PageSourceSearch

https://www.evergreen.k12.oh.us/Common/controls/ContentItemModern/scripts/ContentItemListUIModule.js

js evergreen.k12.oh.us collected 2026-10-08 06:38:50 UTC 114,392 bytes, 2,367 lines download raw bytes

1// Polyfill for URLSearchParams for IE11 - see PRES-6579
2var URLSearchParams = window.URLSearchParams || function (searchString) {
3    var self = this;
4    self.searchString = searchString;
5    self.get = function (name) {
6        var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(self.searchString);
7        if (results === null) {
8            return null;
9        }
10        else {
11            return decodeURI(results[1]) || 0;
12        }
13    };
14};
15
16
17function onResizeDocContainer() {
18    $('.PO-wrapper').each(function () {
19        var portletWidth = $(this).width();
20        if (portletWidth < 525) {
21            $(this).addClass('PO-mobileView');
22        }
23        else {
24            $(this).removeClass('PO-mobileView');
25        }
26    });
27}
28
29$(window).resize(function () {
30    onResizeDocContainer();
31});
32
33var ContentItemListUI = function (contextId, historyObject, subFolders, params, selectMultiSwitch, selectedItems) {
34    var mainContainer = "#PO-documentContainer";//mainCtrl; //"#PO-documentContainer";
35    var loadingContainer = "#PO-documentContainer-loading";
36    var obj = typeof params === 'string' ? JSON.parse(params) : params;
37    var _params = JSON.stringify(obj);
38    var ctlSuffixId = "_" + obj["Extension"];
39    var ctlClientId = obj["ClientId"] + "_";
40    mainContainer = mainContainer + ctlSuffixId;
41    loadingContainer = loadingContainer + ctlSuffixId;
42    var currentO;
43    var listSelector = $(mainContainer + " .documentList");
44    var _historyObject = historyObject;
45    var _back = [];
46    var _history = [];
47    var _contextId = contextId;
48
49    var _currentPage = 0;
50    var _pagesize = 10;
51    var noofpagebuttons = 3;
52    var _lastPage = 0;
53    var pagerSelector = mainContainer + " .PO-paging";
54
55    var _data;
56    var _settings;
57    var _permit;
58    var _searchVal = "";
59    var _sortcriteria = "";
60    var _root;
61    var _activeItem = (historyObject) ? historyObject.ActiveItem : 0;
62    var _activeObject = (historyObject) ? historyObject.ActiveItem : undefined;
63    var _rootObject;
64    var commons = new ContentCommon();
65    var res = commons.Resources;
66    var timerId;
67    var contentItemData;
68    var _sortby = "";
69    var _sortasc = true;
70
71    var headerSelector = mainContainer + " .documentListTitle .displayTable";
72    var columns = [{ "data": "Name", "title": res["file"].Propercase() + " " + res["Name"], "sort": true, "visible": true, "arialabel": "File Name" },
73                   { "data": "CreationUser", "title": res["User"].Propercase(), "sort": true, "visible": true, "arialabel": "User" },
74                   { "data": "FileSize", "title": res["Size"].Propercase(), "sort": true, "visible": true, "arialabel": "file size" },
75                   { "data": "ModifiedDateString", "title": res["Modified"].Propercase(), "sort": true, "visible": true, "arialabel": "last modified date" },
76                  ];
77    var secLink = mainContainer + " #secuirtyLink" + ctlSuffixId;
78    var actLink = mainContainer + " #activityLink" + ctlSuffixId;
79    var hideUserField = false;
80    var hideModifiedDateField = false;
81    var hideSizeField = false;
82    var showDispSettings = false;
83
84    var showSubscription = obj["ShowSubscription"];
85
86    var hideDescription = obj["HideDescription"];
87
88    var showDescrip = function (isHideDescription) {
89        var divDescript = $(mainContainer + " .PO-description");
90        if (isHideDescription || divDescript.text().length === 0) {
91            divDescript.hide();
92        } else {
93            divDescript.show();
94        }
95    };
96
97    function setHidDescription(isHide) {
98        hideDescription = isHide;
99    }
100
101    function setDescription(description) {
102        var divDescript = $(mainContainer + " .PO-description");
103        divDescript.innerHTML = description;
104    }
105
106    function showLoadingScreen() {
107        $(loadingContainer).show();
108        $(mainContainer).hide();
109    }
110
111    function hideLoadingScreen() {
112        const params = new URLSearchParams(window.location.search);
113        if (params.get("showLoadingScreen") !== "true") {
114            $(loadingContainer).hide();
115            $(mainContainer).show();
116        }
117    }
118
119    //Show breadcrums
120    var showBreadCrumbs = function () {
121        var breadcrumbSel = mainContainer + " .PO-breadcrumb";
122        $(breadcrumbSel).empty();
123        for (var i = 0; i <= _back.length - 1; i++) {
124            var breadcrumbLink = document.createElement("a");
125            breadcrumbLink.href = "#";
126            breadcrumbLink.className = "crumButton";
127            breadcrumbLink.title = res["FolderTooltip"] + "'" + _back[i].Name + "'";
128            breadcrumbLink.setAttribute("parent-id", _back[i].objectId);
129            breadcrumbLink.setAttribute("data-id", _back[i].objectId);
130            breadcrumbLink.setAttribute("tag", i);
131            breadcrumbLink.textContent = _back[i].Name;
132            $(breadcrumbSel).append(breadcrumbLink);
133            if (_back.length > 0)
134                $(breadcrumbSel).append("&nbsp;<span class=\"fa fa-chevron-right\">&nbsp;</span>");
135        }
136
137        if (_back.length > 0) {
138            $(mainContainer + " .PO-navigationBar").show();
139            if (_rootObject !== null) {
140                var breadcrumbSpan = document.createElement("span");
141                breadcrumbSpan.textContent = _rootObject.Name;
142                $(breadcrumbSel).append(breadcrumbSpan);
143
144            }
145        } else {
146            $(mainContainer + " .PO-navigationBar").hide();
147        }
148        var crumButtonSel = mainContainer + " .crumButton";
149        $(crumButtonSel).off();
150        $(crumButtonSel).on("click", function (e) {
151            e.preventDefault();
152            var tag = parseInt($(this).attr("tag"));
153            var dataid = parseInt($(this).attr("data-id"));
154            var dataid = parseInt($(this).attr("parent-id"));
155            var hObject = _history[tag];
156
157            _back = jQuery.grep(_back,
158                function (value, index) {
159                    return index < tag;
160                });
161
162            _history = jQuery.grep(_history,
163                function (value, index) {
164                    return index < tag;
165                });
166            var childItemListUi;
167            if (hObject && hObject.historyObject) {
168                hObject.historyObject.Back = _back;
169                hObject.historyObject.History = _history;
170                hObject.historyObject.Params = _params;
171                childItemListUi = new ContentItemListUI(dataid, hObject.historyObject, null, _params, selectMultiSwitch, selectedItems);
172            }
173            else {
174                childItemListUi = new ContentItemListUI(dataid, null, null, _params, selectMultiSwitch, selectedItems);
175            }
176
177            childItemListUi.initialise(hObject);
178
179            e.preventDefault();
180        });
181    };
182
183    var addSubFolderRow = function (ctrl) {
184
185        if (_back !== undefined && _back.length > 0) {
186            ctrl.find("li.subfolder").remove();
187            var index = _back.length - 1;
188            if (index >= 0 && _root !== null && _root !== undefined) {
189                var backFolderName = "";
190                if (_back.length > 0) {
191                    backFolderName = _back[_back.length - 1].Name;
192                }
193                var backLinktitle = res["ClickBack"] + "'" + backFolderName + "'";
194                var dataRow = document.createElement("li");
195                dataRow.className = "subfolder open openfolderback";
196                dataRow.setAttribute("parent-id", _root.ParentId);
197                dataRow.setAttribute("title", backLinktitle);
198
199                var link = document.createElement("a");
200                link.href = "#";
201                link.setAttribute("data-write", _root.canWrite);
202
203                var displayTable = document.createElement("div");
204                displayTable.className = "displayTable";
205
206                var iconType = document.createElement("div");
207                iconType.className = "iconType";
208                var iconItem = document.createElement("div");
209                iconItem.className = "item";
210                var icon = document.createElement("em");
211                icon.className = "fa fa-folder-open";
212                iconItem.appendChild(icon);
213                iconType.appendChild(iconItem);
214
215                var titleUser = document.createElement("div");
216                titleUser.className = "titleUser";
217                var docTitle = document.createElement("div");
218                docTitle.className = "item docTitle";
219                docTitle.textContent = _root.Name;
220                titleUser.appendChild(docTitle);
221
222                var sizeTime = document.createElement("div");
223                sizeTime.className = "sizeTime";
224                var docSize = document.createElement("div");
225                docSize.className = "item docSize";
226                docSize.textContent = _data.length + " Item(s)";
227                sizeTime.appendChild(docSize);
228
229                displayTable.appendChild(iconType);
230                displayTable.appendChild(titleUser);
231                displayTable.appendChild(sizeTime);
232                link.appendChild(displayTable);
233                dataRow.appendChild(link);
234
235                ctrl.prepend(dataRow);
236
237                var liopenfolderback = mainContainer + " li.openfolderback";
238
239                $(liopenfolderback).off("click");
240                $(liopenfolderback).on("click", function (e) {
241                    e.preventDefault();
242                    var dataid = parseInt($(this).attr("parent-id"));
243                    var hsto = null;
244                    if (_history !== undefined && _history.length > 0) {
245                        hsto = _history[_history.length - 1];
246                    }
247                    var childItemListUi = new ContentItemListUI(dataid, hsto, null, _params, selectMultiSwitch, selectedItems);
248                    _back.pop();
249                    if (_history !== undefined && _history.length > 0)
250                        _history.pop();
251                    $.when(childItemListUi.initialise(hsto)).then(function () {
252                        showCurrentItem();
253                    });
254                });
255            }
256        }
257        else {
258            ctrl.find(mainContainer + " li.folder").remove();
259        }
260    };
261
262    //setup history of controls from history object
263    var setupHistory = function (hstObject) {
264        _currentPage = hstObject.currentPage;
265        _pagesize = hstObject.pagesize;
266        _searchVal = hstObject.searchVal;
267        //_rootObject = hstObject.RootObject;
268        //_back = hstObject.Back;
269        //$(mainContainer + " #pageSize").val(hstObject.pagesize);
270        //$(mainContainer + " #txtSearch").val(hstObject.searchVal);
271    };
272
273    var reloadDocumentContainerItems = function () {
274        // reload the document container's new items
275        refreshDocumentContainer();
276    }
277
278    // Initialise control
279    function initialise(hstObject, moveModalClosed) {
280        // if loading after the content item move modal has closed then clear the selected items
281        if (moveModalClosed === true) {
282            selectedItems = [];
283        }
284
285        if (historyObject !== null) {
286            if (historyObject.Back !== null) _back = historyObject.Back;
287            if (historyObject.History !== null) _history = historyObject.History;
288        }
289
290        if (!contentItemData) {
291            contentItemData = new ContentItemData(_contextId);
292        }
293
294        //init portlet subscription before items adding
295        if (showSubscription) {
296            var subscriptionLink = $(mainContainer + " a.subscriptionrootitem");
297            subscriptionLink.attr('title', res["SubscriptionLinkTitle"]);
298            subscriptionLink.html('<em class="fa fa-bell"></em>' + res["Subscribe"]);
299            subscriptionLink.attr('data-name', res["Subscribe"]);
300            subscriptionLink.attr('data-id', _contextId);
301            subscriptionLink.off("click");
302            subscriptionLink.on("click", function (e) {
303                e.preventDefault();
304                _activeObject = $(this);
305                var type = $(this).attr("data-item");
306                var name = $(this).attr("data-name");
307                var id = $(this).attr("data-id");
308                _activeItem = id;
309                displaySubscriptionModal(_contextId, { "Id": id, "Name": name });
310            });
311        }
312
313        // Set loading spinner "Loading..." text
314        $(loadingContainer + " #loadingText" + ctlSuffixId).html(res["Loading"]);
315        $(loadingContainer + " #loadingSpinnerTitleId" + ctlSuffixId).html(res["DocumentsLoading"]);
316
317        showDescrip(hideDescription);
318
319        bindEvents();
320
321        if (_historyObject !== null) {
322        }
323        else {
324            //$(mainContainer + " .PO-backButton").attr("style", "display:none");
325            $(document).contentItemListUI = this;
326        }
327        if (hstObject) setupHistory(hstObject);
328
329        refreshDocumentContainer();
330
331        currentO = this;
332    }
333
334    var refreshDocumentContainer = function () {
335
336        showLoadingScreen();
337
338        $.when(contentItemData.GetFolderDetailWithParents(_contextId, _params, false)).then(function (results) {
339            var resp = results.d;
340            if (resp.RequestStatus !== null && resp.RequestStatus.RequestError) {
341                commons.ShowErrorMessage(res["RequestError"]);
342            }
343            else {
344                try {
345                    _root = results.d.DataObject;
346                    _rootObject = results.d.DataObject;
347                    _back = results.d.AncestryList;
348                    showBreadCrumbs();
349                    _searchVal = $(mainContainer + " #txtSearch" + ctlSuffixId).val().trim();
350                    obj.searchVal = _searchVal;
351
352                    // Get addDelay param from querystyring, and add to search params (used to trigger delay on loading doc container, for testing loading spinner)
353                    var href = window.location.href;
354                    if (href.indexOf('?') > -1) {
355                        var queryString = href.substring(href.indexOf('?'), href.length);
356                        var addDelay = getParameterByName("addDelay", queryString);
357                        if (addDelay === "true") { obj.addDelay = true; }
358                    }
359
360                    var _searchParams = JSON.stringify(obj);
361
362                    $.when(contentItemData.GetItemList(_contextId, _searchParams)).then(function (results) {
363                        var resp = results.d;
364                        if (resp.RequestStatus !== null && resp.RequestStatus.RequestError) {
365                            commons.ShowErrorMessage(res["RequestError"] + "!  " + resp.RequestStatus.RequestErrorMessage);
366                        }
367                        else {
368                            try {
369                                _settings = results.d.Settings;
370
371                                hideUserField = _settings.Settings !== undefined && _settings.Settings.HideUserField;
372                                hideModifiedDateField = _settings.Settings !== undefined && _settings.Settings.HideLastModifiedField;
373                                hideSizeField = _settings.Settings !== undefined && _settings.Settings.HideSizeField;
374                                showDispSettings = _settings.Settings !== undefined && _settings.Settings.ShowOnEachContainer;
375                                _permit = results.d.UserPermit;
376                                updateToolBar();
377                                contentItemData.Data = results.d.DataObject;
378                                _data = contentItemData.Data;
379                                addSubFolderRow(listSelector);
380                                appendHeader();
381                                switch (_settings.Settings.SortBy) {
382                                    case "Name":
383                                        _sortby = "Name";
384                                        break;
385                                    case "User":
386                                        _sortby = "CreationUser";
387                                        break;
388                                    case "Modified":
389                                        _sortby = "ModifiedDateString";
390                                        break;
391                                    case "Size":
392                                        _sortby = "FileSize";
393                                        break;
394                                }
395                                _sortasc = _settings.Settings.SortAsc;
396                                updateHeader($("div.sortcolumn[data='" + _sortby + "']"), _settings.Settings.SortAsc ? "asc" : "desc");
397                                sortDataList(_sortby, _sortasc);
398                            } catch (e) {
399                                commons.ShowErrorDetails(e);
400                            }
401                            //$(".processingStatus").html("done...." + _
401contextId);
402                        }
403                    }).done(function () {
404                        hideLoadingScreen();
405                        onResizeDocContainer();
406                    });
407                } catch (e) {
408                    hideLoadingScreen();
409                    commons.ShowErrorDetails(e);
410                }
411            }
412        });
413    };
414
415    function getParameterByName(name, queryString) {
416        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
417        var regexS = "[\\?&]" + name + "=([^&#]*)";
418        var regex = new RegExp(regexS);
419        var results = regex.exec(queryString);
420        if (results === null)
421            return "";
422        else
423            return decodeURIComponent(results[1].replace(/\\+/g, " "));
424    };
425
426    //Set default data in paging and search while navigating folders
427    var clearControls = function () {
428        //$(mainContainer + " #pageSize").val(10);
429        $(mainContainer + " #txtSearch" + ctlSuffixId).val("");
430    };
431
432
433    //Remove Pager control
434    var removePager = function (ctrl) {
435        ctrl.find("ul.PO-pageButton li").remove();
436    };
437
438    var getCurrentObject = function () {
439        //_currentO.Data = _data;
440        currentO.currentPage = _currentPage;
441        currentO.pagesize = _pagesize;
442        currentO.searchVal = _searchVal;
443        currentO.RootObject = _rootObject;
444        currentO.Params = _params;
445        currentO.Back = _back;
446        currentO.Container = mainContainer;
447        currentO.ActiveItem = _activeItem;
448        currentO.ActiveObject = _activeObject;
449        currentO.Access = _permit;
450        return currentO;
451    };
452
453    //search value in control
454    var searchValue = function (arrEle) {
455        var searchVal = $(mainContainer + " #txtSearch" + ctlSuffixId).val();
456        return arrEle.Name.toLowerCase().indexOf(searchVal.toLowerCase()) >= 0 ||
457            (!arrEle.CreationUser ? "" : arrEle.CreationUser).toLowerCase().indexOf(searchVal.toLowerCase()) >= 0;
458    };
459
460    function GetItemsByParentId(items, ParentId) {
461        var _filteritems = function (item) {
462            return item.ParentId === ParentId;
463        };
464        return items.filter(_filteritems);
465    }
466
467    //Search data filter
468    var searchContentData = function () {
469        _searchVal = $(mainContainer + " #txtSearch" + ctlSuffixId).val().trim();
470        obj.searchVal = _searchVal;
471        var _searchParams = JSON.stringify(obj);
472        _currentPage = 0;
473        removePager(listSelector);
474        try {
475            showLoadingScreen();
476            $.when(contentItemData.GetItemList(_contextId, _searchParams)).then(function (results) {
477                var resp = results.d;
478                if (resp.RequestStatus !== null && resp.RequestStatus.RequestError) {
479                    commons.ShowErrorMessage(res["RequestError"] + "!  " + resp.RequestStatus.RequestErrorMessage);
480                }
481                else {
482                    try {
483                        _data = contentItemData.Data = results.d.DataObject;
484                        displayContentData(_data);
485                    } catch (e) {
486                        commons.ShowErrorDetails(e);
487                    }
488                }
489            }).done(function () {
490                hideLoadingScreen();
491            });
492        } catch (e) {
493            hideLoadingScreen();
494            commons.ShowErrorDetails(e);
495        }
496
497        //displayContentData(_data);
498    };
499
500    var tempResLink = "/Common/resources/shared/controls";
501    //Modal Folder (used for confirmation dialogs):
502    var displayUpsertFolderModal = function (cId, folderObject) {
503        var templateUrl = obj["csFolder.html"];
504        var contentItemData = new ContentItemData(_contextId);
505        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
506            data = localiseFolder(data);
507            AppendTemplateInModal(data);
508            if (data.length > 0) {
509                var contentItemFolder = new ContentItemFolder(getCurrentObject(), cId, folderObject);
510                contentItemFolder.initialise();
511            }
512            return false;
513        });
514    }
515    function localiseFolder(dataStr) {
516        dataStr = dataStr.replace(/\{{Name}}/g, res["Name"]);
517        dataStr = dataStr.replace(/\{{Add}}/g, res["Add"]);
518        dataStr = dataStr.replace(/\{{Update}}/g, res["Update"]);
519        dataStr = dataStr.replace(/\{{Required}}/g, res["Required"]);
520        dataStr = dataStr.replace(/\{{Description}}/g, res["Description"]);
521        dataStr = dataStr.replace(/\{{folder}}/g, res["folder"].Propercase());
522        dataStr = dataStr.replace(/\{{CancelX}}/g, res["CancelX"]);
523        return dataStr;
524    };
525
526    //Modal File 
527    var displayUpsertFileModal = function (cId, fileObject) {
528        var templateUrl = obj["csFile.html"];
529        var contentItemData = new ContentItemData(_contextId);
530        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
531            data = localiseFile(data);
532            AppendTemplateInModal(data);
533            if (data.length > 0) {
534                var contentItemfile = new ContentItemFile(getCurrentObject(), cId, fileObject, { "maxSize": _settings.Settings.MaximumSize, "allowedExts": _settings.AllowedExts });
535                contentItemfile.initialise();
536            }
537            return false;
538        });
539    }
540
541    var displayUploader = function () {
542        var pl = {
543            i18n_uploader: res["Uploader"],
544            i18n_add_files: res["Add_Files"],
545            i18n_start_upload: res["Start_Upload"],
546            i18n_cancel_upload: res["Cancel_Upload"],
547            i18n_name: res["File_Name"],
548            i18n_file_size: res["File_Size"],
549            i18n_remove_button: res["File_Remove_Button"],
550            i18n_uploader_maximum_error: res["Maximum_Error"],
551            i18n_invalid_file_type_error: res["Invalid_File_Type_Error"],
552            i18n_maximum_file_size_error: res["Maximum_File_Size_Error"],
553            i18n_file_upload_successful: res["File_Upload_Successful"],
554            i18n_x_of_y_successfully_uploaded: res["X_of_Y_successfully_uploaded"],
555            i18n_cancel_upload_title: res["Cancel_Upload_Title"],
556            i18n_are_you_sure_you_want_to_cancel: res["Are_You_Sure_You_Want_To_Cancel_Upload"],
557            i18n_yes: res["general_yes"],
558            i18n_no: res["general_no"],
559            maxFileSize: _settings.Settings.IsExist ? (_settings.Settings.MaximumSize * 1024) : (_settings.DefaultMaximumSize * 1024),
560            maxFileSizeFormatMB: false,
561            maxNumberOfFiles: 50, // hard coded in the system - not configurable
562            acceptedFileTypes: _settings.AllowedExts,
563            objectType: "content_item",
564            parentId: _contextId,
565            url: '../../../../Src/Classes/Uploader/FileUploaderHandler',
566            reloadDocumentContainerItems: reloadDocumentContainerItems // pass a function through so we can reload the doc container with new items
567        };
568
569        presence.loadModalPopup('objUploader', '/common/Modals/Uploader/Uploader.htm', '', pl);
570    }
571
572    function localiseFile(dataStr) {
573        dataStr = dataStr.replace(/\{{Name}}/g, res["Name"]);
574        dataStr = dataStr.replace(/\{{Add}}/g, res["Add"]);
575        dataStr = dataStr.replace(/\{{Update}}/g, res["Update"]);
576        dataStr = dataStr.replace(/\{{Required}}/g, res["Required"]);
577        dataStr = dataStr.replace(/\{{Description}}/g, res["Description"]);
578        dataStr = dataStr.replace(/\{{file}}/g, res["file"].Propercase());
579        dataStr = dataStr.replace(/\{{CancelX}}/g, res["CancelX"]);
580        return dataStr;
581    };
582    //Modal Link 
583    var displayUpsertLinkModal = function (cId, linkObject) {
584        var templateUrl = obj["csLink.html"];
585        var contentItemData = new ContentItemData(_contextId);
586        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
587            data = localiseLink(data);
588            AppendTemplateInModal(data);
589            if (data.length > 0) {
590                var contentItemLink = new ContentItemLink(getCurrentObject(), cId, linkObject);
591                contentItemLink.initialise();
592            }
593            return false;
594        });
595    }
596    function localiseLink(dataStr) {
597        dataStr = dataStr.replace(/\{{Name}}/g, res["Name"]);
598        dataStr = dataStr.replace(/\{{Add}}/g, res["Add"]);
599        dataStr = dataStr.replace(/\{{Update}}/g, res["Update"]);
600        dataStr = dataStr.replace(/\{{Required}}/g, res["Required"]);
601        dataStr = dataStr.replace(/\{{Description}}/g, res["Description"]);
602        dataStr = dataStr.replace(/\{{link}}/g, res["link"].Propercase());
603        dataStr = dataStr.replace(/\{{Url}}/g, res["Url"]);
604        dataStr = dataStr.replace(/\{{Favorite}}/g, res["Favorite"]);
605        dataStr = dataStr.replace(/\{{CancelX}}/g, res["CancelX"]);
606        return dataStr;
607    };
608
609    function escapeHtml(unsafe) {
610        return unsafe
611            .replace(/&/g, "&amp;")
612            .replace(/</g, "&lt;")
613            .replace(/>/g, "&gt;")
614            .replace(/"/g, "&quot;")
615            .replace(/'/g, "&#039;");
616    }
617
618    // Move Multiple Modal
619    var displayMoveModalMultiple = function (cId, itemObject) {
620        var templateUrl = obj["csMove.html"];
621        var contentItemData = new ContentItemData(_contextId);
622        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
623            data = localiseMove(data).replace("{{ObjectName}}", res["AllSelectedItems"]);
624            AppendTemplateInModal(data);
625            if (data.length > 0) {
626                var rootFolderId = cId;
627                var contentItemMove = new ContentItemMove(getCurrentObject(), rootFolderId, itemObject, null, selectedItems);
628                contentItemMove.initialise();
629            }
630            return false;
631        });
632    };
633
634    //Modal Move
635    var displayMoveModal = function (cId, itemObject) {
636        var templateUrl = obj["csMove.html"];
637        var contentItemData = new ContentItemData(_contextId);
638        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
639            data = localiseMove(data).replace("{{ObjectName}}", escapeHtml(itemObject.Name));
640
641            AppendTemplateInModal(data);
642            if (data.length > 0) {
643                var rootFolderId = cId;
644                var contentItemMove = new ContentItemMove(getCurrentObject(), rootFolderId, itemObject);
645                contentItemMove.initialise();
646            }
647            return false;
648        });
649    };
650    function localiseMove(dataStr) {
651        dataStr = dataStr.replace(/\{{MoveNote}}/g, res["MoveNote"]);
652        dataStr = dataStr.replace(/\{{CancelX}}/g, res["CancelX"]);
653        return dataStr;
654    };
655    //Modal display settings 
656    var displaySettingsModal = function (cId) {
657        var templateUrl = obj["csDisplaySettings.html"];
658        var contentItemData = new ContentItemData(_contextId);
659        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
660            data = localiseSettings(data);
661            AppendTemplateInModal(data);
662            if (data.length > 0) {
663                var contentItemSettings = new ContentDispSettingsModule(getCurrentObject(), cId);
664                contentItemSettings.Initialise();
665            }
666            return false;
667        });
668    }
669
670    var displayMultipleSelect = function (contextId) {
671
672        selectMultiSwitch = !selectMultiSwitch;
673        var docList = $(mainContainer + " .documentList");
674        var checkBoxes = docList.find(" .CMS_checkbox");
675
676        if (selectMultiSwitch === false) {
677            // hide multi options (move to & delete buttons)
678            $(mainContainer + " .multiMoveOption").hide();
679
680            // reset the checked items
681            selectedItems = [];
682            // uncheck the items
683            checkBoxes.each(function () {
684                var checkboxNode = this.childNodes[0];
685                checkboxNode.setAttribute("aria-hidden", "true");
686                checkboxNode.checked = false;
687            });
688
689            // hide the checkboxes
690            docList.removeClass("DL-multiMove");
691            // remove background colour from Select Multi button so it no longer appears selected
692            $(mainContainer + " #MultiMoveLink").css({
693                "background-color": "",
694                "box-shadow": "",
695                "border-radius": ""
696            });
697        }
698        else {
699            // show the checkboxes
700            docList.addClass("DL-multiMove");
701
702            checkBoxes.each(function () {
703                var checkboxNode = this.childNodes[0];
704                checkboxNode.setAttribute("aria-hidden", "false");
705            });
706
707            // show Move To... and Delete buttons
708            $(mainContainer + " .multiMoveOption").show();
709            // set background colour of Select Multiple button so it shows it has been selected
710            $(mainContainer + " #MultiMoveLink").css({
711                "background-color": "#ffffff",
712                "box-shadow": "0 0 1px rgba(0,0,0,0.5)",
713                "border-radius": "4px"
714            });
715        }
716    }
717
718    function localiseSettings(dataStr) {
719        dataStr = dataStr.replace(/\{{HideTheLastModifiedField}}/g, res["HideTheLastModifiedField"]);
720        dataStr = dataStr.replace(/\{{HideTheUserField}}/g, res["HideTheUserField"]);
721        dataStr = dataStr.replace(/\{{HideTheSizeField}}/g, res["HideTheSizeField"]);
722        dataStr = dataStr.replace(/\{{SortBy}}/g, res["SortBy"]);
723        dataStr = dataStr.replace(/\{{Name}}/g, res["Name"]);
724        dataStr = dataStr.replace(/\{{Modified}}/g, res["Modified"]);
725        dataStr = dataStr.replace(/\{{Size}}/g, res["Size"]);
726        dataStr = dataStr.replace(/\{{Ascending}}/g, res["Ascending"]);
727        dataStr = dataStr.replace(/\{{Descending}}/g, res["Descending"]);
728        dataStr = dataStr.replace(/\{{User}}/g, res["User"]);
729        dataStr = dataStr.replace(/\{{SortOrder}}/g, res["SortOrder"].Propercase());
730        dataStr = dataStr.replace(/\{{MaxUploadSize}}/g, res["MaxUploadSize"]);
731        dataStr = dataStr.replace(/\{{DefaultMaximum}}/g, res["DefaultMaximum"]);
732        dataStr = dataStr.replace(/\{{SetMaximumSizeTo}}/g, res["SetMaximumSizeTo"]);
733        dataStr = dataStr.replace(/\{{UpdateDisplaysettings}}/g, res["UpdateDisplaysettings"]);
734        dataStr = dataStr.replace(/\{{Required}}/g, res["Required"]);
735        dataStr = dataStr.replace(/\{{CancelX}}/g, res["CancelX"]);
736        dataStr = dataStr.replace(/\{{DataFields}}/g, res["DataFields"]);
737        dataStr = dataStr.replace(/\{{SortByField}}/g, res["SortByField"].Propercase());
738        dataStr = dataStr.replace(/\{{Description}}/g, res["Description"].Propercase());
739        dataStr = dataStr.replace(/\{{ConvertToPlainText}}/g, res["ConvertToPlainText"]);
740        dataStr = dataStr.replace(/\{{HideDescriptionColumn}}/g, res["HideDescriptionColumn"]);
741        dataStr = dataStr.replace(/\{{WarningMessage}}/g, res["WarningMessage"]);
742        dataStr = dataStr.replace(/\{{Loading}}/g, res["Loading"]);
743        dataStr = dataStr.replace(/\{{DocumentsLoading}}/g, res["DocumentsLoading"]);
744
745        return dataStr;
746    }
747
748    //Modal security
749    var displayFilePropModal = function (cId, fileObject) {
750        var templateUrl = obj["csFileProps.html"];
751        var contentItemData = new ContentItemData(_contextId);
752        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
753            data = localiseProperty(data);
754            AppendTemplateInModal(data);
755            if (data.length > 0) {
756                var contentItemFileProps = new ContentItemFileProps(getCurrentObject(), cId, fileObject, { "maxSize": _settings.Settings.MaximumSize, "allowedExts": _settings.AllowedExts });
757                contentItemFileProps.initialise();
758            }
759            return false;
760        });
761    }
762    function localiseProperty(dataStr) {
763        dataStr = dataStr.replace(/\{{Name}}/g, res["Name"]);
764        dataStr = dataStr.replace(/\{{Required}}/g, res["Required"]);
765        dataStr = dataStr.replace(/\{{Update}}/g, res["Update"]);
766        dataStr = dataStr.replace(/\{{Size}}/g, res["Size"]);
767        dataStr = dataStr.replace(/\{{Date}}/g, res["Date"]);
768        dataStr = dataStr.replace(/\{{Description}}/g, res["Description"]);
769        dataStr = dataStr.replace(/\{{User}}/g, res["User"]);
770        dataStr = dataStr.replace(/\{{VersionHistory}}/g, res["VersionHistory"]);
771        dataStr = dataStr.replace(/\{{MetaData}}/g, res["MetaData"]);
772        dataStr = dataStr.replace(/\{{AddRevision}}/g, res["AddRevision"]);
773        dataStr = dataStr.replace(/\{{Revision List}}/g, res["RevisionList"]);
774        dataStr = dataStr.replace(/\{{Author}}/g, res["Author"]);
775        dataStr = dataStr.replace(/\{{CreatedOn}}/g, res["CreatedOn"]);
776        dataStr = dataStr.replace(/\{{Version#}}/g, res["Version#"]);
777        dataStr = dataStr.replace(/\{{Action}}/g, res["Action"]);
778
779        dataStr = dataStr.replace(/\{{file}}/g, res["file"].Propercase());
780        dataStr = dataStr.replace(/\{{CancelX}}/g, res["CancelX"]);
781        dataStr = dataStr.replace(/\{{Activity}}/g, res["Activity"]);
782        dataStr = dataStr.replace(/\{{ActivityList}}/g, res["ActivityList"]);
783        dataStr = dataStr.replace(/\{{Action}}/g, res["Action"]);
784        dataStr = dataStr.replace(/\{{OccuredAt}}/g, res["OccuredAt"]);
785        dataStr = dataStr.replace(/\{{SelectAFile}}/g, res["SelectAFile"]);
786        dataStr = dataStr.replace(/\{{DragDrop}}/g, res["DragDrop"]);
787        return dataStr;
788    };
789    //Modal security
790    var displaySecurityModal = function (cId) {
791        //var contentItemLink = new ContentItemLink(getCurrentObject(), cId);
792        //contentItemLink.initialise();
793    }
794
795    //Modal Activity
796    var displayActivityModal = function (cId, name) {
797        var templateUrl = obj["csContentActivity.html"];
798        var contentItemData = new ContentItemData(_contextId);
799        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
800            data = localiseActivity(data);
801            AppendTemplateInModal(data);
802            if (data.length > 0) {
803                var contentActivity = new ContentActivity(getCurrentObject(), cId, name);
804                contentActivity.initialise();
805            }
806            return false;
807        });
808    }
809    function localiseActivity(dataStr) {
810        dataStr = dataStr.replace(/\{{ActivityList}}/g, res["ActivityList"]);
811        dataStr = dataStr.replace(/\{{SubscriptionAlerts}}/g, res["SubscriptionAlerts"]);
812        dataStr = dataStr.replace(/\{{Action}}/g, res["Action"]);
813        dataStr = dataStr.replace(/\{{OccuredAt}}/g, res["OccuredAt"]);
814        dataStr = dataStr.replace(/\{{User}}/g, res["User"]);
815        dataStr = dataStr.replace(/\{{Description}}/g, res["Description"]);
816        dataStr = dataStr.replace(/\{{ActionWidth}}/g, $(".PO-wrapper").width() > 525 ? "width:300px;" : "");
817        return dataStr;
818    };
819
820    //Modal Subscription 
821    var displaySubscriptionModal = function (cId, ciObject) {
822        var templateUrl = obj["csContentAlert.html"];
823        var contentItemData = new ContentItemData(_contextId);
824        $.when(contentItemData.GetTemplate(templateUrl)).then(function (data, textStatus, XMLHttpRequest) {
825            data = localiseNotification(data);
826            AppendTemplateInModal(data);
827            if (data.length > 0) {
828                $.widget("ui.dialog", $.ui.dialog, {
829                    _allowInteraction: function (event) {
830                        //This function fixes issue with IE11 not able to verify Recaptcha v2
831                        if (this._super(event)) {
832                            return true;
833                        }
834                        // address interaction issues with general iframes with the dialog
835                        if (event.target.ownerDocument !== this.document[0]) {
836                            return true;
837                        }
838
839                        // address interaction issues with iframe based drop downs in IE
840                        if ($(event.target).closest("iframe").length) {
841                            return true;
842                        }
843                    }
844                });
845                var contentAlert = new ContentAlert(getCurrentObject(), cId, ciObject);
846                contentAlert.initialise();
847            }
848            return false;
849        });
850    }
851    function localiseNotification(dataStr) {
852        dataStr = dataStr.replace(/\{{Subscription_Title}}/g, res["Subscription_Title"]);
853        dataStr = dataStr.replace(/\{{Subscription_MyAlertOnline}}/g, res["Subscription_MyAlertOnline"]);
854        dataStr = dataStr.replace(/\{{Subscription_EmailAlerts}}/g, res["Subscription_EmailAlerts"]);
855        dataStr = dataStr.replace(/\{{Subscription_EmailAddress}}/g, res["Subscription_EmailAddress"]);
856        dataStr = dataStr.replace(/\{{Subscription_SendImmediately}}/g, res["Subscription_SendImmediately"]);
857        dataStr = dataStr.replace(/\{{Subscription_SendDaily}}/g, res["Subscription_SendDaily"]);
858        dataStr = dataStr.replace(/\{{Subscription_SendWeekly}}/g, res["Subscription_SendWeekly"]);
859        dataStr = dataStr.replace(/\{{Subscription_EmailType}}/g, res["Subscription_EmailType"]);
860        dataStr = dataStr.replace(/\{{Subscription_EmailTypeHtml}}/g, res["Subscription_EmailTypeHtml"]);
861        dataStr = dataStr.replace(/\{{Subscription_EmailTypeText}}/g, res["Subscription_EmailTypeText"]);
862        dataStr = dataStr.replace(/\{{Subscription_AddAlert}}/g, res["Subscription_AddAlert"]);
863        dataStr = dataStr.replace(/\{{Subscription_Frequency}}/g, res["Subscription_Frequency"]);
864        dataStr = dataStr.replace(/\{{SelectFrequency}}/g, res["SelectFrequency"]);
865        dataStr = dataStr.replace(/\{{Required}}/g, res["Required"]);
866        dataStr = dataStr.replace(/\{{CancelX}}/g, res["CancelX"]);
867        return dataStr;
868    };
869
870    var AppendTemplateInModal = function (template) {
871        if (template !== undefined && template.length > 0) {
872            $(mainContainer + " #cmsModal").empty();
873            $(mainContainer + " #cmsModal").append(template);
874            //$(mainContainer + " #cmsModal select").selectBoxIt({ autoWidth: false });
875        }
876    };
877
878    //bind events 
879    var bindEvents = function () {
880
881        clearControls();
882
883        $(mainContainer + " #btnSearch").off("click");
884        $(mainContainer + " #btnSearch").on("click", function (e) {
885            e.preventDefault();
886            searchContainer();
887        });
888
889        $(mainContainer + " #linkClear" + ctlSuffixId).off("click");
890        $(mainContainer + " #linkClear" + ctlSuffixId).on("click", function (e) {
891            $(mainContainer + " #txtSearch" + ctlSuffixId).val("");
892            e.preventDefault();
893            searchContainer();
894        });
895
896        $(mainContainer + " #txtSearch" + ctlSuffixId).off("keyup");
897        $(mainContainer + " #txtSearch" + ctlSuffixId).on("keyup", function (e) {
898            if (e.which === 13 && $(mainContainer + " #txtSearch" + ctlSuffixId).is(':focus')) {
899                e.preventDefault();
900                searchContainer();
901            }
902        });
903    }
904
905    function searchContainer() {
906        if (_searchVal !== $(mainContainer + " #txtSearch" + ctlSuffixId).val().trim()) {
907            searchContentData();
908        }
909    };
910
911    var updateToolBar = function () {
912
913        // show and hide the multiple move/delete options
914        if (selectMultiSwitch === true) {
915            $(mainContainer + " .multiMoveOption").show();
916        }
917        else {
918            $(mainContainer + " .multiMoveOption").hide();
919        }
920
921        if (_permit.CanCreate && !isGuestMode) {
922            $(mainContainer + " div .PO-settingMenuBar").show();
923            $(mainContainer + " #addFolder" + ctlSuffixId + " a").html("<em class=\"fa fa-folder\"></em> " + res["folder"].Propercase());
924            $(mainContainer + " #addFolder" + ctlSuffixId + " a").attr("title", res["Add"] + " " + res["folder"].Propercase());
925            $(mainContainer + " #addFolder" + ctlSuffixId).off();
926            $(mainContainer + " #addFolder" + ctlSuffixId).on("click", function (e) {
927                e.stopPropagation();
928                e.preventDefault();
929                displayUpsertFolderModal(_contextId, { "Id": 0 });
930                return false;
931            });
932
933            // HIDING OLD UPLOAD FOR RELEASE... DO NOT REMOVE UNTIL ALL COMPONENTS ARE COMPLETE FOR NEW UPLOADER
934            $(mainContainer + " #" + ctlClientId + "addFiles a").html("<em class=\"fa fa-file\"></em> " + res["file"].Propercase());
935            $(mainContainer + " #" + ctlClientId + "addFiles a").attr("title", res["Add"] + " " + res["file"].Propercase());
936            $(mainContainer + " #" + ctlClientId + "addFiles").off();
937            $(mainContainer + " #" + ctlClientId + "addFiles").on("click", function (e) {
938                e.stopPropagation();
939                e.preventDefault();
940                displayUpsertFileModal(_contextId, { "Id": 0 });
941                return false;
942            });
943
944            $(mainContainer + " #" + ctlClientId + "addFilesJQuery a").html("<em class=\"fa fa-file\"></em> " + res["file"].Propercase());
945            $(mainContainer + " #" + ctlClientId + "addFilesJQuery a").attr("title", res["Add"] + " " + res["file"].Propercase());
946            $(mainContainer + " #" + ctlClientId + "addFilesJQuery").off();
947            $(mainContainer + " #" + ctlClientId + "addFilesJQuery").on("click", function (e) {
948                e.stopPropagation();
949                e.preventDefault();
950                displayUploader();
951                return false;
952            });
953
954            $(mainContainer + " #addLink" + ctlSuffixId + " a").html("<em class=\"fa fa-link\"></em> " + res["link"].Propercase());
955            $(mainContainer + " #addLink" + ctlSuffixId + " a").attr("title", res["Add"] + " " + res["link"].Propercase());
956            $(mainContainer + " #addLink" + ctlSuffixId).off();
957            $(mainContainer + " #addLink" + ctlSuffixId).on("click", function (e) {
958                e.stopPropagation();
959                e.preventDefault();
960                displayUpsertLinkModal(_contextId, { "Id": 0 });
961                return false;
962            });
963
964            ///Add Menu items
965            $(mainContainer + " .PO-settingDropdownButton").html("<em class=\"fa fa-plus\"></em> " + res["Add"] + "</a>");
966            $(mainContainer + " .PO-settingDropdownButton").attr("title", res["Add"] + res["Items"]);
967            $(mainContainer + " .PO-settingDropdownButton").off("
967click");
968            $(mainContainer + " .PO-settingDropdownButton").on("click", function (e) {
969                e.preventDefault();
970                $(mainContainer + " #addDropdown" + ctlSuffixId).slideToggle();
971
972            });
973
974            $(mainContainer + " #addDropdown" + ctlSuffixId).off("mouseleave");
975            $(mainContainer + " #addDropdown" + ctlSuffixId).on("mouseleave", function (e) {
976                e.preventDefault();
977                $(mainContainer + " #addDropdown" + ctlSuffixId).slideToggle();
978            });
979        }
980        else {
981            $(mainContainer + " div .PO-settingMenuBar").hide();
982        }
983        if (_permit.IsAdmin && !isGuestMode) {
984            if (showDispSettings) {
985                $(mainContainer + " .settingsLi").show();
986                $(mainContainer + " .settingsLi").first().html("<span>|</span>");
987                $(mainContainer + " #displaySettingsLink" + ctlSuffixId).html("<em class=\"fa fa-cog\"></em> " + res["Settings"]);
988                $(mainContainer + " #displaySettingsLink" + ctlSuffixId).attr("title", res["Settings"]);
989                $(mainContainer + " #displaySettingsLink" + ctlSuffixId).off();
990                $(mainContainer + " #displaySettingsLink" + ctlSuffixId).on("click", function (e) {
991                    e.preventDefault();
992                    displaySettingsModal(_contextId);
993                });
994            }
995            else {
996                $(mainContainer + " #displaySettingsLink" + ctlSuffixId).off("click");
997                $(mainContainer + " #displaySettingsLink" + ctlSuffixId).empty();
998                $(mainContainer + " .settingsLi").hide();
999            }
1000            if (_permit.IsAdmin) {
1001                $(mainContainer + " .activityLi").show();
1002                $(mainContainer + " .activityLi").first().html("<span>|</span>");
1003                $(mainContainer + " #activityLink" + ctlSuffixId).parent().show();
1004                $(mainContainer + " #activityLink" + ctlSuffixId).html("<em class=\"fa fa-check\"></em> " + res["Activity"])
1005                $(mainContainer + " #activityLink" + ctlSuffixId).attr("title", res["Activity"]);
1006                $(actLink).off("click");
1007                $(actLink).on("click", function (e) {
1008                    e.preventDefault();
1009                    displayActivityModal(_contextId);
1010                });
1011            } else {
1012                $(actLink).off("click");
1013                $(mainContainer + " #activityLink" + ctlSuffixId).empty();
1014                $(mainContainer + " .activityLi").hide();
1015            }
1016
1017            if (_permit.IsAdmin) {
1018                $(mainContainer + " .securityLi").show();
1019                $(mainContainer + " .securityLi").first().html("<span>|</span>");
1020                $(mainContainer + " #secuirtyLink" + ctlSuffixId).parent().show();
1021                $(mainContainer + " #secuirtyLink" + ctlSuffixId).html("<em class=\"fa fa-lock\"></em> " + res["Security"]);
1022                $(mainContainer + " #secuirtyLink" + ctlSuffixId).attr("title", res["Security"]);
1023                $(secLink).off("click");
1024                $(secLink).on("click", function (e) {
1025                    e.preventDefault();
1026                    document.location.href = _settings.SecLink;
1027                });
1028
1029                if (canUseMultiSelect) {
1030                    // Select Mutiple button set up
1031                    $(mainContainer + " .multiMoveLi").show();
1032                    $(mainContainer + " .multiMoveLi").first().html("<span>|</span>");
1033
1034                    $(mainContainer + " #MultiMoveLink").html("<em class=\"fa fa-check-square-o\"></em> " + res["SelectMultiple"]);
1035                    $(mainContainer + " #MultiMoveLink").attr("title", res["SelectMultiple"]);
1036                    $(mainContainer + " #MultiMoveLink").off("click");
1037                    $(mainContainer + " #MultiMoveLink").on("click", function (e) {
1038                        e.preventDefault();
1039                        displayMultipleSelect(_contextId);
1040                    });
1041                    // Move Selected to... button set up
1042                    $(mainContainer + " .CMS_bAction").off("click");
1043                    $(mainContainer + " .CMS_bAction").on("click", function (e) {
1044                        e.preventDefault();
1045                        if ((selectedItems.length > 0) === false) {
1046                            commons.ShowErrorMessage(res["NoItemsSelectedError"]);
1047                            return false;
1048                        }
1049                        var firstItem = selectedItems[0];
1050                        var locationFolderId = $(this).attr("locationFolderId");
1051                        displayMoveModalMultiple(_contextId, { "Id": firstItem, "Name": res["AllSelectedItems"], "parentId": _contextId, "locationFolderId": locationFolderId });
1052                    });
1053                }
1054                else {
1055                    $(mainContainer + " .multiMoveLi").remove();
1056                    $(mainContainer + " #MultiMoveLink").remove();
1057                    $(mainContainer + " .multiMoveOption").remove();
1058                }
1059
1060                if (!_permit.CanCreate) {
1061                    $(mainContainer + " .PO-settingDropdownButton").parent().remove();
1062                }
1063            } else {
1064                $(secLink).off("click");
1065                $(mainContainer + " #secuirtyLink" + ctlSuffixId).empty();
1066                $(mainContainer + " .securityLi" + ctlSuffixId).hide();
1067            }
1068        }
1069        else {
1070            $(mainContainer + " #displaySettingsLink" + ctlSuffixId).off("click");
1071            $(mainContainer + " #displaySettingsLink" + ctlSuffixId).empty();
1072            $(mainContainer + " .settingsLi").hide();
1073            $(actLink).off("click");
1074            $(mainContainer + " #activityLink" + ctlSuffixId).empty();
1075            $(mainContainer + " .activityLi").hide();
1076            $(secLink).off("click");
1077            $(mainContainer + " #secuirtyLink" + ctlSuffixId).empty();
1078            $(mainContainer + " .securityLi" + ctlSuffixId).hide();
1079            // hide Select Multiple option
1080            $(mainContainer + " #selectMultipleLink").off("click");
1081            $(mainContainer + " #selectMultipleLink").empty();
1082            $(mainContainer + " .multipleLi").hide();
1083        }
1084        if (_permit.CanWrite && !isGuestMode) {
1085            $(document).off('dragenter');
1086            $(document).on('dragenter', function (e) {
1087                e.stopPropagation();
1088                e.preventDefault();
1089            });
1090            $(document).off('dragover');
1091            $(document).on('dragover', function (e) {
1092                e.stopPropagation();
1093                e.preventDefault();
1094                //dragandrophandler.css('border', '2px dotted #0B85A1');
1095            });
1096            $(document).off('drop');
1097            $(document).on('drop', function (e) {
1098                e.stopPropagation();
1099                e.preventDefault();
1100            });
1101        }
1102    };
1103
1104    //Update header with sort icon
1105    var updateHeader = function (sortColumn, sortDir) {
1106        var ascControl = "<em class=\"fa fa-caret-up\"></em>";
1107        var descControl = "<em class=\"fa fa-caret-down\"></em>";
1108        var dataVar = sortColumn.attr("data");
1109        var columnText = sortColumn.children().first().html();
1110
1111        $(mainContainer + " div.sortcolumn").each(function () {
1112            if ($(this).attr("data") === dataVar) {
1113                $(this).addClass("active");
1114                $(this).find("em").remove();
1115                $(this).append(sortDir === "asc" ? ascControl : descControl);
1116                var updateDir = sortDir;
1117                if (updateDir === "desc") {
1118                    updateDir = "asc"; //asc
1119                } else {
1120                    updateDir = "desc"; //desc
1121                }
1122                $(this).attr("sort-direction", updateDir);
1123                if (sortDir === "desc") {
1124                    $(this).attr("title", res["Asc"].format(columnText));
1125                } else {
1126                    $(this).attr("title", res["Desc"].format(columnText));
1127                }
1128            }
1129            else {
1130                $(this).removeClass("active");
1131                $(this).find("em").remove();
1132            }
1133        });
1134    };
1135
1136    var sortDataList = function (sortColumnName, sortasc) {
1137        //set values
1138        _sortby = sortColumnName;
1139        _sortasc = sortasc;
1140        //updat sort header UI
1141        updateHeader($("div.sortcolumn[data='" + sortColumnName + "']"), sortasc ? "asc" : "desc");
1142        //update item list UI
1143        displayContentData(_data);
1144    };
1145
1146
1147    //Append header row
1148    var appendHeader = function () {
1149        $(headerSelector).find("div").remove();
1150        var columnTemplate = "<div class=\"item {sort}\" data=\"{data}\" sort-direction=\"asc\" title=\"{tooltip}\"><a href='#' role='button' aria-label=\"{arialabel}\">{title}</a></div>";
1151        var hRow = "<div> "
1152            + "{column0}"
1153            + "{column1}"
1154            + "</div> "
1155            + "<div> "
1156            + "{column2}"
1157            + "{column3}"
1158            + "</div>";
1159        for (var i = 0; i <= columns.length - 1; i++) {
1160            if ((columns[i].data === "CreationUser" && hideUserField)
1161                || (columns[i].data === "ModifiedDateString" && hideModifiedDateField)
1162                || (columns[i].data === "FileSize" && hideSizeField)) {
1163                hRow = hRow.replace("{column" + i + "}", "");
1164            }
1165            else if (columns[i].visible) {
1166                var col = columnTemplate.replace(/\{data}/g, columns[i].data);
1167                col = col.replace(/\{sort}
1167/g, (columns[i].sort ? "sortcolumn" : ""));
1168                col = col.replace(/\{title}/g, columns[i].title);
1169                col = col.replace(/\{tooltip}/g, res["Asc"].format(columns[i].title));
1170                col = col.replace(/\{arialabel}/g, "Sort by " + columns[i].arialabel);
1171                hRow = hRow.replace("{column" + i + "}", col);
1172            }
1173        }
1174        $(headerSelector).append(hRow);
1175
1176        $(mainContainer + " div.sortcolumn").off("click");
1177        $(mainContainer + " div.sortcolumn").on("click", function (e) {
1178            e.preventDefault();
1179            var dataVar = $(this).attr("data");
1180            var sortDir = $(this).attr("sort-direction");
1181            _currentPage = 0;
1182
1183            if (sortDir === "") {
1184                sortDir = "asc"; //asc
1185            }
1186            _sortcriteria = (_sortcriteria.indexOf(dataVar) >= 0) ? "" : dataVar + sortDir;
1187            sortDataList(dataVar, sortDir === "desc" ? false : true);
1188        });
1189
1190    };
1191
1192    //Display data in table from service : Header row and data rows
1193    var displayContentData = function (data) {
1194
1195        if (_data.length > 1) {
1196            _data = _data.sort(function (first, second) {
1197                var valA;
1198                var valB;
1199                switch (_sortby) {
1200                    case "Name":
1201                        valA = first.Name.toLowerCase(); valB = second.Name.toLowerCase();
1202                        break;
1203                    case "FileSize":
1204                        valA = parseInt(first.FileSize); valB = parseInt(second.FileSize);
1205                        break;
1206                    case "CreationUser":
1207                        valA = (!first.CreationUser ? "" : first.CreationUser).toLowerCase(); valB = (!second.CreationUser ? "" : second.CreationUser).toLowerCase();
1208                        break;
1209                    case "CreationDate":
1210                        valA = first.CreationDate; valB = second.CreationDate;
1211                        break;
1212                    case "ModifiedDateString":
1213                        valA = parseInt(first.ModifiedDateTicks); valB = parseInt(second.ModifiedDateTicks);
1214                        break;
1215                }
1216                var val1A = first.Name.toLowerCase(); var val1B = second.Name.toLowerCase();
1217                if (_sortasc) {
1218                    return valA > valB ? 1 : (valA < valB ? -1 : (val1A > val1B ? 1 : -1));
1219                }
1220                else {
1221                    return valA < valB ? 1 : (valA > valB ? -1 : (val1A > val1B ? 1 : -1));
1222                }
1223            });
1224        }
1225
1226        appendPagerAndData(listSelector, _data);
1227    };
1228
1229    var addPageButton = function (startPage, lastPage) {
1230        if (startPage <= 0) startPage = 0;
1231        var pagebutton = "";
1232        pagebutton += "<li><a href='#' class=\"pageButton\" tag=\"-1\" title=\"" + res["PrevPage"] + "\"><em class=\"fa fa-arrow-left\"></em></a></li>";
1233        pagebutton += "<li><a href='#' class=\"nextPrev\" tag=\"" + (startPage + 1) + "\" id=\"prev\" title=\"" + res["PrevPages"] + "\" >...</a></li>";
1234        for (var i = 0; i <= noofpagebuttons - 1; i++) {
1235            if (i > lastPage) continue;
1236            else {
1237                pagebutton += "<li><a href='#' class=\"pageButton number\" tag=\"" + i + "\" title=\"" + (i + 1) + res["Page"] + "\">" + (i + 1) + " </a></li>";
1238            }
1239        }
1240        pagebutton += "<li><a href='#' class=\"nextPrev\" tag=\"" + (startPage + 1) + "\" id=\"next\" title=\"" + res["NextPage"] + "\" >...</a></li>";
1241        pagebutton += "<li><a href='#' class=\"pageButton\" tag=\"+1\" title=\"" + res["NextPages"] + "\"><em class=\"fa fa-arrow-right\"></em></a></li>";
1242        return pagebutton;
1243    };
1244
1245    var updateButton = function (startPage, lastPage) {
1246        var i = startPage;
1247        $(pagerSelector + " a.number").each(function () {
1248            if (i <= lastPage) {
1249                $(this).show();
1250                var tag = $(this).attr("tag");
1251                $(this).attr("tag", i - 1);
1252                $(this).attr("title", i + res["Page"]);
1253                $(this).html(i);
1254            }
1255            else { $(this).hide(); }
1256            i += 1;
1257        });
1258        $(pagerSelector + " a.nextPrev").attr("tag", startPage);
1259        if (startPage <= 1) {
1260            $(pagerSelector + " li").first().hide();
1261            $(pagerSelector + " li").first().next().hide();
1262        }
1263        else {
1264            $(pagerSelector + " li").first().show();
1265            $(pagerSelector + " li").first().next().show();
1266        }
1267        if (i > lastPage) {
1268            $(pagerSelector + " li").last().hide();
1269            $(pagerSelector + " li").last().prev().hide();
1270        }
1271        else {
1272            $(pagerSelector + " li").last().show();
1273            $(pagerSelector + " li").last().prev().show();
1274        }
1275    };
1276
1277    //Show search result status
1278    var showPageStatus = function (iPage, data, pagesize) {
1279        if (Math.ceil(data.length / pagesize) > 0)
1280            $(mainContainer + " .PO-pageCount").html(res["PageStatus"].format((iPage + 1), Math.ceil(data.length / pagesize)));
1281        else
1282            $(mainContainer + " .PO-pageCount").text("");
1283    };
1284
1285    //Show current page 
1286    var showCurrentPage = function () {
1287        $(mainContainer + " .pageButton").each(function () {
1288            var incrementButton = $(this).attr("tag").indexOf("+") < 0 && $(this).attr("tag").indexOf("-") < 0;
1289            if (parseInt($(this).attr("tag")) === _currentPage && incrementButton) {
1290                $(this).addClass("active");
1291                //console.log($(this).attr("tag"));
1292            } else
1293                $(this).removeClass("active");
1294        });
1295        $(mainContainer + " .nextPrev").each(function () {
1296            $(this).removeClass("active");
1297        });
1298        //showCurrentItem();
1299    };
1300
1301    //Show current item 
1302    var showCurrentItem = function () {
1303        if (_activeItem > 0) {
1304            var ctrlClick = $(mainContainer + " a.dataRowItem[data=" + _activeItem + "]");
1305            if (ctrlClick) {
1306                //if (ctrlClick.attr("data-type") == "content_folder")
1307                //{ ctrlClick.parent().find(".folderSettingsToggle").trigger("click"); }
1308                //else
1309                //{ ctrlClick.trigger("click", ["Show", "event"]); }
1310                ctrlClick.parent().find("a").first().focus();
1311            }
1312            //if (_activeObject)
1313            //    if (_activeObject.eq(0).attr("data-id") == _activeItem) {
1314            //        ctrlClick.parent().find("a." + _activeObject.eq(0).attr("class")).focus();
1315            //    }
1316        }
1317        //showListfocus();
1318
1319
1320
1321        //showCurrentfocus();
1322    };
1323
1324    //Show current object focused 
1325    var showListfocus = function () {
1326        listSelector.find("li a").first().focus();
1327    };
1328
1329    //Set feature items
1330    var setDetailRow = function (data) {
1331        var subscriptionLink = "";
1332        var returnString = "";
1333        var moveToLink = "";
1334        var deleteLink = ""
1335        var propLink = "";
1336        var editLink = "";
1337        var openLink = "";
1338        var activityLink = "";
1339        var securityLink = "";
1340        if (data.canWrite) {
1341            editLink = "<li><a href='#' class=\"edititem\" title=\"" + res["EditLinkTitle"] + "'" + data.Name + "'\" aria-haspopup=\"true\" data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\"><em class=\"fa fa-pencil-square-o\"></em> {1}</a></li>";
1342
1343            propLink = "<li><a href='#' class=\"propitem\" title=\"" + res["PropertiesLinkTitle"] + "'" + data.Name + "'\"  data-create=\"" + data.canCreate + "\"  data-del=\"" + data.canDelete + "\" data-adm=\"" + data.isAdmin + "\"   aria-haspopup=\"true\" id=\"lnkEdit_{object}\" data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\"><em class=\"fa fa-pencil-square-o\"></em> {1}</a></li>".replace('{1}', res["Edit"]);
1344        }
1345        if (_permit.CanWrite) {
1346            moveToLink = "<li><a href='#' class=\"moveitem\" title=\"" + res["MoveToLinkTitle"] + "'" + data.Name + "'\" aria-haspopup=\"true\" id=\"lnkMove_{object}\" data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\" locationFolderId=\"" + data.ParentId + "\"><em class=\"fa fa-folder-open\"></em> {1}</a></li>".replace('{1}', res["MoveTo"]);
1347        }
1348        if (data.isAdmin) {
1349            activityLink = "<li><a href='#' class=\"actitem\" title=\"" + res["ActivityLinkTitle"] + " '" + data.Name + "'\" aria-haspopup=\"true\"  data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\"><em class=\"fa fa-check\"></em> {1}</a></li>".replace('{1}', res["Activity"]);
1350            securityLink = "<li><a href=\"" + data.SecLink + "\" class=\"secitem\" title=\"" + res["SecurityLinkTitle"] + " '" + data.Name + "'\" data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\"><em class=\"fa fa-lock\"></em> {1}</a></li>".replace('{1}', res["Security"]);
1351        }
1352        if (data.canDelete) {
1353            deleteLink = "<li><a href='#' class=\"deleteitem\" title=\"" + res["DeleteLinkTitle"] + " '" + data.Name + "'\" aria-haspopup=\"true\" id=\"lnkDelete_{object}\" data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\">
1353<em class=\"fa fa-trash\"></em>{1}</a></li>";
1354        }
1355        if (showSubscription) {
1356            subscriptionLink = "<li><a href='#' class=\"subscriptionitem\" title=\"" + res["SubscriptionLinkTitle"] + " '" + data.Name + "'\" aria-haspopup=\"true\" id=\"lnkSubscription_{object}\" data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\"><em class=\"fa fa-bell\"></em>{1}</a></li>".replace('{1}', res["Subscribe"]);
1357        }
1358        var copyLink = "<li><a href='#' class=\"copyLink\" title=\"" + res["CopyLinkTitle"] + " '" + data.Name + "'\" data-clipboard-action=\"copy\" id=\"lnkCopy_{object}\"  data-clipboard-text=\"" + data.Link + "\"  data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\" ><em class=\"fa fa-clipboard\"></em> {1}</a></li>";
1359        var downloadLink = "<li><a href=\"" + data.DownloadLink + "\" download=\"" + data.Name + "\" title=\"" + res["DownloadLinkTitle"] + " '" + data.Name + "'\" target=\"_blank\" class=\"downloaditem fileName\"  data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\" ><em class=\"fa fa-download\" ></em> {1}</a></li>".replace('{1}', res["Download"]);
1360
1361
1362        var linkRes = res["link"];
1363        var fileRes = res["file"];
1364        var folRes = res["folder"];
1365        var chatRes = res["chat"];
1366        var addressFeature = res["Iwantto"];
1367        switch (data.Type) {
1368            case "content_extlink":
1369                openLink = "<li><a href=\"" + data.Link + "\"  target=\"_blank\"  class=\"openLink\" title=\"" + res["OpenLinkTitle"] + " '" + data.Name + "'\"  data-id=\"{object}\" data-item=\"{type}\" data-name=\"{name}\" ><em class=\"fa fa-external-link\"></em> {1}</a></li>".replace("{1}", res["OpenLink"]);
1370                returnString = "<div class=\"fileActions\"><ul><li>{0}</li>{1}{2}{3}{4}{5}{6}{7}</ul></div>".format(addressFeature, copyLink.format(linkRes, res["CopyLink"]), editLink.format(linkRes, res["Edit"]), moveToLink.format(linkRes, res["MoveTo"]), deleteLink.format(linkRes, res["Delete"]), subscriptionLink.format(linkRes), openLink.format(linkRes), activityLink.format(linkRes));
1371                break;
1372            case "content_folder":
1373                returnString = "<div class=\"fileActions\"><ul><li>{0}</li></li>{1}{2}{3}{4}{5}{6}</ul></div>".format(addressFeature, copyLink.format(folRes, res["CopyLink"]), editLink.format(folRes, res["Edit"]), moveToLink.format(folRes, res["MoveTo"]), deleteLink.format(folRes, res["Delete"]), subscriptionLink.format(linkRes), activityLink.format(folRes));
1374                break;
1375            case "workspace_chat":
1376                returnString = "<div class=\"fileActions\"><ul><li>{0}</li></li>{1}{2}{3}{4}{5}{6}</ul></div>".format(addressFeature, copyLink.format(chatRes, res["CopyLink"]), "", moveToLink.format(chatRes, res["MoveTo"]), deleteLink.format(chatRes, res["Delete"]), subscriptionLink.format(linkRes), activityLink.format(chatRes));
1377                break;
1378            default:
1379                returnString = "<div class=\"fileActions\"><ul><li>{0}</li></li>{1}{2}{3}{4}{5}{6}{7}{8}{9}</ul></div>".format(addressFeature, copyLink.format(fileRes, res["CopyLink"]), propLink, moveToLink.format(fileRes, res["MoveTo"]), deleteLink.format(fileRes, res["Delete"]), "", downloadLink, subscriptionLink.format(linkRes), activityLink.format(fileRes), securityLink.format(fileRes));
1380                break;
1381        }
1382
1383        return returnString.replace(/\{type}/g, data.Type).replace(/\{object}/g, data.ObjectId).replace(/\{name}/g, data.Name);
1384    };
1385
1386    // Prepare the file/folder/link control
1387    var configureDownloadLink = function (anchor, data) {
1388        switch (data.Type) {
1389            case "content_folder":
1390                anchor.href = "#";
1391                anchor.title = res["FolderTooltip"] + " '" + data.Name + "'";
1392                break;
1393            case "content_item":
1394                anchor.href = data.Link;
1395                anchor.title = data.Title;
1396                anchor.setAttribute("alt", data.Title);
1397                anchor.setAttribute("target", "_blank");
1398                break;
1399            case "content_extlink":
1400                anchor.href = data.Link;
1401                anchor.title = res["OpenLink"] + " '" + data.Name + "'";
1402                anchor.target = "_blank";
1403                break;
1404            default:
1405                anchor.href = "#";
1406                anchor.title = res["ItemDetails"] + " '" + data.Name + "'";
1407                break;
1408        }
1409    };
1410
1411    var clearList = function (ctrl) {
1412        if (_back !== undefined && _back.length > 0)
1413            ctrl.find("li").not(".subfolder").remove();
1414        else
1415            ctrl.empty();
1416        ctrl.find("li.norecords").remove();
1417    };
1418
1419    //Show no records template
1420    var showNoRecordsTemplate = function (lstControl) {
1421        clearList(lstControl);
1422        addSubFolderRow(lstControl);
1423        appendHeader(lstControl);
1424        var tableRow = $("<li class=\"norecords\">" + res["NoRecords"] + "</li>");
1425        lstControl.append(tableRow);
1426    };
1427
1428    var getTreeNode = function () {
1429        var treeNode = "";
1430        if (_back !== undefined && _back.length > 0) {
1431            treeNode += "<div class=\"folderTree\"><em class=\"fa fa-level-up fa-rotate-90\" title=\"" + res["SubFolder"] + "\"></em></div>";
1432        }
1433        return treeNode;
1434    }
1435
1436    //Append DataRow as per paging AppendDataRow
1437    var appendDataRow = function (ctrl, iPage, data, pagesize) {
1438        clearList(ctrl);
1439        var endCount = ((iPage * pagesize) + pagesize) - 1;
1440        if (data.length < endCount) {
1441            endCount = data.length;
1442        }
1443
1444        for (var i = iPage * pagesize; i <= endCount; i++) {
1445            if (data[i] !== undefined) {
1446                var dateString = "";
1447                if (!hideModifiedDateField)
1448                    dateString = data[i].ModifiedDateString;
1449
1450                var sizeString = "";
1451                if (!hideSizeField)
1452                    sizeString = (data[i].FileSizeString === "0 B " ? "" : data[i].FileSizeString);
1453
1454                var userString = "";
1455                if (!hideUserField && data[i].CreationUser)
1456                    userString = data[i].CreationUser;
1457
1458                // if item has been marked as selected, check the checkbox 
1459                // note this is for navigating through folders to preserve the selected item values
1460                var itemChecked = "";
1461                if (selectedItems.length > 0 && (selectedItems.indexOf(data[i].ObjectId.toString()) > -1)) {
1462                    itemChecked = "checked";
1463                }
1464
1465                var dataRow;
1466
1467                if (canUseMultiSelect) {
1468                    if (data[i].Type === "content_folder") {
1469                        dataRow = document.createElement("li");
1470                        dataRow.className = "folder";
1471
1472                        var multiMove = document.createElement("div");
1473                        multiMove.className = "multiMove";
1474
1475                        var displayTableMultiMove = document.createElement("div");
1476                        displayTableMultiMove.className = "displayTable";
1477
1478                        var label = document.createElement("label");
1479                        label.className = "CMS_checkbox CMS_cb_noText";
1480
1481                        var input = document.createElement("input");
1482                        input.type = "checkbox";
1483                        input.className = "CMS_input";
1484                        input.setAttribute("aria-label", "Click to select item");
1485                        input.setAttribute("aria-hidden", "true");
1486                        if (itemChecked) input.setAttribute("checked", "checked");
1487                        input.setAttribute("data-type", data[i].Type);
1488                        input.setAttribute("data-write", data[i].canWrite);
1489                        input.setAttribute("data", data[i].ObjectId);
1490
1491                        var span = document.createElement("span");
1492                        var em = document.createElement("em");
1493                        em.className = "fa";
1494                        em.setAttribute("aria-hidden", "true");
1495                        span.appendChild(em);
1496
1497                        label.appendChild(input);
1498                        label.appendChild(span);
1499                        displayTableMultiMove.appendChild(label);
1500                        multiMove.appendChild(displayTableMultiMove);
1501                        dataRow.appendChild(multiMove);
1502
1503                        var anchor = document.createElement("a");
1504                        anchor.className = `documentDetailsToggle ${data[i].Type} dataRowItem`;
1505                        anchor.setAttribute("data-type", data[i].Type);
1506                        anchor.setAttribute("data-write", data[i].canWrite);
1507                        anchor.setAttribute("data", data[i].ObjectId);
1508                        anchor.setAttribute("href", "#");
1509                        anchor.setAttribute("title", res["ItemDetails"] + " '" + data[i].Name + "'");
1510                        configureDownloadLink(anchor, data[i]);
1511
1512                        var displayTable = document.createElement("div");
1513                        displayTable.className = "displayTable";
1514
1515                        var treeNode = getTreeNode();
1516                        if (treeNode) {
1517                            displayTable.innerHTML += treeNode;
1518                        }
1519
1520                        var iconType = document.createElement("div");
1521                        iconType.className = "iconType";
1522                        var iconItem = document.createElement("div");
1523                        iconItem.className = "item";
1524                        iconItem.innerHTML = commons.GetImageIconAsPerFile(data[i].Extension, data[i].Type);
1525                        iconType.appendChild(iconItem);
1526                        displayTable.appendChild(iconType);
1527
1528                        var titleUser = document.createElement("div");
1529                        titleUser.className = "titleUser";
1530
1531                        var docTitle = document.createElement("div");
1532                        docTitle.className = "item docTitle";
1533                        docTitle.innerHTML = data[i].Name;
1534                        titleUser.appendChild(docTitle);
1535
1536                        var uploader = document.createElement("div");
1537                        uploader.className = "item uploader";
1538                        uploader.textContent = userString;
1539                        titleUser.appendChild(uploader);
1540
1541                        if (data[i].ParentName.length > 0) {
1542                            var docBread = document.createElement("div");
1543                            docBread.className = "item docBread";
1544                            docBread.innerHTML = `<strong>Folder:</strong> ... / ${data[i].ParentName}`;
1545                            titleUser.appendChild(docBread);
1546                        }
1547
1548                        displayTable.appendChild(titleUser);
1549
1550                        var sizeTime = document.createElement("div");
1551                        sizeTime.className = "sizeTime";
1552
1553                        var docSize = document.createElement("div");
1554                        docSize.className = "item docSize";
1555                        if (data[i].Type === "content_folder") {
1556                            docSize.textContent = data[i].ChildrenCount + res["Items"];
1557                        } else {
1558                            docSize.textContent = data[i].Type === "content_extlink" ? "" : sizeString;
1559                        }
1560                        sizeTime.appendChild(docSize);
1561
1562                        displayTable.appendChild(sizeTime);
1563                        anchor.appendChild(displayTable);
1564                        dataRow.appendChild(anchor);
1565
1566                        var documentDetails = document.createElement("div");
1567                        documentDetails.className = "documentDetails";
1568                        documentDetails.setAttribute("aria-haspopup", "true");
1569
1570                        if (data[i].Description && data[i].canRead) {
1571                            var fileDescription = document.createElement("div");
1572                            fileDescription.className = "fileDescription";
1573                            fileDescription.textContent = data[i].Description;
1574                            documentDetails.appendChild(fileDescription);
1575                        }
1576
1577                        dataRow.appendChild(documentDetails);
1578
1579                        var downloadButton = document.createElement("a");
1580                        downloadButton.className = "downloadButton folderSettingsToggle";
1581                        downloadButton.setAttribute("aria-label", "toggle options");
1582                        downloadButton.setAttribute("data", data[i].ObjectId);
1583                        downloadButton.setAttribute("href", "#");
1584                        downloadButton.setAttribute("title", res["ItemDetails"] + " '" + data[i].Name + "'");
1585
1586                        var bulletButton = document.createElement("div");
1587                        bulletButton.className = "displayTable";
1588                        var bulletSpan = document.createElement("div");
1589                        bulletSpan.className = "bulletButton";
1590                        bulletSpan.innerHTML = "<span>•••</span>";
1591                        bulletButton.appendChild(bulletSpan);
1592                        downloadButton.appendChild(bulletButton);
1593
1594                        dataRow.appendChild(downloadButton);
1595                    } else {
1596                        dataRow = document.createElement("li");
1597
1598                        var multiMove = document.createElement("div");
1599                        multiMove.className = "multiMove";
1600
1601                        var displayTableMultiMove = document.createElement("div");
1602                        displayTableMultiMove.className = "displayTable";
1603
1604                        var label = document.createElement("label");
1605                        label.className = "CMS_checkbox CMS_cb_noText";
1606
1607                        var input = document.createElement("input");
1608                        input.type = "checkbox";
1609                        input.className = "CMS_input";
1610                        input.setAttribute("aria-label", "Click to select item");
1611                        input.setAttribute("aria-hidden", "true");
1612                        if (itemChecked) input.setAttribute("checked", "checked");
1613                        input.setAttribute("data-type", data[i].Type);
1614                        input.setAttribute("data-write", data[i].canWrite);
1615                        input.setAttribute("data", data[i].ObjectId);
1616
1617                        var span = document.createElement("span");
1618                        var em = document.createElement("em");
1619                        em.className = "fa";
1620                        em.setAttribute("aria-hidden", "true");
1621                        span.appendChild(em);
1622
1623                        label.appendChild(input);
1624                        label.appendChild(span);
1625                        displayTableMultiMove.appendChild(label);
1626                        multiMove.appendChild(displayTableMultiMove);
1627                        dataRow.appendChild(multiMove);
1628
1629                        var documentDetailsToggle = document.createElement("div");
1630                        documentDetailsToggle.className = `documentDetailsToggle ${data[i].Type} dataRowItem`;
1631
1632                        var displayTable = document.createElement("div");
1633                        displayTable.className = "displayTable";
1634
1635                        var treeNode = getTreeNode();
1636                        if (treeNode) {
1637                            displayTable.innerHTML += treeNode;
1638                        }
1639
1640                        var iconType = document.createElement("div");
1641                        iconType.className = "iconType iconTypeItem";
1642                        var iconItem = document.createElement("div");
1643                        iconItem.className = "item";
1644                        iconItem.innerHTML = commons.GetImageIconAsPerFile(data[i].Extension, data[i].Type);
1645                        iconType.appendChild(iconItem);
1646                        displayTable.appendChild(iconType);
1647
1648                        var titleUser = document.createElement("div");
1649                        titleUser.className = "titleUser";
1650
1651                        var docItemTitle = document.createElement("a");
1652                        docItemTitle.className = "item docItemTitle";
1653                        docItemTitle.setAttribute("data-type", data[i].Type);
1654                        docItemTitle.setAttribute("data-write", data[i].canWrite);
1655                        docItemTitle.setAttribute("data", data[i].ObjectId);
1656                        docItemTitle.setAttribute("href", "#");
1657                        docItemTitle.innerHTML = data[i].Name;
1658                        configureDownloadLink(docItemTitle, data[i]);
1659                        titleUser.appendChild(docItemTitle);
1660
1661                        var uploader = document.createElement("div");
1662                        uploader.className = "item uploader";
1663                        uploader.textContent = userString;
1664                        titleUser.appendChild(uploader);
1665
1666                        if (data[i].ParentName.length > 0) {
1667                            var docBread = document.createElement("div");
1668                            docBread.className = "item docBread";
1669                            docBread.innerHTML = `<strong>Folder:</strong> ... / ${data[i].ParentName}`;
1670                            titleUser.appendChild(docBread);
1671                        }
1672
1673                        displayTable.appendChild(titleUser);
1674
1675                        var sizeTime = document.createElement("div");
1676                        sizeTime.className = "sizeTime";
1677
1678                        var docSize = document.createElement("div");
1679                        docSize.className = "item docSize";
1680                        if (data[i].Type === "content_folder") {
1681                            docSize.textContent = data[i].ChildrenCount + res["Items"];
1682                        } else {
1683                            docSize.textContent = data[i].Type === "content_extlink" ? "" : sizeString;
1684                        }
1685                        sizeTime.appendChild(docSize);
1686
1687                        if (data[i].Type !== "content_folder") {
1688                            var docDate = document.createElement("div");
1689                            docDate.className = "item docDate";
1690                            docDate.innerHTML = dateString;
1691                            sizeTime.appendChild(docDate);
1692                        }
1693
1694                        displayTable.appendChild(sizeTime);
1695                        documentDetailsToggle.appendChild(displayTable);
1696                        dataRow.appendChild(documentDetailsToggle);
1697
1698                        var documentDetails = document.createElement("div");
1699                        documentDetails.className = "documentDetails";
1700                        documentDetails.setAttribute("aria-haspopup", "true");
1701
1702                        if (data[i].Description && data[i].canRead) {
1703                            var fileDescription = document.createElement("div");
1704                            fileDescription.className = "fileDescription";
1705                            fileDescription.textContent = data[i].Description;
1706                            documentDetails.appendChild(fileDescription);
1707                        }
1708
1709                        dataRow.appendChild(documentDetails);
1710
1711                        var downloadButton = document.createElement("a");
1712                        downloadButton.className = "downloadButton folderSettingsToggle";
1713                        downloadButton.setAttribute("aria-label", "toggle options");
1714                        downloadButton.setAttribute("data", data[i].ObjectId);
1715                        downloadButton.setAttribute("href", "#");
1716                        downloadButton.setAttribute("title", res["ItemDetails"] + " '" + data[i].Name + "'");
1717
1718                        var bulletButton = document.createElement("div");
1719                        bulletButton.className = "displayTable";
1720                        var bulletSpan = document.createElement("div");
1721                        bulletSpan.className = "bulletButton";
1722                        bulletSpan.innerHTML = "<span>•••</span>";
1723                        bulletButton.appendChild(bulletSpan);
1724                        downloadButton.appendChild(bulletButton);
1725
1726                        dataRow.appendChild(downloadButton);
1727                    }
1728                } else {
1729                    if (data[i].Type === "content_folder") {
1730                        dataRow = document.createElement("li");
1731                        dataRow.className = "folder";
1732
1733                        var anchor = document.createElement("a");
1734                        anchor.className = `documentDetailsToggle ${data[i].Type} dataRowItem`;
1735                        anchor.setAttribute("data-type", data[i].Type);
1736                        anchor.setAttribute("data-write", data[i].canWrite);
1737                        anchor.setAttribute("data", data[i].ObjectId);
1738                        anchor.setAttribute("href", "#");
1739                        anchor.setAttribute("title", res["ItemDetails"] + " '" + data[i].Name + "'");
1740                        configureDownloadLink(anchor, data[i]);
1741
1742                        var displayTable = document.createElement("div");
1743                        displayTable.className = "displayTable";
1744
1745                        var treeNode = getTreeNode();
1746                        if (treeNode) {
1747                            displayTable.innerHTML += treeNode;
1748                        }
1749
1750                        var iconType = document.createElement("div");
1751                        iconType.className = "iconType";
1752                        var iconItem = document.createElement("div");
1753                        iconItem.className = "item";
1754                        iconItem.innerHTML = commons.GetImageIconAsPerFile(data[i].Extension, data[i].Type);
1755                        iconType.appendChild(iconItem);
1756                        displayTable.appendChild(iconType);
1757
1758                        var titleUser = document.createElement("div");
1759                       
1759 titleUser.className = "titleUser";
1760
1761                        var docTitle = document.createElement("div");
1762                        docTitle.className = "item docTitle";
1763                        docTitle.innerHTML = data[i].Name;
1764                        titleUser.appendChild(docTitle);
1765
1766                        var uploader = document.createElement("div");
1767                        uploader.className = "item uploader";
1768                        uploader.textContent = userString;
1769                        titleUser.appendChild(uploader);
1770
1771                        if (data[i].ParentName.length > 0) {
1772                            var docBread = document.createElement("div");
1773                            docBread.className = "item docBread";
1774                            docBread.innerHTML = `<strong>Folder:</strong> ... / ${data[i].ParentName}`;
1775                            titleUser.appendChild(docBread);
1776                        }
1777
1778                        displayTable.appendChild(titleUser);
1779
1780                        var sizeTime = document.createElement("div");
1781                        sizeTime.className = "sizeTime";
1782
1783                        var docSize = document.createElement("div");
1784                        docSize.className = "item docSize";
1785                        if (data[i].Type === "content_folder") {
1786                            docSize.textContent = data[i].ChildrenCount + res["Items"];
1787                        } else {
1788                            docSize.textContent = data[i].Type === "content_extlink" ? "" : sizeString;
1789                        }
1790                        sizeTime.appendChild(docSize);
1791
1792                        displayTable.appendChild(sizeTime);
1793                        anchor.appendChild(displayTable);
1794                        dataRow.appendChild(anchor);
1795
1796                        var documentDetails = document.createElement("div");
1797                        documentDetails.className = "documentDetails";
1798                        documentDetails.setAttribute("aria-haspopup", "true");
1799
1800                        if (data[i].Description && data[i].canRead) {
1801                            var fileDescription = document.createElement("div");
1802                            fileDescription.className = "fileDescription";
1803                            fileDescription.textContent = data[i].Description;
1804                            documentDetails.appendChild(fileDescription);
1805                        }
1806
1807                        dataRow.appendChild(documentDetails);
1808
1809                        var downloadButton = document.createElement("a");
1810                        downloadButton.className = "downloadButton folderSettingsToggle";
1811                        downloadButton.setAttribute("aria-label", "toggle options");
1812                        downloadButton.setAttribute("data", data[i].ObjectId);
1813                        downloadButton.setAttribute("href", "#");
1814                        downloadButton.setAttribute("title", res["ItemDetails"] + " '" + data[i].Name + "'");
1815
1816                        var bulletButton = document.createElement("div");
1817                        bulletButton.className = "displayTable";
1818                        var bulletSpan = document.createElement("div");
1819                        bulletSpan.className = "bulletButton";
1820                        bulletSpan.innerHTML = "<span>•••</span>";
1821                        bulletButton.appendChild(bulletSpan);
1822                        downloadButton.appendChild(bulletButton);
1823
1824                        dataRow.appendChild(downloadButton);
1825                    } else {
1826                        dataRow = document.createElement("li");
1827
1828                        var documentDetailsToggle = document.createElement("div");
1829                        documentDetailsToggle.className = `documentDetailsToggle ${data[i].Type} dataRowItem`;
1830
1831                        var displayTable = document.createElement("div");
1832                        displayTable.className = "displayTable";
1833
1834                        var treeNode = getTreeNode();
1835                        if (treeNode) {
1836                            displayTable.innerHTML += treeNode;
1837                        }
1838
1839                        var iconType = document.createElement("div");
1840                        iconType.className = "iconType iconTypeItem";
1841                        var iconItem = document.createElement("div");
1842                        iconItem.className = "item";
1843                        iconItem.innerHTML = commons.GetImageIconAsPerFile(data[i].Extension, data[i].Type);
1844                        iconType.appendChild(iconItem);
1845                        displayTable.appendChild(iconType);
1846
1847                        var titleUser = document.createElement("div");
1848                        titleUser.className = "titleUser";
1849
1850                        var docItemTitle = document.createElement("a");
1851                        docItemTitle.className = `item docItemTitle downloaditem fileName ${data[i].Type} dataRowItem`;
1852                        docItemTitle.setAttribute("data-type", data[i].Type);
1853                        docItemTitle.setAttribute("data-write", data[i].canWrite);
1854                        docItemTitle.setAttribute("data", data[i].ObjectId);
1855                        docItemTitle.setAttribute("href", "#");
1856                        docItemTitle.setAttribute("download", data[i].Name);
1857                        docItemTitle.innerHTML = data[i].Name;
1858                        configureDownloadLink(docItemTitle, data[i]);
1859                        titleUser.appendChild(docItemTitle);
1860
1861                        var uploader = document.createElement("div");
1862                        uploader.className = "item uploader";
1863                        uploader.textContent = userString;
1864                        titleUser.appendChild(uploader);
1865
1866                        if (data[i].ParentName.length > 0) {
1867                            var docBread = document.createElement("div");
1868                            docBread.className = "item docBread";
1869                            docBread.innerHTML = `<strong>Folder:</strong> ... / ${data[i].ParentName}`;
1870                            titleUser.appendChild(docBread);
1871                        }
1872
1873                        displayTable.appendChild(titleUser);
1874
1875                        var sizeTime = document.createElement("div");
1876                        sizeTime.className = "sizeTime";
1877
1878                        var docSize = document.createElement("div");
1879                        docSize.className = "item docSize";
1880                        if (data[i].Type === "content_folder") {
1881                            docSize.textContent = data[i].ChildrenCount + res["Items"];
1882                        } else {
1883                            docSize.textContent = data[i].Type === "content_extlink" ? "" : sizeString;
1884                        }
1885                        sizeTime.appendChild(docSize);
1886
1887                        if (data[i].Type !== "content_folder") {
1888                            var docDate = document.createElement("div");
1889                            docDate.className = "item docDate";
1890                            docDate.innerHTML = dateString;
1891                            sizeTime.appendChild(docDate);
1892                        }
1893
1894                        displayTable.appendChild(sizeTime);
1895                        documentDetailsToggle.appendChild(displayTable);
1896                        dataRow.appendChild(documentDetailsToggle);
1897
1898                        var documentDetails = document.createElement("div");
1899                        documentDetails.className = "documentDetails";
1900                        documentDetails.setAttribute("aria-haspopup", "true");
1901
1902                        if (data[i].Description && data[i].canRead) {
1903                            var fileDescription = document.createElement("div");
1904                            fileDescription.className = "fileDescription";
1905                            fileDescription.textContent = data[i].Description;
1906                            documentDetails.appendChild(fileDescription);
1907                        }
1908
1909                        dataRow.appendChild(documentDetails);
1910
1911                        var downloadButton = document.createElement("a");
1912                        downloadButton.className = "downloadButton folderSettingsToggle";
1913                        downloadButton.setAttribute("aria-label", "toggle options");
1914                        downloadButton.setAttribute("data", data[i].ObjectId);
1915                        downloadButton.setAttribute("href", "#");
1916                        downloadButton.setAttribute("title", res["ItemDetails"] + " '" + data[i].Name + "'");
1917
1918                        var bulletButton = document.createElement("div");
1919                        bulletButton.className = "displayTable";
1920                        var bulletSpan = document.createElement("div");
1921                        bulletSpan.className = "bulletButton";
1922                        bulletSpan.innerHTML = "<span>•••</span>";
1923                        bulletButton.appendChild(bulletSpan);
1924                        downloadButton.appendChild(bulletButton);
1925
1926                        dataRow.appendChild(downloadButton);
1927                    }
1928                }
1929
1930                $(dataRow).find("div.documentDetails").prepend(setDetailRow(data[i]));
1931                ctrl.append(dataRow);
1932            }
1933        }
1934        showPageStatus(iPage, data, pagesize);
1935
1936        //Show description div
1937        $(mainContainer + " a.dataRowItem, " + mainContainer + " a.content_extlink, " + mainContainer + " a.workspace_chat, " + mainContainer + " a.folderSettingsToggle").off();
1938        $(mainContainer + " a.folderSettingsToggle").on("click", function (event) {
1939            //$(mainContainer + " a.dataRowItem").off();
1940            //$(mainContainer + " a.dataRowItem").on("click", function (event) {
1941            event.preventDefault();
1942            var currentItem = $(this);
1943            var parentLi = currentItem.parent("li");
1944            _activeObject = currentItem;
1945            var id = currentItem.attr("data");
1946            _activeItem = id;
1947            hideOtherRows(id);
1948            if (parentLi.find(".documentDetails").first().is(":visible")) {
1949                parentLi.find(".documentDetails").hide();
1950                parentLi.find("a").first().focus();
1951                listSelector.find("li").removeClass("notCurrentDocument");
1952            }
1953            else {
1954                parentLi.addClass("focus");
1955                parentLi.removeClass("notCurrentDocument");
1956                parentLi.find(".documentDetails").show();
1957                parentLi.find("a").first().focus();
1958                parentLi.find("a.copyLink").focus();
1959            }
1960        });
1961
1962
1963        $(mainContainer + " a.dataRowItem").off();
1964        $(mainContainer + " a.dataRowItem").on("click", function (event) {
1965            event.preventDefault();
1966            var currentItem = $(this);
1967            _activeObject = currentItem;
1968            var id = currentItem.attr("data");
1969            _activeItem = id;
1970            if (!hideOtherRows(id)) {
1971                var type = currentItem.attr("data-type")
1972                switch (type) {
1973                    case "content_folder":
1974                        openFolder(currentItem, event);
1975                        break;
1976                    case "content_item":
1977                    case "content_extlink":
1978                        window.open(currentItem.attr("href"), '_blank');
1979                        break;
1980                }
1981            }
1982        });
1983
1984        $(mainContainer + " .CMS_input").off();
1985        $(mainContainer + " .CMS_input").on("change", function (event) {
1986            event.preventDefault();
1987            var currentItem = $(this);
1988            onItemChanged(currentItem);
1989        });
1990
1991        var onItemChanged = function (element) {
1992            var dataid = $(element).attr("data");
1993            if ($(element).attr("checked") === "checked") {
1994                // only add if it's not already in the list
1995                if (selectedItems.indexOf(dataid) === -1) {
1996                    selectedItems.push(dataid);
1997                }
1998            }
1999            else {
2000                var index = selectedItems.indexOf(dataid);
2001                selectedItems.splice(index, 1);
2002            }
2003
2004        };
2005
2006        function openFolder(element, event) {
2007            event.preventDefault();
2008            var objId = parseInt($(element).attr("data"));
2009            clearControls();
2010            _activeItem = objId;
2011            _activeObject = $(element);
2012            _back.push(_rootObject);
2013            _history.push(getCurrentObject());
2014            currentO.History = _history;
2015
2016            var childItemListUi = new ContentItemListUI(objId, currentO, null, _params, selectMultiSwitch, selectedItems);
2017            $.when(childItemListUi.initialise(null)).then(function () {
2018                showListfocus();
2019                showCurrentItem();
2020            });
2021            return false;
2022        }
2023
2024        //Activity modal
2025        $(mainContainer + " a.actitem").off();
2026        $(mainContainer + " a.actitem").on("click", function (e) {
2027            e.preventDefault();
2028            _activeObject = $(this);
2029            var type = $(this).attr("data-item");
2030            var name = $(this).attr("data-name");
2031            var id = $(this).attr("data-id");
2032            _activeItem = id;
2033            displayActivityModal(id, name);
2034            return false;
2035        });
2036
2037
2038        //Move Item
2039        $(mainContainer + " a.moveitem").off();
2040        $(mainContainer + " a.moveitem").on("click", function (e) {
2041            e.preventDefault();
2042            _activeObject = $(this);
2043            var type = $(this).attr("data-item");
2044            var name = $(this).attr("data-name");
2045            var id = $(this).attr("data-id");
2046            var locationFolderId = $(this).attr("locationFolderId");
2047            _activeItem = id;
2048            displayMoveModal(_contextId, { "Id": id, "Name": name, "parentId": _contextId, "locationFolderId": locationFolderId });
2049            return false;
2050        });
2051
2052        //Delete Item
2053        $(mainContainer + " a.deleteitem").off();
2054        $(mainContainer + " a.deleteitem").on("click", function (e) {
2055            e.preventDefault();
2056            var type = $(this).attr("data-item");
2057            var name = $(this).attr("data-name");
2058            var id = $(this).attr("data-id");
2059            _activeItem = id;
2060            _activeObject = $(this);
2061            switch (type) {
2062                case "content_folder":
2063                    var contentItemFolder = new ContentItemFolder(getCurrentObject(), _contextId, { "Id": id });
2064                    contentItemFolder.DeleteFolder(name);
2065
2066                    break;
2067                case "content_extlink":
2068                    var contentItemLink = new ContentItemLink(getCurrentObject(), _contextId, { "Id": id });
2069                    contentItemLink.DeleteLink(name);
2070                    break;
2071                case "content_item":
2072                case "workspace_chat":
2073                    var contentItemfile = new ContentItemFile(getCurrentObject(), _contextId, { "Id": id }, { "maxSize": _settings.Settings.MaximumSize, "allowedExts": _settings.Settings.AllowedExts });
2074                    contentItemfile.DeleteFile(name);
2075                    break;
2076            }
2077            return false;
2078        });
2079
2080        //EditIten
2081        $(mainContainer + " a.edititem").off();
2082        $(mainContainer + " a.edititem").on("click", function (e) {
2083            e.preventDefault();
2084            var type = $(this).attr("data-item");
2085            var name = $(this).attr("data-name");
2086            var id = $(this).attr("data-id");
2087            _activeItem = id;
2088            _activeObject = $(this);
2089            switch (type) {
2090                case "content_folder":
2091                    displayUpsertFolderModal(_contextId, { "Id": id });
2092                    break;
2093                case "content_item":
2094                    displayUpsertFileModal(_contextId, { "Id": id });
2095                    break;
2096                case "content_extlink":
2097                    displayUpsertLinkModal(_contextId, { "Id": id });
2098                    break;
2099            }
2100            return false;
2101        });
2102
2103        //File Props
2104        $(mainContainer + " a.propitem").off();
2105        $(mainContainer + " a.propitem").on("click", function (e) {
2106            e.preventDefault();
2107            _activeObject = $(this);
2108            var type = $(this).attr("data-item");
2109            var name = $(this).attr("data-name");
2110            var id = $(this).attr("data-id");
2111            var canC = $(this).attr("data-create");
2112            var canDel = $(this).attr("data-del");
2113            var canAdm = $(this).attr("data-adm");
2114            _activeItem = id;
2115            switch (type) {
2116                case "content_item":
2117                    displayFilePropModal(_contextId, { "Id": id, "canCreate": canC, "canDelete": canDel, "isAdmin": canAdm });
2118                    break;
2119            }
2120        });
2121        $(mainContainer + " a.copyLink").off();
2122        $(mainContainer + " a.copyLink").on("click", function (e) {
2123            e.preventDefault();
2124        });
2125        if (showSubscription) {
2126            $(mainContainer + " a.subscriptionitem").on("click", function (e) {
2127                //if (_permit.IsAdmin) {
2128                e.preventDefault();
2129                _activeObject = $(this);
2130                var type = $(this).attr("data-item");
2131                var name = $(this).attr("data-name");
2132                var id = $(this).attr("data-id");
2133                _activeItem = id;
2134                displaySubscriptionModal(_contextId, { "Id": id, "Name": name });
2135                //}
2136                //else {
2137                //    //Add redirect to alert window
2138                //}
2139            });
2140        }
2141        if (_permit.CanWrite) {
2142            var dragandrophandler = $(mainContainer + " .documentList li");
2143            dragandrophandler.off("dragstart");
2144            dragandrophandler.on("dragstart", function (e, ui) {
2145                _activeObject = $(e.currentTarget);
2146                _activeItem = _activeObject.attr("data");
2147                //e.stopPropagation();
2148                //e.preventDefault();
2149
2150            });
2151            dragandrophandler.off("dragenter");
2152            dragandrophandler.on('dragenter', function (e) {
2153                e.stopPropagation();
2154                e.preventDefault();
2155                $(e.currentTarget).find("a").first().focus();
2156                if (!$(e.currentTarget).hasClass("folder") && !$(e.currentTarget).hasClass("subfolder")) {
2157                    e.cancel = true;
2158                }
2159                //$(this).css('border', '2px solid #0B85A1');
2160            });
2161            dragandrophandler.off("dragover");
2162            dragandrophandler.on('dragover', function (e) {
2163                e.stopPropagation();
2164                e.preventDefault();
2165                if (!$(e.currentTarget).hasClass("folder") && !$(e.currentTarget).hasClass("subfolder")) {
2166                    e.cancel = true;
2167                }
2168                //e.cancel = !($(e.currentTarget).hasClass("folder") || $(e.currentTarget).hasClass("subfolder"));
2169            });
2170            dragandrophandler.off("dragleave");
2171            dragandrophandler.on('dragleave', function (e) {
2172                e.stopPropagation();
2173                e.preventDefault();
2174                if (!$(e.currentTarget).hasClass("folder") && !$(e.currentTarget).hasClass("subfolder")) {
2175                    e.cancel = true;
2176                }
2177                //$(this).css('border', '2px solid #0B85A1');
2178            });
2179            dragandrophandler.off("drop");
2180            dragandrophandler.on('drop', function (e) {
2181                e.preventDefault();
2182                $(e.currentTarget).removeAttr("style");
2183                if ($(e.currentTarget) && _activeObject &&
2184                    ($(e.currentTarget).hasClass("folder") || $(e.currentTarget).hasClass("subfolder"))) {
2185                    var dropIn = $(e.currentTarget).find("a").first();
2186                    var type = _activeObject.find("a").first().attr("data-type");
2187                    var canWrite = dropIn.attr("data-write");
2188                    var name = _activeObject.find("a").first().find("div.docTitle").text();
2189                    var id = _activeObject.find("a").first().attr("data");
2190                    if (dropIn && canWrite) {
2191                        if (canWrite === "true") {
2192                            var destId = dropIn.attr("data");
2193                            //_activeItem = id;                            
2194
2195                            //displayMoveModal(_contextId, { "Id": id, "Name": name, "parentId": _contextId });
2196                            var contentItemMove = new ContentItemMove(getCurrentObject(), id, { "Id": id, "Name": name, "parentId": _contextId }, null);
2197                            if ($(e.currentTarget).hasClass("subfolder")) {
2198                                destId = $(e.currentTarget).attr("parent-id");
2199                                if (destId !== id)
2200                                    contentItemMove.MoveObject($(e.currentTarget).attr("title").replace(res["ClickBack"], "").replace(/\'/g, ""), destId, id);
2201                            }
2202                            else {
2203                                if (destId !== id)
2204                                    contentItemMove.MoveObject(dropIn.find(".docT
2204itle").html(), destId, id);
2205                            }
2206                            _activeObject = $(e.currentTarget);
2207                            _activeItem = _activeObject.attr("data");
2208                            initialise(getCurrentObject());
2209                            contentItemMove = null;
2210                        }
2211                        else {
2212                            commons.ShowErrorMessage(res["WritePermissionError"]);
2213                        }
2214                    }
2215                }
2216            });
2217        }
2218
2219        ////Clipboard object
2220        var cb = new Clipboard(mainContainer + " a.copyLink");
2221        cb.off('success');
2222        // Modify the Clipboard.js success event to include a custom property for the link ID
2223        cb.on('success', function (e) {
2224            // Add a custom property to the event object
2225            e.linkId = $(e.trigger).attr('data-id'); // Assuming the link ID is stored in the 'data-id' attribute of the trigger element
2226            e.clearSelection();
2227            commons.ShowMsgConfigurable(res["copyMessage"], "", 20000000, $(e.trigger).attr("id"));
2228            setTimeout(function () { 
2229                console.log("Link ID:", e.linkId); // Log the custom property for debugging
2230                showCurrentItem(); 
2231            }, 1100);
2232        });
2233        cb.off('error');
2234        cb.on('error', function (e) {
2235            try {
2236                commons.ShowErrorMessage("Press Ctrl-C/Command+C to copy");
2237            }
2238            catch (e) {
2239                //commons.ShowErrorMessage(e);
2240            }
2241        });
2242
2243        showCurrentPage();
2244    }
2245
2246    var GetFavoriteLink = function (isFav) {
2247        var favIcon = "";
2248        if (isFav)
2249            favIcon = "<i class=\"fa fa-star\" ></i>";
2250        return favIcon;
2251    };
2252    //Append Paging and data row
2253    var appendPagerAndData = function (ctrl, data) {
2254        var pagerCtrl = $(pagerSelector);
2255        _lastPage = Math.ceil(data.length / _pagesize);
2256
2257        if (_currentPage >= _lastPage && _lastPage - 1 >= 0) {
2258            _currentPage = _lastPage - 1;
2259        }
2260
2261        if (data.length > 0)
2262            appendDataRow(listSelector, _currentPage, data, _pagesize);
2263        else
2264            showNoRecordsTemplate(listSelector);
2265
2266        removePager(pagerCtrl);
2267
2268
2269
2270        pagerCtrl.find("ul.PO-pageButton").append(addPageButton(_currentPage, _lastPage));
2271        updateButton((noofpagebuttons * Math.floor(_currentPage / noofpagebuttons)) + 1, _lastPage);
2272        showPageStatus(_currentPage, data, _pagesize);
2273        showCurrentPage();
2274
2275        $(mainContainer + " li a.pageButton").on("click", function (e) {
2276            e.preventDefault();
2277            var tag = $(this).attr("tag");
2278            if (tag === "-1") {
2279                _currentPage -= 1;
2280            }
2281            else if (tag === "+1") {
2282                if (_currentPage < _lastPage - 1)
2283                    _currentPage += 1;
2284            }
2285            else {
2286                _currentPage = parseInt($(this).attr("tag"));
2287                $(this).focus();
2288            }
2289            if (_currentPage < 0) _currentPage = 0;
2290
2291
2292            appendDataRow(listSelector, _currentPage, data, _pagesize);
2293            updateButton((noofpagebuttons * Math.floor(_currentPage / noofpagebuttons)) + 1, _lastPage);
2294            showCurrentPage();
2295
2296
2297        });
2298        $(mainContainer + " a.nextPrev").on("click", function (e) {
2299            e.preventDefault();
2300            var id = $(this).attr("id");
2301            //console.log("... clicked .. " + $(this).attr("tag"));
2302            var startPage = parseInt($(this).attr("tag"));
2303
2304            if (id === "next")
2305                startPage += (noofpagebuttons);
2306            else if (id === "prev")
2307                startPage -= (noofpagebuttons);
2308            if (startPage <= 0) startPage = 1;
2309            showCurrentPage();
2310            updateButton(startPage, _lastPage);
2311
2312        });
2313
2314    };
2315
2316    var hideOtherRows = function (currentRow) {
2317        var hasFocusItem = false;
2318        $(mainContainer + " a.documentDetailsToggle").each(function (index, value) {
2319            if ($(value).attr("data") !== currentRow) {
2320                var parentContainer = $(value).parent();
2321                if (parentContainer.hasClass("focus")) {
2322                    hasFocusItem = true;
2323                }
2324                parentContainer.find(".documentDetails").hide();
2325                parentContainer.removeClass("focus");
2326                parentContainer.addClass("notCurrentDocument");
2327            }
2328        });
2329        return hasFocusItem;
2330    };
2331
2332
2333    listSelector.off('focus');
2334    listSelector.on('focus', 'li', function () {
2335        $(this).closest(mainContainer + " .documentList").scrollTop($(this).index() * $(this).outerHeight());
2336    }).on('keydown', 'li', function (e) {
2337        if (e.keyCode === 40) {
2338            $(this).next("li").find("a").first().focus();
2339            return false;
2340        } else if (e.keyCode === 38) {
2341            $(this).prev("li").find("a").first().focus();
2342            return false;
2343        }
2344    }).find('li').first().focus();
2345
2346
2347    return {
2348        initialise: initialise,
2349        historyObject: _historyObject,
2350        contextId: _contextId,
2351        currentPage: _currentPage,
2352        pagesize: _pagesize,
2353        searchVal: _searchVal,
2354        Sortcriteria: _sortcriteria,
2355        Root: _root,
2356        RootObject: _rootObject,
2357        Back: _back,
2358        History: _history,
2359        Params: _params,
2360        ActiveItem: _activeItem,
2361        ActiveObject: _activeObject,
2362        Access: _permit,
2363        ShowListfocus: showListfocus,
2364        SetHidDescription: setHidDescription,
2365        SetDescription: setDescription
2366    }
2367};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.