source: branches/work_312/doc/DocSchemaDetails.cpp @ 661

Revision 661, 75.2 KB checked in by jls17, 4 years ago (diff)
  • the field list of join form did link to the joined schemas but without the overlay/custom identification
  • reduced the data size (the link to the joined-form isn't store for every field in the json struct)
Line 
1//Copyright (C) 2009 Stefan Nerlich | stefan.nerlich@hotmail.com
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside is distributed in the hope that it will be useful,
10//    but WITHOUT ANY WARRANTY; without even the implied warranty of
11//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12//    GNU General Public License for more details.
13//
14//    You should have received a copy of the GNU General Public License
15//    along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "DocSchemaDetails.h"
19#include "DocFieldDetails.h"
20#include "../output/CsvPage.h"
21#include "../output/ImageTag.h"
22#include "../output/TabControl.h"
23#include "../output/URLLink.h"
24#include "../output/WorkflowReferenceTable.h"
25#include "../core/ARDayStructHelper.h"
26#include "../core/ARHandle.h"
27#include "../core/OpenWindowReportData.h"
28#include "../core/OpenWindowSampleData.h"
29#include "../util/Context.h"
30#include "DocOverlayHelper.h"
31#include "DocMain.h"
32
33#include "rapidjson/document.h"
34#include "rapidjson/genericwritestream.h"
35#include "rapidjson/writer.h"
36
37using namespace rapidjson;
38
39CDocSchemaDetails::CDocSchemaDetails(unsigned int schemaInsideId, int rootLevel)
40: schema(schemaInsideId)
41{
42        this->uniqueAlList.clear();
43        this->uniqueEscalList.clear();
44        this->uniqueFilterList.clear();
45        this->overlayType = 0;
46}
47
48CDocSchemaDetails::~CDocSchemaDetails(void)
49{
50}
51
52void CDocSchemaDetails::Documentation()
53{
54        try
55        {
56                CPageParams file(PAGE_DETAILS, &this->schema);
57                rootLevel = file->GetRootLevel();
58                string path = file->GetPath();
59
60                FileSystemUtil fsUtil(this->pInside->appConfig);
61                if(fsUtil.CreateSubDirectory(path)>=0)
62                {
63                        //stringstream pgStrm; 
64                        CWebPage webPage(file->GetFileName(), this->schema.GetName(), rootLevel, this->pInside->appConfig);
65                        CDocOverlayHelper overlayHelper(schema, rootLevel);
66                       
67                        const ARCompoundSchema& compSchema = this->schema.GetCompound();
68                        overlayType = schema.GetOverlayType();
69
70                        //ContentHead informations
71                        stringstream contHeadStrm;
72                        contHeadStrm << CWebUtil::LinkToSchemaIndex(rootLevel, false) << endl;
73                        contHeadStrm << MenuSeparator << this->pInside->LinkToSchemaTypeList(schema.GetInternalSchemaType(), rootLevel) << endl;
74                        contHeadStrm << MenuSeparator << ImageTag(schema, rootLevel) << CWebUtil::ObjName(this->schema.GetName());
75                        contHeadStrm << CAREnum::GetOverlayTypeString(overlayType);
76
77                        if(!this->schema.GetAppRefName().empty())
78                                contHeadStrm << MenuSeparator << " Application " << this->pInside->LinkToContainer(this->schema.GetAppRefName(), rootLevel);
79
80                        webPage.AddContentHead(contHeadStrm.str(), overlayHelper.PlaceOverlayLink());
81                        webPage.AddContent(overlayHelper.PlaceOverlaidNotice());
82
83                        // add the javascript we need for this page to display correctly
84                        webPage.GetReferenceManager()
85                                .AddScriptReference("img/object_list.js")
86                                .AddScriptReference("img/schema_page.js")
87                                .AddScriptReference("img/jquery.timers.js")
88                                .AddScriptReference("img/jquery.address.min.js");
89
90                        // now the content
91                        CTabControl tabControl;
92
93                        // Add general schema informations to the page
94                        tabControl.AddTab("General", ShowGeneralInfo());
95
96                        // Add list of all fields to the page
97                        tabControl.AddTab("Fields", (IsJoinViewOrVendorForm() ? this->AllFieldsSpecial() : this->AllFields()) );
98
99                        // Add list of all views to the page
100                        tabControl.AddTab("Views", this->ShowVuiList());
101
102                        // Add a section which lists workflow thats reading data from this form
103                        tabControl.AddTab("Workflow", WorkflowDoc());
104
105                        // Add table with all references to the page
106                        tabControl.AddTab("References", GenerateReferencesTable(compSchema));
107
108                        webPage.AddContent(tabControl.ToXHtml());
109                        webPage.SaveInFolder(path);
110                }
111        }
112        catch(exception& e)
113        {
114                cout << "EXCEPTION schema details documentation of '"<< this->schema.GetName() << "': " << e.what() << endl;
115        }
116}
117
118//Create a page with all fields of this form
119string CDocSchemaDetails::AllFields()
120{               
121        CTable tbl("fieldListAll", "TblObjectList");
122        tbl.AddColumn(40, "Field Name");
123        tbl.AddColumn(10, "Field ID"); 
124        tbl.AddColumn(10, "Datatype");
125        tbl.AddColumn(10, "In Views");
126        tbl.AddColumn(10, "Modified");
127        tbl.AddColumn(20, "By");
128
129        try
130        {
131                CARFieldList* fields = schema.GetFields();
132                unsigned int fieldCount = fields->GetCount();
133                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
134                {
135                        CARField field(schema.GetInsideId(), 0, fieldIndex);
136
137                        CTableRow row("");
138
139                        CTableCell cellName(URLLink(field, rootLevel), "");
140                        CTableCell cellFieldId(field.GetFieldId(), "");
141                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
142
143                        stringstream strmTmp;
144                        if(field.GetDisplayInstances().numItems == 0 && field.GetFieldId() != 15)                               
145                                strmTmp << "<span class=\"fieldInNoView\">" << field.GetDisplayInstances().numItems << "</span>" << endl;
146                        else
147                                strmTmp << field.GetDisplayInstances().numItems;                       
148                        CTableCell cellNumViews(strmTmp.str(), "");                     
149
150                        CTableCell cellTimestamp(CUtil::DateTimeToHTMLString(field.GetTimestamp()), "");
151                        CTableCell cellLastChanged(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel), "");
152
153                        row.AddCell(cellName);
154                        row.AddCell(cellFieldId);
155                        row.AddCell(cellDataType);
156                        row.AddCell(cellNumViews);
157                        row.AddCell(cellTimestamp);
158                        row.AddCell(cellLastChanged);
159
160                        tbl.AddRow(row);
161                }
162
163                tbl.description = GenerateFieldTableDescription(tbl);
164
165                AllFieldsCsv();
166        }
167        catch(exception& e)
168        {
169                cout << "EXCEPTION schema all fields of '"<< this->schema.GetName() << "': " << e.what() << endl;
170        }
171
172        return tbl.ToXHtml();   
173}
174
175void CDocSchemaDetails::AllFieldsCsv()
176{               
177        CTable tbl("fieldListAll", "TblObjectList");
178        tbl.AddColumn(40, "Field Name");
179        tbl.AddColumn(10, "Field ID"); 
180        tbl.AddColumn(10, "Datatype");
181        tbl.AddColumn(10, "In Views");
182        tbl.AddColumn(10, "Modified");
183        tbl.AddColumn(20, "By");
184
185        try
186        {
187                CARFieldList* fields = schema.GetFields();
188                unsigned int fieldCount = fields->GetCount();
189                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
190                {
191                        CARField field(schema.GetInsideId(), 0, fieldIndex);
192
193                        CTableRow row("");
194                        CTableCell cellName(field.GetName(), "");
195                        CTableCell cellFieldId(field.GetFieldId(), "");
196                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");                   
197                        CTableCell cellNumViews(field.GetDisplayInstances().numItems, "");     
198                        CTableCell cellTimestamp(CUtil::DateTimeToString(field.GetTimestamp()), "");
199                        CTableCell cellLastChanged(field.GetLastChanged(), "");
200
201                        row.AddCell(cellName);         
202                        row.AddCell(cellFieldId);
203                        row.AddCell(cellDataType);
204                        row.AddCell(cellNumViews);
205                        row.AddCell(cellTimestamp);
206                        row.AddCell(cellLastChanged);
207
208                        tbl.AddRow(row);
209                }
210
211                //Save field information to ccs
212                CPageParams file(PAGE_SCHEMA_FIELDS_CSV, &this->schema);
213                CCsvPage csvPage(file->GetFileName(), this->pInside->appConfig);
214                csvPage.SaveInFolder(file->GetPath(), tbl.ToCsv());
215        }
216        catch(exception& e)
217        {
218                cout << "EXCEPTION schema all fields csv of '" << this->schema.GetName() << "': " << e.what() << endl;
219        }
220}
221
222void CDocSchemaDetails::AllFieldsJson(std::ostream &out)
223{
224        try
225        {
226                Document document;
227                Document::AllocatorType &alloc = document.GetAllocator();
228                document.SetArray();
229
230                CARFieldList* fields = schema.GetFields();
231                unsigned int fieldCount = fields->GetCount();
232                bool isSpecialForm = IsJoinViewOrVendorForm();
233
234                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
235                {
236                        CARField field(schema.GetInsideId(), 0, fieldIndex);
237                        CPageParams fieldLink(PAGE_DETAILS, &field);
238
239                        Value item;
240                        item.SetArray();
241
242                        string strName = field.GetName();
243                        string strDate = CUtil::DateTimeToString(field.GetTimestamp());
244                        string strLink = CWebUtil::DocName(fieldLink->GetFileName());
245
246                        Value name(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
247                        Value modified(strDate.c_str(), static_cast<SizeType>(strDate.size()), alloc);
248                        Value link(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
249
250                        item.PushBack(static_cast<int>(field.GetFieldId()), alloc);
251                        item.PushBack(name, alloc);
252                        item.PushBack(field.GetDataType(), alloc);
253                        item.PushBack(field.GetDisplayInstances().numItems, alloc);
254                        item.PushBack(modified, alloc);
255                        item.PushBack(field.GetLastChanged(), alloc);
256                        item.PushBack(link, alloc);
257                       
258                        // for special forms, we need some more details for the real-field column
259                        if (isSpecialForm)
260                        {
261                                switch (field.GetMapping().fieldType)
262                                {
263                                case AR_FIELD_JOIN:
264                                        {
265                                                if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
266                                                {
267                                                        const ARCompoundSchema& compSchema = this->schema.GetCompound();
268                                                        CARSchema schemaLeft(compSchema.u.join.memberA);
269                                                        CARSchema schemaRight(compSchema.u.join.memberB);
270
271                                                        CARField fldLeft(schemaLeft.GetInsideId(), 1);
272                                                        CARField fldRight(schemaRight.GetInsideId(), 1);
273
274                                                        CPageParams schemaLeftLink(PAGE_DETAILS, &schemaLeft);
275                                                        CPageParams schemaRightLink(PAGE_DETAILS, &schemaRight);
276                                                        CPageParams fldLeftLink(PAGE_DETAILS, &fldLeft);
277                                                        CPageParams fldRightLink(PAGE_DETAILS, &fldRight);
278
279                                                        string leftFieldName;
280                                                        string leftFieldLink;
281                                                        if (fldLeft.Exists())
282                                                        {
283                                                                leftFieldName = fldLeft.GetName();
284                                                                leftFieldLink = CWebUtil::GetRelativeURL(rootLevel, fldLeftLink);
285                                                        }
286                                                        else
287                                                        {
288                                                                leftFieldName = "1";
289                                                        }
290
291                                                        string leftSchemaName = compSchema.u.join.memberA;
292                                                        string leftSchemaLink;
293                                                        if (schemaLeft.Exists())
294                                                                leftSchemaLink = CWebUtil::GetRelativeURL(rootLevel, schemaLeftLink);
295                                                       
296                                                        string rightFieldName;
297                                                        string rightFieldLink;
298                                                        if (fldRight.Exists())
299                                                        {
300                                                                rightFieldName = fldRight.GetName();
301                                                                rightFieldLink = CWebUtil::GetRelativeURL(rootLevel, fldRightLink);
302                                                        }
303                                                        else
304                                                        {
305                                                                rightFieldName = "1";
306                                                        }
307                                                        string rightSchemaName = compSchema.u.join.memberB;
308                                                        string rightSchemaLink;
309                                                        if (schemaRight.Exists())
310                                                                rightSchemaLink = CWebUtil::GetRelativeURL(rootLevel, schemaRightLink);
311
312                                                        Value leftNameVal(leftFieldName.c_str(), static_cast<SizeType>(leftFieldName.size()), alloc);
313                                                        Value leftLinkVal(leftFieldLink.c_str(), static_cast<SizeType>(leftFieldLink.size()), alloc);
314
315                                                        Value rightNameVal(rightFieldName.c_str(), static_cast<SizeType>(rightFieldName.size()), alloc);
316                                                        Value rightLinkVal(rightFieldLink.c_str(), static_cast<SizeType>(rightFieldLink.size()), alloc);
317
318                                                        item.PushBack(leftNameVal, alloc);
319                                                        item.PushBack(leftLinkVal, alloc);
320
321                                                        item.PushBack(rightNameVal, alloc);
322                                                        item.PushBack(rightLinkVal, alloc);
323                                                }
324                                                else
325                                                {
326                                                        if(field.GetMapping().u.join.realId > 0)
327                                                        {
328                                                                const ARCompoundSchema& compSchema = this->schema.GetCompound();
329
330                                                                string baseSchemaName = (field.GetMapping().u.join.schemaIndex == 0 ? compSchema.u.join.memberA : compSchema.u.join.memberB);
331                                                               
332                                                                CARSchema baseSchema(baseSchemaName);
333                                                                CPageParams baseSchemaPage(PAGE_DETAILS, &baseSchema);
334
335                                                                CARField baseField(baseSchema.GetInsideId(), field.GetMapping().u.join.realId);
336                                                                CPageParams baseFieldPage(PAGE_DETAILS, &baseField);
337
338                                                                string baseFieldName;
339                                                                string baseFieldLink;
340
341                                                                // now check if the field exists in the join-member! Otherwise we can't determine the field name and URL!
342                                                                if (baseField.Exists())
343                                                                {
344                                                                        baseFieldName = baseField.GetName();
345                                                                        baseFieldLink = CWebUtil::GetRelativeURL(rootLevel, baseFieldPage);
346                                                                }
347                                                                else
348                                                                {
349                                                                        // if this field doesn't exist in the join member, show the fieldid instead!
350                                                                        stringstream baseFieldIdStrm;
351                                                                        baseFieldIdStrm << field.GetMapping().u.join.realId;
352                                                                        baseFieldName = baseFieldIdStrm.str();
353                                                                }
354                                                               
355                                                                string baseSchemaLink; 
356                                                                if (baseSchema.Exists())
357                                                                        baseSchemaLink = CWebUtil::GetRelativeURL(rootLevel, baseSchemaPage);
358                                                               
359                                                                Value baseFileNameVal(baseFieldName.c_str(), static_cast<SizeType>(baseFieldName.size()), alloc);
360                                                                Value baseFileLinkVal(baseFieldLink.c_str(), static_cast<SizeType>(baseFieldLink.size()), alloc);
361
362                                                                item.PushBack(baseFileNameVal, alloc);
363                                                                item.PushBack(baseFileLinkVal, alloc);
364                                                                // write the schema-index (left- or right join-member) so we could link to the correct form
365                                                                item.PushBack(field.GetMapping().u.join.schemaIndex, alloc);
366                                                        }
367                                                }
368                                        }
369                                        break;
370                                case AR_FIELD_VIEW:
371                                        {
372                                                string val = field.GetMapping().u.view.fieldName;
373                                                Value itemVal(val.c_str(), static_cast<SizeType>(val.size()), alloc);
374                                                item.PushBack(itemVal, alloc);
375                                        }
376                                        break;
377                                case AR_FIELD_VENDOR:
378                                        {
379                                                string val = field.GetMapping().u.vendor.fieldName;
380                                                Value itemVal(val.c_str(), static_cast<SizeType>(val.size()), alloc);
381                                                item.PushBack(itemVal, alloc);
382                                        }
383                                        break;
384                                }
385
386                        }
387
388                        document.PushBack(item, alloc);
389                }
390
391                GenericWriteStream output(out);
392                Writer<GenericWriteStream> writer(output);
393
394                out << endl << "<script type=\"text/javascript\">" << endl;
395                out << "var schemaFieldList = "; document.Accept(writer); out << ";";
396                if (isSpecialForm)
397                {
398                        string type;
399                        switch (this->schema.GetCompound().schemaType)
400                        {
401                        case AR_SCHEMA_VIEW:
402                                type = "view";
403                                break;
404                        case AR_SCHEMA_VENDOR:
405                                type = "vendor";
406                                break;
407                        case AR_SCHEMA_JOIN:
408                                type = "join";
409                                break;
410                        }
411                        if (!type.empty())
412                        {
413                                out << "schemaFieldManager.setRenderer(\"" << type << "\");";
414                        }
415                }
416                out << endl;
417                out << "</script>" << endl;
418        }
419        catch(exception& e)
420        {
421                cout << "EXCEPTION schema all fields json of '" << this->schema.GetName() << "': " << e.what() << endl;
422        }
423}
424
425//Create a page with all fields of a joinform
426string CDocSchemaDetails::AllFieldsSpecial()
427{               
428        CTable tbl("fieldListAll", "TblObjectList");
429        tbl.AddColumn(20, "Field Name");
430        tbl.AddColumn(5, "Field ID");
431        tbl.AddColumn(5, "Datatype");
432        tbl.AddColumn(30, "Real Field");
433        tbl.AddColumn(10, "In Views");
434        tbl.AddColumn(10, "Modified");
435        tbl.AddColumn(20, "By");
436
437        try
438        {
439                CARFieldList* fields = schema.GetFields();
440                unsigned int fieldCount = fields->GetCount();
441                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
442                {
443                        CARField field(schema.GetInsideId(), 0, fieldIndex);
444
445                        CTableRow row("");
446                        CTableCell cellName(URLLink(field, rootLevel), "");
447                        CTableCell cellFieldId(field.GetFieldId(), "");
448
449                        stringstream strmTmp;
450                        if(field.GetDisplayInstances().numItems == 0 && field.GetFieldId() != 15)                               
451                                strmTmp << "<span class=\"fieldInNoView\">" << field.GetDisplayInstances().numItems << "</span" << endl;
452                        else
453                                strmTmp << field.GetDisplayInstances().numItems;                       
454                       
455                        CTableCell cellNumViews(strmTmp.str(), "");     
456                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
457
458                        strmTmp.str("");                       
459                        switch (field.GetMapping().fieldType)
460                        {
461                        case AR_FIELD_JOIN:
462                                {
463                                        if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
464                                        {
465                                                const ARCompoundSchema& compSchema = this->schema.GetCompound();
466                                                strmTmp << this->pInside->LinkToField(compSchema.u.join.memberA, 1, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(compSchema.u.join.memberA, rootLevel);
467                                                strmTmp << "<br/>" << endl;
468                                                strmTmp << this->pInside->LinkToField(compSchema.u.join.memberB, 1, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(compSchema.u.join.memberB, rootLevel);
469                                        }
470                                        else
471                                        {
472                                                if(field.GetMapping().u.join.realId > 0)
473                                                {
474                                                        string tmpBaseSchema = this->schema.GetCompound().u.join.memberA;
475                                                        if(field.GetMapping().u.join.schemaIndex > 0)
476                                                                tmpBaseSchema = this->schema.GetCompound().u.join.memberB;
477
478                                                        strmTmp << this->pInside->LinkToField(tmpBaseSchema, field.GetMapping().u.join.realId, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(tmpBaseSchema, rootLevel);
479                                                }
480                                                else
481                                                        strmTmp << "&nbsp;";
482                                        }
483                                }
484                                break;
485                        case AR_FIELD_VIEW:
486                                strmTmp << field.GetMapping().u.view.fieldName;
487                                break;
488                        case AR_FIELD_VENDOR:
489                                strmTmp << field.GetMapping().u.vendor.fieldName;
490                                break;
491                        }
492
493                        CTableCell cellFieldRealId(strmTmp.str(), "");
494                        CTableCell cellTimestamp(CUtil::DateTimeToHTMLString(field.GetTimestamp()), "");
495                        CTableCell cellLastChanged(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel), "");
496
497                        row.AddCell(cellName);
498                        row.AddCell(cellFieldId);
499                        row.AddCell(cellDataType);
500                        row.AddCell(cellFieldRealId);
501                        row.AddCell(cellNumViews);
502                        row.AddCell(cellTimestamp);
503                        row.AddCell(cellLastChanged);
504
505                        tbl.AddRow(row);
506                }
507
508                tbl.description = GenerateFieldTableDescription(tbl);
509
510                AllFieldsSpecialCsv();
511        }
512        catch(exception& e)
513        {
514                cout << "EXCEPTION schema all fields join of '"<< this->schema.GetName() << "': " << e.what() << endl;
515        }
516
517        return tbl.ToXHtml();   
518}
519
520void CDocSchemaDetails::AllFieldsSpecialCsv()
521{               
522        CTable tbl("fieldListAll", "TblObjectList");
523        tbl.AddColumn(20, "Field Name");
524        tbl.AddColumn(5, "Field ID");
525        tbl.AddColumn(5, "Datatype");
526        tbl.AddColumn(30, "Real Field");
527        tbl.AddColumn(10, "In Views");
528        tbl.AddColumn(10, "Modified");
529        tbl.AddColumn(20, "By");
530
531        try
532        {
533                CARFieldList* fields = schema.GetFields();
534                unsigned int fieldCount = fields->GetCount();
535                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
536                {
537                        CARField field(schema.GetInsideId(), 0, fieldIndex);
538
539                        CTableRow row("");
540                        CTableCell cellName(field.GetName(), "");
541                        CTableCell cellFieldId(field.GetFieldId(), "");
542                        CTableCell cellNumViews(field.GetDisplayInstances().numItems, "");
543                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
544
545                        stringstream strmTmp;
546                        switch (field.GetMapping().fieldType)
547                        {
548                        case AR_FIELD_JOIN:
549                                {
550                                        if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
551                                        {
552                                                strmTmp << 1;
553                                        }
554                                        else
555                                        {
556                                                if(field.GetMapping().u.join.realId > 0)
557                                                {
558                                                        strmTmp << field.GetMapping().u.join.realId;
559                                                }
560                                        }
561                                }
562                                break;
563                        case AR_FIELD_VIEW:
564                                {
565                                        strmTmp << field.GetMapping().u.view.fieldName;
566                                }
567                                break;
568                        case AR_FIELD_VENDOR:
569                                {
570                                        strmTmp << field.GetMapping().u.vendor.fieldName;
571                                }
572                                break;                 
573                        }
574
575                        CTableCell cellFieldRealId(strmTmp.str());
576                        CTableCell cellTimestamp(CUtil::DateTimeToString(field.GetTimestamp()), "");
577                        CTableCell cellLastChanged(field.GetLastChanged(), "");
578
579                        row.AddCell(cellName);
580                        row.AddCell(cellFieldId);
581                        row.AddCell(cellDataType);
582                        row.AddCell(cellFieldRealId);
583                        row.AddCell(cellNumViews);
584                        row.AddCell(cellTimestamp);
585                        row.AddCell(cellLastChanged);
586
587                        tbl.AddRow(row);
588                }
589
590                //Save field information to csv
591                CPageParams file(PAGE_SCHEMA_FIELDS_CSV, &this->schema);
592                CCsvPage csvPage(file->GetFileName(), this->pInside->appConfig);
593                csvPage.SaveInFolder(file->GetPath(), tbl.ToCsv());
594        }
595        catch(exception& e)
596        {
597                cout << "EXCEPTION schema all fields join csv of '" << this->schema.GetName() << "': " << e.what() << endl;
598        }
599}
600
601string CDocSchemaDetails::GenerateFieldTableDescription(CTable &tbl)
602{
603        stringstream outputStrm;
604        AllFieldsJson(outputStrm);
605        outputStrm << "<div><span class='clearable'><input type=\"text\" class='data_field' id=\"fieldNameFilter\" placeholder=\"search by name or id\"/></span><button id=\"execFieldFilter\">Filter</button></div>" << endl;
606        outputStrm << ImageTag(ImageTag::Document, rootLevel) << "<span id='fieldListFilterResultCount'></span>" << tbl.NumRows() << " fields (" << URLLink("data", CPageParams(PAGE_SCHEMA_FIELDS_CSV, &this->schema), rootLevel) << ")" << endl;
607        outputStrm << "<div id=\"result\"></div>";
608        return outputStrm.str();
609}
610
611bool CDocSchemaDetails::InAlList(string objName)
612{
613        list<string>::iterator listIter;               
614        for ( listIter = this->uniqueAlList.begin(); listIter != this->uniqueAlList.end(); listIter++ )
615        {
616                string *listItemName = &(*listIter);
617                if(strcmp(objName.c_str(), listItemName->c_str())==0)
618                {
619                        return true;
620                }
621        }
622        return false;
623}
624
625bool CDocSchemaDetails::InFilterList(string objName)
626{
627        list<string>::iterator listIter;               
628        for ( listIter = this->uniqueFilterList.begin(); listIter != this->uniqueFilterList.end(); listIter++ )
629        {
630                string *listItemName = &(*listIter);
631                if(strcmp(objName.c_str(), listItemName->c_str())==0)
632                {
633                        return true;
634                }
635        }
636        return false;
637}
638
639bool CDocSchemaDetails::InEscalList(string objName)
640{
641        list<string>::iterator listIter;               
642        for ( listIter = this->uniqueEscalList.begin(); listIter != this->uniqueEscalList.end(); listIter++ )
643        {
644                string *listItemName = &(*listIter);
645                if(strcmp(objName.c_str(), listItemName->c_str())==0)
646                {
647                        return true;
648                }
649        }
650        return false;
651}
652
653bool CDocSchemaDetails::IsSchemaInWFConnectStruct(const ARWorkflowConnectStruct& wfCS)
654{
655        if (wfCS.type == AR_WORKFLOW_CONN_SCHEMA_LIST && wfCS.u.schemaList != NULL)
656        {
657                for (unsigned int connectIndex = 0; connectIndex < wfCS.u.schemaList->numItems; ++connectIndex)
658                {
659                        if (schema.GetName() == wfCS.u.schemaList->nameList[connectIndex])
660                        {
661                                return true;
662                        }
663                }
664        }
665        return false;
666}
667
668void AddJsonRow(Document &doc, CARActiveLink &al, int rootLevel)
669{
670        CPageParams alDetailPage(PAGE_DETAILS, &al);
671        Document::AllocatorType &alloc = doc.GetAllocator();
672        Value item;
673        item.SetArray();
674
675        string strModDate, strActlinkName, strLink;
676        strModDate = CUtil::DateTimeToString(al.GetTimestamp());
677        strActlinkName = al.GetName();
678        strLink = CWebUtil::GetRelativeURL(rootLevel, alDetailPage);
679
680        Value modDate, alName, alLink;
681        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
682        alName.SetString(strActlinkName.c_str(), static_cast<SizeType>(strActlinkName.length()), alloc);
683        alLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
684
685        item.PushBack((al.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
686        item.PushBack(alName, alloc);
687        item.PushBack((al.GetEnabled() ? true : false), alloc);
688        item.PushBack(al.GetOrder(), alloc);
689        item.PushBack(al.GetExecuteMask(), alloc);
690        item.PushBack(al.GetIfActions().numItems, alloc);
691        item.PushBack(al.GetElseActions().numItems, alloc);
692        item.PushBack(modDate, alloc);
693        item.PushBack(al.GetLastChanged(), alloc);
694        item.PushBack(alLink, alloc);
695       
696        doc.PushBack(item, alloc);
697}
698
699void AddJsonRow(Document &doc, CARFilter &flt, int rootLevel)
700{
701        CPageParams fltDetailPage(PAGE_DETAILS, &flt);
702        Document::AllocatorType &alloc = doc.GetAllocator();
703        Value item;
704        item.SetArray();
705
706        string strModDate, strName, strLink;
707        strModDate = CUtil::DateTimeToString(flt.GetTimestamp());
708        strName = flt.GetName();
709        strLink = CWebUtil::GetRelativeURL(rootLevel, fltDetailPage);
710
711        Value modDate, objName, objLink;
712        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
713        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
714        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
715
716        item.PushBack((flt.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
717        item.PushBack(objName, alloc);
718        item.PushBack((flt.GetEnabled() ? true : false), alloc);
719        item.PushBack(flt.GetOrder(), alloc);
720        item.PushBack(flt.GetOperation(), alloc);
721        item.PushBack(flt.GetIfActions().numItems, alloc);
722        item.PushBack(flt.GetElseActions().numItems, alloc);
723        item.PushBack(modDate, alloc);
724        item.PushBack(flt.GetLastChanged(), alloc);
725        item.PushBack(objLink, alloc);
726       
727        doc.PushBack(item, alloc);
728}
729
730void AddJsonRow(Document &doc, CAREscalation &esc, int rootLevel)
731{
732        CPageParams escDetailPage(PAGE_DETAILS, &esc);
733        Document::AllocatorType &alloc = doc.GetAllocator();
734        Value item;
735        item.SetArray();
736
737        string strModDate, strName, strLink;
738        strModDate = CUtil::DateTimeToString(esc.GetTimestamp());
739        strName = esc.GetName();
740        strLink = CWebUtil::GetRelativeURL(rootLevel, escDetailPage);
741
742        Value modDate, objName, objLink;
743        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
744        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
745        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
746
747        item.PushBack((esc.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
748        item.PushBack(objName, alloc);
749        item.PushBack((esc.GetEnabled() ? true : false), alloc);
750        item.PushBack("", alloc);
751        item.PushBack(esc.GetTimeStruct().escalationTmType, alloc);
752        item.PushBack(esc.GetIfActions().numItems, alloc);
753        item.PushBack(esc.GetElseActions().numItems, alloc);
754        item.PushBack(modDate, alloc);
755        item.PushBack(esc.GetLastChanged(), alloc);
756        item.PushBack(objLink, alloc);
757       
758        doc.PushBack(item, alloc);
759}
760
761void AddJsonRow(Document &doc, CARContainer &cnt, int rootLevel)
762{
763        CPageParams cntDetailPage(PAGE_DETAILS, &cnt);
764        Document::AllocatorType &alloc = doc.GetAllocator();
765        Value item;
766        item.SetArray();
767
768        string strModDate, strName, strLink;
769        strModDate = CUtil::DateTimeToString(cnt.GetTimestamp());
770        strName = cnt.GetName();
771        strLink = CWebUtil::GetRelativeURL(rootLevel, cntDetailPage);
772
773        Value modDate, objName, objLink;
774        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
775        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
776        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
777
778        item.PushBack((cnt.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
779        item.PushBack(objName, alloc);
780        item.PushBack(cnt.GetType(), alloc);
781        item.PushBack("", alloc);
782        item.PushBack("", alloc);
783        item.PushBack("", alloc);
784        item.PushBack("", alloc);
785        item.PushBack(modDate, alloc);
786        item.PushBack(cnt.GetLastChanged(), alloc);
787        item.PushBack(objLink, alloc);
788       
789        doc.PushBack(item, alloc);
790}
791
792string CDocSchemaDetails::WorkflowDoc()
793{
794        try
795        {
796                //CPageParams file(PAGE_SCHEMA_WORKFLOW, &this->schema);
797
798                Document document;
799                document.SetArray();
800
801                //Field references
802                CTable tblRef("referenceList", "TblObjectList");
803                tblRef.AddColumn(35, "Server object");
804                tblRef.AddColumn(05, "Enabled");
805                tblRef.AddColumn(05, "Order");
806                tblRef.AddColumn(15, "Execute On");
807                tblRef.AddColumn(05, "If");
808                tblRef.AddColumn(05, "Else");
809                tblRef.AddColumn(15, "Changed");
810                tblRef.AddColumn(15, "By");
811
812                const CARSchemaList::ObjectRefList& alList = this->schema.GetActiveLinks();
813                const CARSchemaList::ObjectRefList& fltList = this->schema.GetFilters();
814                const CARSchemaList::ObjectRefList& escList = this->schema.GetEscalations();
815                const CARSchemaList::ObjectRefList& algList = this->schema.GetActLinkGuides();
816                const CARSchemaList::ObjectRefList& flgList = this->schema.GetFilterGuides();
817                const CARSchemaList::ObjectRefList& wbsList = this->schema.GetWebservices();
818
819                // Add all active links
820                CARSchemaList::ObjectRefList::const_iterator curIt = alList.begin();
821                CARSchemaList::ObjectRefList::const_iterator endIt = alList.end();
822                for (; curIt != endIt; ++curIt)
823                {
824                        CARActiveLink al(*curIt);
825                        AddJsonRow(document, al, rootLevel);
826                }
827
828                // Add all filters
829                curIt = fltList.begin();
830                endIt = fltList.end();
831                for (; curIt != endIt; ++curIt)
832                {
833                        CARFilter flt(*curIt);
834                        AddJsonRow(document, flt, rootLevel);
835                }
836
837                // Add all escalations
838                curIt = escList.begin();
839                endIt = escList.end();
840                for (; curIt != endIt; ++curIt)
841                {
842                        CAREscalation esc(*curIt);
843                        AddJsonRow(document, esc, rootLevel);
844                }
845
846                // add all active link guides
847                curIt = algList.begin();
848                endIt = algList.end();
849                for (; curIt != endIt; ++curIt)
850                {
851                        CARContainer alg(*curIt);
852                        AddJsonRow(document, alg, rootLevel);
853                }
854
855                // add all filter guides
856                curIt = flgList.begin();
857                endIt = flgList.end();
858                for (; curIt != endIt; ++curIt)
859                {
860                        CARContainer flg(*curIt);
861                        AddJsonRow(document, flg, rootLevel);
862                }
863
864                // add all webservices
865                curIt = wbsList.begin();
866                endIt = wbsList.end();
867                for (; curIt != endIt; ++curIt)
868                {
869                        CARContainer ws(*curIt);
870                        AddJsonRow(document, ws, rootLevel);
871                }
872
873                // generate json output struct
874                stringstream strm;
875                GenericWriteStream genericStream(strm);
876                Writer<GenericWriteStream> genericWriter(genericStream);
877
878                strm << "<script type=\"text/javascript\">" << "var schemaWFLInit = false;" << endl;
879                strm << "var referenceList = "; document.Accept(genericWriter); strm << ";" << endl
880                     << "var rootLevel = " << rootLevel << endl
881                     << "</script>" << endl
882                                 << CDocMain::CreateSchemaReferenceFilterControl() << endl
883                     << tblRef;
884                return strm.str();
885        }
886        catch(exception& e)
887        {
888                cout << "EXCEPTION schema workflow doc of '" << this->schema.GetName() << "': " << e.what() << endl;
889                return "";
890        }
891}
892
893//list of groups with access rights
894void CDocSchemaDetails::ShowPermissionProperties(std::ostream &strm, CARProplistHelper *propIndex)
895{
896        try
897        {
898                //CPageParams file(PAGE_SCHEMA_PERMISSIONS, &this->schema);
899
900                CTable tbl("permissionList", "TblObjectList");
901                tbl.AddColumn(60, "Group Name");
902                tbl.AddColumn(20, "Group Id");
903                tbl.AddColumn(20, "Permission");
904
905                const ARPermissionList& perms = this->schema.GetPermissions();
906                for(unsigned int i = 0; i < perms.numItems; ++i)
907                {
908                        if(this->pInside->ValidateGroup(this->schema.GetAppRefName(), perms.permissionList[i].groupId))
909                        {
910                                CTableRow row("");
911                                stringstream perm;
912
913                                if(perms.permissionList[i].permissions == AR_PERMISSIONS_HIDDEN)
914                                        perm << ImageTag(ImageTag::Hidden, rootLevel);
915                                else
916                                        perm << ImageTag(ImageTag::Visible, rootLevel);
917
918                                perm << CAREnum::ObjectPermission(perms.permissionList[i].permissions);
919
920                                row.AddCell(CTableCell(this->pInside->LinkToGroup(this->schema.GetAppRefName(), perms.permissionList[i].groupId, rootLevel)));
921                                row.AddCell(CTableCell(perms.permissionList[i].groupId));
922                                row.AddCell(perm.str());
923                                tbl.AddRow(row);
924                        }
925                }
926
927                //CPageParams file(PAGE_SCHEMA_SUBADMINS, &this->schema); //////////////////////////////////
928                CTable tblSubAdm("subadminPerms", "TblObjectList");
929                tblSubAdm.AddColumn(90, "Group Name");
930                tblSubAdm.AddColumn(10, "Group Id");
931
932                const ARInternalIdList& subAdmins = schema.GetSubadmins();
933                for(unsigned int i = 0; i < subAdmins.numItems; ++i)
934                {
935                        CTableRow row("");
936                        row.AddCell(this->pInside->LinkToGroup(this->schema.GetAppRefName(), subAdmins.internalIdList[i], rootLevel));
937                        row.AddCell(subAdmins.internalIdList[i]);
938                        tblSubAdm.AddRow(row);
939                }
940
941                //Show all fields with all group permissions
942                CTable tblFieldPerm("fieldPerms", "TblObjectList");
943
944                tblFieldPerm.AddColumn(40, "Field Name");
945                tblFieldPerm.AddColumn(10, "Field ID"); 
946                tblFieldPerm.AddColumn(10, "Datatype");         
947                tblFieldPerm.AddColumn(40, "Permissions");
948
949
950                CARFieldList* fields = schema.GetFields();
951                unsigned int fieldCount = fields->GetCount();
952                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
953                {
954                        CARField field(schema.GetInsideId(), 0, fieldIndex);
955
956                        //Field Permissions
957                        stringstream strmFieldPermissions;
958                        strmFieldPermissions.str("");
959
960                        const ARPermissionList& fldPerms = field.GetPermissions();
961                        if(fldPerms.numItems > 0)
962                        {
963                                CTable tblFieldPermissionDetails("PermissionFieldList", "TblHidden");
964                                tblFieldPermissionDetails.AddColumn(50, "Group Name");
965                                tblFieldPermissionDetails.AddColumn(50, "Permission");
966                                tblFieldPermissionDetails.DisableHeader();
967
968                                for(unsigned int i = 0; i < fldPerms.numItems; ++i)
969                                {
970                                        stringstream perm;
971                                       
972                                        if(fldPerms.permissionList[i].permissions == AR_PERMISSIONS_CHANGE)
973                                                perm << ImageTag(ImageTag::Edit, rootLevel);
974                                        else
975                                                perm << ImageTag(ImageTag::Visible, rootLevel);
976
977                                        perm << CAREnum::FieldPermission(fldPerms.permissionList[i].permissions);
978
979                                        CTableRow row("");
980                                        row.AddCell(this->pInside->LinkToGroup(schema.GetAppRefName(), fldPerms.permissionList[i].groupId, rootLevel));
981                                        row.AddCell(perm.str());
982                                        tblFieldPermissionDetails.AddRow(row);
983                                }
984
985                                strmFieldPermissions << tblFieldPermissionDetails;
986                        }
987                        else
988                        {
989                                strmFieldPermissions << EmptyValue << endl;
990                        }
991
992
993                        CTableRow row("");                     
994                        row.AddCell(CTableCell(URLLink(field, rootLevel)));
995                        row.AddCell(CTableCell(field.GetFieldId()));
996                        row.AddCell(CTableCell(CAREnum::DataType(field.GetDataType())));
997                        row.AddCell(CTableCell(strmFieldPermissions.str()));
998                        tblFieldPerm.AddRow(row);
999                }
1000
1001                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Permissions" << "</h2>";
1002                strm << "<div id='schemaPermissions'>" 
1003                         << "<h2>" << "Group Permissions" << "</h2>" << "<div>" << tbl << "</div>"
1004             << "<h2>" << "Subadministrator Permissions" << "</h2>" << "<div>" << tblSubAdm << "</div>"
1005             << "<h2>" << "Field Permissions" << "</h2>" << "<div>" << tblFieldPerm << "</div>"
1006                     << "</div>";
1007        }
1008        catch(exception& e)
1009        {
1010                cout << "EXCEPTION schema permission doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1011        }
1012}
1013
1014//Create a page that shows a list of all indexes
1015void CDocSchemaDetails::ShowIndexProperties(std::ostream &strm, CARProplistHelper *propIndex)
1016{
1017        try
1018        {
1019                //CPageParams file(PAGE_SCHEMA_INDEXES, &this->schema);
1020
1021                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Indexes" << "</h2>";
1022                strm << "<div>";
1023
1024                const ARIndexList& indexList = this->schema.GetIndexList();
1025                for(unsigned int nIndex=0; nIndex < indexList.numItems; ++nIndex)
1026                {               
1027                        CTable tbl("indexTbl", "TblObjectList");
1028                        tbl.AddColumn(0, "Field Name");
1029                        tbl.AddColumn(0, "Field ID");
1030                        tbl.AddColumn(0, "Datatype");
1031                        tbl.AddColumn(0, "Modified");
1032                        tbl.AddColumn(0, "By");
1033
1034                        stringstream tblDesc;
1035                        if(indexList.indexList[nIndex].unique)
1036                                tblDesc << "Unique Index :" << CWebUtil::ObjName(indexList.indexList[nIndex].indexName);
1037                        else
1038                                tblDesc << "Index: " << CWebUtil::ObjName(indexList.indexList[nIndex].indexName);
1039
1040                        tbl.description = tblDesc.str();
1041
1042                        for(unsigned int nField=0; nField < indexList.indexList[nIndex].numFields; ++nField)
1043                        {
1044                                CARField field(schema.GetInsideId(), indexList.indexList[nIndex].fieldIds[nField]);
1045
1046                                if (field.Exists())
1047                                {
1048                                        CTableRow row("");
1049                                        row.AddCell( CTableCell(URLLink(field, rootLevel)));
1050                                        row.AddCell( CTableCell(field.GetFieldId()));
1051                                        row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));
1052                                        row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetDataType())));
1053                                        row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1054                                        tbl.AddRow(row);
1055
1056                                        //Add a reference
1057                                        CRefItem refItem(this->schema, 0, nIndex, REFM_SCHEMA_INDEX);
1058                                        pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1059                                }
1060                        }
1061
1062                        strm << tbl;
1063                }
1064
1065                strm << "</div>";
1066        }
1067        catch(exception& e)
1068        {
1069                cout << "EXCEPTION creating schema index doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1070        }
1071}
1072
1073//Create a page that shows the form resultlist
1074void CDocSchemaDetails::ShowResultListProperties(std::ostream &strm, CARProplistHelper *propIndex)
1075{
1076        try
1077        {
1078                CTable tbl("fieldListIndex", "TblObjectList");
1079                tbl.AddColumn(25, "Field Name");
1080                tbl.AddColumn(10, "Field Id");
1081                tbl.AddColumn(10, "Datatype");
1082                tbl.AddColumn(5, "Width");
1083                tbl.AddColumn(10, "Separator");
1084                tbl.AddColumn(20, "Modified");
1085                tbl.AddColumn(20, "By");
1086
1087                const AREntryListFieldList& resultFields = schema.GetResultFields();
1088                for(unsigned int i = 0; i < resultFields.numItems; ++i)
1089                {
1090                        CARField field(schema.GetInsideId(), resultFields.fieldsList[i].fieldId);
1091
1092                        if (field.Exists())
1093                        {
1094                                CTableRow row("");
1095                                row.AddCell( CTableCell(URLLink(field, rootLevel)));
1096                                row.AddCell( CTableCell(field.GetFieldId()));
1097                                row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));
1098                                row.AddCell( CTableCell(resultFields.fieldsList[i].columnWidth));
1099                                row.AddCell( CTableCell(resultFields.fieldsList[i].separator));
1100                                row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetTimestamp())));
1101                                row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1102                                tbl.AddRow(row);
1103
1104                                //Add a reference
1105                                CRefItem refItem(this->schema, REFM_SCHEMA_RESULTLIST);
1106                                pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1107                        }
1108                }
1109
1110                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Result List Fields" << "</h2>";
1111                strm << "<div>" << tbl << "</div>";
1112        }
1113        catch(exception& e)
1114        {
1115                cout << "EXCEPTION creating schema resultlist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1116        }
1117}
1118
1119//Create a page that shows the page sortslist
1120void CDocSchemaDetails::ShowSortListProperties(std::ostream &strm, CARProplistHelper *propIndex)
1121{
1122        try
1123        {
1124                //CPageParams file(PAGE_SCHEMA_SORTLIST, &this->schema);
1125
1126                CTable tbl("fieldListIndex", "TblObjectList");
1127                tbl.AddColumn(10, "Sort Order");
1128                tbl.AddColumn(30, "Field Name");
1129                tbl.AddColumn(10, "Field Id");
1130                tbl.AddColumn(10, "Datatype");
1131                tbl.AddColumn(20, "Modified");
1132                tbl.AddColumn(20, "By");
1133
1134
1135                const ARSortList& sorting = schema.GetSortList();
1136                for(unsigned int i = 0; i < sorting.numItems; ++i)
1137                {
1138                        CARField field(schema.GetInsideId(), sorting.sortList[i].fieldId);
1139
1140                        if (field.Exists())
1141                        {
1142                                CTableRow row("");
1143
1144                                string sortImage;
1145                                if(sorting.sortList[i].sortOrder == AR_SORT_DESCENDING)
1146                                        sortImage = ImageTag(ImageTag::SortDesc, rootLevel);
1147                                else
1148                                        sortImage = ImageTag(ImageTag::SortAsc, rootLevel);
1149
1150                                row.AddCell( CTableCell(sortImage));
1151                                row.AddCell( CTableCell(URLLink(field, rootLevel)));
1152                                row.AddCell( CTableCell(field.GetFieldId()));
1153                                row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));                               
1154                                row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetTimestamp())));
1155                                row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1156
1157                                tbl.AddRow(row);
1158
1159                                //Add a reference
1160                                CRefItem refItem(this->schema, REFM_SCHEMA_SORTLIST);
1161                                pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1162                        }
1163                }
1164
1165                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Sort" << "</h2>";
1166                strm << "<div>" << tbl << "</div>";
1167        }
1168        catch(exception& e)
1169        {
1170                cout << "EXCEPTION creating schema sortlist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1171        }
1172}
1173
1174//Create a page with a list of all views
1175string CDocSchemaDetails::ShowVuiList()
1176{       
1177        try
1178        {
1179                //CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_VUI, &this->schema);
1180
1181                CTable tbl("vuiList", "TblObjectList");
1182                tbl.AddColumn(30, "Vui Name");
1183                tbl.AddColumn(20, "Label");
1184                tbl.AddColumn(10, "Web Alias");
1185                tbl.AddColumn(10, "Type");
1186                tbl.AddColumn(15, "Modified");
1187                tbl.AddColumn(15, "By");
1188
1189                unsigned int vuiCount = schema.GetVUIs()->GetCount();
1190                for (unsigned int vuiIndex = 0; vuiIndex < vuiCount; ++vuiIndex)
1191                {
1192                        CARVui vui(schema.GetInsideId(), 0, vuiIndex);
1193
1194                        CTableRow row("");                     
1195                        row.AddCell( CTableCell(URLLink(vui, rootLevel)));
1196                        row.AddCell( CTableCell(vui.Label()));
1197                        row.AddCell( CTableCell(vui.webAlias()));
1198                        row.AddCell( CTableCell(CAREnum::VuiType(vui.GetType())));
1199                        row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(vui.GetTimestamp())));
1200                        row.AddCell( CTableCell(this->pInside->LinkToUser(vui.GetLastChanged(), rootLevel)));
1201                        tbl.AddRow(row);
1202                }
1203
1204                stringstream strm;
1205                strm << tbl;
1206                return strm.str();
1207        }
1208        catch(exception& e)
1209        {
1210                cout << "EXCEPTION creating schema vuilist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1211                return "";
1212        }
1213}
1214
1215string CDocSchemaDetails::TypeDetails()
1216{
1217        stringstream strm;
1218        strm.str("");
1219
1220        try
1221        {
1222                const ARCompoundSchema& compSchema = schema.GetCompound();
1223                switch(compSchema.schemaType)
1224                {
1225                case AR_SCHEMA_JOIN:
1226                        {
1227                                strm << "(" << "<span id='join-left'>" << this->pInside->LinkToSchema(compSchema.u.join.memberA, rootLevel) << "</span>" << " <-> " << "<span id='join-right'>" << this->pInside->LinkToSchema(compSchema.u.join.memberB, rootLevel) << "</span>" << ")" << "<br/>";
1228
1229                                if(compSchema.u.join.joinQual.operation != AR_COND_OP_NONE)
1230                                {
1231                                        stringstream strmQuery;
1232                                        CARSchema memberA(compSchema.u.join.memberA);
1233                                        CARSchema memberB(compSchema.u.join.memberB);
1234                                        CRefItem refItem(this->schema, REFM_SCHEMA_JOIN_QUALIFICATION);
1235
1236                                        CARQualification arQual(*this->pInside, refItem, memberA.GetInsideId(), memberB.GetInsideId(), rootLevel);
1237                                        arQual.CheckQuery(&compSchema.u.join.joinQual, strmQuery);
1238
1239                                        strm << "Qualification: " << strmQuery.str();
1240                                }
1241                        }
1242                        break;
1243                case AR_SCHEMA_VIEW:
1244                        {
1245                                strm << "<span class='additionalInfo'>" << "(" << "Table&nbsp;Name: " << compSchema.u.view.tableName << " &nbsp;&nbsp;&nbsp; "
1246                                     << "Key&nbsp;Field: " << compSchema.u.view.keyField << ")" << "</span>";
1247                        }
1248                        break;                 
1249                case AR_SCHEMA_VENDOR:
1250                        {
1251                                strm << "<span class='additionalInfo'>" << "(" << "Plugin:&nbsp;" << compSchema.u.vendor.vendorName << " &nbsp;&nbsp;&nbsp; ";
1252                                strm << "Table: " << compSchema.u.vendor.tableName << ")" << "</span>";
1253                        }
1254                        break;
1255                default:
1256                        {
1257                                strm << EmptyValue;
1258                        }
1259                        break;
1260                }
1261        }
1262        catch(exception& e)
1263        {
1264                cout << "EXCEPTION enumerating regular schema type information of '" << this->schema.GetName() << "': " << e.what() << endl;
1265        }
1266        return strm.str();
1267}
1268
1269string CDocSchemaDetails::ContainerReferences()
1270{
1271        stringstream strm;
1272        strm.str("");
1273        try
1274        {
1275                CContainerTable *contTable = new CContainerTable(*this->pInside);
1276
1277                //// Add Packing Lists ////
1278                const CARSchemaList::ObjectRefList& pkl = schema.GetPackingLists();
1279                CARSchemaList::ObjectRefList::const_iterator curIt = pkl.begin();
1280                CARSchemaList::ObjectRefList::const_iterator endIt = pkl.end();
1281
1282                for (; curIt != endIt; ++curIt)
1283                {
1284                        CARContainer cont(*curIt);
1285                        contTable->AddRow(cont, rootLevel);
1286                }
1287
1288                //// create output ////
1289                if(contTable->NumRows() > 0)
1290                        strm << *contTable;
1291                else
1292                        strm << EmptyValue;
1293
1294                delete contTable;
1295        }
1296        catch(exception& e)
1297        {
1298                cout << "EXCEPTION enumerating container references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1299        }
1300
1301        return strm.str();
1302}
1303
1304string CDocSchemaDetails::JoinFormReferences()
1305{
1306        stringstream strm;
1307        strm.str("");
1308        try
1309        {
1310                const ARNameType& schemaName = this->schema.GetARName();
1311                unsigned int schemaCount = this->pInside->schemaList.GetCount();
1312                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1313                {
1314                        CARSchema schema(schemaIndex);
1315
1316                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(schema))
1317                                continue;
1318
1319                        const ARCompoundSchema& compSchema = schema.GetCompound();
1320
1321                        if(compSchema.schemaType == AR_SCHEMA_JOIN)
1322                        {
1323                                if(strcmp(schemaName, compSchema.u.join.memberA) == 0)
1324                                {
1325                                        strm << "Primary Form in: " << URLLink(schema, rootLevel) << "<br/>" << endl;
1326                                }
1327
1328                                if(strcmp(schemaName, compSchema.u.join.memberB)==0)                                   
1329                                {
1330                                        strm << "Secondary Form in: " << URLLink(schema, rootLevel) << "<br/>" << endl;
1331                                }
1332                        }
1333                }
1334
1335                if(strm.str().size() == 0)
1336                        strm << EmptyValue;
1337        }
1338        catch(exception& e)
1339        {
1340                cout << "EXCEPTION enumerating join form references of '" << this->schema.GetName() << "': " << e.what() << endl;
1341        }
1342
1343        return strm.str();
1344}
1345
1346
1347string CDocSchemaDetails::TableFieldReferences()
1348{
1349        stringstream strm;
1350        strm.str("");
1351        try
1352        {
1353                // TODO: there is a function that checks for field references between table-field and column-field
1354                // before the documentation starts. Move this function over to this scanning routing and store
1355                // "table field to form" references in a list within the CARSchemaList
1356                // ===> move scaning over to CARInside::CustomFieldReferences
1357                bool bFound = false;
1358
1359                unsigned int schemaCount = pInside->schemaList.GetCount();
1360                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1361                {                       
1362                        CARSchema searchSchema(schemaIndex);
1363                       
1364                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(searchSchema))
1365                                continue;
1366
1367                        unsigned int fieldCount = searchSchema.GetFields()->GetCount();
1368                        for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
1369                        {
1370                                CARField field(schemaIndex, 0, fieldIndex);
1371                               
1372                                if(field.GetDataType() == AR_DATA_TYPE_TABLE && field.GetLimits().dataType == AR_DATA_TYPE_TABLE)
1373                                {
1374                                        const ARTableLimitsStruct &limit = field.GetLimits().u.tableLimits;                                     
1375                                        const char *tableSchema = limit.schema;
1376
1377                                        if (limit.schema[0] == '$')
1378                                                tableSchema = limit.sampleSchema;
1379
1380                                        if(schema.GetName().compare(tableSchema) == 0)
1381                                        {
1382                                                strm << "Table: " << URLLink(field, rootLevel);
1383                                                strm << " in form: " << URLLink(searchSchema, rootLevel) << "<br/>" << endl;
1384
1385                                                bFound = true;
1386                                        }
1387                                }
1388                        }
1389                }
1390
1391                if(!bFound)
1392                        strm << EmptyValue;
1393        }
1394        catch(exception& e)
1395        {
1396                cout << "EXCEPTION enumerating table references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1397        }
1398
1399        return strm.str();
1400}
1401
1402string CDocSchemaDetails::SearchMenuReferences()
1403{
1404        stringstream strm;
1405        strm.str("");
1406        try
1407        {
1408                CMenuTable *menuTable = new CMenuTable(*this->pInside);
1409
1410                const CARSchema::ReferenceList &refList = schema.GetReferences();
1411                CARSchema::ReferenceList::const_iterator curIt = refList.begin();
1412                CARSchema::ReferenceList::const_iterator endIt = refList.end();
1413
1414                for (; curIt != endIt; ++curIt)
1415                {
1416                        if (curIt->GetMessageId() == REFM_CHARMENU_FORM && curIt->GetObjectType() == AR_STRUCT_ITEM_XML_CHAR_MENU)
1417                        {
1418                                CARHandle<CARCharMenu> hMenu(*curIt);
1419                                menuTable->AddRow(*hMenu, rootLevel);
1420                        }
1421                }
1422
1423                if(menuTable->NumRows() > 0)
1424                        strm << *menuTable;
1425                else
1426                        strm << EmptyValue;
1427
1428                delete menuTable;
1429        }
1430        catch(exception& e)
1431        {
1432                cout << "EXCEPTION enumerating search menu references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1433        }
1434
1435        return strm.str();
1436}
1437
1438string CDocSchemaDetails::AlWindowOpenReferences()
1439{
1440        stringstream strm;
1441        strm.str("");
1442        try
1443        {
1444                CAlTable *alTable = new CAlTable(*this->pInside);
1445
1446                const CARSchema::ReferenceList &references = schema.GetReferences();
1447                CARSchema::ReferenceList::const_iterator curIt = references.begin();
1448                CARSchema::ReferenceList::const_iterator endIt = references.end();
1449
1450                for (; curIt != endIt; ++curIt)
1451                {
1452                        if (curIt->GetMessageId() != REFM_OPENWINDOW_FORM && curIt->GetObjectType() != AR_STRUCT_ITEM_XML_ACTIVE_LINK)
1453                                continue;
1454
1455                        CARActiveLink al(curIt->GetObjectId());
1456
1457                        if (!al.Exists())
1458                                continue;
1459
1460                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(al))
1461                                continue;
1462
1463                        alTable->AddRow(curIt->GetObjectId(), rootLevel);
1464                }
1465
1466                if(alTable->NumRows() > 0)
1467                        strm << *alTable;
1468                else
1469                        strm << EmptyValue;
1470
1471                delete alTable;
1472        }
1473        catch(exception& e)
1474        {
1475                cout << "EXCEPTION enumerating window open references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1476        }
1477
1478        return strm.str();
1479}
1480
1481string CDocSchemaDetails::ShowProperties()
1482{
1483        stringstream strm;
1484        strm.str("");
1485        int schemaType = this->schema.GetCompound().schemaType;
1486       
1487        try
1488        {
1489                const ARPropList& propList = this->schema.GetPropList();
1490                CARProplistHelper propIdx(&propList);
1491
1492                strm << "<div id='schemaProperties'>";
1493
1494                // doc basic properties
1495                ShowBasicProperties(strm, &propIdx);
1496                ShowEntryPointProperties(strm, &propIdx);
1497
1498                if (schemaType != AR_SCHEMA_DIALOG)
1499                {
1500                        ShowResultListProperties(strm, &propIdx);
1501                        ShowSortListProperties(strm, &propIdx);
1502                        ShowArchiveProperties(strm);
1503
1504                        if (pInside->CompareServerVersion(7,0) >= 0) 
1505                        {
1506                                ShowAuditProperties(strm);
1507                        }
1508                       
1509                        if (schemaType != AR_SCHEMA_VENDOR && schemaType != AR_SCHEMA_VIEW)
1510                                ShowIndexProperties(strm, &propIdx);
1511
1512                        ShowFTSMTSProperties(strm, &propIdx);
1513                }
1514
1515                ShowPermissionProperties(strm, &propIdx);
1516
1517                propIdx.UnusedPropertiesToHTML(strm, rootLevel);
1518
1519                ShowChangeHistory(strm, &propIdx);
1520
1521                strm << "</div>";
1522        }
1523        catch(exception& e)
1524        {
1525                cerr << "EXCEPTION enumerating properties: " << e.what() << endl;
1526        }
1527        return strm.str();
1528}
1529
1530void CDocSchemaDetails::ShowBasicProperties(std::ostream& strm, CARProplistHelper* propIndex)
1531{
1532        ARValueStruct* propVal;
1533
1534        try
1535        {
1536                stringstream tmpStrm;
1537                CTable tbl("basicProps", "TblNoBorder");
1538                tbl.AddColumn(20, "Description");
1539                tbl.AddColumn(80, "Value");
1540                tbl.DisableHeader();
1541
1542                // entry id block size
1543                ARLong32 nextIDBlockSize = -1;
1544
1545                propVal = propIndex->GetAndUseValue(AR_OPROP_NEXT_ID_BLOCK_SIZE);
1546                if (propVal != NULL)
1547                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1548                                nextIDBlockSize = propVal->u.intVal;
1549
1550                tmpStrm.str("");
1551                tmpStrm << (nextIDBlockSize>0?"Enabled":"Disabled") << "<br/>";
1552                if (nextIDBlockSize>0)
1553                        tmpStrm << "Size: " << nextIDBlockSize;
1554
1555                CTableRow rowBS("");
1556                rowBS.AddCell("Next Request ID Block");
1557                rowBS.AddCell(tmpStrm.str());
1558                tbl.AddRow(rowBS);
1559
1560#if AR_CURRENT_API_VERSION >= AR_API_VERSION_710
1561                // cache properties
1562                ARLong32 cacheDisplayProps = -1;
1563
1564                propVal = propIndex->GetAndUseValue(AR_OPROP_CACHE_DISP_PROP);
1565                if (propVal != NULL) 
1566                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1567                                cacheDisplayProps = propVal->u.intVal;
1568
1569                tmpStrm.str("");
1570                tmpStrm << "Override Server Settings: " << (cacheDisplayProps>=0?"Enabled":"Disabled");
1571                if (cacheDisplayProps>=0)
1572                {
1573                        tmpStrm << "<br/>";
1574                        tmpStrm << CWebUtil::ChkBoxInput("disableVUICaching",(cacheDisplayProps & AR_CACHE_DPROP_VUI) > 0) << "Disable VUI Display Property Caching<br/>" ;
1575                        tmpStrm << CWebUtil::ChkBoxInput("disableFieldCaching",(cacheDisplayProps & AR_CACHE_DPROP_FIELD) > 0) << "Disable Field Display Property Caching" ;
1576                }
1577
1578                CTableRow rowOC("");
1579                rowOC.AddCell("Display Property Caching");
1580                rowOC.AddCell(tmpStrm.str());
1581                tbl.AddRow(rowOC);
1582
1583                /////////////////////////////////////////////////////////////////////////////////////
1584
1585                ARLong32 disableStatusHistory = 0;
1586                propVal = propIndex->GetAndUseValue(AR_OPROP_CORE_FIELDS_OPTION_MASK);
1587                if (propVal != NULL)
1588                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1589                                disableStatusHistory = propVal->u.intVal;
1590
1591                CTableRow disSH("");
1592                disSH.AddCell("Disable Status History");
1593                disSH.AddCell((disableStatusHistory & AR_CORE_FIELDS_OPTION_DISABLE_STATUS_HISTORY ? "Yes" : "No"));
1594                tbl.AddRow(disSH);
1595
1596#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
1597                ARLong32 allowDelete = 0;
1598                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_ALLOW_DELETE);
1599                if (propVal != NULL)
1600                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1601                                allowDelete = propVal->u.intVal;
1602
1603                CTableRow row("");
1604                row.AddCell("Allow Delete");
1605                row.AddCell((allowDelete == 1 ? "Yes" : "No"));
1606                tbl.AddRow(row);
1607
1608                /////////////////////////////////////////////////////////////////////////////////////
1609
1610                ARLong32 allowDrillDownWebReports = 0;
1611                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_ALLOW_DELETE);
1612                if (propVal != NULL)
1613                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1614                                allowDrillDownWebReports = propVal->u.intVal;
1615
1616                row.ClearCells();
1617                row.AddCell("Allow Drill Down in Web Reports");
1618                row.AddCell((allowDrillDownWebReports == 1 ? "Yes" : "No"));
1619                tbl.AddRow(row);
1620
1621                /////////////////////////////////////////////////////////////////////////////////////
1622
1623                ARLong32 value = 0;
1624                propVal = propIndex->GetAndUseValue(AR_OPROP_LOCALIZE_FORM_VIEWS);
1625                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
1626                {
1627                        value = propVal->u.intVal;
1628                }
1629                else
1630                        value = AR_LOCALIZE_FORM_VIEWS_ALL;     // default, if property isn't present
1631
1632                const char* strState = "Disabled";
1633                if (value == AR_LOCALIZE_FORM_VIEWS_ALL) strState = "All";
1634                if (value == AR_LOCALIZE_FORM_VIEWS_ALIASES) strState = "Only for selection field aliases";
1635
1636                row.ClearCells();
1637                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_LOCALIZE_FORM_VIEWS));
1638                row.AddCell(strState);
1639                tbl.AddRow(row);
1640
1641                /////////////////////////////////////////////////////////////////////////////////////
1642
1643                value = 0;
1644                propVal = propIndex->GetAndUseValue(AR_OPROP_LOCALIZE_FORM_DATA);
1645                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
1646                {
1647                        value = propVal->u.intVal;
1648                }
1649                else
1650                        value = AR_LOCALIZE_FORM_DATA_ALL; // default, if property isn't present
1651
1652                row.ClearCells();
1653                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_LOCALIZE_FORM_DATA));
1654                row.AddCell((value == 1 ? "Yes" : "No"));
1655                tbl.AddRow(row);
1656
1657#if AR_CURRENT_API_VERSION >= AR_API_VERSION_800
1658               
1659                const char* strValue = "";
1660                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_TAG_NAME);
1661                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_CHAR)
1662                {
1663                        strValue = propVal->u.charVal;
1664                }
1665
1666                row.ClearCells();
1667                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_FORM_TAG_NAME));
1668                row.AddCell(strValue);
1669                tbl.AddRow(row);
1670
1671#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_800
1672#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_763
1673#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_710
1674
1675                // now write the table
1676                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Basic" << "</h2>";
1677                strm << "<div>" << tbl << "</div>";
1678        }
1679        catch(exception& e)
1680        {
1681                cout << "EXCEPTION enumerating basic properties: " << e.what() << endl;
1682        }
1683}
1684
1685void CDocSchemaDetails::ShowEntryPointProperties(std::ostream &strm, CARProplistHelper *propIndex)
1686{
1687        ARValueStruct* propVal;
1688
1689        try
1690        {
1691                stringstream tmpStrm;
1692                CTable tbl("entryPoints", "TblNoBorder");
1693                tbl.AddColumn(20, "Description");
1694                tbl.AddColumn(80, "Value");
1695                tbl.DisableHeader();
1696
1697                // entry points
1698                ARLong32 entryPointNewOrder = -1;
1699                ARLong32 entryPointSearchOrder = -1;
1700
1701                propVal = propIndex->GetAndUseValue(AR_SMOPROP_ENTRYPOINT_DEFAULT_NEW_ORDER);
1702                if (propVal != NULL) 
1703                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1704                                entryPointNewOrder = propVal->u.intVal;
1705
1706                propVal = propIndex->GetAndUseValue(AR_SMOPROP_ENTRYPOINT_DEFAULT_SEARCH_ORDER);
1707                if (propVal != NULL) 
1708                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1709                                entryPointSearchOrder = propVal->u.intVal;
1710
1711
1712                tmpStrm << CWebUtil::ChkBoxInput("" ,(entryPointNewOrder >= 0)) << "Enable Entry Point" << "<br/>";
1713                tmpStrm << "Application List Display Order: "; if (entryPointNewOrder >=0) tmpStrm << entryPointNewOrder; tmpStrm << "<br/>" << "<br/>";
1714
1715                CTableRow row;
1716                row.AddCell("New Mode");
1717                row.AddCell(tmpStrm.str());
1718                tbl.AddRow(row);
1719               
1720                tmpStrm.str("");
1721                tmpStrm << CWebUtil::ChkBoxInput("", (entryPointSearchOrder >= 0)) << "Enable Entry Point" << "<br/>";
1722                tmpStrm << "Application List Display Order: "; if (entryPointSearchOrder >= 0) tmpStrm << entryPointSearchOrder; tmpStrm << endl;
1723
1724                row.ClearCells();
1725                row.AddCell("Search Mode");
1726                row.AddCell(tmpStrm.str());
1727                tbl.AddRow(row);
1728               
1729                // now write the table
1730                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "EntryPoints" << "</h2>";
1731                strm << "<div>" << tbl << "</div>";
1732        }
1733        catch(exception& e)
1734        {
1735                cout << "EXCEPTION enumerating basic properties: " << e.what() << endl;
1736        }
1737}
1738
1739void CDocSchemaDetails::ShowAuditProperties(std::ostream& strm)
1740{
1741        try
1742        {
1743                const ARAuditInfoStruct& audit = this->schema.GetAuditInfo();
1744                CTable tbl("displayPropList", "TblObjectList");
1745                tbl.AddColumn(20, "Description");
1746                tbl.AddColumn(80, "Values");
1747
1748                CTableRow row("");
1749                row.AddCell("Audit Style");
1750                row.AddCell(CAREnum::AuditStyle(audit.style));
1751                tbl.AddRow(row);
1752
1753                row.ClearCells();
1754                row.AddCell("Audit Enabled");
1755                row.AddCell((audit.enable==0?"No":"Yes"));
1756                tbl.AddRow(row);
1757
1758#if AR_CURRENT_API_VERSION > 13 // Version 7.5 and higher
1759                row.ClearCells();
1760                row.AddCell("Audit Only Changed Fields");
1761                row.AddCell(CAREnum::AuditChangedFields(audit.auditMask));
1762                tbl.AddRow(row);
1763#endif
1764
1765                row.ClearCells();
1766                switch (audit.style)
1767                {
1768                        case AR_AUDIT_NONE:
1769                                {
1770                                        if (audit.formName[0] != 0)
1771                                        {
1772                                                row.AddCell("Audited From Form");
1773                                                row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1774                                                tbl.AddRow(row);
1775                                        }
1776                                }
1777                                break;
1778                        case AR_AUDIT_COPY:
1779                                {
1780                                        row.AddCell("Audit Form");
1781                                        row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1782                                        tbl.AddRow(row);
1783                                }
1784                                break;
1785                        case AR_AUDIT_LOG:
1786                                {
1787                                        row.AddCell("Audit Log Form");
1788                                        row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1789                                        tbl.AddRow(row);
1790                                }
1791                                break;
1792                        case AR_AUDIT_LOG_SHADOW:
1793                                {
1794                                        row.AddCell("Audited From Forms");
1795                                        row.AddCell(AuditTargetReferences());
1796                                        tbl.AddRow(row);
1797                                }
1798                                break;
1799                }
1800
1801                // audit qualification
1802                stringstream qualStrm; qualStrm.str("");
1803                int pFormId = schema.GetInsideId();
1804
1805                if (audit.query.operation != AR_COND_OP_NONE)
1806                {
1807                        CRefItem refItem(this->schema, REFM_SCHEMA_AUDIT_QUALIFICATION);
1808                        CARQualification arQual(*this->pInside, refItem, pFormId, rootLevel);
1809                        arQual.CheckQuery(&audit.query, qualStrm);
1810                }
1811                else
1812                {
1813                        qualStrm << EmptyRunIf << endl;
1814                }
1815
1816                row.ClearCells();
1817                row.AddCell("Qualification");
1818                row.AddCell(qualStrm.str());
1819                tbl.AddRow(row);
1820
1821                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Audit Settings" << "</h2>";
1822                strm << "<div>" << tbl << "</div>";
1823        }
1824        catch (...)
1825        {
1826                cerr << "EXCEPTION audit properties" << endl;
1827        }
1828}
1829
1830void CDocSchemaDetails::ShowArchiveProperties(std::ostream& strm)
1831{
1832        try
1833        {
1834                const ARArchiveInfoStruct& archive = this->schema.GetArchiveInfo();
1835                bool archiveToForm = (archive.archiveType & AR_ARCHIVE_FORM)>0;
1836                bool deleteSource = (archive.archiveType & AR_ARCHIVE_DELETE)>0;
1837                bool archiveToFile = (archive.archiveType & (AR_ARCHIVE_FILE_ARX | AR_ARCHIVE_FILE_XML))>0;
1838                unsigned int fileFormat = (archive.archiveType & (AR_ARCHIVE_FILE_ARX | AR_ARCHIVE_FILE_XML)) << 2;
1839                bool noAttachments = (archive.archiveType & AR_ARCHIVE_NO_ATTACHMENTS)>0;
1840                bool noDiary = (archive.archiveType & AR_ARCHIVE_NO_DIARY)>0;
1841
1842                CTable tbl("displayPropList", "TblObjectList");
1843                tbl.AddColumn(20, "Description");
1844                tbl.AddColumn(80, "Values");
1845
1846                // archive type
1847                stringstream typeStrm; typeStrm.str("");
1848                if (!archiveToForm && !archiveToFile)
1849                {
1850                        typeStrm << "None";
1851                }
1852                else if (archiveToForm || deleteSource)
1853                {
1854                        if (archiveToForm) typeStrm << "Copy to Archive";
1855                        if (deleteSource && archiveToForm) typeStrm << " and ";
1856                        if (deleteSource) typeStrm << "Delete From Source";
1857                }
1858
1859                CTableRow row("");
1860                row.AddCell("Archive Type");
1861                row.AddCell(typeStrm.str());
1862                tbl.AddRow(row);
1863
1864                row.ClearCells();
1865                row.AddCell("Archive State");
1866                row.AddCell((archive.enable==0?"Disabled":"Enabled"));
1867                tbl.AddRow(row);
1868
1869                row.ClearCells();
1870                if (archiveToFile)
1871                {
1872                        // archive to file is not supported by admin/developer tool; but maybe some day...
1873                        row.AddCell("Archive to File");
1874                        row.AddCell(archive.u.dirPath);
1875                        tbl.AddRow(row);
1876                }
1877                else if (archiveToForm)
1878                {
1879                        stringstream tmpStrm; tmpStrm.str("");
1880                        tmpStrm << this->pInside->LinkToSchema(archive.u.formName,rootLevel) << "<br/>" << endl;
1881                        tmpStrm << CWebUtil::ChkBoxInput("noAttachments",noAttachments) << "No Attachments&nbsp;&nbsp;";
1882                        tmpStrm << CWebUtil::ChkBoxInput("noDiary",noDiary) << "No Diary" << endl;
1883
1884                        row.AddCell("Archive to Form");
1885                        row.AddCell(tmpStrm.str());
1886                        tbl.AddRow(row);
1887                }
1888
1889                if (archive.archiveFrom[0] != 0)
1890                {
1891                        row.ClearCells();
1892                        row.AddCell("Archive From Form");
1893                        row.AddCell(this->pInside->LinkToSchema(archive.archiveFrom, rootLevel));
1894                        tbl.AddRow(row);
1895                }
1896
1897                stringstream qualStrm; qualStrm.str("");
1898                int pFormId = this->schema.GetInsideId(); //this->pInside->SchemaGetInsideId(this->schema.GetARName());
1899
1900                if (archive.query.operation != AR_COND_OP_NONE)
1901                {
1902                        CRefItem refItem(this->schema, REFM_SCHEMA_ARCHIVE_QUALIFICATION);
1903                        CARQualification arQual(*this->pInside, refItem, pFormId, rootLevel);
1904                        arQual.CheckQuery(&archive.query, qualStrm);
1905                }
1906                else
1907                {
1908                        qualStrm << EmptyRunIf << endl;
1909                }
1910
1911                row.ClearCells();
1912                row.AddCell("Times");
1913                row.AddCell(CARDayStructHelper::DayStructToHTMLString(archive.archiveTime));
1914                tbl.AddRow(row);
1915
1916                row.ClearCells();
1917                row.AddCell("Qualification");
1918                row.AddCell(qualStrm.str());
1919                tbl.AddRow(row);
1920
1921                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Archive Settings" << "</h2>";
1922                strm << "<div>" << tbl << "</div>";
1923        }
1924        catch (...)
1925        {
1926                cerr << "EXCEPTION archive properties" << endl;
1927        }
1928}
1929
1930void CDocSchemaDetails::WorkflowReferences(std::ostream &strm)
1931{
1932        try
1933        {
1934                CTable tabSet("setFieldReferences", "TblObjectList");
1935                tabSet.AddColumn(50, "Object Name");
1936                tabSet.AddColumn(10, "Enabled");
1937                tabSet.AddColumn(20, "Execute On");
1938                tabSet.AddColumn(20, "Description");
1939
1940                CTable tabPush("pushReferences", "TblObjectList");
1941                tabPush.AddColumn(50, "Object Name");
1942                tabPush.AddColumn(10, "Enabled");
1943                tabPush.AddColumn(20, "Execute On");
1944                tabPush.AddColumn(20, "Description");
1945
1946                CTable delAction("deleteReferences", "TblObjectList");
1947                delAction.AddColumn(50, "Object Name");
1948                delAction.AddColumn(10, "Enabled");
1949                delAction.AddColumn(20, "Execute On");
1950                delAction.AddColumn(20, "Description");
1951
1952                CTable tabService("serviceReferences", "TblObjectList");
1953                tabService.AddColumn(50, "Object Name");
1954                tabService.AddColumn(10, "Enabled");
1955                tabService.AddColumn(20, "Execute On");
1956                tabService.AddColumn(20, "Description");
1957
1958
1959                const CARSchema::ReferenceList &refList = schema.GetReferences();
1960                CARSchema::ReferenceList::const_iterator curIt = refList.begin();
1961                CARSchema::ReferenceList::const_iterator endIt = refList.end();
1962
1963                for (; curIt != endIt; ++curIt)
1964                {
1965                        int messageId = curIt->GetMessageId();
1966                        if (messageId == REFM_SETFIELDS_FORM)
1967                        {
1968                                bool hasEnabledFlag;
1969                                string tmpEnabled = "";
1970                                string tmpCssEnabled = "";
1971
1972                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
1973
1974                                if (hasEnabledFlag)
1975                                {
1976                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
1977                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
1978                                }
1979
1980                                CTableRow row;
1981                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
1982                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
1983                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
1984                                row.AddCell(curIt->GetDescription(rootLevel));
1985                                tabSet.AddRow(row);
1986                        }
1987                        if (messageId == REFM_SERVICE_CALL)
1988                        {
1989                                bool hasEnabledFlag;
1990                                string tmpEnabled = "";
1991                                string tmpCssEnabled = "";
1992
1993                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
1994
1995                                if (hasEnabledFlag)
1996                                {
1997                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
1998                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
1999                                }
2000
2001                                CTableRow row;
2002                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2003                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2004                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2005                                row.AddCell(curIt->GetDescription(rootLevel));
2006                                tabService.AddRow(row);
2007                        }
2008                        if (messageId == REFM_PUSHFIELD_TARGET)
2009                        {
2010                                bool hasEnabledFlag;
2011                                string tmpEnabled = "";
2012                                string tmpCssEnabled = "";
2013
2014                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2015
2016                                if (hasEnabledFlag)
2017                                {
2018                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2019                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2020                                }
2021
2022                                CTableRow row;
2023                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2024                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2025                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2026                                row.AddCell(curIt->GetDescription(rootLevel));
2027                                tabPush.AddRow(row);
2028                        }
2029                        if (messageId == REFM_DELETE_ENTRY_ACTION)
2030                        {
2031                                bool hasEnabledFlag;
2032                                string tmpEnabled = "";
2033                                string tmpCssEnabled = "";
2034
2035                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2036
2037                                if (hasEnabledFlag)
2038                                {
2039                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2040                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2041                                }
2042
2043                                CTableRow row;
2044                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2045                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2046                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2047                                row.AddCell(curIt->GetDescription(rootLevel));
2048                                delAction.AddRow(row);
2049                        }
2050                }
2051
2052                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow reading data from this form" << endl;
2053                tabSet.ToXHtml(strm);
2054
2055                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow writing data to this form" << endl;
2056                tabPush.ToXHtml(strm);
2057
2058                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow deleting data on this form" << endl;
2059                delAction.ToXHtml(strm);
2060
2061                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow executing services on this form" << endl;
2062                tabService.ToXHtml(strm);
2063        }
2064        catch(exception& e)
2065        {
2066                cout << "EXCEPTION enumerating filter push fields references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
2067        }
2068}
2069
2070string CDocSchemaDetails::GenerateReferencesTable(const ARCompoundSchema &compSchema)
2071{
2072        stringstream strmTmp;
2073        WorkflowReferences(strmTmp);
2074
2075        //Schema Properties
2076        CTable tblObjProp("objProperties", "TblObjectList");
2077        tblObjProp.AddColumn(0, "Property");
2078        tblObjProp.AddColumn(0, "Value");
2079
2080        //Schema type informations
2081        CTableRow row("cssStdRow");     
2082        CTableCell cellProp("");                               
2083        CTableCell cellPropValue("");   
2084
2085        //Container References
2086        row.ClearCells();
2087        cellProp.content = "Container References";
2088        cellPropValue.content = this->ContainerReferences();
2089        row.AddCell(cellProp);
2090        row.AddCell(cellPropValue);
2091        tblObjProp.AddRow(row);                 
2092
2093        //TableField References
2094        row.ClearCells();
2095        cellProp.content = "Table Fields datasource form";
2096        cellPropValue.content = this->TableFieldReferences();
2097        row.AddCell(cellProp);
2098        row.AddCell(cellPropValue);
2099        tblObjProp.AddRow(row); 
2100
2101        //AL window open references
2102        row.ClearCells();
2103        cellProp.content = "Active Link \"Open Window Action\"";
2104        cellPropValue.content = this->AlWindowOpenReferences();
2105        row.AddCell(cellProp);
2106        row.AddCell(cellPropValue);
2107        tblObjProp.AddRow(row);
2108
2109        //Join References
2110        row.ClearCells();
2111        cellProp.content = "Join Form References";
2112        cellPropValue.content = this->JoinFormReferences();
2113        row.AddCell(cellProp);
2114        row.AddCell(cellPropValue);
2115        tblObjProp.AddRow(row);
2116
2117        //Menu References
2118        row.ClearCells();
2119        cellProp.content = "Search Menu References";
2120        cellPropValue.content = this->SearchMenuReferences();
2121        row.AddCell(cellProp);
2122        row.AddCell(cellPropValue);
2123        tblObjProp.AddRow(row);
2124
2125        strmTmp << tblObjProp;
2126        return strmTmp.str();
2127}
2128
2129bool CDocSchemaDetails::IsJoinViewOrVendorForm()
2130{
2131        switch(this->schema.GetCompound().schemaType)
2132        {
2133        case AR_SCHEMA_JOIN:
2134        case AR_SCHEMA_VIEW:
2135        case AR_SCHEMA_VENDOR:
2136                return true;
2137        default:       
2138                return false;
2139        }
2140}
2141
2142string CDocSchemaDetails::ShowGeneralInfo()
2143{
2144        const ARCompoundSchema &compSchema = this->schema.GetCompound();
2145        stringstream strm;
2146
2147        CTable tbl("general", "TblNoBorder");
2148        tbl.AddColumn(20, "");
2149        tbl.AddColumn(80, "");
2150        tbl.DisableHeader();
2151
2152        CTableRow row;
2153        row.AddCell("Name");
2154        row.AddCell(this->schema.GetName());
2155        tbl.AddRow(row);       
2156        row.ClearCells();
2157
2158        // generate the schema type row (and with additional details for special form types like join, view and vendor)
2159        row.AddCell("Type");
2160        row.AddCell(GetSchemaType());
2161        tbl.AddRow(row);
2162        row.ClearCells();
2163        strm.str("");
2164
2165        // search for the default vui
2166        CARVui defaultVUI(this->schema.GetInsideId(), this->schema.GetDefaultVUI());
2167
2168        row.AddCell("Default View");
2169        row.AddCell(CheckedURLLink(defaultVUI, schema.GetDefaultVUI(), rootLevel));
2170        tbl.AddRow(row);
2171        row.ClearCells();
2172
2173        strm << tbl.ToXHtml();
2174        tbl.ClearRows();
2175
2176        if (pInside->CompareServerVersion(7,1) >= 0)
2177        {
2178                stringstream numberConverter;
2179                if (schema.GetDbTableId() > 0)
2180                        numberConverter << schema.GetDbTableId();
2181
2182                row.AddCell("DB Table ID");
2183                row.AddCell(numberConverter.str());
2184                tbl.AddRow(row);
2185                row.ClearCells();
2186
2187                if (compSchema.schemaType != AR_SCHEMA_DIALOG && compSchema.schemaType != AR_SCHEMA_VENDOR)
2188                {
2189                        row.AddCell("DB Table View");
2190                        row.AddCell(schema.GetDbViewName());
2191                        tbl.AddRow(row);
2192                        row.ClearCells();
2193
2194                        row.AddCell("DB Table SH Views");
2195                        row.AddCell(schema.GetDbShViewName());
2196                        tbl.AddRow(row);
2197                        row.ClearCells();
2198                }
2199
2200                strm << tbl.ToXHtml();
2201        }
2202
2203        strm << "<hr/>" << endl;
2204
2205        strm << ShowProperties();
2206
2207        strm << "<hr/>" << endl;
2208
2209        return strm.str();
2210}
2211
2212void CDocSchemaDetails::ShowFTSMTSProperties(std::ostream& strm, CARProplistHelper *propIndex)
2213{
2214#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
2215        if (pInside->CompareServerVersion(7,6,3) < 0)
2216                return;
2217
2218        ARValueStruct* propVal;
2219        int iValue;
2220
2221        try
2222        {
2223                stringstream tmpStrm;
2224                CTable tbl("ftsProps", "TblNoBorder");
2225                tbl.AddColumn(20, "Description");
2226                tbl.AddColumn(80, "Value");
2227                tbl.DisableHeader();
2228
2229                ///////////////////////////////////////////////////////////////////////////////////////
2230
2231                CTableRow       row("");
2232                iValue = 0;
2233                propVal = propIndex->GetAndUseValue(AR_OPROP_MFS_OPTION_MASK);
2234                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2235                        iValue = propVal->u.intVal;
2236               
2237                row.AddCell("Exclude from multi-form search");
2238                row.AddCell((iValue & AR_MULTI_FORM_SEARCH_OPTION_EXCLUDE ? "Yes" : "No"));             
2239                tbl.AddRow(row);
2240
2241                ///////////////////////////////////////////////////////////////////////////////////////
2242
2243                row.ClearCells();
2244                char* strValue = NULL;
2245                vector<int> weightedRelevancyFields; weightedRelevancyFields.resize(4);
2246
2247                propVal = propIndex->GetAndUseValue(AR_OPROP_MFS_WEIGHTED_RELEVANCY_FIELDS);
2248                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_CHAR)
2249                        strValue = propVal->u.charVal;
2250
2251
2252                if (strValue != NULL && strValue[0] != 0)
2253                {
2254                        int numFields = atoi(strValue);
2255                        char* newPos = strchr(strValue, ';');
2256                        if (newPos)
2257                        {
2258                                strValue = newPos + 1;
2259                                for (int fieldPos = 0; fieldPos < numFields; fieldPos++)
2260                                {
2261                                        int fieldTag = atoi(strValue);
2262                                       
2263                                        newPos = strchr(strValue, ';');
2264                                        if (newPos)
2265                                        {
2266                                                strValue = newPos + 1;
2267                                                int fieldId = atoi(strValue);
2268                                               
2269                                                if (fieldTag > 0 && fieldTag <= AR_MFS_WEIGHTED_RELEVANCY_KEYWORDS_FIELD_TAG)
2270                                                {
2271                                                        weightedRelevancyFields[fieldTag-1] = fieldId;
2272                                                }
2273                                        }
2274                                }
2275                        }
2276                }
2277
2278                CTable weightedRelFields("WRFields", "TblNoBorder");
2279                weightedRelFields.AddColumn(0, "");
2280                weightedRelFields.AddColumn(80, "");
2281                weightedRelFields.DisableHeader();
2282
2283                for (unsigned int wrfPos = 0; wrfPos < AR_MFS_WEIGHTED_RELEVANCY_KEYWORDS_FIELD_TAG; wrfPos++)
2284                {
2285                        int fieldId = weightedRelevancyFields[wrfPos];
2286
2287                        CTableRow wrfRow("");
2288                        wrfRow.AddCell(CAREnum::WeightedRelevancyFieldType(wrfPos+1));
2289                        wrfRow.AddCell((fieldId > 0 ? pInside->LinkToField(this->schema.GetInsideId(), fieldId, rootLevel) : ""));
2290                        weightedRelFields.AddRow(wrfRow);
2291
2292                        if (fieldId > 0 && (!pInside->appConfig.bOverlaySupport || IsVisibleObject(schema)))
2293                        {
2294                                CRefItem ref(schema, REFM_SCHEMA_FTS_WEIGHTED_RELEVANCY_FIELD);
2295                                pInside->AddFieldReference(schema.GetInsideId(), fieldId, ref);
2296                        }
2297                }
2298
2299                row.AddCell("Weighted relevancy fields");
2300                row.AddCell(weightedRelFields.ToXHtml());
2301                tbl.AddRow(row);
2302
2303                ///////////////////////////////////////////////////////////////////////////////////////
2304
2305                row.ClearCells();
2306                ARDayStruct timeValue;
2307                unsigned int intervalValue = 0;
2308
2309                ARZeroMemory(&timeValue);
2310
2311                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_MONTH_MASK);
2312                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2313                        timeValue.monthday = propVal->u.intVal;
2314
2315                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_WEEKDAY_MASK);
2316                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2317                        timeValue.weekday = propVal->u.intVal;
2318
2319                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_HOUR_MASK);
2320                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2321                        timeValue.hourmask = propVal->u.intVal;
2322               
2323                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_MINUTE);
2324                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2325                        timeValue.minute = propVal->u.intVal;
2326
2327                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_INTERVAL);
2328                if (propVal != NULL && (propVal->dataType == AR_DATA_TYPE_INTEGER || propVal->dataType == AR_DATA_TYPE_ULONG))
2329                        intervalValue = propVal->u.ulongVal;
2330               
2331                row.AddCell("FT-indexed field updates");
2332                if (timeValue.monthday != 0 || timeValue.weekday != 0 || timeValue.hourmask != 0 || timeValue.minute != 0)
2333                {
2334                        row.AddCell(CARDayStructHelper::DayStructToHTMLString(timeValue));
2335                }
2336                else if (intervalValue != 0)
2337                {
2338                        unsigned int days, hours, minutes, seconds;
2339                        CARDayStructHelper::SplitInterval(intervalValue, days, hours, minutes, seconds);
2340
2341                        tmpStrm.str("");
2342                        tmpStrm << days << " Days " << hours << " Hours " << minutes << " Minutes";
2343                        row.AddCell(tmpStrm.str());
2344                }
2345                else
2346                {
2347                        row.AddCell("No Time specified");
2348                }
2349                tbl.AddRow(row);
2350
2351                ///////////////////////////////////////////////////////////////////////////////////////
2352
2353                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Full Text Search" << "</h2>";
2354                strm << "<div>" << tbl << "</div>";
2355        }
2356        catch (exception &e)
2357        {
2358                cerr << "EXCEPTION in ShowFTSMTSProperties: " << e.what() << endl;
2359        }
2360#endif
2361}
2362
2363void CDocSchemaDetails::ShowChangeHistory(std::ostream &strm, CARProplistHelper *propIndex)
2364{
2365        strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Change History &amp; Helptext" << "</h2>"
2366             << "<div>" << this->pInside->ServerObjectHistory(&this->schema, rootLevel, true) << "</div>" << endl;
2367}
2368
2369string CDocSchemaDetails::GetSchemaType()
2370{
2371        const ARCompoundSchema &compSchema = schema.GetCompound();
2372        unsigned int schemaType = schema.GetInternalSchemaType();
2373        stringstream strm;
2374
2375        if (schemaType == AR_SCHEMA_JOIN)
2376        {
2377                strm << CAREnum::JoinType(compSchema.u.join.option) << "-";
2378        }
2379        strm << CAREnum::SchemaType(schemaType);
2380
2381        if(schemaType == AR_SCHEMA_JOIN
2382                || schemaType == AR_SCHEMA_VIEW
2383                || schemaType == AR_SCHEMA_VENDOR)
2384        {
2385                strm << " " << this->TypeDetails();
2386        }
2387
2388        return strm.str();
2389}
2390
2391string CDocSchemaDetails::AuditTargetReferences()
2392{
2393        vector<int> schemas;
2394
2395        const CARSchema::ReferenceList &references = schema.GetReferences();
2396        CARSchema::ReferenceList::const_iterator curIt = references.begin();
2397        CARSchema::ReferenceList::const_iterator endIt = references.end();
2398
2399        for (; curIt != endIt; ++curIt)
2400        {
2401                if (curIt->GetMessageId() == REFM_SCHEMA_AUDIT_SOURCE && curIt->GetObjectType() == AR_STRUCT_ITEM_XML_SCHEMA)
2402                        schemas.push_back(curIt->GetObjectId());
2403        }
2404
2405        if (schemas.size() > 0)
2406        {
2407                stringstream strm;
2408               
2409                size_t count = schemas.size();
2410
2411                for (size_t index = 0; index < count; ++index)
2412                {
2413                        if (index > 0) { strm << "<br/>"; }
2414                        strm << pInside->LinkToSchema(schemas[index], rootLevel);
2415                }
2416                return strm.str();
2417        }
2418        return "";
2419}
Note: See TracBrowser for help on using the repository browser.