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

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