source: branches/work_304/doc/DocSchemaDetails.cpp @ 385

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