source: branches/work_311/doc/DocSchemaDetails.cpp @ 604

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