source: branches/work_304/doc/DocMain.cpp @ 435

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