source: branches/work_311/doc/DocMain.cpp @ 609

Revision 609, 57.4 KB checked in by jls17, 5 years ago (diff)
  • improved the layout of the filter control on the schemas workflow tab if there is not enough space for all checkboxes to fit into a single line
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 "DocMain.h"
19#include "../output/IFileStructure.h"
20#include "../output/ImageTag.h"
21#include "../output/LetterFilterControl.h"
22#include "../output/URLLink.h"
23#include "../core/ARServerInfo.h"
24
25#include "rapidjson/document.h"
26#include "rapidjson/genericwritestream.h"
27#include "rapidjson/writer.h"
28
29using namespace rapidjson;
30
31CDocMain::CDocMain()
32{
33}
34
35CDocMain::~CDocMain(void)
36{
37}
38
39int CDocMain::Index()
40{
41        try
42        {
43                CWebPage webPage("index", "Documentation Index", 0, this->pInside->appConfig); 
44                webPage.AddContent("This space is intentionally left blank...");
45                return webPage.SaveInFolder("");
46        }
47        catch(exception& e)
48        {
49                cout << "EXCEPTION Index: " << e.what() << endl;
50        }
51        return 0;
52}
53
54void CDocMain::ServerInfoList()
55{
56        CPageParams file(PAGE_SERVER_INFO);
57
58        try
59        {
60                int rootLevel = file->GetRootLevel();
61                CWebPage webPage(file->GetFileName(), "Server details", rootLevel, this->pInside->appConfig);
62                CTable tbl("serverDetailList", "TblObjectList");
63                tbl.AddColumn(40, "Operation");
64                tbl.AddColumn(60, "Value");
65
66                unsigned int count = this->pInside->serverInfoList.GetCount();
67                for (unsigned int index = 0; index < count; ++index)
68                {       
69                        CARServerInfo srvInfo(index, CARServerInfo::INDEX);
70                        ARValueStruct* val = srvInfo.GetValue();
71
72                        CTableRow row("cssStdRow");
73                        row.AddCell(CTableCell(CAREnum::ServerInfoApiCall(srvInfo.GetOperation())));
74                        row.AddCell(CTableCell(CARValue::ValueToString(*val)));
75                        tbl.AddRow(row);               
76                }
77
78                stringstream tblDesc;
79                tblDesc << ImageTag(ImageTag::Document, rootLevel) << "Server informations";
80                tbl.description = tblDesc.str();
81
82                webPage.AddContent(tbl.ToXHtml());
83
84                webPage.SaveInFolder(file->GetPath());
85        }
86        catch(exception& e)
87        {
88                cout << "EXCEPTION ServerInfoList: " << e.what() << endl;
89        }
90}
91
92string CDocMain::ShortMenu(string curCharacter, const CPageParams &curPage, std::vector<int>& objCountPerLetter)
93{
94        stringstream strm;
95        try
96        {
97                strm << "<table id='formLetterFilter'><tr>" << endl;
98
99                string strValue = objectNameFirstCharLetters; // "abcdefghijklmnopqrstuvwxyz0123456789#"
100                for (unsigned int i = 0; i < strValue.size(); ++i) 
101                {
102                        if(std::string(1, strValue.at(i)) != curCharacter)
103                        {
104                                // copy all page params over and change the page we want to link to
105                                CPageParams linkTo(curPage, strValue.at(i));
106                                if (objCountPerLetter[i] > 0)
107                                {
108                                        strm << "<td>";
109                                        strm << URLLink( std::string(1, strValue.at(i)), linkTo , curPage->GetRootLevel());
110                                }
111                                else
112                                {
113                                        strm << "<td class=\"disabledLetter\">";
114                                        strm << strValue.at(i);
115                                }
116
117                                strm << "</td>" << endl;
118
119                        }
120                        else
121                                strm << "<td>" << std::string(1, strValue.at(i)) << "</td>" << endl;                   
122                }
123
124                strm << "</tr></table>" << endl;
125        }
126        catch(exception& e)
127        {
128                cout << "EXCEPTION ShortMenu: " << e.what() << endl;
129        }
130        return strm.str();
131}
132
133unsigned int CDocMain::SchemaList()
134{
135        CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_SCHEMA);
136        unsigned int objCount = 0;
137
138        try
139        {
140                rootLevel = file->GetRootLevel();
141                CSchemaTable tbl(*this->pInside);
142                LetterFilterControl letterFilter;
143
144                unsigned int schemaCount = this->pInside->schemaList.GetCount();
145                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
146                {       
147                        CARSchema schema(schemaIndex);
148
149#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
150                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(schema))
151                                continue;
152#endif
153
154                        letterFilter.IncStartLetterOf(schema);
155                        objCount++;
156                }
157                if (objCount > 0)
158                {
159                        tbl.RemoveEmptyMessageRow();
160                }
161
162                CWebPage webPage(file->GetFileName(), "Forms", rootLevel, this->pInside->appConfig);
163
164                webPage.GetReferenceManager()
165                        .AddScriptReference("img/object_list.js")
166                        .AddScriptReference("img/schemaList.js")
167                        .AddScriptReference("img/jquery.timers.js")
168                        .AddScriptReference("img/jquery.address.min.js");
169
170                stringstream strmTmp;
171                strmTmp << "<span id='schemaListFilterResultCount'></span>" << CWebUtil::LinkToSchemaIndex(objCount, rootLevel);
172                SchemaListJson(strmTmp);
173                strmTmp << CreateSchemaFilterControl() << endl;
174                strmTmp << letterFilter;
175                strmTmp << tbl;
176                webPage.AddContent(strmTmp.str());
177
178                webPage.SaveInFolder(file->GetPath());
179        }
180        catch(exception& e)
181        {
182                cout << "EXCEPTION SchemaList: " << e.what() << endl;
183        }
184        return objCount;
185}
186
187unsigned int CDocMain::ActiveLinkList()
188{
189        CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_ACTIVE_LINK);
190        unsigned int objCount = 0;
191
192        try
193        {
194                rootLevel = file->GetRootLevel();
195
196                CAlTable tbl(*this->pInside);
197                LetterFilterControl letterFilter;
198
199                unsigned int alCount = this->pInside->alList.GetCount();
200               
201                for (unsigned int alIdx = 0; alIdx < alCount; ++alIdx)
202                {
203                        CARActiveLink actLink(alIdx);
204
205#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
206                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(actLink))
207                                continue;
208#endif
209
210                        letterFilter.IncStartLetterOf(actLink);
211
212                        objCount++;
213                }
214                if (objCount > 0)
215                {
216                        tbl.RemoveEmptyMessageRow();
217                }
218
219                CWebPage webPage(file->GetFileName(), "Active Link List", rootLevel, this->pInside->appConfig);
220               
221                webPage.GetReferenceManager()
222                        .AddScriptReference("img/object_list.js")
223                        .AddScriptReference("img/actlinkList.js")
224                        .AddScriptReference("img/jquery.timers.js")
225                        .AddScriptReference("img/jquery.address.min.js");
226
227                stringstream strmTmp;
228                strmTmp << "<span id='actlinkListFilterResultCount'></span>" << CWebUtil::LinkToActiveLinkIndex(objCount, rootLevel);
229                ActiveLinkListJson(strmTmp);
230                strmTmp << CreateActlinkFilterControl() << endl;
231                strmTmp << letterFilter;
232                strmTmp << tbl;
233                webPage.AddContent(strmTmp.str());
234
235                webPage.SaveInFolder(file->GetPath());
236        }
237        catch(exception& e)
238        {
239                cout << "EXCEPTION ActiveLinkList: " << e.what() << endl;
240        }
241        return objCount;
242}
243
244void CDocMain::ActiveLinkListJson(ostream &strm)
245{
246        Document document;
247        Document::AllocatorType &alloc = document.GetAllocator();
248        document.SetArray();
249
250        unsigned int actlinkCount = this->pInside->alList.GetCount();
251        for (unsigned int actlinkIndex = 0; actlinkIndex < actlinkCount; ++actlinkIndex)
252        {       
253                CARActiveLink actlink(actlinkIndex);
254               
255#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
256                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(actlink))
257                                continue;
258#endif
259
260                        CARProplistHelper props(&actlink.GetPropList());
261                        CPageParams actlinkDetailPage(PAGE_DETAILS, &actlink);
262
263                        // create a new json row and make it an array
264                        Value actlinkRow;
265                        actlinkRow.SetArray();
266
267                        // now build the needed temporary variables
268                        string strName = actlink.GetName();
269                        string strModifiedDate = CUtil::DateTimeToString(actlink.GetTimestamp());
270                        string strLink = CWebUtil::GetRelativeURL(rootLevel, actlinkDetailPage);
271                        string strExecuteOn = actlink.GetExecuteOn(true, &props);
272
273                        // build the values
274                        Value valName(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
275                        Value valModifiedDate(strModifiedDate.c_str(), static_cast<SizeType>(strModifiedDate.size()), alloc);
276                        Value valLink(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
277                        Value valExecuteOn(strExecuteOn.c_str(), static_cast<SizeType>(strExecuteOn.size()), alloc);
278
279                        // add everything to the row
280                        actlinkRow.PushBack(valName, alloc);
281                        actlinkRow.PushBack(actlink.GetEnabled(), alloc);
282                        actlinkRow.PushBack(actlink.GetGroupList().numItems, alloc);
283                        actlinkRow.PushBack(actlink.GetOrder(), alloc);
284                        actlinkRow.PushBack(valExecuteOn, alloc);
285                        actlinkRow.PushBack(actlink.GetIfActions().numItems, alloc);
286                        actlinkRow.PushBack(actlink.GetElseActions().numItems, alloc);
287                        actlinkRow.PushBack(valModifiedDate, alloc);
288                        actlinkRow.PushBack(actlink.GetLastChanged(), alloc);
289                        actlinkRow.PushBack(valLink, alloc);
290                        actlinkRow.PushBack(actlink.GetOverlayType(), alloc);
291
292                        // add the row to the document
293                        document.PushBack(actlinkRow, alloc);
294        }
295
296        GenericWriteStream output(strm);
297        Writer<GenericWriteStream> writer(output);
298
299        strm << endl << "<script type=\"text/javascript\">" << endl;
300        strm << "var alList = "; document.Accept(writer); strm << ";";
301        strm << "var rootLevel = " << rootLevel << ";";
302        strm << endl;
303        strm << "</script>" << endl;
304}
305
306void CDocMain::ActiveLinkActionList()
307{
308        CPageParams file(PAGE_ACTION_OVERVIEW, AR_STRUCT_ITEM_XML_ACTIVE_LINK);
309       
310        try
311        {
312                int rootLevel = file->GetRootLevel();
313                CWebPage webPage(file->GetFileName(), "Active Link Actions", rootLevel, this->pInside->appConfig);
314
315                CTable tbl("alList", "TblObjectList");
316
317                stringstream strmTmp;
318                strmTmp << URLLink("Active Links", CPageParams(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_ACTIVE_LINK), ImageTag::ActiveLink, rootLevel) << " with a specified action in If/Else list:";
319
320                tbl.description = strmTmp.str();
321                tbl.AddColumn(100, "Active Link Action (Items count if/else)");
322
323                //Search all possible action type
324#if AR_CURRENT_API_VERSION > 12 // Version 7.1 and higher
325#define LAST_ACTIVE_LINK_ACTION 18
326#else
327#define LAST_ACTIVE_LINK_ACTION 17
328#endif
329                for(int nActionType=AR_ACTIVE_LINK_ACTION_MACRO; nActionType<=LAST_ACTIVE_LINK_ACTION; nActionType++)
330                {               
331                        int nCountIf = 0;
332                        int nCountElse = 0;
333
334                        //Create a new webpage for every action
335                        ActiveLinkActionDetails(nActionType, nCountIf, nCountElse);
336
337                        strmTmp.str("");
338                        strmTmp << URLLink(CAREnum::ActiveLinkAction(nActionType), CPageParams(PAGE_ACTION_OBJLIST, AR_STRUCT_ITEM_XML_ACTIVE_LINK, nActionType), ImageTag::Document, rootLevel) << " (" << nCountIf << "/" << nCountElse << ")";
339
340                        CTableRow row("");
341                        row.AddCell(CTableCell(strmTmp.str()));
342                        tbl.AddRow(row);
343                }
344
345                webPage.AddContent(tbl.ToXHtml());
346
347                webPage.SaveInFolder(file->GetPath());
348        }
349        catch(exception& e)
350        {
351                cout << "EXCEPTION ActiveLinkActionList: " << e.what() << endl;
352        }
353}
354
355void CDocMain::ActiveLinkActionDetails(int nActionType, int &ifCount, int &elseCount)
356{
357        CPageParams file(PAGE_ACTION_OBJLIST, AR_STRUCT_ITEM_XML_ACTIVE_LINK, nActionType);
358        try
359        {               
360                int rootLevel = 1;
361
362                //stringstream strmTmp;
363                //strmTmp << "index_action_" << nActionType;
364                CWebPage webPage(file->GetFileName(), "Active Link Actions", rootLevel, this->pInside->appConfig);
365
366                CAlTable *tbl = new CAlTable(*this->pInside);   
367
368                unsigned int alCount = pInside->alList.GetCount();
369                for (unsigned int alIndex = 0; alIndex < alCount; ++alIndex )
370                {
371                        CARActiveLink al(alIndex);
372
373#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
374                        // Hide overlaid objects on the list
375                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(al))
376                                continue;
377#endif
378
379                        int nActionExists = 0;
380                        const ARActiveLinkActionList &ifActions = al.GetIfActions();
381                        const ARActiveLinkActionList &elseActions = al.GetElseActions();
382
383                        //actionList
384                        for(unsigned int nAction=0; nAction < ifActions.numItems; nAction++)
385                        {
386                                if(ifActions.actionList[nAction].action == nActionType)
387                                {
388                                        ++ifCount;
389                                        ++nActionExists;
390                                }
391                        }               
392
393                        //elseList
394                        for(unsigned int nAction=0; nAction < elseActions.numItems; nAction++)
395                        {
396                                if(elseActions.actionList[nAction].action == nActionType)
397                                {               
398                                        ++elseCount;                   
399                                        ++nActionExists;
400                                }
401                        }               
402
403                        if(nActionExists > 0)
404                        {
405                                tbl->AddRow(alIndex, rootLevel);
406                        }
407                }
408
409                stringstream strmTmp;
410                strmTmp << URLLink("Active Links", CPageParams(PAGE_ACTION_OVERVIEW, AR_STRUCT_ITEM_XML_ACTIVE_LINK), ImageTag::ActiveLink, rootLevel) << " with " << CAREnum::ActiveLinkAction(nActionType) << " action";
411                tbl->SetDescription(strmTmp.str());
412
413                webPage.AddContent(tbl->Print());
414                delete tbl;
415
416                webPage.SaveInFolder(file->GetPath());
417        }
418        catch(exception& e)
419        {
420                cout << "EXCEPTION ActiveLinkActionDetails: " << e.what() << endl;
421        }
422}
423
424
425unsigned int CDocMain::FilterList()
426{
427        CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_FILTER);
428        unsigned int objCount = 0;
429
430        try
431        {
432                rootLevel = file->GetRootLevel();
433                CFilterTable tbl(*this->pInside);
434                LetterFilterControl letterFilter;
435
436                unsigned int filterCount = this->pInside->filterList.GetCount();
437
438                for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex )
439                {
440                        CARFilter filter(filterIndex);
441
442#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
443                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(filter))
444                                continue;
445#endif
446
447                        letterFilter.IncStartLetterOf(filter);
448                        objCount++;
449                }
450                if (objCount > 0)
451                {
452                        tbl.RemoveEmptyMessageRow();
453                }
454
455                CWebPage webPage(file->GetFileName(), "Filter List", file->GetRootLevel(), this->pInside->appConfig);
456
457                webPage.GetReferenceManager()
458                        .AddScriptReference("img/object_list.js")
459                        .AddScriptReference("img/filterList.js")
460                        .AddScriptReference("img/jquery.timers.js")
461                        .AddScriptReference("img/jquery.address.min.js");
462
463                stringstream strmTmp;
464                strmTmp << "<span id='filterListFilterResultCount'></span>" << CWebUtil::LinkToFilterIndex(objCount, rootLevel);
465                FilterListJson(strmTmp);
466                strmTmp << CreateFilterFilterControl() << endl;
467                strmTmp << letterFilter;
468                strmTmp << tbl;
469                webPage.AddContent(strmTmp.str());
470
471                webPage.SaveInFolder(file->GetPath());
472        }
473        catch(exception& e)
474        {
475                cout << "EXCEPTION FilterList: " << e.what() << endl;
476        }
477        return objCount;
478}
479
480void CDocMain::FilterListJson(std::ostream &strm)
481{
482        Document document;
483        Document::AllocatorType &alloc = document.GetAllocator();
484        document.SetArray();
485
486        unsigned int filterCount = this->pInside->filterList.GetCount();
487        for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex)
488        {       
489                CARFilter filter(filterIndex);
490               
491#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
492                if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(filter))
493                        continue;
494#endif
495
496                CPageParams filterDetailPage(PAGE_DETAILS, &filter);
497
498                // create a new json row and make it an array
499                Value filterRow;
500                filterRow.SetArray();
501
502                // now build the needed temporary variables
503                string strName = filter.GetName();
504                string strExecuteOn = filter.GetExecuteOn(true);
505                string strModifiedDate = CUtil::DateTimeToString(filter.GetTimestamp());
506                string strLink = CWebUtil::GetRelativeURL(rootLevel, filterDetailPage);
507
508                // build the values
509                Value valName(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
510                Value valExecOn(strExecuteOn.c_str(), static_cast<SizeType>(strExecuteOn.size()), alloc);               
511                Value valModifiedDate(strModifiedDate.c_str(), static_cast<SizeType>(strModifiedDate.size()), alloc);
512                Value valLink(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
513
514                // add everything to the row
515                filterRow.PushBack(valName,alloc);
516                filterRow.PushBack(filter.GetEnabled(), alloc);
517                filterRow.PushBack(filter.GetOrder(), alloc);
518                filterRow.PushBack(valExecOn, alloc);
519                filterRow.PushBack(filter.GetIfActions().numItems, alloc);
520                filterRow.PushBack(filter.GetElseActions().numItems, alloc);
521                filterRow.PushBack(valModifiedDate, alloc);
522                filterRow.PushBack(filter.GetLastChanged(), alloc);
523                filterRow.PushBack(valLink, alloc);
524                filterRow.PushBack(filter.GetOperation(), alloc);
525                filterRow.PushBack(filter.GetOverlayType(), alloc);
526
527                document.PushBack(filterRow, alloc);
528        }
529
530        GenericWriteStream output(strm);
531        Writer<GenericWriteStream> writer(output);
532
533        strm << endl << "<script type=\"text/javascript\">" << endl;
534        strm << "var filterList = "; document.Accept(writer); strm << ";";
535        strm << "var rootLevel = " << rootLevel << ";";
536        strm << endl;
537        strm << "</script>" << endl;
538}
539
540void CDocMain::FilterActionList()
541{
542        CPageParams file(PAGE_ACTION_OVERVIEW, AR_STRUCT_ITEM_XML_FILTER);
543
544        try
545        {
546                int rootLevel = file->GetRootLevel();
547                CWebPage webPage(file->GetFileName(), "Filter Actions", rootLevel, this->pInside->appConfig);
548
549                CTable tbl("filterList", "TblObjectList");
550
551                stringstream strmTmp;
552                strmTmp << URLLink("Filter", CPageParams(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_FILTER), ImageTag::Filter, rootLevel) << " with a specified action in If/Else list:";
553
554                tbl.description = strmTmp.str();
555                tbl.AddColumn(100, "Filter Action (Items count if/else)");
556
557#if AR_CURRENT_API_VERSION >= AR_API_VERSION_750 // Version 7.5 and higher
558#define LAST_FILTER_ACTION 12
559#else
560#define LAST_FILTER_ACTION 11
561#endif
562
563                //Search all possible actions
564                for(int nActionType=AR_FILTER_ACTION_NOTIFY; nActionType<=LAST_FILTER_ACTION; nActionType++)
565                {               
566                        int nCountIf = 0;
567                        int nCountElse = 0;
568
569                        // Create a new webpage for every action
570                        FilterActionDetails(nActionType, nCountIf, nCountElse);
571
572                        strmTmp.str("");
573                        strmTmp << URLLink(CAREnum::FilterAction(nActionType), CPageParams(PAGE_ACTION_OBJLIST, AR_STRUCT_ITEM_XML_FILTER, nActionType), ImageTag::Document, rootLevel) << " (" << nCountIf << "/" << nCountElse << ")";
574
575                        CTableRow row("");
576                        row.AddCell(CTableCell(strmTmp.str()));         
577                        tbl.AddRow(row);       
578                }
579
580                webPage.AddContent(tbl.ToXHtml());
581
582                webPage.SaveInFolder(file->GetPath());
583        }
584        catch(exception& e)
585        {
586                cout << "EXCEPTION FilterActionList: " << e.what() << endl;
587        }
588}
589
590void CDocMain::FilterActionDetails(int nActionType, int &ifCount, int &elseCount)
591{
592        CPageParams file(PAGE_ACTION_OBJLIST, AR_STRUCT_ITEM_XML_FILTER, nActionType);
593
594        try
595        {
596                int rootLevel = file->GetRootLevel();
597
598                //stringstream strmTmp;
599                //strmTmp << "index_action_" << nActionType;
600                CWebPage webPage(file->GetFileName(), "Filter Actions", rootLevel, this->pInside->appConfig);
601
602                CFilterTable *tbl = new CFilterTable(*this->pInside);
603
604                unsigned int filterCount = pInside->filterList.GetCount();
605                for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex )
606                {       
607                        CARFilter flt(filterIndex);
608
609#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
610                        // Hide overlaid objects on the list
611                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(flt))
612                                continue;
613#endif
614
615                        int nActionExists = 0;
616                        const ARFilterActionList &ifActions = flt.GetIfActions();
617                        const ARFilterActionList &elseActions = flt.GetElseActions();
618
619                        //actionList
620                        for(unsigned int nAction=0; nAction < ifActions.numItems; ++nAction)
621                        {
622                                if (ifActions.actionList[nAction].action == nActionType)
623                                {               
624                                        ++ifCount;
625                                        nActionExists++;
626                                }
627                        }
628
629                        //elseList
630                        for(unsigned int nAction=0; nAction < elseActions.numItems; ++nAction)
631                        {
632                                if (elseActions.actionList[nAction].action == nActionType)
633                                {
634                                        ++elseCount;
635                                        nActionExists++;
636                                }
637                        }
638
639                        if(nActionExists > 0)
640                        {
641                                tbl->AddRow(filterIndex, rootLevel);
642                        }
643                }
644
645                stringstream strmTmp;
646                strmTmp << URLLink("Filter", CPageParams(PAGE_ACTION_OVERVIEW, AR_STRUCT_ITEM_XML_FILTER), ImageTag::Filter, rootLevel) << " with " << CAREnum::FilterAction(nActionType) << " action";
647                tbl->SetDescription(strmTmp.str());
648
649                webPage.AddContent(tbl->Print());
650                delete tbl;
651
652                webPage.SaveInFolder(file->GetPath());
653        }
654        catch(exception& e)
655        {
656                cout << "EXCEPTION FilterActionDetails: " << e.what() << endl;
657        }
658}
659
660void CDocMain::FilterErrorHandlers()
661{
662        CPageParams file(PAGE_FILTER_ERRORHANDLERS);
663
664        try
665        {
666                int rootLevel = file->GetRootLevel();
667                CWebPage webPage(file->GetFileName(), "Filter Error Handlers", rootLevel, this->pInside->appConfig);
668
669                CFilterTable tbl(*pInside);
670
671                unsigned int filterCount = pInside->filterList.GetCount();
672                for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex)
673                {
674                        CARFilter flt(filterIndex);
675                       
676#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
677                        // Hide overlaid objects on the list
678                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(flt))
679                                continue;
680#endif
681
682                        if (flt.ErrorCallers().size() > 0)
683                        {
684                                tbl.AddRow(filterIndex, rootLevel);
685                        }
686                }
687
688                stringstream strm;
689                strm << CWebUtil::LinkToFilterIndex(tbl.NumRows(), rootLevel) << " used as Error Handler";
690
691                tbl.SetDescription(strm.str());
692                webPage.AddContent(tbl.Print());
693
694                webPage.SaveInFolder(file->GetPath());
695        }
696        catch(exception& e)
697        {
698                cout << "EXCEPTION FilterErrorHandlers: " << e.what() << endl;
699        }
700}
701
702unsigned int CDocMain::EscalationList()
703{
704        CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_ESCALATION);
705        unsigned int objCount = 0;
706
707        try
708        {
709                rootLevel = file->GetRootLevel();
710                CEscalTable tbl(*this->pInside);
711                LetterFilterControl letterFilter;
712
713                unsigned int escalCount = pInside->escalationList.GetCount();
714                for (unsigned int escalIndex = 0; escalIndex < escalCount; ++escalIndex)
715                {
716                        CAREscalation escalation(escalIndex);
717
718#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
719                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(escalation))
720                                continue;
721#endif
722
723                        letterFilter.IncStartLetterOf(escalation);
724                        objCount++;
725                }
726                if (objCount > 0)
727                {
728                        tbl.RemoveEmptyMessageRow();
729                }
730
731                CWebPage webPage(file->GetFileName(), "Escalation List", rootLevel, this->pInside->appConfig);
732                webPage.GetReferenceManager()
733                        .AddScriptReference("img/object_list.js")
734                        .AddScriptReference("img/escalationList.js")
735                        .AddScriptReference("img/jquery.timers.js")
736                        .AddScriptReference("img/jquery.address.min.js");
737
738                stringstream strmTmp;
739                strmTmp << "<span id='esclationListFilterResultCount'></span>" << CWebUtil::LinkToEscalationIndex(objCount, rootLevel);
740                EscalationListJson(strmTmp);
741                strmTmp << CreateEscalationFilterControl() << endl;
742                strmTmp << letterFilter;
743                strmTmp << tbl;
744                webPage.AddContent(strmTmp.str());
745
746                webPage.SaveInFolder(file->GetPath());
747        }
748        catch(exception& e)
749        {
750                cout << "EXCEPTION EscalationList: " << e.what() << endl;
751        }
752        return objCount;
753}
754
755void CDocMain::EscalationListJson(std::ostream &strm)
756{
757        Document document;
758        Document::AllocatorType &alloc = document.GetAllocator();
759        document.SetArray();
760
761        unsigned int escalCount = this->pInside->escalationList.GetCount();
762        for (unsigned int escalIndex = 0; escalIndex < escalCount; ++escalIndex)
763        {       
764                CAREscalation escalation(escalIndex);
765
766#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
767                if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(escalation))
768                        continue;
769#endif
770
771                CARProplistHelper props(&escalation.GetPropList());
772                CPageParams escalDetailPage(PAGE_DETAILS, &escalation);
773
774                // create a new json row and make it an array
775                Value escalRow;
776                escalRow.SetArray();
777
778                // now build the needed temporary variables
779                string strName = escalation.GetName();                 
780                string strExecuteOn = escalation.GetExecuteOn();
781                string strModifiedDate = CUtil::DateTimeToString(escalation.GetTimestamp());
782                string strLink = CWebUtil::GetRelativeURL(rootLevel, escalDetailPage);
783               
784                // build the values
785                Value valName(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
786                Value valExecuteOn(strExecuteOn.c_str(), static_cast<SizeType>(strExecuteOn.size()), alloc);
787                Value valModifiedDate(strModifiedDate.c_str(), static_cast<SizeType>(strModifiedDate.size()), alloc);
788                Value valLink(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
789
790                // add everything to the row
791                escalRow.PushBack(valName, alloc);
792                escalRow.PushBack(escalation.GetEnabled(), alloc);
793                escalRow.PushBack(valExecuteOn, alloc);
794                escalRow.PushBack(escalation.GetIfActions().numItems, alloc);
795                escalRow.PushBack(escalation.GetElseActions().numItems, alloc);
796                escalRow.PushBack(valModifiedDate, alloc);
797                escalRow.PushBack(escalation.GetLastChanged(), alloc);
798                escalRow.PushBack(valLink, alloc);
799                escalRow.PushBack(escalation.GetPool(), alloc);
800                escalRow.PushBack(escalation.GetOverlayType(), alloc);
801
802                // add the row to the document
803                document.PushBack(escalRow, alloc);
804        }
805
806        GenericWriteStream output(strm);
807        Writer<GenericWriteStream> writer(output);
808
809        strm << endl << "<script type=\"text/javascript\">" << endl;
810        strm << "var escalationList = "; document.Accept(writer); strm << ";";
811        strm << "var rootLevel = " << rootLevel << ";";
812        strm << endl;
813        strm << "</script>" << endl;
814}
815
816void CDocMain::EscalationActionList()
817{
818        CPageParams file(PAGE_ACTION_OVERVIEW, AR_STRUCT_ITEM_XML_ESCALATION);
819
820        try
821        {
822                int rootLevel = file->GetRootLevel();
823                CWebPage webPage(file->GetFileName(), "Escalation Actions", rootLevel, this->pInside->appConfig);
824
825                CTable tbl("escalList", "TblObjectList");
826
827                stringstream strmTmp;
828                strmTmp << URLLink("Escalation", CPageParams(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_ESCALATION), ImageTag::Escalation, rootLevel) << " with a specified action in If/Else list:";
829
830                tbl.description = strmTmp.str();
831                tbl.AddColumn(100, "Escalation Action (Items count if/else)");
832
833#if AR_CURRENT_API_VERSION >= AR_API_VERSION_750 // Version 7.5 and higher
834#define LAST_ESCLATION_ACTION 12
835#else
836#define LAST_ESCLATION_ACTION 11
837#endif
838
839                //Search all possible actions
840                for(int nActionType=AR_FILTER_ACTION_NOTIFY; nActionType<=LAST_ESCLATION_ACTION; nActionType++)
841                {
842                        switch (nActionType)
843                        {
844                        case AR_FILTER_ACTION_GOTOACTION:
845                        case AR_FILTER_ACTION_CALLGUIDE:
846                        case AR_FILTER_ACTION_EXITGUIDE:
847                        case AR_FILTER_ACTION_GOTOGUIDELABEL:
848                                continue;
849                        }
850
851                        int nCountIf = 0;
852                        int nCountElse = 0;
853
854                        //Create a new webpage for every action
855                        EscalationActionDetails(nActionType, nCountIf, nCountElse);
856
857                        strmTmp.str("");
858                        strmTmp << URLLink(CAREnum::FilterAction(nActionType), CPageParams(PAGE_ACTION_OBJLIST, AR_STRUCT_ITEM_XML_ESCALATION, nActionType), ImageTag::Document, rootLevel) << " (" << nCountIf << "/" << nCountElse << ")";
859
860                        CTableRow row("");
861                        row.AddCell(CTableCell(strmTmp.str()));
862                        tbl.AddRow(row);
863                }
864
865                webPage.AddContent(tbl.ToXHtml());
866
867                webPage.SaveInFolder(file->GetPath());
868        }
869        catch(exception& e)
870        {
871                cout << "EXCEPTION EscalationActionList: " << e.what() << endl;
872        }
873}
874
875
876void CDocMain::EscalationActionDetails(int nActionType, int &ifCount, int &elseCount)
877{
878        CPageParams file(PAGE_ACTION_OBJLIST, AR_STRUCT_ITEM_XML_ESCALATION, nActionType);
879
880        try
881        {
882                int rootLevel = file->GetRootLevel();
883
884                //stringstream strmTmp;
885                //strmTmp << "index_action_" << nActionType;
886                CWebPage webPage(file->GetFileName(), "Escalation Actions", rootLevel, this->pInside->appConfig);
887
888                CEscalTable *tbl = new CEscalTable(*this->pInside);
889
890                unsigned int escalCount = pInside->escalationList.GetCount();
891                for (unsigned int escalIndex = 0; escalIndex < escalCount; ++escalIndex)
892                {       
893                        CAREscalation esc(escalIndex);
894
895#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
896                        // Hide overlaid objects on the list
897                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(esc))
898                                continue;
899#endif
900
901                        int nActionExists = 0;
902                        const ARFilterActionList &ifActions = esc.GetIfActions();
903                        const ARFilterActionList &elseActions = esc.GetElseActions();
904
905                        //actionList
906                        for(unsigned int nAction=0; nAction < ifActions.numItems; ++nAction)
907                        {
908                                if(ifActions.actionList[nAction].action == nActionType)
909                                {
910                                        ++ifCount;
911                                        ++nActionExists;
912                                }
913                        }               
914
915                        //elseList
916                        for(unsigned int nAction=0; nAction < elseActions.numItems; ++nAction)
917                        {
918                                if(elseActions.actionList[nAction].action == nActionType)
919                                {
920                                        ++elseCount;
921                                        nActionExists++;
922                                }
923                        }               
924
925                        if(nActionExists > 0)
926                        {
927                                tbl->AddRow(escalIndex, rootLevel);
928                        }
929                }
930
931                stringstream strmTmp;
932                strmTmp << URLLink("Escalation", CPageParams(PAGE_ACTION_OVERVIEW, AR_STRUCT_ITEM_XML_ESCALATION), ImageTag::Escalation, rootLevel) << " with " << CAREnum::FilterAction(nActionType) << " action";
933                tbl->SetDescription(strmTmp.str());
934
935                webPage.AddContent(tbl->Print());
936                delete tbl;
937
938                webPage.SaveInFolder(file->GetPath());
939        }
940        catch(exception& e)
941        {
942                cout << "EXCEPTION EscalationActionDetails: " << e.what() << endl;
943        }
944}
945
946
947unsigned int CDocMain::CharMenuList()
948{
949        CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_CHAR_MENU);
950        unsigned int objCount = 0;
951
952        try
953        {
954                rootLevel = file->GetRootLevel();
955                CMenuTable tbl(*this->pInside);
956                LetterFilterControl letterFilter;
957
958                unsigned int menuCount = this->pInside->menuList.GetCount();
959                for ( unsigned int menuIndex = 0; menuIndex < menuCount; ++menuIndex )
960                {       
961                        CARCharMenu menu(menuIndex);
962
963#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
964                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(menu))
965                                continue;
966#endif
967
968                        letterFilter.IncStartLetterOf(menu);
969                        objCount++;
970                }
971                if (objCount > 0)
972                {
973                        tbl.RemoveEmptyMessageRow();
974                }
975
976                CWebPage webPage(file->GetFileName(), "Menu List", 1, this->pInside->appConfig);
977
978                webPage.GetReferenceManager()
979                        .AddScriptReference("img/object_list.js")
980                        .AddScriptReference("img/menuList.js")
981                        .AddScriptReference("img/jquery.timers.js")
982                        .AddScriptReference("img/jquery.address.min.js");
983
984                stringstream strmTmp;
985                strmTmp << "<span id='menuListFilterResultCount'></span>" << CWebUtil::LinkToMenuIndex(objCount, rootLevel);
986                MenuListJson(strmTmp);
987                strmTmp << CreateMenuFilterControl() << endl;
988                strmTmp << letterFilter;
989                strmTmp << tbl;
990
991                webPage.AddContent(strmTmp.str());
992                webPage.AddContent("(!) Menu is not attached to a character field and no Active Link \"Change Field\" Action sets the menu to a field.");
993
994                webPage.SaveInFolder(file->GetPath());
995        }
996        catch(exception& e)
997        {
998                cout << "EXCEPTION CharMenuList: " << e.what() << endl;
999        }
1000        return objCount;
1001}
1002
1003void CDocMain::MenuListJson(std::ostream &strm)
1004{
1005        Document document;
1006        Document::AllocatorType &alloc = document.GetAllocator();
1007        document.SetArray();
1008
1009        unsigned int menuCount = this->pInside->menuList.GetCount();
1010        for (unsigned int menuIndex = 0; menuIndex < menuCount; ++menuIndex)
1011        {
1012                CARCharMenu menu(menuIndex);
1013
1014#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1015                if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(menu))
1016                        continue;
1017#endif
1018
1019                CPageParams menuDetailPage(PAGE_DETAILS, &menu);
1020
1021                // create a new json row and make it an array
1022                Value menuRow;
1023                menuRow.SetArray();
1024
1025                // now build the needed temporary variables
1026                string strName = menu.GetName();
1027                string strModifiedDate = CUtil::DateTimeToString(menu.GetTimestamp());
1028                string strLink = CWebUtil::GetRelativeURL(rootLevel, menuDetailPage);
1029
1030                // build the values
1031                Value valName(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
1032                Value valModifiedDate(strModifiedDate.c_str(), static_cast<SizeType>(strModifiedDate.size()), alloc);
1033                Value valLink(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
1034
1035                // add everything to the row
1036                menuRow.PushBack(valName, alloc);
1037                menuRow.PushBack(menu.GetDefinition().menuType, alloc);
1038                menuRow.PushBack(menu.GetRefreshCode(), alloc);
1039                menuRow.PushBack(valModifiedDate, alloc);
1040                menuRow.PushBack(menu.GetLastChanged(), alloc);
1041                menuRow.PushBack(valLink, alloc);
1042                menuRow.PushBack(menu.GetOverlayType(), alloc);
1043                menuRow.PushBack((menu.IsUsedInWorkflow() ? 1 : 0), alloc);
1044
1045                // add the row to the document
1046                document.PushBack(menuRow, alloc);
1047        }
1048
1049        GenericWriteStream output(strm);
1050        Writer<GenericWriteStream> writer(output);
1051
1052        strm << endl << "<script type=\"text/javascript\">" << endl;
1053        strm << "var menuList = "; document.Accept(writer); strm << ";";
1054        strm << "var rootLevel = " << rootLevel << ";";
1055        strm << endl;
1056        strm << "</script>" << endl;
1057}
1058
1059unsigned int CDocMain::ContainerList(int nType, string title)
1060{
1061        unsigned int objCount = 0;
1062        CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_CONTAINER, nType);
1063
1064        try
1065        {
1066                rootLevel = file->GetRootLevel();
1067                CContainerTable tbl(*this->pInside, false);
1068                LetterFilterControl letterFilter;
1069
1070                unsigned int cntCount = this->pInside->containerList.GetCount();
1071                for ( unsigned int cntIndex = 0; cntIndex < cntCount; ++cntIndex )
1072                {       
1073                        CARContainer cont(cntIndex);
1074
1075#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1076                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(cont))
1077                                continue;
1078#endif
1079
1080                        if (cont.GetType() == nType)    // the type must match
1081                        {
1082                                letterFilter.IncStartLetterOf(cont);
1083                                tbl.AddRowJson(cont, rootLevel);
1084                                objCount++;
1085                        }
1086                }
1087                if (objCount > 0)
1088                {
1089                        tbl.RemoveEmptyMessageRow();
1090                }
1091
1092                CWebPage webPage(file->GetFileName(), title, rootLevel, this->pInside->appConfig);
1093               
1094                webPage.GetReferenceManager()
1095                        .AddScriptReference("img/object_list.js")
1096                        .AddScriptReference("img/containerList.js")
1097                        .AddScriptReference("img/jquery.timers.js")
1098                        .AddScriptReference("img/jquery.address.min.js");
1099
1100                stringstream strmTmp;
1101                strmTmp << "<span id='containerListResultCount'></span>" << CWebUtil::LinkToContainer(objCount, rootLevel, nType) << endl;
1102                strmTmp << "<script type=\"text/javascript\">" << endl;
1103                strmTmp << "var rootLevel = " << rootLevel << ";";
1104                strmTmp << "var containerType = " << nType << ";";
1105                strmTmp << endl;
1106                strmTmp << "</script>" << endl;
1107                strmTmp << CreateContainerFilterControl() << endl;
1108                strmTmp << letterFilter;
1109                strmTmp << tbl;
1110                webPage.AddContent(strmTmp.str());
1111
1112                if (nType == ARCON_GUIDE || nType == ARCON_FILTER_GUIDE)
1113                {
1114                        webPage.AddContent("(!) No Active Link / Filter \"CallGuide\" Action uses this Guide.");
1115                }
1116
1117                webPage.SaveInFolder(file->GetPath());
1118        }
1119        catch(exception& e)
1120        {
1121                cout << "EXCEPTION ContainerList: " << e.what() << endl;
1122        }
1123        return objCount;
1124}
1125
1126void CDocMain::RoleList()
1127{
1128        CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_ROLE);
1129
1130        try
1131        {
1132                int rootLevel = file->GetRootLevel();
1133                CRoleTable tbl(*this->pInside);
1134                LetterFilterControl letterFilter;
1135
1136                unsigned int roleCount = this->pInside->roleList.GetCount();
1137                for (unsigned int roleIndex = 0; roleIndex < roleCount; ++roleIndex)
1138                {       
1139                        CARRole role(roleIndex);
1140
1141                        letterFilter.IncStartLetterOf(role);
1142                        tbl.AddRowJson(role, rootLevel);
1143                }
1144                if (roleCount > 0)
1145                {
1146                        tbl.RemoveEmptyMessageRow();
1147                }
1148
1149                CWebPage webPage(file->GetFileName(), "Role List", rootLevel, this->pInside->appConfig);
1150
1151                webPage.GetReferenceManager()
1152                        .AddScriptReference("img/object_list.js")
1153                        .AddScriptReference("img/roleList.js")
1154                        .AddScriptReference("img/jquery.timers.js")
1155                        .AddScriptReference("img/jquery.address.min.js");
1156
1157                stringstream strmTmp;
1158                strmTmp << "<span id='roleListFilterResultCount'></span>" << CWebUtil::LinkToRoleIndex(roleCount, rootLevel);
1159                strmTmp << CreateRoleFilterControl();
1160                strmTmp << letterFilter;
1161                strmTmp << tbl;
1162                webPage.AddContent(strmTmp.str());
1163
1164                webPage.SaveInFolder(file->GetPath());
1165        }
1166        catch(exception& e)
1167        {
1168                cout << "EXCEPTION RoleList: " << e.what() << endl;
1169        }
1170}
1171
1172void CDocMain::GroupList()
1173{
1174        CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_GROUP);
1175
1176        try
1177        {
1178                int rootLevel = file->GetRootLevel();
1179                CGroupTable tbl(*this->pInside);
1180                LetterFilterControl letterFilter;
1181
1182                unsigned int groupCount = pInside->groupList.GetCount();
1183                for (unsigned int groupIndex = 0; groupIndex < groupCount; ++groupIndex)
1184                {       
1185                        CARGroup grp(groupIndex);
1186                        letterFilter.IncStartLetterOf(grp);
1187                        tbl.AddRowJson(grp, rootLevel);
1188                }
1189                if (groupCount > 0)
1190                {
1191                        tbl.RemoveEmptyMessageRow();
1192                }
1193
1194                CWebPage webPage(file->GetFileName(), "Group List", rootLevel, this->pInside->appConfig);
1195
1196                webPage.GetReferenceManager()
1197                        .AddScriptReference("img/object_list.js")
1198                        .AddScriptReference("img/groupList.js")
1199                        .AddScriptReference("img/jquery.timers.js")
1200                        .AddScriptReference("img/jquery.address.min.js");
1201
1202                stringstream strmTmp;
1203                strmTmp << "<span id='groupListFilterResultCount'></span>" << CWebUtil::LinkToGroupIndex(groupCount, rootLevel);
1204                strmTmp << CreateGroupFilterControl() << endl;
1205                strmTmp << letterFilter;
1206                strmTmp << tbl;
1207                webPage.AddContent(strmTmp.str());
1208
1209                webPage.SaveInFolder(file->GetPath());
1210        }
1211        catch(exception& e)
1212        {
1213                cout << "EXCEPTION GroupList: " << e.what() << endl;
1214        }
1215}
1216
1217void CDocMain::UserList(string searchChar, std::vector<int>& objCountPerLetter)
1218{
1219        unsigned int page = (unsigned int)searchChar[0];
1220        CPageParams file(page, AR_STRUCT_ITEM_XML_USER);
1221
1222        try
1223        {
1224                int rootLevel = file->GetRootLevel();
1225                CUserTable tbl(*this->pInside);
1226
1227                unsigned int userCount = this->pInside->userList.GetCount();
1228                for (unsigned int userIndex = 0; userIndex < userCount; ++userIndex)
1229                {       
1230                        CARUser user(userIndex);
1231
1232                        bool bInsert = false;
1233                        if(searchChar == "*")  //All objecte
1234                        {
1235                                // the first call to this function holds always "*" as search char. That's the
1236                                // best time to sum up the object count per letter.
1237                                string firstChar = user.GetNameFirstChar();
1238                                if (firstChar.empty()) firstChar = "*";
1239                                int index = CARObject::GetFirstCharIndex(firstChar[0]);
1240                                ++(objCountPerLetter[index]);
1241                                bInsert = true;
1242                        }
1243                        else if(searchChar == "#")
1244                        {
1245                                if(!user.NameStandardFirstChar())
1246                                {
1247                                        bInsert = true;
1248                                }
1249                        }
1250                        else
1251                        {
1252                                if(user.GetNameFirstChar() == searchChar)
1253                                {
1254                                        bInsert = true;
1255                                }
1256                        }
1257
1258                        if(bInsert)
1259                        {       
1260                                tbl.AddRow(user, rootLevel);
1261                        }
1262                }
1263
1264                if (tbl.NumRows() > 0 || searchChar == "*")
1265                {
1266                        CWebPage webPage(file->GetFileName(), "User List", rootLevel, this->pInside->appConfig);
1267
1268                        stringstream strmTmp;
1269                        strmTmp << CWebUtil::LinkToUserIndex(tbl.NumRows(), rootLevel) << ShortMenu(searchChar, file, objCountPerLetter);
1270
1271                        tbl.SetDescription(strmTmp.str());
1272                        webPage.AddContent(tbl.Print());
1273
1274                        webPage.SaveInFolder(file->GetPath());
1275                }
1276        }
1277        catch(exception& e)
1278        {
1279                cout << "EXCEPTION UserList: " << e.what() << endl;
1280        }
1281}
1282
1283void CDocMain::GlobalFieldList()
1284{
1285        CPageParams file(PAGE_GLOBALFIELS);
1286
1287        try
1288        {
1289                int rootLevel = file->GetRootLevel();
1290                CWebPage webPage(file->GetFileName(), "Global Fields", rootLevel, this->pInside->appConfig);   
1291
1292                // outer table
1293                CTable tbl("fieldListAll", "TblObjectList");
1294                tbl.AddColumn(20, "GlobalFieldId");
1295                tbl.AddColumn(80, "References");
1296
1297                // inner table; reused per global field id
1298                CTable innerTbl("refList", "TblObjectList");
1299                innerTbl.AddColumn(50, "Schema Name");
1300                innerTbl.AddColumn(50, "Field Name");
1301
1302                int currentGlobalFieldId = 0;
1303
1304                //Search all global fields
1305                list<CARGlobalField>::iterator listIter = this->pInside->globalFieldList.begin();
1306                list<CARGlobalField>::iterator listEnd = this->pInside->globalFieldList.end();
1307                for (; listIter != listEnd; ++listIter )
1308                {       
1309                        CARGlobalField &glField = (*listIter);
1310                        CARField fld(glField.schemaInsideId, glField.fieldId);
1311
1312                        if (currentGlobalFieldId != fld.GetFieldId())
1313                        {
1314                                // add the previous global field to the table before resetting
1315                                if (currentGlobalFieldId != 0)
1316                                        AddGlobalFieldRow(tbl, currentGlobalFieldId, innerTbl);
1317
1318                                // reset for current field
1319                                currentGlobalFieldId = fld.GetFieldId();
1320                                innerTbl.ClearRows();
1321                        }
1322
1323                        CTableRow innerTblRow("");
1324                        innerTblRow.AddCellList(
1325                                this->pInside->LinkToSchema(glField.schemaInsideId, rootLevel),
1326                                this->pInside->LinkToField(glField.schemaInsideId, fld.GetFieldId(), rootLevel));
1327
1328                        innerTbl.AddRow(innerTblRow);
1329                }
1330                if (innerTbl.NumRows() > 0)
1331                        AddGlobalFieldRow(tbl, currentGlobalFieldId, innerTbl);
1332
1333                stringstream strmTmp;
1334                strmTmp << ImageTag(ImageTag::Document, rootLevel) << tbl.NumRows() << " Global Fields" << endl;
1335                tbl.description = strmTmp.str();
1336
1337                webPage.AddContent(tbl.ToXHtml());
1338                webPage.SaveInFolder(file->GetPath());
1339        }
1340        catch(exception& e)
1341        {
1342                cout << "EXCEPTION GlobalFieldList: " << e.what() << endl;
1343        }
1344}
1345
1346void CDocMain::AddGlobalFieldRow(OUTPUT::CTable &tbl, int fieldId, OUTPUT::CTable &fields)
1347{
1348        CTableRow row("");
1349        row.AddCell(CTableCell(fieldId));
1350        row.AddCell(fields.ToXHtml());
1351        tbl.AddRow(row);
1352}
1353
1354void CDocMain::MessageList()
1355{
1356        CPageParams file(PAGE_MESSAGES);
1357
1358        try
1359        {
1360                int rootLevel = file->GetRootLevel();
1361                list<CMessageItem> listMsgItem;
1362
1363                //Search all activelinks
1364                unsigned int alCount = pInside->alList.GetCount();
1365                for (unsigned int alIndex = 0; alIndex < alCount; ++alIndex)
1366                {
1367                        CARActiveLink al(alIndex);
1368
1369#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1370                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(al))
1371                                continue;
1372#endif
1373
1374                        CARSchema schema(al.GetSchemaList().u.schemaList[0].nameList[0]);
1375
1376                        for (unsigned int ifElse = 0; ifElse < 2; ++ifElse)
1377                        {
1378                                const ARActiveLinkActionList &actions = (ifElse == 0 ? al.GetIfActions() : al.GetElseActions());
1379
1380                                //actionList
1381                                for(unsigned int nAction=0; nAction < actions.numItems; nAction++)
1382                                {
1383                                        if(actions.actionList[nAction].action == AR_ACTIVE_LINK_ACTION_MESSAGE)
1384                                        {
1385                                                stringstream strmTmp;
1386                                                strmTmp.str("");
1387                                                strmTmp << (ifElse == 0 ? "If" : "Else") << "-Action " << nAction;
1388
1389                                                ARMessageStruct &msg = actions.actionList[nAction].u.message;
1390
1391                                                CMessageItem msgItem;
1392                                                msgItem.msgDetails = strmTmp.str();
1393                                                msgItem.msgNumber = msg.messageNum;
1394                                                msgItem.msgText = (schema.Exists() ? pInside->TextFindFields(msg.messageText, "$", schema.GetInsideId(), rootLevel, true, NULL) : msg.messageText);
1395                                                msgItem.msgType = msg.messageType;
1396                                                msgItem.objectLink = URLLink(al, rootLevel);
1397                                                listMsgItem.push_back(msgItem);
1398                                        }
1399                                }
1400                        }
1401                }
1402
1403
1404                //Search all filter
1405                unsigned int filterCount = pInside->filterList.GetCount();
1406                for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex )
1407                {
1408                        CARFilter flt(filterIndex);
1409
1410#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1411                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(flt))
1412                                continue;
1413#endif
1414
1415                        CARSchema schema(flt.GetSchemaList().u.schemaList[0].nameList[0]);
1416
1417                        for (unsigned int ifElse = 0; ifElse < 2; ++ifElse)
1418                        {
1419                                const ARFilterActionList &actions = (ifElse == 0 ? flt.GetIfActions() : flt.GetElseActions());
1420
1421                                //actionList
1422                                for(unsigned int nAction=0; nAction < actions.numItems; ++nAction)
1423                                {
1424                                        if(actions.actionList[nAction].action == AR_FILTER_ACTION_MESSAGE)
1425                                        {
1426                                                stringstream strmTmp;
1427                                                strmTmp.str("");
1428                                                strmTmp << (ifElse == 0 ? "If" : "Else") << "-Action " << nAction;
1429
1430                                                const ARFilterStatusStruct &msg = actions.actionList[nAction].u.message;
1431
1432                                                CMessageItem msgItem;
1433                                                msgItem.msgDetails = strmTmp.str();
1434                                                msgItem.msgNumber = msg.messageNum;
1435                                                msgItem.msgText = (schema.Exists() ? pInside->TextFindFields(msg.messageText, "$", schema.GetInsideId(), rootLevel, true, NULL) : msg.messageText);
1436                                                msgItem.msgType = msg.messageType;
1437                                                msgItem.objectLink = URLLink(flt, rootLevel);
1438                                                listMsgItem.push_back(msgItem);
1439                                        }
1440                                }
1441                        }
1442                }
1443
1444
1445                CWebPage webPage(file->GetFileName(), "Messages", rootLevel, this->pInside->appConfig);
1446                if(listMsgItem.size() > 0)
1447                {
1448                        Sort(listMsgItem);
1449
1450                        //Print all Messages           
1451                        CTable tbl("fieldListAll", "TblObjectList");
1452                        tbl.AddColumn(5, "Number");
1453                        tbl.AddColumn(25, "Object Name");
1454                        tbl.AddColumn(5, "Details");
1455                        tbl.AddColumn(5, "Type");       
1456                        tbl.AddColumn(60, "Text");
1457
1458                        list<CMessageItem>::iterator msgIter;   
1459                        CMessageItem *msg;
1460                        for ( msgIter = listMsgItem.begin(); msgIter != listMsgItem.end(); msgIter++ )
1461                        {
1462                                msg = &(*msgIter);
1463
1464                                CTableRow row("");
1465                                row.AddCell( CTableCell(msg->msgNumber));
1466                                row.AddCell( CTableCell(msg->objectLink));
1467                                row.AddCell( CTableCell(msg->msgDetails));
1468                                row.AddCell( CTableCell(CAREnum::MessageType(msg->msgType)));
1469                                row.AddCell( CTableCell(msg->msgText));
1470
1471                                tbl.AddRow(row);
1472                        }
1473
1474                        webPage.AddContent(tbl.ToXHtml());
1475                }
1476                else
1477                {
1478                        webPage.AddContent("No messages loaded.");
1479                }
1480
1481                webPage.SaveInFolder(file->GetPath());
1482        }
1483        catch(exception& e)
1484        {
1485                cout << "EXCEPTION MessageList: " << e.what() << endl;
1486        }
1487}
1488
1489void CDocMain::NotificationList()
1490{
1491        CPageParams file(PAGE_NOTIFICATIONS);
1492
1493        try
1494        {
1495                int rootLevel = file->GetRootLevel();
1496
1497                //Print all Messages           
1498                CTable tbl("fieldListAll", "TblObjectList");
1499                tbl.AddColumn(25, "Object Name");
1500                tbl.AddColumn(5, "Details");
1501                tbl.AddColumn(5, "Type");       
1502                tbl.AddColumn(60, "Text");
1503
1504                //Search all filter
1505                unsigned int filterCount = pInside->filterList.GetCount();
1506                for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex)
1507                {
1508                        CARFilter flt(filterIndex);
1509
1510#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1511                        // Hide overlaid objects on the list
1512                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(flt))
1513                                continue;
1514#endif
1515
1516                        CARSchema schema(flt.GetSchemaList().u.schemaList[0].nameList[0]);
1517
1518                        for (unsigned int ifElse = 0; ifElse < 2; ++ifElse)
1519                        {
1520                                const ARFilterActionList &actions = (ifElse == 0 ? flt.GetIfActions() : flt.GetElseActions());
1521
1522                                //actionList
1523                                for(unsigned int nAction=0; nAction < actions.numItems; ++nAction)
1524                                {
1525                                        if(actions.actionList[nAction].action == AR_FILTER_ACTION_NOTIFY)
1526                                        {
1527                                                if (!schema.Exists()) 
1528                                                        continue;
1529
1530                                                const ARFilterActionNotify& notifyAction = actions.actionList[nAction].u.notify;
1531
1532                                                stringstream strm;
1533                                                strm << (ifElse == 0 ? "If" : "Else") << "-Action " << nAction;
1534
1535                                                stringstream text;
1536                                                if (notifyAction.subjectText != NULL && notifyAction.subjectText[0] != 0)
1537                                                        text << pInside->TextFindFields(notifyAction.subjectText, "$", schema.GetInsideId(), rootLevel, true, NULL) << "<BR/>";
1538                                                if (notifyAction.notifyText != NULL)
1539                                                        text << pInside->TextFindFields(notifyAction.notifyText, "$", schema.GetInsideId(), rootLevel, true, NULL);
1540
1541                                                CTableRow row("");
1542                                                row.AddCell(URLLink(flt, rootLevel));
1543                                                row.AddCell(strm.str());
1544                                                row.AddCell(CAREnum::NotifyMechanism(notifyAction.notifyMechanism)); // Type of Notifcation
1545                                                row.AddCell(text.str());
1546
1547                                                tbl.AddRow(row);
1548                                        }
1549                                }
1550                        }
1551                }
1552
1553                //Search all escalations
1554                unsigned int escalCount = pInside->escalationList.GetCount();
1555                for (unsigned int escalIndex = 0; escalIndex < escalCount; ++escalIndex)
1556                {
1557                        CAREscalation esc(escalIndex);
1558
1559#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1560                        // Hide overlaid objects on the list
1561                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(esc))
1562                                continue;
1563#endif
1564
1565                        CARSchema schema(esc.GetSchemaList().u.schemaList[0].nameList[0]);
1566
1567                        for (unsigned int ifElse = 0; ifElse < 2; ++ifElse)
1568                        {
1569                                const ARFilterActionList &actions = (ifElse == 0 ? esc.GetIfActions() : esc.GetElseActions());
1570
1571                                //actionList
1572                                for(unsigned int nAction=0; nAction < actions.numItems; ++nAction)
1573                                {
1574                                        if(actions.actionList[nAction].action == AR_FILTER_ACTION_NOTIFY)
1575                                        {
1576                                                if (!schema.Exists()) 
1577                                                        continue;
1578
1579                                                const ARFilterActionNotify& notifyAction = actions.actionList[nAction].u.notify;
1580
1581                                                stringstream strm;
1582                                                strm << (ifElse == 0 ? "If" : "Else") << "-Action " << nAction;
1583
1584                                                stringstream text;
1585                                                if (notifyAction.subjectText != NULL && notifyAction.subjectText[0] != 0)
1586                                                        text << pInside->TextFindFields(notifyAction.subjectText, "$", schema.GetInsideId(), rootLevel, true, NULL) << "<BR/>";
1587                                                if (notifyAction.notifyText != NULL)
1588                                                        text << pInside->TextFindFields(notifyAction.notifyText, "$", schema.GetInsideId(), rootLevel, true, NULL);
1589
1590                                                CTableRow row("");
1591                                                row.AddCell(URLLink(esc, rootLevel));
1592                                                row.AddCell(strm.str());
1593                                                row.AddCell(CAREnum::NotifyMechanism(notifyAction.notifyMechanism)); // Type of Notifcation
1594                                                row.AddCell(text.str());
1595
1596                                                tbl.AddRow(row);
1597                                        }
1598                                }
1599                        }
1600                }
1601
1602                CWebPage webPage(file->GetFileName(), "Notifications", rootLevel, this->pInside->appConfig);
1603                if(tbl.NumRows() > 0)
1604                {
1605                        webPage.AddContent(tbl.ToXHtml());
1606                }
1607                else
1608                {
1609                        webPage.AddContent("No notifications loaded.");
1610                }
1611
1612                webPage.SaveInFolder(file->GetPath());
1613        }
1614        catch(exception& e)
1615        {
1616                cout << "EXCEPTION NotificationList: " << e.what() << endl;
1617        }
1618}
1619
1620void CDocMain::Sort(list<CMessageItem> &listResult)
1621{
1622        listResult.sort(SortByMsgNum);
1623}
1624
1625bool CDocMain::SortByMsgNum(const CMessageItem& t1, const CMessageItem& t2 )
1626{       
1627        return ( t1.msgNumber < t2.msgNumber);
1628}
1629
1630string CDocMain::CreateStandardFilterControl(const string &inputControlId, const string &htmlPlaceHolder)
1631{
1632        stringstream content;
1633        content << "<span class='clearable'><label for='" << inputControlId << "'>Filter: </label><input id='" << inputControlId << "' class='data_field' type='text' ";
1634        if (!htmlPlaceHolder.empty()) { content << "placeholder='" << htmlPlaceHolder << "'"; }
1635        content << "/></span>";
1636        return content.str();
1637}
1638
1639string CDocMain::CreateSchemaFilterControl()
1640{
1641        stringstream content;   
1642        content << "<div>" 
1643                << CreateStandardFilterControl("formFilter", "search by name or id") << " &nbsp;&nbsp;&nbsp; "
1644                << "<span class='multiFilter' id='multiFilter'>Restrict results to: "
1645                << "<input id='typeFilterRegular' type='checkbox' value='1'/><label for='typeFilterRegular'>&nbsp;Regular</label>"
1646                << "<input id='typeFilterJoin' type='checkbox' value='2'/><label for='typeFilterJoin'>&nbsp;Join</label>"
1647                << "<input id='typeFilterView' type='checkbox' value='3'/><label for='typeFilterView'>&nbsp;View</label>"
1648                << "<input id='typeFilterDialog' type='checkbox' value='4'/><label for='typeFilterDialog'>&nbsp;Dialog</label>"
1649                << "<input id='typeFilterVendor' type='checkbox' value='5'/><label for='typeFilterVendor'>&nbsp;Vendor</label>"
1650                << " <button id='typeFilterNone'>Clear All</button>"
1651                << "</span>"
1652        << "</div>";
1653
1654        return content.str();
1655}
1656
1657string CDocMain::CreateActlinkFilterControl()
1658{
1659        stringstream content;
1660        content << "<div>"
1661                << CreateStandardFilterControl("actlinkFilter")
1662        << "</div>";
1663        return content.str();
1664}
1665
1666string CDocMain::CreateFilterFilterControl()
1667{
1668        stringstream content;
1669        content << "<div>"
1670                << CreateStandardFilterControl("filterFilter")
1671                << "<span class='multiFilter' id='multiFilter'>Restrict results to: "
1672                << "<input id='typeFilterOnlyNone' type='checkbox' value='N'/><label for='typeFilterOnlyNone'>&nbsp;None</label>"
1673                << "<input id='typeFilterModify' type='checkbox' value='2'/><label for='typeFilterModify'>&nbsp;Modify</label>"
1674                << "<input id='typeFilterSubmit' type='checkbox' value='4'/><label for='typeFilterSubmit'>&nbsp;Submit</label>"
1675                << "<input id='typeFilterDelete' type='checkbox' value='8'/><label for='typeFilterDelete'>&nbsp;Delete</label>"
1676                << "<input id='typeFilterGetEntry' type='checkbox' value='1'/><label for='typeFilterGetEntry'>&nbsp;Get&nbsp;Entry</label>"
1677                << "<input id='typeFilterMerge' type='checkbox' value='16'/><label for='typeFilterMerge'>&nbsp;Merge</label>"
1678                << "<input id='typeFilterService' type='checkbox' value='64'/><label for='typeFilterService'>&nbsp;Service</label>"
1679                << " <button id='typeFilterNone'>Clear All</button>"
1680                << "</span>"
1681        << "</div>";
1682        return content.str();
1683}
1684
1685string CDocMain::CreateEscalationFilterControl()
1686{
1687        stringstream content;
1688        content << "<div>"
1689                << CreateStandardFilterControl("escalationFilter")
1690        << "</div>";
1691        return content.str();
1692}
1693
1694string CDocMain::CreateMenuFilterControl()
1695{
1696        stringstream content;
1697        content << "<div>"
1698                << CreateStandardFilterControl("menuFilter")
1699                << "<span class='multiFilter' id='multiFilter'>Restrict results to: "
1700                << "<input id='typeFilterCharacter' type='checkbox' value='1'/><label for='typeFilterCharacter'>&nbsp;Character</label>"
1701                << "<input id='typeFilterSearch' type='checkbox' value='2'/><label for='typeFilterSearch'>&nbsp;Search</label>"
1702                << "<input id='typeFilterFile' type='checkbox' value='3'/><label for='typeFilterFile'>&nbsp;File</label>"
1703                << "<input id='typeFilterSQL' type='checkbox' value='4'/><label for='typeFilterSQL'>&nbsp;SQL</label>"
1704                << "<input id='typeFilterDD' type='checkbox' value='6'/><label for='typeFilterDD'>&nbsp;Data&nbsp;Dictionary</label>"
1705                << " <button id='typeFilterNone'>Clear All</button>"
1706                << "</span>"
1707        << "</div>";
1708        return content.str();
1709}
1710
1711string CDocMain::CreateContainerFilterControl()
1712{
1713        stringstream content;
1714        content << "<div>"
1715                << CreateStandardFilterControl("containerFilter")
1716        << "</div>";
1717        return content.str();
1718}
1719
1720string CDocMain::CreateImageFilterControl()
1721{
1722        stringstream content;
1723        content << "<div>"
1724                << CreateStandardFilterControl("imageFilter")
1725        << "</div>";
1726        return content.str();
1727}
1728
1729string CDocMain::CreateGroupFilterControl()
1730{
1731        stringstream content;
1732        content << "<div>"
1733                << CreateStandardFilterControl("groupFilter", "search by name or id") << " &nbsp;&nbsp;&nbsp; "
1734                << "<span class='multiFilter' id='multiFilter'>Restrict results to: "
1735                << "<input id='typeFilterRegular' type='checkbox' value='0'/><label for='typeFilterRegular'>&nbsp;Regular</label>"
1736                << "<input id='typeFilterDynamic' type='checkbox' value='1'/><label for='typeFilterDynamic'>&nbsp;Dynamic</label>"
1737                << "<input id='typeFilterComputed' type='checkbox' value='2'/><label for='typeFilterComputed'>&nbsp;Computed</label>"
1738                << " <button id='typeFilterNone'>Clear All</button>"
1739                << "</span>"
1740        << "</div>";
1741        return content.str();
1742}
1743
1744string CDocMain::CreateRoleFilterControl()
1745{
1746        stringstream content;
1747        content << "<div>"
1748                << CreateStandardFilterControl("roleFilter", "search by name or id")
1749        << "</div>";
1750        return content.str();
1751}
1752
1753string CDocMain::CreateSchemaReferenceFilterControl()
1754{
1755        stringstream content;
1756        content << "<div>"
1757                << "<div id='search'>" << CreateStandardFilterControl("workflowFilter") << "</div>"
1758                << "<div class='restrictions'>"
1759                        << "<div id='clearButton'><button id='typeFilterNone'>Clear All</button>" << "</div>"
1760                        << "<div id='referenceMultiFilter'>"
1761                                << "<div class='left'>Restrict results to: " << "</div>"
1762                                << "<div class='filterOpts'>"
1763                                        << "<div class='checkbox'><input id='typeFilterActiveLink' type='checkbox' value='1'/><label for='typeFilterActiveLink'>&nbsp;ActiveLink</label>" << "</div>"
1764                                        << "<div class='checkbox'><input id='typeFilterFilter' type='checkbox' value='2'/><label for='typeFilterFilter'>&nbsp;Filter</label>" << "</div>"
1765                                        << "<div class='checkbox'><input id='typeFilterEscalation' type='checkbox' value='3'/><label for='typeFilterEscalation'>&nbsp;Escalation</label>" << "</div>"
1766                                        << "<div class='checkbox'><input id='typeFilterALGuide' type='checkbox' value='4'/><label for='typeFilterALGuide'>&nbsp;ActiveLinkGuide</label>" << "</div>"
1767                                        << "<div class='checkbox'><input id='typeFilterFilterGuide' type='checkbox' value='5'/><label for='typeFilterFilterGuide'>&nbsp;FilterGuide</label>" << "</div>"
1768                                        << "<div class='checkbox'><input id='typeFilterApplication' type='checkbox' value='6'/><label for='typeFilterApplication'>&nbsp;Application</label>" << "</div>"
1769                                        << "<div class='checkbox'><input id='typeFilterPackList' type='checkbox' value='7'/><label for='typeFilterPackList'>&nbsp;PackingList</label>" << "</div>"
1770                                        << "<div class='checkbox'><input id='typeFilterWebservice' type='checkbox' value='8'/><label for='typeFilterWebservice'>&nbsp;Webservice</label>" << "</div>"
1771                                << "</div>"
1772                        << "</div>"
1773                << "</div>"
1774        << "</div>";
1775        return content.str();
1776}
1777
1778void CDocMain::SchemaListJson(std::ostream &strm)
1779{
1780        Document document;
1781        Document::AllocatorType &alloc = document.GetAllocator();
1782        document.SetArray();
1783
1784        unsigned int schemaCount = this->pInside->schemaList.GetCount();
1785        for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1786        {       
1787                CARSchema schema(schemaIndex);
1788                CPageParams schemaDetailPage(PAGE_DETAILS, &schema);
1789               
1790#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1791                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(schema))
1792                                continue;
1793#endif
1794
1795                        // create a new json row and make it an array
1796                        Value schemaRow;
1797                        schemaRow.SetArray();
1798
1799                        // now build the needed temporary variables
1800                        string strName = schema.GetName();
1801                        string strWebAlias = schema.WebAlias();                 
1802                        string strModifiedDate = CUtil::DateTimeToString(schema.GetTimestamp());
1803                        string strLink = CWebUtil::GetRelativeURL(rootLevel, schemaDetailPage);
1804
1805                        //// try to reduce data size
1806                        //if (strLink.compare(strName) == 0)
1807                        //      strLink == "";
1808
1809                        Value valName(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
1810                        Value valWebAlias(strWebAlias.c_str(), static_cast<SizeType>(strWebAlias.size()), alloc);
1811                        Value valModifiedDate(strModifiedDate.c_str(), static_cast<SizeType>(strModifiedDate.size()), alloc);
1812                        Value valLink(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
1813
1814                        // add everything to the row
1815                        schemaRow.PushBack(schema.GetDbTableId(), alloc);
1816                        schemaRow.PushBack(valName, alloc);
1817                        schemaRow.PushBack(valWebAlias, alloc);
1818                        schemaRow.PushBack(static_cast<int>(schema.GetFields()->GetCount()), alloc);
1819                        schemaRow.PushBack(static_cast<int>(schema.GetVUIs()->GetCount()), alloc);
1820                        schemaRow.PushBack(static_cast<int>(schema.GetCompound().schemaType), alloc);
1821                        schemaRow.PushBack(valModifiedDate, alloc);
1822                        schemaRow.PushBack(schema.GetLastChanged(), alloc);
1823                        schemaRow.PushBack(valLink, alloc);
1824                        schemaRow.PushBack(schema.GetOverlayType(), alloc);
1825
1826                        // add the row to the document
1827                        document.PushBack(schemaRow, alloc);
1828        }
1829
1830        GenericWriteStream output(strm);
1831        Writer<GenericWriteStream> writer(output);
1832
1833        strm << endl << "<script type=\"text/javascript\">" << endl;
1834        strm << "var schemaList = "; document.Accept(writer); strm << ";";
1835        strm << "var rootLevel = " << rootLevel << ";";
1836        strm << endl;
1837        strm << "</script>" << endl;   
1838}
Note: See TracBrowser for help on using the repository browser.