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

Revision 433, 61.4 KB checked in by jls17, 6 years ago (diff)
  • added placeholder support to the filter control
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                int rootLevel = file->GetRootLevel();
1217                CContainerTable tbl(*this->pInside);
1218
1219                unsigned int cntCount = this->pInside->containerList.GetCount();
1220                for ( unsigned int cntIndex = 0; cntIndex < cntCount; ++cntIndex )
1221                {       
1222                        CARContainer cont(cntIndex);
1223
1224#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1225                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(cont))
1226                                continue;
1227#endif
1228
1229                        if (cont.GetType() == nType)    // the type must match
1230                        {
1231                                objCount++;
1232                                bool bInsert = false;
1233                                if(searchChar == "*")  //All objecte
1234                                {
1235                                        // the first call to this function holds alwasy "*" as search char. That's the
1236                                        // best time to sum up the object count per letter.
1237                                        string firstChar = cont.GetNameFirstChar();
1238                                        if (firstChar.empty()) firstChar = "*";
1239                                        int index = CARObject::GetFirstCharIndex(firstChar[0]);
1240                                        ++(objCountPerLetter[index]);
1241                                        bInsert = true;
1242                                }
1243                                else if(searchChar == "#")
1244                                {
1245                                        if(!cont.NameStandardFirstChar())
1246                                        {
1247                                                bInsert = true;
1248                                        }
1249                                }
1250                                else
1251                                {
1252                                        if(cont.GetNameFirstChar() == searchChar)
1253                                        {
1254                                                bInsert = true;
1255                                        }
1256                                }
1257
1258                                if(bInsert)
1259                                {
1260                                        tbl.AddRow(cont, rootLevel);
1261                                }
1262                        }
1263                }
1264
1265                if (tbl.NumRows() > 0 || searchChar == "*")
1266                {
1267                        CWebPage webPage(file->GetFileName(), title, rootLevel, this->pInside->appConfig);
1268
1269                        stringstream strmTmp;
1270                        strmTmp << CWebUtil::LinkToContainer(tbl.NumRows(), rootLevel, nType);
1271                        strmTmp << ShortMenu(searchChar, file, objCountPerLetter);
1272                       
1273                        tbl.SetDescription(strmTmp.str());
1274                        webPage.AddContent(tbl.Print());
1275
1276                        webPage.AddContent("(!) No Active Link / Filter \"CallGuide\" Action uses this Guide.");
1277
1278                        webPage.SaveInFolder(file->GetPath());
1279                }
1280        }
1281        catch(exception& e)
1282        {
1283                cout << "EXCEPTION ContainerList: " << e.what() << endl;
1284        }
1285        return objCount;
1286}
1287
1288void CDocMain::RoleList(string searchChar, std::vector<int>& objCountPerLetter)
1289{
1290        unsigned int page = (unsigned int)searchChar[0];
1291        CPageParams file(page, AR_STRUCT_ITEM_XML_ROLE);
1292
1293        try
1294        {
1295                int rootLevel = file->GetRootLevel();
1296                CRoleTable tbl(*this->pInside);
1297
1298                unsigned int roleCount = this->pInside->roleList.GetCount();
1299                for (unsigned int roleIndex = 0; roleIndex < roleCount; ++roleIndex)
1300                {       
1301                        CARRole role(roleIndex);
1302
1303                        bool bInsert = false;
1304                        if(searchChar == "*")  //All objecte
1305                        {
1306                                // the first call to this function holds always "*" as search char. That's the
1307                                // best time to sum up the object count per letter.
1308                                string firstChar = role.GetNameFirstChar();
1309                                if (firstChar.empty()) firstChar = "*";
1310                                int index = CARObject::GetFirstCharIndex(firstChar[0]);
1311                                ++(objCountPerLetter[index]);
1312                                bInsert = true;
1313                        }
1314                        else if(searchChar == "#")
1315                        {
1316                                if(!role.NameStandardFirstChar())
1317                                {
1318                                        bInsert = true;
1319                                }
1320                        }
1321                        else
1322                        {
1323                                if(role.GetNameFirstChar() == searchChar)
1324                                {
1325                                        bInsert = true;
1326                                }
1327                        }
1328
1329                        if(bInsert)
1330                        {       
1331                                tbl.AddRow(role, rootLevel);
1332                        }
1333                }
1334
1335                if (tbl.NumRows() > 0 || searchChar == "*")
1336                {
1337                        CWebPage webPage(file->GetFileName(), "Role List", rootLevel, this->pInside->appConfig);
1338
1339                        stringstream strmTmp;
1340                        strmTmp << CWebUtil::LinkToRoleIndex(tbl.NumRows(), rootLevel) << ShortMenu(searchChar, file, objCountPerLetter);
1341
1342                        tbl.SetDescription(strmTmp.str());
1343                        webPage.AddContent(tbl.Print());
1344
1345                        webPage.SaveInFolder(file->GetPath());
1346                }
1347        }
1348        catch(exception& e)
1349        {
1350                cout << "EXCEPTION GroupList: " << e.what() << endl;
1351        }
1352}
1353
1354unsigned int CDocMain::ImageList(string searchChar, std::vector<int> &objCountPerLetter)
1355{
1356        unsigned int objCount = 0;
1357#if AR_CURRENT_API_VERSION >= AR_API_VERSION_750
1358        // server version older than 7.5 ?? then there are no files to generate
1359        if (pInside->CompareServerVersion(7,5) < 0) return 0;
1360        if (searchChar.size() != 1) return 0;
1361
1362        unsigned int page = (unsigned int)searchChar[0];
1363        CPageParams file(page, AR_STRUCT_ITEM_XML_IMAGE);
1364
1365        try
1366        {
1367                int rootLevel = file->GetRootLevel();
1368                CImageTable imgTable(*this->pInside);
1369
1370                unsigned int len = this->pInside->imageList.GetCount();
1371                for (unsigned int idx = 0; idx < len; ++idx)
1372                {
1373                        CARImage img(idx);
1374
1375#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1376                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(img))
1377                                continue;
1378#endif
1379
1380                        objCount++;
1381
1382                        bool bInsert = false;
1383                       
1384                        if (searchChar == "*") // All objects
1385                        {
1386                                // the first call to this function holds always "*" as search char. That's the
1387                                // best time to sum up the object count per letter.
1388                                string firstChar = img.GetNameFirstChar();
1389                                if (firstChar.empty()) firstChar = "*";
1390                                int index = CARObject::GetFirstCharIndex(firstChar[0]);
1391                                ++(objCountPerLetter[index]);
1392                                bInsert = true;
1393                        }
1394                        else if (searchChar == "#")
1395                        {
1396                                if (!img.NameStandardFirstChar())
1397                                        bInsert = true;
1398                        }
1399                        else 
1400                        {
1401                                if (img.GetNameFirstChar() == searchChar)
1402                                        bInsert = true;
1403                        }
1404
1405                        if (bInsert)
1406                                imgTable.AddRow(idx, rootLevel);
1407                }
1408
1409                if (imgTable.NumRows() > 0 || searchChar == "*")
1410                {
1411                        CWebPage webPage(file->GetFileName(), "Image List", rootLevel, this->pInside->appConfig);
1412
1413                        stringstream strmTmp;
1414                        strmTmp << CWebUtil::LinkToImageIndex(imgTable.NumRows(), rootLevel);
1415                        strmTmp << ShortMenu(searchChar, file, objCountPerLetter);
1416                       
1417                        imgTable.SetDescription(strmTmp.str());
1418                       
1419                        webPage.AddContent(imgTable.Print());
1420                        webPage.SaveInFolder(file->GetPath());
1421                }
1422        }
1423        catch(exception& e)
1424        {
1425                cout << "EXCEPTION ImageList: " << e.what() << endl;
1426        }
1427#endif // AR_CURRENT_API_VERSION >= AR_API_VERSION_750
1428        return objCount;
1429}
1430
1431void CDocMain::GroupList(string searchChar, std::vector<int>& objCountPerLetter)
1432{
1433        unsigned int page = (unsigned int)searchChar[0];
1434        CPageParams file(page, AR_STRUCT_ITEM_XML_GROUP);
1435
1436        try
1437        {
1438                int rootLevel = file->GetRootLevel();
1439                CGroupTable tbl(*this->pInside);
1440
1441                unsigned int groupCount = pInside->groupList.GetCount();
1442                for (unsigned int groupIndex = 0; groupIndex < groupCount; ++groupIndex)
1443                {       
1444                        CARGroup grp(groupIndex);
1445
1446                        bool bInsert = false;
1447                        if(searchChar == "*")  //All objects
1448                        {
1449                                // the first call to this function holds always "*" as search char. That's the
1450                                // best time to sum up the object count per letter.
1451                                string firstChar = grp.GetNameFirstChar();
1452                                if (firstChar.empty()) firstChar = "*";
1453                                int index = CARObject::GetFirstCharIndex(firstChar[0]);
1454                                ++(objCountPerLetter[index]);
1455                                bInsert = true;
1456                        }
1457                        else if(searchChar == "#")
1458                        {
1459                                if(!grp.NameStandardFirstChar())
1460                                {
1461                                        bInsert = true;
1462                                }
1463                        }
1464                        else
1465                        {
1466                                if(grp.GetNameFirstChar() == searchChar)
1467                                {
1468                                        bInsert = true;
1469                                }
1470                        }
1471
1472                        if(bInsert)
1473                        {       
1474                                tbl.AddRow("", grp.GetGroupId(), rootLevel);
1475                        }
1476                }
1477
1478                if (tbl.NumRows() > 0 || searchChar == "*")
1479                {
1480                        CWebPage webPage(file->GetFileName(), "Group List", rootLevel, this->pInside->appConfig);
1481
1482                        stringstream strmTmp;
1483                        strmTmp << CWebUtil::LinkToGroupIndex(tbl.NumRows(), rootLevel) << ShortMenu(searchChar, file, objCountPerLetter);
1484
1485                        tbl.SetDescription(strmTmp.str());
1486                        webPage.AddContent(tbl.Print());
1487
1488                        webPage.SaveInFolder(file->GetPath());
1489                }
1490        }
1491        catch(exception& e)
1492        {
1493                cout << "EXCEPTION GroupList: " << e.what() << endl;
1494        }
1495}
1496
1497void CDocMain::UserList(string searchChar, std::vector<int>& objCountPerLetter)
1498{
1499        unsigned int page = (unsigned int)searchChar[0];
1500        CPageParams file(page, AR_STRUCT_ITEM_XML_USER);
1501
1502        try
1503        {
1504                int rootLevel = file->GetRootLevel();
1505                CUserTable tbl(*this->pInside);
1506
1507                unsigned int userCount = this->pInside->userList.GetCount();
1508                for (unsigned int userIndex = 0; userIndex < userCount; ++userIndex)
1509                {       
1510                        CARUser user(userIndex);
1511
1512                        bool bInsert = false;
1513                        if(searchChar == "*")  //All objecte
1514                        {
1515                                // the first call to this function holds always "*" as search char. That's the
1516                                // best time to sum up the object count per letter.
1517                                string firstChar = user.GetNameFirstChar();
1518                                if (firstChar.empty()) firstChar = "*";
1519                                int index = CARObject::GetFirstCharIndex(firstChar[0]);
1520                                ++(objCountPerLetter[index]);
1521                                bInsert = true;
1522                        }
1523                        else if(searchChar == "#")
1524                        {
1525                                if(!user.NameStandardFirstChar())
1526                                {
1527                                        bInsert = true;
1528                                }
1529                        }
1530                        else
1531                        {
1532                                if(user.GetNameFirstChar() == searchChar)
1533                                {
1534                                        bInsert = true;
1535                                }
1536                        }
1537
1538                        if(bInsert)
1539                        {       
1540                                tbl.AddRow(user, rootLevel);
1541                        }
1542                }
1543
1544                if (tbl.NumRows() > 0 || searchChar == "*")
1545                {
1546                        CWebPage webPage(file->GetFileName(), "User List", rootLevel, this->pInside->appConfig);
1547
1548                        stringstream strmTmp;
1549                        strmTmp << CWebUtil::LinkToUserIndex(tbl.NumRows(), rootLevel) << ShortMenu(searchChar, file, objCountPerLetter);
1550
1551                        tbl.SetDescription(strmTmp.str());
1552                        webPage.AddContent(tbl.Print());
1553
1554                        webPage.SaveInFolder(file->GetPath());
1555                }
1556        }
1557        catch(exception& e)
1558        {
1559                cout << "EXCEPTION UserList: " << e.what() << endl;
1560        }
1561}
1562
1563void CDocMain::GlobalFieldList()
1564{
1565        CPageParams file(PAGE_GLOBALFIELS);
1566
1567        try
1568        {
1569                int rootLevel = file->GetRootLevel();
1570                CWebPage webPage(file->GetFileName(), "Global Fields", rootLevel, this->pInside->appConfig);   
1571
1572                // outer table
1573                CTable tbl("fieldListAll", "TblObjectList");
1574                tbl.AddColumn(20, "GlobalFieldId");
1575                tbl.AddColumn(80, "References");
1576
1577                // inner table; reused per global field id
1578                CTable innerTbl("refList", "TblObjectList");
1579                innerTbl.AddColumn(50, "Schema Name");
1580                innerTbl.AddColumn(50, "Field Name");
1581
1582                int currentGlobalFieldId = 0;
1583
1584                //Search all global fields
1585                list<CARGlobalField>::iterator listIter = this->pInside->globalFieldList.begin();
1586                list<CARGlobalField>::iterator listEnd = this->pInside->globalFieldList.end();
1587                for (; listIter != listEnd; ++listIter )
1588                {       
1589                        CARGlobalField &glField = (*listIter);
1590                        CARField fld(glField.schemaInsideId, glField.fieldId);
1591
1592                        if (currentGlobalFieldId != fld.GetFieldId())
1593                        {
1594                                // add the previous global field to the table before resetting
1595                                if (currentGlobalFieldId != 0)
1596                                        AddGlobalFieldRow(tbl, currentGlobalFieldId, innerTbl);
1597
1598                                // reset for current field
1599                                currentGlobalFieldId = fld.GetFieldId();
1600                                innerTbl.ClearRows();
1601                        }
1602
1603                        CTableRow innerTblRow("");
1604                        innerTblRow.AddCellList(
1605                                this->pInside->LinkToSchema(glField.schemaInsideId, rootLevel),
1606                                this->pInside->LinkToField(glField.schemaInsideId, fld.GetFieldId(), rootLevel));
1607
1608                        innerTbl.AddRow(innerTblRow);
1609                }
1610                if (innerTbl.NumRows() > 0)
1611                        AddGlobalFieldRow(tbl, currentGlobalFieldId, innerTbl);
1612
1613                stringstream strmTmp;
1614                strmTmp << CWebUtil::ImageTag("doc.gif", rootLevel) << tbl.NumRows() << " Global Fields" << endl;
1615                tbl.description = strmTmp.str();
1616
1617                webPage.AddContent(tbl.ToXHtml());
1618                webPage.SaveInFolder(file->GetPath());
1619        }
1620        catch(exception& e)
1621        {
1622                cout << "EXCEPTION GlobalFieldList: " << e.what() << endl;
1623        }
1624}
1625
1626void CDocMain::AddGlobalFieldRow(OUTPUT::CTable &tbl, int fieldId, OUTPUT::CTable &fields)
1627{
1628        CTableRow row("");
1629        row.AddCell(CTableCell(fieldId));
1630        row.AddCell(fields.ToXHtml());
1631        tbl.AddRow(row);
1632}
1633
1634void CDocMain::MessageList()
1635{
1636        CPageParams file(PAGE_MESSAGES);
1637
1638        try
1639        {
1640                int rootLevel = file->GetRootLevel();
1641                int curMsgNumber = 0;
1642                list<CMessageItem> listMsgItem;
1643
1644                //Search all activelinks
1645                unsigned int alCount = pInside->alList.GetCount();
1646                for (unsigned int alIndex = 0; alIndex < alCount; ++alIndex)
1647                {
1648                        CARActiveLink al(alIndex);
1649
1650#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1651                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(al))
1652                                continue;
1653#endif
1654
1655                        CARSchema schema(al.GetSchemaList().u.schemaList[0].nameList[0]);
1656
1657                        for (unsigned int ifElse = 0; ifElse < 2; ++ifElse)
1658                        {
1659                                const ARActiveLinkActionList &actions = (ifElse == 0 ? al.GetIfActions() : al.GetElseActions());
1660
1661                                //actionList
1662                                for(unsigned int nAction=0; nAction < actions.numItems; nAction++)
1663                                {
1664                                        if(actions.actionList[nAction].action == AR_ACTIVE_LINK_ACTION_MESSAGE)
1665                                        {
1666                                                stringstream strmTmp;
1667                                                strmTmp.str("");
1668                                                strmTmp << (ifElse == 0 ? "If" : "Else") << "-Action " << nAction;
1669
1670                                                ARMessageStruct &msg = actions.actionList[nAction].u.message;
1671
1672                                                CMessageItem msgItem;
1673                                                msgItem.msgDetails = strmTmp.str();
1674                                                msgItem.msgNumber = msg.messageNum;
1675                                                msgItem.msgText = (schema.Exists() ? pInside->TextFindFields(msg.messageText, "$", schema.GetInsideId(), rootLevel, true, NULL) : msg.messageText);
1676                                                msgItem.msgType = msg.messageType;
1677                                                msgItem.objectLink = al.GetURL(rootLevel);
1678                                                listMsgItem.push_back(msgItem);
1679                                        }
1680                                }
1681                        }
1682                }
1683
1684
1685                //Search all filter
1686                unsigned int filterCount = pInside->filterList.GetCount();
1687                for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex )
1688                {
1689                        CARFilter flt(filterIndex);
1690
1691#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1692                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(flt))
1693                                continue;
1694#endif
1695
1696                        CARSchema schema(flt.GetSchemaList().u.schemaList[0].nameList[0]);
1697
1698                        for (unsigned int ifElse = 0; ifElse < 2; ++ifElse)
1699                        {
1700                                const ARFilterActionList &actions = (ifElse == 0 ? flt.GetIfActions() : flt.GetElseActions());
1701
1702                                //actionList
1703                                for(unsigned int nAction=0; nAction < actions.numItems; ++nAction)
1704                                {
1705                                        if(actions.actionList[nAction].action == AR_FILTER_ACTION_MESSAGE)
1706                                        {
1707                                                stringstream strmTmp;
1708                                                strmTmp.str("");
1709                                                strmTmp << (ifElse == 0 ? "If" : "Else") << "-Action " << nAction;
1710
1711                                                const ARFilterStatusStruct &msg = actions.actionList[nAction].u.message;
1712
1713                                                CMessageItem msgItem;
1714                                                msgItem.msgDetails = strmTmp.str();
1715                                                msgItem.msgNumber = msg.messageNum;
1716                                                msgItem.msgText = (schema.Exists() ? pInside->TextFindFields(msg.messageText, "$", schema.GetInsideId(), rootLevel, true, NULL) : msg.messageText);
1717                                                msgItem.msgType = msg.messageType;
1718                                                msgItem.objectLink = flt.GetURL(rootLevel);
1719                                                listMsgItem.push_back(msgItem);
1720                                        }
1721                                }
1722                        }
1723                }
1724
1725
1726                CWebPage webPage(file->GetFileName(), "Messages", rootLevel, this->pInside->appConfig);
1727                if(listMsgItem.size() > 0)
1728                {
1729                        Sort(listMsgItem);
1730
1731                        //Print all Messages           
1732                        CTable tbl("fieldListAll", "TblObjectList");
1733                        tbl.AddColumn(5, "Number");
1734                        tbl.AddColumn(25, "Object Name");
1735                        tbl.AddColumn(5, "Details");
1736                        tbl.AddColumn(5, "Type");       
1737                        tbl.AddColumn(60, "Text");
1738
1739                        list<CMessageItem>::iterator msgIter;   
1740                        CMessageItem *msg;
1741                        for ( msgIter = listMsgItem.begin(); msgIter != listMsgItem.end(); msgIter++ )
1742                        {
1743                                msg = &(*msgIter);
1744
1745                                CTableRow row("");
1746                                row.AddCell( CTableCell(msg->msgNumber));
1747                                row.AddCell( CTableCell(msg->objectLink));
1748                                row.AddCell( CTableCell(msg->msgDetails));
1749                                row.AddCell( CTableCell(CAREnum::MessageType(msg->msgType)));
1750                                row.AddCell( CTableCell(msg->msgText));
1751
1752                                tbl.AddRow(row);
1753                        }
1754
1755                        webPage.AddContent(tbl.ToXHtml());
1756                }
1757                else
1758                {
1759                        webPage.AddContent("No messages loaded.");
1760                }
1761
1762                webPage.SaveInFolder(file->GetPath());
1763        }
1764        catch(exception& e)
1765        {
1766                cout << "EXCEPTION MessageList: " << e.what() << endl;
1767        }
1768}
1769
1770void CDocMain::NotificationList()
1771{
1772        CPageParams file(PAGE_NOTIFICATIONS);
1773
1774        try
1775        {
1776                int rootLevel = file->GetRootLevel();
1777
1778                //Print all Messages           
1779                CTable tbl("fieldListAll", "TblObjectList");
1780                tbl.AddColumn(25, "Object Name");
1781                tbl.AddColumn(5, "Details");
1782                tbl.AddColumn(5, "Type");       
1783                tbl.AddColumn(60, "Text");
1784
1785                //Search all filter
1786                unsigned int filterCount = pInside->filterList.GetCount();
1787                for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex)
1788                {
1789                        CARFilter flt(filterIndex);
1790
1791#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1792                        // Hide overlaid objects on the list
1793                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(flt))
1794                                continue;
1795#endif
1796
1797                        CARSchema schema(flt.GetSchemaList().u.schemaList[0].nameList[0]);
1798
1799                        for (unsigned int ifElse = 0; ifElse < 2; ++ifElse)
1800                        {
1801                                const ARFilterActionList &actions = (ifElse == 0 ? flt.GetIfActions() : flt.GetElseActions());
1802
1803                                //actionList
1804                                for(unsigned int nAction=0; nAction < actions.numItems; ++nAction)
1805                                {
1806                                        if(actions.actionList[nAction].action == AR_FILTER_ACTION_NOTIFY)
1807                                        {
1808                                                if (!schema.Exists()) 
1809                                                        continue;
1810
1811                                                const ARFilterActionNotify& notifyAction = actions.actionList[nAction].u.notify;
1812
1813                                                stringstream strm;
1814                                                strm << (ifElse == 0 ? "If" : "Else") << "-Action " << nAction;
1815
1816                                                stringstream text;
1817                                                if (notifyAction.subjectText != NULL && notifyAction.subjectText[0] != 0)
1818                                                        text << pInside->TextFindFields(notifyAction.subjectText, "$", schema.GetInsideId(), rootLevel, true, NULL) << "<BR/>";
1819                                                if (notifyAction.notifyText != NULL)
1820                                                        text << pInside->TextFindFields(notifyAction.notifyText, "$", schema.GetInsideId(), rootLevel, true, NULL);
1821
1822                                                CTableRow row("");
1823                                                row.AddCell(flt.GetURL(rootLevel));
1824                                                row.AddCell(strm.str());
1825                                                row.AddCell(CAREnum::NotifyMechanism(notifyAction.notifyMechanism)); // Type of Notifcation
1826                                                row.AddCell(text.str());
1827
1828                                                tbl.AddRow(row);
1829                                        }
1830                                }
1831                        }
1832                }
1833
1834                //Search all escalations
1835                unsigned int escalCount = pInside->escalationList.GetCount();
1836                for (unsigned int escalIndex = 0; escalIndex < escalCount; ++escalIndex)
1837                {
1838                        CAREscalation esc(escalIndex);
1839
1840#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
1841                        // Hide overlaid objects on the list
1842                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(esc))
1843                                continue;
1844#endif
1845
1846                        CARSchema schema(esc.GetSchemaList().u.schemaList[0].nameList[0]);
1847
1848                        for (unsigned int ifElse = 0; ifElse < 2; ++ifElse)
1849                        {
1850                                const ARFilterActionList &actions = (ifElse == 0 ? esc.GetIfActions() : esc.GetElseActions());
1851
1852                                //actionList
1853                                for(unsigned int nAction=0; nAction < actions.numItems; ++nAction)
1854                                {
1855                                        if(actions.actionList[nAction].action == AR_FILTER_ACTION_NOTIFY)
1856                                        {
1857                                                if (!schema.Exists()) 
1858                                                        continue;
1859
1860                                                const ARFilterActionNotify& notifyAction = actions.actionList[nAction].u.notify;
1861
1862                                                stringstream strm;
1863                                                strm << (ifElse == 0 ? "If" : "Else") << "-Action " << nAction;
1864
1865                                                stringstream text;
1866                                                if (notifyAction.subjectText != NULL && notifyAction.subjectText[0] != 0)
1867                                                        text << pInside->TextFindFields(notifyAction.subjectText, "$", schema.GetInsideId(), rootLevel, true, NULL) << "<BR/>";
1868                                                if (notifyAction.notifyText != NULL)
1869                                                        text << pInside->TextFindFields(notifyAction.notifyText, "$", schema.GetInsideId(), rootLevel, true, NULL);
1870
1871                                                CTableRow row("");
1872                                                row.AddCell(esc.GetURL(rootLevel));
1873                                                row.AddCell(strm.str());
1874                                                row.AddCell(CAREnum::NotifyMechanism(notifyAction.notifyMechanism)); // Type of Notifcation
1875                                                row.AddCell(text.str());
1876
1877                                                tbl.AddRow(row);
1878                                        }
1879                                }
1880                        }
1881                }
1882
1883                CWebPage webPage(file->GetFileName(), "Notifications", rootLevel, this->pInside->appConfig);
1884                if(tbl.NumRows() > 0)
1885                {
1886                        webPage.AddContent(tbl.ToXHtml());
1887                }
1888                else
1889                {
1890                        webPage.AddContent("No notifications loaded.");
1891                }
1892
1893                webPage.SaveInFolder(file->GetPath());
1894        }
1895        catch(exception& e)
1896        {
1897                cout << "EXCEPTION NotificationList: " << e.what() << endl;
1898        }
1899}
1900
1901void CDocMain::Sort(list<CMessageItem> &listResult)
1902{
1903        listResult.sort(SortByMsgNum);
1904}
1905
1906bool CDocMain::SortByMsgNum(const CMessageItem& t1, const CMessageItem& t2 )
1907{       
1908        return ( t1.msgNumber < t2.msgNumber);
1909}
1910
1911string CDocMain::CreateStandardFilterControl(const string &inputControlId, const string &htmlPlaceHolder)
1912{
1913        stringstream content;
1914        content << "<span class='clearable'><label for='" << inputControlId << "'>Filter: </label><input id='" << inputControlId << "' class='data_field' type='text' ";
1915        if (!htmlPlaceHolder.empty()) { content << "placeholder='" << htmlPlaceHolder << "'"; }
1916        content << "/></span>";
1917        return content.str();
1918}
1919
1920string CDocMain::CreateSchemaFilterControl()
1921{
1922        stringstream content;   
1923        content << "<div>" 
1924                << CreateStandardFilterControl("formFilter", "search by name or id") << " &nbsp;&nbsp;&nbsp; "
1925                << "<span class='multiFilter' id='multiFilter'>Restrict results to: "
1926                << "<input id='typeFilterRegular' type='checkbox' value='1'/><label for='typeFilterRegular'>&nbsp;Regular</label>"
1927                << "<input id='typeFilterJoin' type='checkbox' value='2'/><label for='typeFilterJoin'>&nbsp;Join</label>"
1928                << "<input id='typeFilterView' type='checkbox' value='3'/><label for='typeFilterView'>&nbsp;View</label>"
1929                << "<input id='typeFilterDialog' type='checkbox' value='4'/><label for='typeFilterDialog'>&nbsp;Dialog</label>"
1930                << "<input id='typeFilterVendor' type='checkbox' value='5'/><label for='typeFilterVendor'>&nbsp;Vendor</label>"
1931                << " <button id='typeFilterNone'>Clear All</button>"
1932                << "</span>"
1933        << "</div>";
1934
1935        return content.str();
1936}
1937
1938string CDocMain::CreateActlinkFilterControl()
1939{
1940        stringstream content;
1941        content << "<div>"
1942                << CreateStandardFilterControl("actlinkFilter")
1943        << "</div>";
1944        return content.str();
1945}
1946
1947string CDocMain::CreateFilterFilterControl()
1948{
1949        stringstream content;
1950        content << "<div>"
1951                << CreateStandardFilterControl("filterFilter")
1952                << "<span class='multiFilter' id='multiFilter'>Restrict results to: "
1953                << "<input id='typeFilterOnlyNone' type='checkbox' value='N'/><label for='typeFilterOnlyNone'>&nbsp;None</label>"
1954                << "<input id='typeFilterModify' type='checkbox' value='2'/><label for='typeFilterModify'>&nbsp;Modify</label>"
1955                << "<input id='typeFilterSubmit' type='checkbox' value='4'/><label for='typeFilterSubmit'>&nbsp;Submit</label>"
1956                << "<input id='typeFilterDelete' type='checkbox' value='8'/><label for='typeFilterDelete'>&nbsp;Delete</label>"
1957                << "<input id='typeFilterGetEntry' type='checkbox' value='1'/><label for='typeFilterGetEntry'>&nbsp;Get&nbsp;Entry</label>"
1958                << "<input id='typeFilterMerge' type='checkbox' value='16'/><label for='typeFilterMerge'>&nbsp;Merge</label>"
1959                << "<input id='typeFilterService' type='checkbox' value='64'/><label for='typeFilterService'>&nbsp;Service</label>"
1960                << " <button id='typeFilterNone'>Clear All</button>"
1961                << "</span>"
1962        << "</div>";
1963        return content.str();
1964}
1965
1966string CDocMain::CreateEscalationFilterControl()
1967{
1968        stringstream content;
1969        content << "<div>"
1970                << CreateStandardFilterControl("escalationFilter")
1971        << "</div>";
1972        return content.str();
1973}
1974
1975string CDocMain::CreateMenuFilterControl()
1976{
1977        stringstream content;
1978        content << "<div>"
1979                << CreateStandardFilterControl("menuFilter")
1980                << "<span class='multiFilter' id='multiFilter'>Restrict results to: "
1981                << "<input id='typeFilterCharacter' type='checkbox' value='1'/><label for='typeFilterCharacter'>&nbsp;Character</label>"
1982                << "<input id='typeFilterSearch' type='checkbox' value='2'/><label for='typeFilterSearch'>&nbsp;Search</label>"
1983                << "<input id='typeFilterFile' type='checkbox' value='3'/><label for='typeFilterFile'>&nbsp;File</label>"
1984                << "<input id='typeFilterSQL' type='checkbox' value='4'/><label for='typeFilterSQL'>&nbsp;SQL</label>"
1985                << "<input id='typeFilterDD' type='checkbox' value='6'/><label for='typeFilterDD'>&nbsp;Data&nbsp;Dictionary</label>"
1986                << " <button id='typeFilterNone'>Clear All</button>"
1987                << "</span>"
1988        << "</div>";
1989        return content.str();
1990}
1991
1992void CDocMain::SchemaListJson(std::ostream &strm)
1993{
1994        Document document;
1995        Document::AllocatorType &alloc = document.GetAllocator();
1996        document.SetArray();
1997
1998        unsigned int schemaCount = this->pInside->schemaList.GetCount();
1999        for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
2000        {       
2001                CARSchema schema(schemaIndex);
2002                CPageParams schemaDetailPage(PAGE_DETAILS, &schema);
2003               
2004#if AR_CURRENT_API_VERSION >= AR_API_VERSION_764
2005                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(schema))
2006                                continue;
2007#endif
2008
2009                        // create a new json row and make it an array
2010                        Value schemaRow;
2011                        schemaRow.SetArray();
2012
2013                        // now build the needed temporary variables
2014                        string strName = schema.GetName();
2015                        string strWebAlias = schema.WebAlias();                 
2016                        string strModifiedDate = CUtil::DateTimeToString(schema.GetTimestamp());
2017                        string strLink = CWebUtil::GetRelativeURL(rootLevel, schemaDetailPage);
2018
2019                        //// try to reduce data size
2020                        //if (strLink.compare(strName) == 0)
2021                        //      strLink == "";
2022
2023                        Value valName(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
2024                        Value valWebAlias(strWebAlias.c_str(), static_cast<SizeType>(strWebAlias.size()), alloc);
2025                        Value valModifiedDate(strModifiedDate.c_str(), static_cast<SizeType>(strModifiedDate.size()), alloc);
2026                        Value valLink(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
2027
2028                        // add everything to the row
2029                        schemaRow.PushBack(schema.GetDbTableId(), alloc);
2030                        schemaRow.PushBack(valName, alloc);
2031                        schemaRow.PushBack(valWebAlias, alloc);
2032                        schemaRow.PushBack(static_cast<int>(schema.GetFields()->GetCount()), alloc);
2033                        schemaRow.PushBack(static_cast<int>(schema.GetVUIs()->GetCount()), alloc);
2034                        schemaRow.PushBack(static_cast<int>(schema.GetCompound().schemaType), alloc);
2035                        schemaRow.PushBack(valModifiedDate, alloc);
2036                        schemaRow.PushBack(schema.GetLastChanged(), alloc);
2037                        schemaRow.PushBack(valLink, alloc);
2038
2039                        // add the row to the document
2040                        document.PushBack(schemaRow, alloc);
2041        }
2042
2043        GenericWriteStream output(strm);
2044        Writer<GenericWriteStream> writer(output);
2045
2046        strm << endl << "<script type=\"text/javascript\">" << endl;
2047        strm << "var schemaList = "; document.Accept(writer); strm << ";";
2048        strm << "var rootLevel = " << rootLevel << ";";
2049        strm << endl;
2050        strm << "</script>" << endl;   
2051}
Note: See TracBrowser for help on using the repository browser.