PageSourceSearch

https://kamloopshotyoga.com/js/1.5.0/liveedit.aurorabrowser.js

js kamloopshotyoga.com collected 2026-10-07 19:25:37 UTC 69,130 bytes, 1,922 lines download raw bytes

1function AuroraBrowser(settings) {
2    if (settings == undefined) {
3        settings = {};
4    }
5
6    this.defaultSettings = {
7        dialog: '#auroraFileBrowseDialog',
8        dialogHash: '#auroraFileBrowseDialogHash',
9//        dialogTitle : '#auroraFileBrowseTitle',
10//        dialogClose : '#auroraFileClose',
11        dialogAccept: '.aurora-file-browse-accept',
12        selectedFileContainer: '#auroraFileBrowseSelected',
13        selectedFilePreview: '#auroraFileBrowseSelectedImage',
14        selectedFileName: '#auroraFileBrowseSelectedName',
15        selectedFileDescription: '#auroraFileBrowseSelectedDescription',
16        selectedFileSize: '#auroraFileBrowseSelectedSize',
17        selectedFileSizeContainer: '#auroraFileBrowseSelectedSizeContainer',
18        chooseSizePopover: '#auroraFileBrowsePopoverSize',
19        fileInfoPopover: '#auroraFileBrowsePopoverInfo',
20        searchBarForm: '#auroraFileBrowseSearchBarForm',
21        searchContentType: '#auroraFileBrowseFileTypeFilter',
22        searchTags: '#auroraFileBrowseFileTagsFilter',
23        searchTagsOpOr: '#auroraFileBrowseFileTagsOpOrFilter',
24        searchTagsOpAnd: '#auroraFileBrowseFileTagsOpAndFilter',
25        searchPagination: '#auroraFileBrowseFilePaginationFilter',
26        fileManagerBadge: '#auroraFileBrowseFileBadge',
27//        fileManagerPanel : '#auroraFileBrowseFilePanel',
28        fileManagerPanelBody: '#auroraFileBrowseFilePanelBody',
29        fileManagerPanelFooter: '#auroraFileBrowseFilePanelFooter',
30        fileManagerFolderPanel: '#auroraFileBrowseFileFolderPanel',
31        fileManagerFolderCrumbs: "#auroraFileBrowseFileFolderBreadcrumb",
32        contentManagerBadge: '#auroraFileBrowseContentBadge',
33//        contentManagerPanel : '#auroraFileBrowseContentPanel',
34        contentManagerPanelBody: '#auroraFileBrowseContentPanelBody',
35        contentManagerPanelFooter: '#auroraFileBrowseContentPanelFooter',
36//        uploadPanel : '#auroraFileBrowseUploadPanel',
37//        uploadPanelBody : '#auroraFileBrowseUploadPanelBody',
38        uploadFolderPanel: '#auroraFileBrowseUploadFolderPanel',
39        uploadFolderCrumbs: "#auroraFileBrowseUploadFolderBreadcrumb",
40        defaultPagination: 10,
41        defaultTagOp: 'or',
42        paramType: 'object',        // string|object
43        callbackField: null,
44        callbackFunction: null,
45        initialFile: null
46    };
47
48    this.settings = $.extend(this.defaultSettings, settings);
49
50    this.dialog = $(this.settings.dialog);
51    this.dialogHash = $(this.settings.dialogHash).val();
52    this.dialogAccept = $(this.settings.dialogAccept);
53    this.chooseSizePopover = $(this.settings.chooseSizePopover);
54    this.fileInfoPopover = $(this.settings.fileInfoPopover);
55    this.selectedFileContainer = $(this.settings.selectedFileContainer);
56    this.selectedFilePreview = $(this.settings.selectedFilePreview);
57    this.selectedFileName = $(this.settings.selectedFileName);
58    this.selectedFileDescription = $(this.settings.selectedFileDescription);
59    this.selectedFileSize = $(this.settings.selectedFileSize);
60    this.selectedFileSizeContainer = $(this.settings.selectedFileSizeContainer);
61
62    this.searchBarForm = $(this.settings.searchBarForm);
63    this.searchTags = $(this.settings.searchTags);
64    this.searchTagsOpOr = $(this.settings.searchTagsOpOr);
65    this.searchTagsOpAnd = $(this.settings.searchTagsOpAnd);
66    if (this.settings.defaultTagOp.toLowerCase() == 'and') {
67        this.searchTagsOpOr.prop('checked', false);
68        this.searchTagsOpAnd.prop('checked', true);
69    } else {
70        this.searchTagsOpAnd.prop('checked', false);
71        this.searchTagsOpOr.prop('checked', true);
72    }
73    this.searchContentType = $(this.settings.searchContentType);
74    this.searchPagination = $(this.settings.searchPagination);
75    this.searchPagination.val(this.settings.defaultPagination);
76
77    this.fileManagerBadge = $(this.settings.fileManagerBadge);
78    this.fileManagerPanelBody = $(this.settings.fileManagerPanelBody);
79    this.fileManagerPanelFooter = $(this.settings.fileManagerPanelFooter);
80    this.fileManagerFolderPanel = $(this.settings.fileManagerFolderPanel);
81    this.fileManagerFolderCrumbs = $(this.settings.fileManagerFolderCrumbs);
82
83    this.contentManagerBadge = $(this.settings.contentManagerBadge);
84    this.contentManagerPanelBody = $(this.settings.contentManagerPanelBody);
85    this.contentManagerPanelFooter = $(this.settings.contentManagerPanelFooter);
86
87    this.uploadFolderPanel = $(this.settings.uploadFolderPanel);
88    this.uploadFolderCrumbs = $(this.settings.uploadFolderCrumbs);
89
90    // filter variables
91    this.tags = [];
92    this.contentType = '';
93    this.pagination = this.settings.defaultPagination;
94    this.tagOp = this.settings.defaultTagOp.toLowerCase();
95
96    // selected file variables
97    this.file = null;
98    this.selectedSize = null;
99
100    // file manager tab variables
101    this.filePage = 1;
102    this.fileFolder = null;
103    this.fileCount = 0;
104
105    // content manager tab variables
106    this.contentPage = 1;
107    this.contentCount = 0;
108
109    this.clearFolderOptionRegistered = false;
110
111    this.fileUpload = null;
112    this.uploadedFiles = {};
113    this.busy = false;
114
115    this.initialize();
116}
117
118AuroraBrowser.prototype.loadResources = function () {
119    var browser = this;
120    var head = document.getElementsByTagName('head')[0];
121
122    // check and load tagsInput
123    if (typeof $.fn.tagsInput == 'undefined') {
124        // add the tagsInput javascript file
125        var script = document.createElement('script');
126        script.type = 'text/javascript';
127        script.src = '/js/tagsinput/1.3.3/jquery.tagsinput.min.js';
128        script.onload = function() {
129            browser.initializeTags(browser);
130        }
131        head.appendChild(script);
132
133        // add the tagsInput CSS file
134        var css = document.createElement('link');
135        css.rel = 'stylesheet';
136        css.type = 'text/css';
137        css.href = '/js/tagsinput/1.3.3/jquery.tagsinput.min.css';
138        head.appendChild(css);
139    } else {
140        // create tags input area
141        this.initializeTags(this);
142    }
143
144    // check and load the ZeroClipboard
145    if (typeof ZeroClipboard == 'undefined') {
146        // load the javascript file
147
148        var script = document.createElement('script');
149        script.type = 'text/javascript';
150        script.src = '/js/ZeroClipboard/2.1.6/ZeroClipboard.min.js';
151        head.appendChild(script);
152    }
153
154    // load the jquery-fileupload resources
155    if (typeof $.fn.fileupload == 'undefined') {
156        var script = document.createElement('script');
157        script.type = 'text/javascript';
158        script.src = '/js/jquery-file-upload/tmpl.min.js';
159        head.appendChild(script);
160
161        script = document.createElement('script');
162        script.type = 'text/javascript';
163        script.src = '/js/jquery-file-upload/load-image.min.js';
164        head.appendChild(script);
165
166        script = document.createElement('script');
167        script.type = 'text/javascript';
168        script.src = '/js/jquery-file-upload/canvas-to-blob.min.js';
169        head.appendChild(script);
170
171        script = document.createElement('script');
172        script.type = 'text/javascript';
173        script.src = '/js/jquery-file-upload/9.5.7/jquery.iframe-transport.min.js';
174        head.appendChild(script);
175
176        script = document.createElement('script');
177        script.type = 'text/javascript';
178        script.src = '/js/jquery-file-upload/9.5.7/jquery.fileupload.min.js';
179        script.onload = function() {
180            var script = document.createElement('script');
181            script.type = 'text/javascript';
182            script.src = '/js/jquery-file-upload/9.5.7/jquery.fileupload-process.min.js';
183            script.onload = function() {
184                var script = document.createElement('script');
185                script.type = 'text/javascript';
186                script.src = '/js/jquery-file-upload/9.5.7/jquery.fileupload-image.min.js';
187                head.appendChild(script);
188
189                script = document.createElement('script');
190                script.type = 'text/javascript';
191                script.src = '/js/jquery-file-upload/9.5.7/jquery.fileupload-audio.min.js';
192                head.appendChild(script);
193
194                script = document.createElement('script');
195                script.type = 'text/javascript';
196                script.src = '/js/jquery-file-upload/9.5.7/jquery.fileupload-video.min.js';
197                head.appendChild(script);
198
199                script = document.createElement('script');
200                script.type = 'text/javascript';
201                script.src = '/js/jquery-file-upload/9.5.7/jquery.fileupload-validate.min.js';
202                script.onload = function() {
203                    var script = document.createElement('script');
204                    script.type = 'text/javascript';
205                    script.src = '/js/jquery-file-upload/9.5.7/jquery.fileupload-ui.min.js';
206                    script.onload = function() {
207                        browser.initializeUpload(browser);
208                    }
209                    head.appendChild(script);
210                }
211                head.appendChild(script);
212            };
213            head.appendChild(script);
214        };
215        head.appendChild(script);
216
217        var css = document.createElement('link');
218        css.rel = 'stylesheet';
219        css.type = 'text/css';
220        css.href = '/css/jquery-file-upload/9.5.7/jquery.fileupload.min.css';
221        head.appendChild(css);
222
223        css = document.createElement('link');
224        css.rel = 'stylesheet';
225        css.type = 'text/css';
226        css.href = '/css/jquery-file-upload/9.5.7/jquery.fileupload-ui.min.css';
227        head.appendChild(css);
228    } else {
229        browser.initializeUpload(browser);
230    }
231};
232
233AuroraBrowser.prototype.destroy = function() {
234    this.unregisterFolderOptionClick();
235
236    if (this.fileUpload != null) {
237        this.fileUpload.fileupload('destroy');
238        this.fileUpload = null;
239    }
240
241    this.hideWait();
242};
243
244AuroraBrowser.prototype.isBusy = function() {
245    return this.busy;
246};
247
248AuroraBrowser.prototype.initialize = function () {
249    var browser = this;
250
251    // initialize bootstrap dialog
252    this.dialog.on('hidden.bs.modal', function () {
253        browser.destroy();
254        browser.dialog.remove();
255        if ($('.modal-backdrop').length > 0) {
256            $('body').addClass('modal-open');
257        }
258        browser = null;
259    }).on('show.bs.modal', function () {
260        browser.dialog.css('zIndex', 65536);
261    }).modal('show');
262
263    this.loadResources();
264
265    // setup the accept button click
266    this.dialogAccept.click(function (event) {
267        event.preventDefault();
268        event.stopPropagation();
269
270        if(browser.isBusy()) {
271            browser.showMessage('Please wait, still processing your last request');
272        } else {
273            browser.dialogAccept.prop('disabled', true);
274            browser.showWait();
275
276            setTimeout(function () {
277                browser.acceptFile();
278
279                browser.hideWait();
280                //browser.dialogAccept.prop('disabled', false);
281                browser.dialog.modal('hide');
282            }, 10);
283        }
284    });
285
286    // setup choose file size popover
287    this.chooseSizePopover.data('browser', this);
288    this.chooseSizePopover.popover({
289        container: browser.settings.selectedFileContainer,
290        content: browser.getAvailableFileSize,
291        html: true,
292        placement: 'auto right',
293        title: 'Choose A Size',
294        viewport: {
295            "selector": browser.settings.selectedFileContainer + ' .media',
296            "padding": 0
297        }
298    }).on('shown.bs.popover', function () {
299        $('body').on('click', {browser: browser}, browser.hideChooseSizePopover);
300    }).on('hidden.bs.popover', function () {
301        $('body').off('click', browser.hideChooseSizePopover);
302    });
303
304    // setup click event handler to change selected file size
305    this.selectedFileContainer.on('click', '.aurora-file-browse-size-option', function (event) {
306        event.preventDefault();
307        var fileId = $(this).data('id');
308        if (fileId == browser.file.id) {
309            browser.setSelectedSize(browser.file);
310        } else {
311            for (var i in browser.file.children) {
312                if (fileId == browser.file.children[i].id) {
313                    browser.setSelectedSize(browser.file.children[i]);
314                    break;
315                }
316            }
317        }
318
319        browser.chooseSizePopover.popover('hide');
320    });
321
322    // setup click event handler to create new custom size image
323    this.selectedFileContainer.on('click', '#auroraFileBrowseSizeCreateSize', function (event) {
324        event.preventDefault();
325        var newWidth = parseInt($('#auroraFileBrowseSizeNewWidth').val());
326        if (isNaN(newWidth) || newWidth == 0) {
327            browser.showError('Valid Width Is Required');
328            $('#auroraFileBrowseSizeNewWidth').focus();
329        } else {
330            var newFile = new AuroraFile({}, browser.file.sourceType);
331            newFile.id = (new Date()).getTime();
332            newFile.parentId = browser.file.id;
333            newFile.type = 'new';
334            newFile.caption = browser.file.caption;
335            newFile.filename = browser.file.filename;
336            newFile.contentType = browser.file.content_type;
337            newFile.width = newWidth;
338            newFile.height = parseInt(( browser.file.height * newWidth ) / browser.file.width);
339
340            browser.file.addChild(newFile);
341            browser.setSelectedSize(newFile);
342
343            browser.chooseSizePopover.popover('hide')
344        }
345    });
346
347    // setup full file detail popover
348    this.fileInfoPopover.data('browser', this);
349    this.fileInfoPopover.popover({
350        container: browser.settings.selectedFileContainer,
351        content: browser.generateFileInfoDisplay,
352        html: true,
353        placement: 'auto left',
354        title: 'File Information',
355        viewport: {
356            "selector": browser.settings.selectedFileContainer + ' .media',
357            "padding": 0
358        }
359    }).on('shown.bs.popover', function () {
360        $('body').on('click', {browser: browser}, browser.hideFileInfoPopover);
361    }).on('hidden.bs.popover', function () {
362        $('body').off('click', browser.hideFileInfoPopover);
363    });
364
365    // override the form submit
366    this.searchBarForm.submit(function (event) {
367        event.preventDefault();
368        browser.loadTabs();
369    });
370
371    // reload tab content when the pagination or file content is changed]
372    this.searchContentType.change(function () {
373        browser.setContentType(this.value);
374    });
375    this.contentType = this.searchContentType.val();
376
377    this.searchPagination.change(function () {
378        browser.setPagination(this.value);
379    });
380
381    // reload the tab content when the tag operation is changed
382    this.searchTagsOpAnd.change(function () {
383        var val = $(this).val();
384        browser.setTagOp(val);
385    });
386
387    this.searchTagsOpOr.change(function () {
388        var val = $(this).val();
389        browser.setTagOp(val);
390    });
391
392    // set click handlers to select the uploaded file
393    $('#auroraFileBrowseUploadedFiles').on('click', '.aurora-file-browse-uploaded-file', function(event) {
394        event.preventDefault();
395        var fileId = $(this).data('id');
396        if(browser.uploadedFiles[fileId]) {
397            browser.setSelectedFile(browser.uploadedFiles[fileId]);
398        }
399    });
400
401    this.loadInitialFile();
402
403    // initial load of tab content
404//    this.loadTabs();
405    this.loadFolders(true);
406    this.loadContentManager();
407};
408
409AuroraBrowser.prototype.loadInitialFile = function() {
410    var browser = this;
411
412    if(this.settings.initialFile != null) {
413        // load the initial file
414        var dataObject = {};
415        var type = 'id';
416        if(isNaN(parseInt(this.settings.initialFile))) {
417            dataObject['file_url'] = this.settings.initialFile;
418            type = 'url';
419        } else {
420            dataObject['file_id'] = this.settings.initialFile;
421        }
422
423        $.ajax({
424            url: '/service/file/manage/getFileDetails',
425            dataType: 'json',
426            data: dataObject,
427            success: function(data) {
428                if(data.success) {
429                    data.data.file.Children = data.data.file.children;
430                    var file = new AuroraFile(data.data.file, 'file');
431                    browser.setSelectedFile(file);
432
433                    for(var i in file.children) {
434                        if(type == 'url') {
435                            if(file.children[i].url == browser.settings.initialFile) {
436                                browser.setSelectedSize(file.children[i]);
437                                break;
438                            }
439                        } else {
440                            if(file.children[i].id == browser.settings.initialFile) {
441                                browser.setSelectedSize(file.children[i]);
442                                break;
443                            }
444                        }
445                    }
446                }
447            },
448        });
449    }
450};
451
452AuroraBrowser.prototype.acceptFile = function() {
453    if (this.selectedSize != null) {
454        var browser = this;
455        if (this.selectedSize.sourceType == 'content') {
456            var dataObject = {
457                url: this.file.url,
458                filename: this.file.getName()
459            }
460            if (this.selectedSize.type == 'new') {
461                dataObject['width'] = this.selectedSize.width;
462            }
463            $.ajax({
464                url: '/service/file/manage/importFile',
465                async: false,
466                data: dataObject,
467                dataType: 'json',
468                success: function (data) {
469                    if (data.success) {
470                        // file successfully imported into file manager
471                        browser.setSelectedSize(new AuroraFile(data.data[data.data.selected_index], 'file'));
472                    } else {
473                        browser.showError(data.message);
474                    }
475                },
476                error: function () {
477                    browser.showError('Unable to import Content Manager File');
478                }
479            });
480        } else if (this.selectedSize.type == 'new') {
481            var dataObject = {
482                image_id: this.selectedSize.parentId,
483                width: this.selectedSize.width
484            }
485            $.ajax({
486                url: '/service/file/manage/resizeImage',
487                async: false,
488                data: dataObject,
489                dataType: 'json',
490                success: function (data) {
491                    if (data.success) {
492                        // new image size successfully created
493                        browser.setSelectedSize(new AuroraFile(data.data, 'file'));
494                    } else {
495                        browser.showError(data.message);
496                    }
497                },
498                error: function () {
499                    browser.showError('Unable to create new image size');
500                }
501            });
502        }
503    }
504
505    if (this.settings.callbackField != null) {
506        $(this.settings.callbackField).val(this.selectedSize.url);
507    }
508
509    if (typeof this.settings.callbackFunction == 'function') {
510        if(this.settings.paramType == 'string') {
511            this.settings.callbackFunction(this.selectedSize.url);
512        } else {
513            this.settings.callbackFunction(this.selectedSize);
514        }
515    }
516};
517
518AuroraBrowser.prototype.hideFileInfoPopover = function (event) {
519    event.preventDefault();
520    var target = event.target;
521    var parent = $(target).parents('.popover');
522    if (parent.length == 0) {
523        event.data.browser.fileInfoPopover.popover('hide');
524    }
525};
526
527AuroraBrowser.prototype.hideChooseSizePopover = function (event) {
528    event.preventDefault();
529    var target = event.target;
530    var parent = $(target).parents('.popover');
531    if (parent.length == 0) {
532        event.data.browser.chooseSizePopover.popover('hide');
533    }
534};
535
536AuroraBrowser.prototype.initializeTags = function (browser, attempt) {
537    if (attempt == undefined) {
538        attempt = 1;
539    }
540    if (typeof $.fn.tagsInput == "undefined") {
541        // defer initialization for 50 ms with a max of 1 second
542        if (attempt < 20) {
543            attempt++;
544            setTimeout(function () {
545                browser.initializeTags(browser, attempt)
546            }, 50);
547        }
548    } else {
549        browser.searchTags.tagsInput({
550            defaultText: 'Search Tags'
551        });
552    }
553};
554
555AuroraBrowser.prototype.initializeUpload = function (browser, attempt) {
556    if (attempt == undefined) {
557        attempt = 1;
558    }
559    if (typeof $.fn.fileupload == "undefined" || typeof $.blueimp == 'undefined') {
560        // defer initialization for 50 ms with a max of 1 second
561        if (attempt < 20) {
562            attempt++;
563            setTimeout(function () {
564                browser.initializeUpload(browser, attempt)
565            }, 50);
566        }
567    } else {
568        var folderId = browser.getFileFolderId();
569        if(folderId == null) {
570            folderId = '';
571        }
572        browser.fileUpload = $('#auroraFileBrowseFileupload').fileupload({
573            url: '/service/file/manage/uploadfile',
574            autoUpload: true,
575            dataType: 'json',
576            disableImageResize: true,
577            dropZone: $('#auroraFileBrowseDropzone'),
578            fileInput: $('#auroraFileBrowseUploadInput'),
579            formData: {
580                folder_id: folderId
581            },
582            // override getFilesFromResponse so that the
583            // javascript templates will work for
584            // processing the response
585            getFilesFromResponse: function (data) {
586                var files = [];
587
588                if (data.result && data.result.data) {
589                    files = [data.result.data];
590                }
591
592                return files;
593            }
594        }).bind('fileuploaddone', function (e, data) {
595            browser.loadFileManager();
596            if (data['result']['success'] === false) {
597                if (data["result"]["message"].includes('file size')) {
598                    browser.showWarning(data["result"]["message"]);
599                } else {
600                    browser.showError(data["result"]["message"]);
601                }
602
603                return;
604            }
605
606            if(data.result.data) {
607                var file = data.result.data.original;
608                if(data.result.data.squarethumb) {
609                    file.thumb = data.result.data.squarethumb.url;
610                } else if (data.result.data.thumb) {
611                    file.thumb = data.result.data.thumb.url;
612                } else {
613                    file.thumb = data.result.data.original.url;
614                }
615                file.Children = {};
616
617                for(var i in data.result.data) {
618                    if(i != 'original') {
619                        file.Children[i] = data.result.data[i];
620                    }
621                }
622
623                file = new AuroraFile(file);
624                browser.uploadedFiles[file.id] = file;
625                browser.setSelectedFile(file);
626            }
627        });
628    }
629};
630
631AuroraBrowser.prototype.getAvailableFileSize = function () {
632    var browser = $(this).data('browser');
633
634    var html = '<ul id="auroraFileBrowseSizeOptions" class="aurora-file-browse-size-options">';
635    var selectedId = browser.selectedSize == null ? null : browser.selectedSize.id;
636
637    var selectedClass = '';
638
639    if (browser.file.children.length > 0) {
640
641        for (var i in browser.file.children) {
642            selectedClass = '';
643            if (selectedId == browser.file.children[i].id) {
644                selectedClass = ' selected';
645            }
646            html += '<li class="aurora-file-browse-size-option' + selectedClass + '" data-id="' + browser.file.children[i].id + '">' +
647            '<i class="fa fa-check-square-o"></i>' +
648            browser.file.children[i].getImageSize(true) +
649            '</li>';
650        }
651    }
652
653    selectedClass = '';
654    if (selectedId == browser.file.id) {
655        selectedClass = ' selected';
656    }
657    html += '<li class="aurora-file-browse-size-option' + selectedClass + '" data-id="' + browser.file.id + '">' +
658    '<i class="fa fa-check-square-o"></i>' +
659    browser.file.getImageSize(true) +
660    '</li>';
661
662    html += '</ul>';
663
664    html += '<hr>';
665
666    html += '<div>' +
667    '<div class="form-group col-xs-10" style="padding: 0;">' +
668    '<label>Create Width</label>' +
669    '<div class="input-group">' +
670    '<input id="auroraFileBrowseSizeNewWidth" type="number" class="form-control" placeholder="Enter New Width" min="1" max="' + browser.file.width + '">' +
671    '<span class="input-group-addon">px</span>' +
672    '</div>' +
673    '</div>' +
674    '<div class="form-group col-xs-1">' +
675    '<label>&nbsp;</label>' +
676    '<i id="auroraFileBrowseSizeCreateSize" class="fa fa-arrow-circle-up"></i>' +
677    '</div>' +
678    '</div>';
679
680    return html;
681};
682
683AuroraBrowser.prototype.generateFileInfoDisplay = function () {
684    var browser = $(this).data('browser');
685
686    var html = '';
687    if (browser.file == null) {
688        html = '';
689    } else {
690        html = '<ul id="auroraFileBrowseInfoPopover" class="aurora-file-browse-info-popover">' +
691        '<li><label>Name</label>' + browser.file.getName() + '</li>' +
692        '<li><label>Description</label>' + browser.file.getDescription() + '</li>' +
693        '<li><label>Caption</label>' + browser.file.caption + '</li>' +
694        '<li><label>Dimensions</label>' + browser.file.getImageSize(true) + '</li>' +
695        '<li><label>Size</label>' + browser.file.size + '</li>' +
696        '<li><label>Content Type</label>' + browser.file.contentType + '</li>' +
697        '<li><label>URL</label>' +
698        '<a id="auroraFileBrowseInfoUrlLink" class="zclip" href="' + browser.file.url + '" target="_blank" data-clipboard-text="' + browser.file.url + '" >' +
699        '<i class="fa fa-link"></i>' +
700        '</a></li>' +
701        '<li><label>Upload Time</label>' + browser.file.createdDate + '</li>';
702
703        if (typeof ZeroClipboard != undefined) {
704            html += '<script>' +
705            'var client = new ZeroClipboard( document.getElementById("auroraFileBrowseInfoUrlLink") );' +
706            'client.on( "ready", function( readyEvent ) { ' +
707            '    client.on( "aftercopy", function( event ) { ' +
708            '        le_show_message("Copied To Clipboard", "File URL" );' +
709            '    });' +
710            '});' +
711            '$("#auroraFileBrowseInfoUrlLink").click(function(event) { event.preventDefault(); });' +
712            '</scr' + 'ipt>';
713        }
714    }
715
716    return html;
717};
718
719AuroraBrowser.prototype.unregisterFolderOptionClick = function () {
720    // stop hide folder popup options on any other click
721    if (this.clearFolderOptionRegistered) {
722        $('body').off('click', this.clearFolderOption);
723        this.clearFolderOptionRegistered = false;
724    }
725};
726
727AuroraBrowser.prototype.registerFolderOptionClick = function () {
728    // hide folder popup options on any other click
729    if (!this.clearFolderOptionRegistered) {
730        var eventData = {
731            broswer: this
732        };
733        $('body').click(eventData, this.clearFolderOption);
734        this.clearFolderOptionRegistered = true;
735    }
736};
737
738AuroraBrowser.prototype.clearFolderOption = function (event) {
739    if (event.data != undefined && event.data.broswer != undefined) {
740        event.data.broswer.fileManagerFolderPanel.find('.abn-tree-row.visible .dropdown-menu').hide();
741        event.data.broswer.fileManagerFolderPanel.find('.abn-tree-row.visible').removeClass('visible');
742        event.data.broswer.uploadFolderPanel.find('.abn-tree-row.visible .dropdown-menu').hide();
743        event.data.broswer.uploadFolderPanel.find('.abn-tree-row.visible').removeClass('visible');
744        event.data.broswer.unregisterFolderOptionClick();
745    }
746};
747
748AuroraBrowser.prototype.loadFolders = function (setFolder) {
749    if (setFolder == undefined) {
750        setFolder = false;
751    }
752    var browser = this;
753    $.ajax({
754        url: '/service/file/manage/getFolders',
755        dataType: 'json',
756        beforeSend: function () {
757            browser.showWait();
758        },
759        success: function (data) {
760            if (data.success) {
761                browser.populateFolders(data.data);
762                if (setFolder) {
763                    var folder = browser.fileManagerFolderPanel.find('.abn-tree-row:first').data('folder');
764                    browser.setFileFolder(folder);
765                }
766            } else {
767                browser.showError(data.message);
768            }
769            browser.hideWait();
770        },
771        error: function () {
772            browser.showError('Unable to load folders!');
773            browser.hideWait();
774        }
775    });
776};
777
778AuroraBrowser.prototype.populateFolders = function (folders) {
779    // remove all existing folders
780    this.fileManagerFolderPanel.empty();
781    this.uploadFolderPanel.empty();
782
783    var fileManagerFolderList = document.createElement('ul');
784    fileManagerFolderList.className = "nav nav-list nav-pills nav-stacked abn-tree";
785
786    var uploadFolderList = document.createElement('ul');
787    uploadFolderList.className = "nav nav-list nav-pills nav-stacked abn-tree";
788
789    for (var i in folders) {
790        var folder = new AuroraFolder(folders[i]);
791
792        this.addFolderItem(folder, fileManagerFolderList, 1);
793        this.addFolderItem(folder, uploadFolderList, 1);
794    }
795
796    this.fileManagerFolderPanel.append(fileManagerFolderList);
797    this.uploadFolderPanel.append(uploadFolderList);
798};
799
800AuroraBrowser.prototype.addFolderItem = function (folder, folderContainer, level) {
801    // create the folder DOM element
802    var folderItem = this.generateFolderDisplayElement(folder, level);
803
804    folderContainer.appendChild(folderItem);
805
806    for (var i in folder.children) {
807        this.addFolderItem(folder.children[i], folderContainer, level + 1);
808    }
809};
810
811AuroraBrowser.prototype.getFileManagerCount = function () {
812    return this.fileCount;
813};
814
815AuroraBrowser.prototype.setFileManagerCount = function (count) {
816    this.fileCount = parseInt(count);
817    if (this.fileCount == undefined || isNaN(this.fileCount)) {
818        this.fileCount = 0;
819    }
820    this.fileManagerBadge.text(this.fileCount);
821};
822
823AuroraBrowser.prototype.getContentManagerCount = function () {
824    return this.contentCount;
825};
826
827AuroraBrowser.prototype.setContentManagerCount = function (count) {
828    this.contentCount = parseInt(count);
829    if (this.contentCount == undefined || isNaN(this.contentCount)) {
830        this.contentCount = 0;
831    }
832    this.contentManagerBadge.text(this.contentCount);
833};
834
835AuroraBrowser.prototype.getContentType = function () {
836    return this.contentType;
837};
838
839AuroraBrowser.prototype.setContentType = function (contentType) {
840    this.contentType = contentType;
841    this.loadTabs();
842};
843
844AuroraBrowser.prototype.getTagOp = function () {
845    return this.tagOp;
846};
847
848AuroraBrowser.prototype.setTagOp = function (tagOp) {
849    if (tagOp != undefined && tagOp.toLowerCase() == 'and') {
850        this.tagOp = 'and'
851        this.searchTagsOpOr.prop('checked', false);
852        this.searchTagsOpAnd.prop('checked', true);
853    } else {
854        this.tagOp = 'or';
855        this.searchTagsOpAnd.prop('checked', false);
856        this.searchTagsOpOr.prop('checked', true);
857    }
858    this.loadTabs();
859};
860
861AuroraBrowser.prototype.getPagination = function () {
862    return this.pagination;
863};
864
865AuroraBrowser.prototype.setPagination = function (pagination) {
866    this.pagination = parseInt(pagination);
867    if (this.pagination == undefined || isNaN(this.pagination)) {
868        this.pagination = this.settings.defaultPagination;
869        this.searchPagination.val(this.pagination);
870    }
871    this.loadTabs();
872};
873
874AuroraBrowser.prototype.getFilePage = function () {
875    return this.filePage;
876};
877
878AuroraBrowser.prototype.setFilePage = function (page, reload) {
879    if (reload == undefined) {
880        reload = true;
881    }
882    this.filePage = parseInt(page);
883    if (this.filePage == undefined || isNaN(this.filePage)) {
884        this.filePage = 1;
885    }
886
887    if (reload) {
888        this.loadFileManager();
889    }
890};
891
892AuroraBrowser.prototype.getContentPage = function () {
893    return this.contentPage;
894};
895
896AuroraBrowser.prototype.setContentPage = function (page, reload) {
897    if (reload == undefined) {
898        reload = true;
899    }
900    this.contentPage = parseInt(page);
901    if (this.contentPage == undefined || isNaN(this.contentPage)) {
902        this.contentPage = 1;
903    }
904
905    if (reload) {
906        this.loadContentManager();
907    }
908};
909
910AuroraBrowser.prototype.getFileFolder = function () {
911    return this.fileFolder;
912};
913
914AuroraBrowser.prototype.getFileFolderId = function () {
915    if (this.fileFolder instanceof AuroraFolder) {
916        return this.fileFolder.id;
917    }
918    return null;
919};
920
921AuroraBrowser.prototype.setFileFolder = function (folder) {
922    this.fileFolder = folder;
923    if (this.fileFolder == undefined || typeof folder !== 'object') {
924        this.fileFolder = null;
925    }
926    var id = this.getFileFolderId();
927
928    // set the folder element as active in the folder trees
929    this.fileManagerFolderPanel.find('.abn-tree-row.active').removeClass('active');
930    this.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + id + ']').addClass('active');
931    this.uploadFolderPanel.find('.abn-tree-row.active').removeClass('active');
932    this.uploadFolderPanel.find('.abn-tree-row[data-folder_id=' + id + ']').addClass('active');
933
934    // make sure the folder is showing
935    this.expandParentFolders(folder);
936
937    this.generateFolderCrumbs(folder);
938
939    this.setFilePage(1);
940
941    // set the folder id of the fileUpload object
942    if(this.fileUpload != null) {
943        if(id == null) {
944            id = '';
945        }
946        this.fileUpload.fileupload('option', 'formData', {folder_id: id});
947    }
948};
949
950AuroraBrowser.prototype.setFileFolderId = function (folderId) {
951    var folderElement = this.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folderId + ']');
952    if (folderElement.length > 0) {
953        var folder = folderElement.data('folder');
954        this.setFileFolder(folder);
955    }
956};
957
958AuroraBrowser.prototype.getSearchTags = function () {
959    var searchString = this.searchTags.val().trim();
960    var searchArray = null;
961    if (searchString.length > 0) {
962        searchArray = searchString.split(",");
963        if (searchArray.length > 0) {
964            for (var i in searchArray) {
965                searchArray[i] = searchArray[i].trim();
966            }
967        }
968    } else {
969        searchArray = [];
970    }
971
972    return searchArray;
973};
974
975AuroraBrowser.prototype.generateFolderCrumbs = function (folder) {
976    this.fileManagerFolderCrumbs.empty();
977    this.uploadFolderCrumbs.empty();
978    this.generateParentFolderCrumb(folder, folder.id);
979};
980
981AuroraBrowser.prototype.generateParentFolderCrumb = function (folder, activeFolderId) {
982    var parentElement = this.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.parentId + ']');
983    if (parentElement.length > 0) {
984        var parentFolder = parentElement.data('folder');
985        this.generateParentFolderCrumb(parentFolder, activeFolderId);
986    }
987
988    var fileManagerCrumb = this.generateFolderCrumb(folder, activeFolderId);
989    this.fileManagerFolderCrumbs.append(fileManagerCrumb);
990
991    var uploadCrumb = this.generateFolderCrumb(folder, activeFolderId);
992    this.uploadFolderCrumbs.append(uploadCrumb);
993};
994
995AuroraBrowser.prototype.generateFolderCrumb = function (folder, activeFolderId) {
996    var browser = this;
997    var crumb = document.createElement('li');
998
999    if (folder.id == activeFolderId) {
1000        crumb.className = 'active';
1001        crumb.appendChild(document.createTextNode(folder.getName()));
1002    } else {
1003        var crumbLink = document.createElement('a');
1004        crumbLink.href = '#';
1005        crumbLink.appendChild(document.createTextNode(folder.getName()));
1006        crumbLink.onclick = function (event) {
1007            event.preventDefault();
1008            browser.setFileFolder(folder);
1009        };
1010        crumb.appendChild(crumbLink);
1011    }
1012
1013    return crumb;
1014};
1015
1016AuroraBrowser.prototype.expandCollapseFileFolder = function (folder) {
1017    var fileManagerFolderElement = this.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1018    var fileManagerIconElement = fileManagerFolderElement.find('.tree-icon');
1019
1020    var uploadFolderElement = this.uploadFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1021    var uploadIconElement = uploadFolderElement.find('.tree-icon');
1022
1023    var state = fileManagerFolderElement.data('state');
1024
1025    if (state == 'closed') {
1026        // expand the folder
1027        fileManagerFolderElement.data('state', 'opened');
1028        fileManagerIconElement.addClass('fa-chevron-down').removeClass('fa-chevron-right');
1029        uploadFolderElement.data('state', 'opened');
1030        uploadIconElement.addClass('fa-chevron-down').removeClass('fa-chevron-right');
1031
1032        // show subfolders
1033        fileManagerFolderElement.nextAll('[data-parent_folder_id=' + folder.id + ']').show();
1034        uploadFolderElement.nextAll('[data-parent_folder_id=' + folder.id + ']').show();
1035        for (var i in folder.children) {
1036            this.showSubfolder(folder.children[i], fileManagerFolderElement);
1037        }
1038    } else if (state == 'opened') {
1039        // collapse the folder
1040        fileManagerFolderElement.data('state', 'closed');
1041        fileManagerIconElement.addClass('fa-chevron-right').removeClass('fa-chevron-down');
1042        uploadFolderElement.data('state', 'closed');
1043        uploadIconElement.addClass('fa-chevron-right').removeClass('fa-chevron-down');
1044
1045        // hide subfolders
1046        for (var i in folder.children) {
1047            this.hideSubfolder(folder.children[i]);
1048        }
1049    }
1050};
1051
1052AuroraBrowser.prototype.expandParentFolders = function (folder) {
1053    if (folder.parentId != null) {
1054        var fileParent = this.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.parentId + ']');
1055        var parentFolder = fileParent.data('folder');
1056
1057        var fileState = fileParent.data('state');
1058
1059        if (fileState == 'closed') {
1060            this.expandCollapseFileFolder(parentFolder);
1061        }
1062
1063        this.expandParentFolders(parentFolder);
1064    }
1065};
1066
1067AuroraBrowser.prototype.toggleFolderOption = function (folder, container) {
1068    var folderElement = container.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1069
1070    if (folderElement.hasClass('visible')) {
1071        // remove the visible popup
1072        folderElement.removeClass('visible');
1073        folderElement.find('.dropdown-menu').hide();
1074        this.unregisterFolderOptionClick();
1075    } else {
1076        // show the popup
1077        // hide any others that are showing
1078        container.find('.abn-tree-row.visible .dropdown-menu').hide();
1079        container.find('.abn-tree-row.visible').removeClass('visible');
1080        folderElement.addClass('visible');
1081        folderElement.find('.dropdown-menu').show();
1082        this.registerFolderOptionClick();
1083    }
1084};
1085
1086AuroraBrowser.prototype.showSubfolder = function (folder, parentElement) {
1087    var fileManagerFolderElement = this.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1088    var uploadFolderElement = this.uploadFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1089    if (parentElement.data('state') == 'opened') {
1090        fileManagerFolderElement.show();
1091        uploadFolderElement.show();
1092    }
1093
1094    // hide subfolders
1095    for (var i in folder.children) {
1096        this.showSubfolder(folder.children[i], fileManagerFolderElement);
1097    }
1098};
1099
1100AuroraBrowser.prototype.hideSubfolder = function (folder) {
1101    var fileManagerFolderElement = this.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1102    var uploadFolderElement = this.uploadFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1103    fileManagerFolderElement.hide();
1104    uploadFolderElement.hide();
1105
1106    // hide subfolders
1107    for (var i in folder.children) {
1108        this.hideSubfolder(folder.children[i]);
1109    }
1110};
1111
1112AuroraBrowser.prototype.getFileManagerUrl = function () {
1113    var folderId = this.getFileFolderId();
1114    if (folderId == null) {
1115        folderId = '';
1116    }
1117    var url = '/service/file/manage/getFiles?folder_id=' + folderId + '&page=' + this.filePage 
1117+
1118        '&results_per_page=' + this.pagination + '&content_type=' + this.contentType +
1119        '&tagop=' + this.tagOp;
1120    var tags = this.getSearchTags();
1121    if (tags.length > 0) {
1122        for (var i in tags) {
1123            url += '&tags[]=' + tags[i];
1124        }
1125    }
1126    return url;
1127};
1128
1129AuroraBrowser.prototype.getContentManagerUrl = function () {
1130    var url = '/service/contentmanager/manage/getFiles?page=' + this.contentPage +
1131        '&results_per_page=' + this.pagination + '&content_type=' + this.contentType +
1132        '&tagop=' + this.tagOp;
1133    var tags = this.getSearchTags();
1134    if (tags.length > 0) {
1135        for (var i in tags) {
1136            url += '&tags[]=' + tags[i];
1137        }
1138    }
1139    return url;
1140};
1141
1142AuroraBrowser.prototype.loadTabs = function () {
1143    this.loadFileManager();
1144    this.loadContentManager();
1145};
1146
1147AuroraBrowser.prototype.loadFileManager = function () {
1148    var browser = this;
1149    $.ajax({
1150        url: browser.getFileManagerUrl(),
1151        dataType: 'json',
1152        beforeSend: function () {
1153            browser.showWait();
1154        },
1155        success: function (data) {
1156            if (data.success) {
1157                browser.setFileManagerCount(data.data.total_records);
1158                browser.setFilePage(data.data.page, false);
1159                browser.populateFileManager(data.data.records);
1160                browser.populateFileManagerNavigation(data.data.page_nav);
1161            } else {
1162                browser.showError(data.message);
1163            }
1164            browser.hideWait();
1165        },
1166        error: function () {
1167            browser.showError('Unable to load files!');
1168            browser.hideWait();
1169        }
1170    });
1171};
1172
1173AuroraBrowser.prototype.populateFileManager = function (files) {
1174    // remove all existing files
1175    this.fileManagerPanelBody.empty();
1176
1177    for (var i in files) {
1178        var file = new AuroraFile(files[i], 'file');
1179
1180        // build new dom element
1181        var fileElement = this.generateFileDisplayElement(file);
1182
1183        this.fileManagerPanelBody.append(fileElement);
1184    }
1185};
1186
1187AuroraBrowser.prototype.populateContentManager = function (files) {
1188    // remove all existing files
1189    //this.contentManagerPanelBody.empty();
1190
1191    for (var i in files) {
1192        var file = new AuroraFile(files[i], 'content');
1193
1194        // build new dom element
1195        var fileElement = this.generateFileDisplayElement(file);
1196
1197        this.contentManagerPanelBody.append(fileElement);
1198    }
1199};
1200
1201AuroraBrowser.prototype.setSelectedFile = function (file) {
1202    this.file = file;
1203
1204    // set thumbnail image preview
1205    this.selectedFilePreview.attr('src', file.getThumbnail());
1206    this.selectedFilePreview.attr('alt', file.getName());
1207
1208    // set file name and description
1209    this.selectedFileName.text(file.getName());
1210    this.selectedFileDescription.text(file.getDescription());
1211
1212    if (file.isImage()) {
1213        //show the file size options
1214        this.selectedFileSizeContainer.show();
1215        this.selectedFileSize.html(file.getImageSize(true));
1216        this.selectedSize = file;
1217    } else {
1218        // hide the file size options
1219        this.selectedFileSizeContainer.hide();
1220        this.selectedFileSize.text('');
1221        this.selectedSize = null;
1222    }
1223
1224    this.selectedFileContainer.show();
1225    this.dialog.animate({scrollTop: 0}, 'medium');
1226};
1227
1228AuroraBrowser.prototype.setSelectedSize = function (file) {
1229    this.selectedSize = file;
1230
1231    // set file name and description
1232    this.selectedFileName.text(file.getName());
1233    this.selectedFileDescription.text(file.getDescription());
1234
1235    //show the file size options
1236    this.selectedFileSizeContainer.show();
1237    this.selectedFileSize.html(file.getImageSize(true));
1238};
1239
1240AuroraBrowser.prototype.populateFileManagerNavigation = function (nav) {
1241    var browser = this;
1242    // remove all existing page navigation
1243    browser.fileManagerPanelFooter.empty();
1244
1245    var navigation = document.createElement('nav');
1246    var list = document.createElement('ul');
1247    list.className = 'pagination';
1248    navigation.appendChild(list);
1249
1250    for (var i in nav) {
1251        var listItem = document.createElement('li');
1252
1253        var link = document.createElement('a');
1254        link.className = 'aurora-file-browse-navigation';
1255        link.setAttribute('href', '#');
1256        var linkText = document.createTextNode(nav[i].label);
1257        link.appendChild(linkText);
1258
1259        if (nav[i].link.length == 0) {
1260            listItem.className = 'active';
1261        } else {
1262            link.setAttribute('data-page', nav[i].link.replace(/[^0-9]/g, ''));
1263            link.onclick = function (event) {
1264                event.preventDefault();
1265                var page = this.getAttribute('data-page');
1266                browser.setFilePage(page);
1267            };
1268        }
1269
1270        listItem.appendChild(link);
1271        list.appendChild(listItem);
1272    }
1273
1274    browser.fileManagerPanelFooter.append(navigation);
1275};
1276
1277AuroraBrowser.prototype.populateContentManagerNavigation = function (nav) {
1278    var browser = this;
1279    // remove all existing page navigation
1280    browser.contentManagerPanelFooter.empty();
1281
1282    var navigation = document.createElement('nav');
1283    var list = document.createElement('ul');
1284    list.className = 'pagination';
1285    navigation.appendChild(list);
1286
1287    for (var i in nav) {
1288        var listItem = document.createElement('li');
1289
1290        var link = document.createElement('a');
1291        link.className = 'aurora-file-browse-navigation';
1292        link.setAttribute('href', '#');
1293        var linkText = document.createTextNode(nav[i].label);
1294        link.appendChild(linkText);
1295
1296        if (nav[i].link.length == 0) {
1297            listItem.className = 'active';
1298        } else {
1299            link.setAttribute('data-page', nav[i].link.replace(/[^0-9]/g, ''));
1300            link.onclick = function (event) {
1301                event.preventDefault();
1302                var page = this.getAttribute('data-page');
1303                browser.setContentPage(page);
1304            };
1305        }
1306
1307        listItem.appendChild(link);
1308        list.appendChild(listItem);
1309    }
1310
1311    browser.contentManagerPanelFooter.append(navigation);
1312};
1313
1314AuroraBrowser.prototype.loadContentManager = function () {
1315    var browser = this;
1316    $.ajax({
1317        url: browser.getContentManagerUrl(),
1318        dataType: 'json',
1319        beforeSend: function () {
1320            browser.showWait();
1321        },
1322        success: function (data) {
1323            if (data.success) {
1324                browser.setContentManagerCount(data.data.total_records);
1325                browser.setContentPage(data.data.page, false);
1326                browser.populateContentManager(data.data.records);
1327                browser.populateContentManagerNavigation(data.data.page_nav);
1328            } else {
1329                browser.showError(data.message);
1330            }
1331            browser.hideWait();
1332        },
1333        error: function () {
1334            browser.showError('Unable to load files!');
1335            browser.hideWait();
1336        }
1337    });
1338};
1339
1340AuroraBrowser.prototype.showWait = function () {
1341    $('body').css({
1342        'cursor': 'wait'
1343    });
1344    this.dialog.addClass('aurora-file-browse-waiting');
1345    this.busy = true;
1346};
1347
1348AuroraBrowser.prototype.hideWait = function () {
1349    $('body').css({
1350        'cursor': 'default'
1351    });
1352    this.dialog.removeClass('aurora-file-browse-waiting');
1353    this.busy = false;
1354};
1355
1356AuroraBrowser.prototype.showError = function (message, title) {
1357    if (title == undefined) {
1358        title = '';
1359    }
1360    le_show_error(message, title);
1361};
1362
1363AuroraBrowser.prototype.showWarning = function (message, title) {
1364    if (title == undefined) {
1365        title = '';
1366    }
1367    le_show_warning(message, title);
1368};
1369
1370AuroraBrowser.prototype.showMessage = function (message, title) {
1371    if (title == undefined) {
1372        title = '';
1373    }
1374    le_show_message(message, title);
1375};
1376
1377AuroraBrowser.prototype.generateFileDisplayElement = function (file) {
1378    // build new dom element
1379    var fileElement = document.createElement('div');
1380    fileElement.className = 'aurora-image-file-container';
1381    var imageElement = document.createElement('img');
1382    imageElement.className = 'aurora-image-file-image';
1383    imageElement.setAttribute('src', file.getThumbnail());
1384    imageElement.setAttribute('alt', file.getName());
1385    fileElement.appendChild(imageElement);
1386    var imageName = document.createElement('div');
1387    imageName.className = 'aurora-image-file-name';
1388    var imageText = document.createTextNode(file.getName());
1389    imageName.appendChild(imageText);
1390    fileElement.appendChild(imageName);
1391
1392    var browser = this;
1393
1394    // attach Aurora file to jquery data
1395    fileElement.onclick = function (event) {
1396        event.preventDefault();
1397        var file = $(this).data('file');
1398        browser.setSelectedFile(file);
1399    };
1400
1401    $(fileElement).data('file', file);
1402
1403    return fileElement;
1404};
1405
1406AuroraBrowser.prototype.generateFolderDisplayElement = function (folder, level) {
1407    // create the li containing element
1408    var folderItem = document.createElement('li');
1409    folderItem.className = "abn-tree-row level-" + level + " clearfix";
1410    // hide all children folders
1411    if (folder.parentId != undefined && folder.parentId != null) {
1412        folderItem.style.display = "none";
1413    }
1414    folderItem.setAttribute('data-folder_id', folder.id);
1415    folderItem.setAttribute('data-parent_folder_id', folder.parentId);
1416    $folderItem = $(folderItem);
1417    $folderItem.data('folder', folder);
1418
1419    // create the div container
1420    var folderItemDiv = document.createElement('div');
1421    folderItemDiv.className = "row_content clearfix";
1422    folderItem.appendChild(folderItemDiv);
1423
1424    // create the row icon
1425    var folderItemIcon = document.createElement('i');
1426    if (folder.id == null) {
1427        folderItemIcon.className = "indented tree-icon fa fa-folder-open-o";
1428        $folderItem.data('state', 'root');
1429    } else if (folder.children.length == 0) {
1430        folderItemIcon.className = "indented tree-icon fa fa-minus-circle";
1431        $folderItem.data('state', 'empty');
1432    } else if (level > 1) {
1433        folderItemIcon.className = "indented tree-icon fa fa-chevron-right";
1434        $folderItem.data('state', 'closed');
1435    } else {
1436        folderItemIcon.className = "indented tree-icon fa fa-chevron-down";
1437        $folderItem.data('state', 'opened');
1438    }
1439
1440    folderItemDiv.appendChild(folderItemIcon);
1441
1442    // create the folder name element
1443    var folderItemName = document.createElement('span');
1444    folderItemName.className = "indented tree-label";
1445    var folderItemNameText = document.createTextNode(folder.getName());
1446    folderItemName.appendChild(folderItemNameText);
1447    folderItemDiv.appendChild(folderItemName);
1448
1449    // create the folder action dropdown
1450    var dropdown = document.createElement('div');
1451    dropdown.className = "options btn-group btn-group-xs";
1452    folderItemDiv.appendChild(dropdown);
1453
1454    // create the dropdown button
1455    var dropdownButton = document.createElement('button');
1456    dropdownButton.setAttribute('type', 'button');
1457    dropdownButton.className = "btn btn-primary dropdown-toggle";
1458    dropdown.appendChild(dropdownButton);
1459
1460    // create the icon for the dropdown button
1461    var dropdownButtonIcon = document.createElement('i');
1462    dropdownButtonIcon.className = "fa fa-cog";
1463    dropdownButton.appendChild(dropdownButtonIcon);
1464
1465    // create the dropdown actions
1466    var dropdownActions = document.createElement('ul');
1467    dropdownActions.className = "dropdown-menu";
1468    dropdownActions.setAttribute('role', 'menu');
1469    dropdown.appendChild(dropdownActions);
1470
1471    // create the add dropdown action
1472    var dropdownActionAdd = document.createElement('li');
1473    dropdownActions.appendChild(dropdownActionAdd);
1474    var dropdownActionAddLink = document.createElement('a');
1475    dropdownActionAdd.appendChild(dropdownActionAddLink);
1476    var dropdownActionAddIcon = document.createElement('i');
1477    dropdownActionAddIcon.className = "fa fa-plus-circle btn-icon";
1478    dropdownActionAddLink.appendChild(dropdownActionAddIcon);
1479    dropdownActionAddLink.appendChild(document.createTextNode('Add'));
1480
1481    if (folder.canDelete()) {
1482        // create the delete dropdown action
1483        var dropdownActionDelete = document.createElement('li');
1484        dropdownActions.appendChild(dropdownActionDelete);
1485        var dropdownActionDeleteLink = document.createElement('a');
1486        dropdownActionDeleteLink.className = "delete";
1487        dropdownActionDelete.appendChild(dropdownActionDeleteLink);
1488        var dropdownActionDeleteIcon = document.createElement('i');
1489        dropdownActionDeleteIcon.className = "fa fa-trash-o btn-icon";
1490        dropdownActionDeleteLink.appendChild(dropdownActionDeleteIcon);
1491        dropdownActionDeleteLink.appendChild(document.createTextNode('Delete'));
1492    }
1493
1494    var browser = this;
1495
1496    dropdownActionAddLink.onclick = function (event) {
1497        event.preventDefault();
1498        event.stopPropagation();
1499        //force hide of popup menu
1500        var folderElement = $(this).parents('.abn-tree-row');
1501        folderElement.removeClass('visible');
1502        folderElement.find('.dropdown-menu').hide();
1503        browser.unregisterFolderOptionClick();
1504
1505        // add folder with dialog prompt
1506        browser.addFolderTo(folder);
1507    };
1508
1509    if (dropdownActionDeleteLink != undefined) {
1510        dropdownActionDeleteLink.onclick = function (event) {
1511            event.preventDefault();
1512            event.stopPropagation();
1513            //force hide of popup menu
1514            var folderElement = $(this).parents('.abn-tree-row');
1515            folderElement.removeClass('visible');
1516            folderElement.find('.dropdown-menu').hide();
1517            browser.unregisterFolderOptionClick();
1518
1519            //delete the folder with a confirmation dialog
1520            browser.deleteFolder(folder);
1521        };
1522    }
1523
1524    // set active click handler
1525    folderItem.onclick = function (event) {
1526        event.preventDefault();
1527        var f = $(this).data('folder');
1528
1529        browser.setFileFolder(f);
1530    };
1531
1532    // set the folder icon click event (collapse/expand) handler
1533    folderItemIcon.onclick = function (event) {
1534        event.preventDefault();
1535        event.stopPropagation();
1536        var parent = $(this).parents('.abn-tree-row');
1537        var f = parent.data('folder');
1538
1539        browser.expandCollapseFileFolder(f);
1540    };
1541
1542    // set the folder popup click event handler
1543    dropdownButton.onclick = function (event) {
1544        event.preventDefault();
1545        event.stopPropagation();
1546        var parent = $(this).parents('.abn-tree-row');
1547        var f = parent.data('folder');
1548
1549        browser.toggleFolderOption(f, parent.parent());
1550    };
1551
1552
1553    return folderItem;
1554};
1555
1556AuroraBrowser.prototype.addFolderTo = function (folder) {
1557    var browser = this;
1558    var t = (new Date()).getTime();
1559    var dialog_id = 'aurora-confirm-dialog-' + t;
1560
1561    var dialog_html = '<div id="' + dialog_id + '" class="modal fade aurora_bootstrap_modal aurora-confirm-dialog" ' +
1562        'tabindex="-1" data-backdrop="static" style="display: none; z-index: 999999;">' +
1563        '<div class="modal-dialog">' +
1564        '<div class="modal-content aurora-confirm-dialog-content">' +
1565
1566        '<!-- dialog header title bar -->' +
1567        '<div class="modal-header aurora-confirm-dialog-header">' +
1568        '<span class="modal-title aurora-confirm-dialog-title">Add Folder</span>' +
1569        '</div>' +
1570
1571        '<!-- dialog body -->' +
1572        '<div class="modal-body aurora-confirm-dialog-body">' +
1573        '<div class="modal-contain aurora-confirm-dialog-contain">' +
1574        '<div class="form-group">' +
1575        '<label for="auroraConfirmDialogFolderName">Add folder to parent folder <b>' + folder.getName() + '</b></label>' +
1576        '<input type="text" class="form-control" id="auroraConfirmDialogFolderName" placeholder="Enter Folder Name">' +
1577        '</div>' +
1578        '</div>' +
1579        '<div class="clearfix"></div>' +
1580        '</div>' +
1581
1582        '<!-- dialog buttons -->' +
1583        '<div class="modal-footer aurora-confirm-dialog-footer">' +
1584        '<button type="button" class="btn btn-primary small-btn blue-btn footer-save-btn aurora-confirm-dialog-ok" id="aurora-confirm-dialog-ok-' + t + '">Add</button>' +
1585        '<button type="button" class="btn small-btn stroked-gray-btn footer-close-btn aurora-confirm-dialog-cancel" id="aurora-confirm-dialog-cancel-' + t + '" data-dismiss="modal">Cancel</button>' +
1586        '<div class="clearfix"></div>' +
1587//            '</div>' +
1588
1589        '</div>' + // close the modal-content
1590        '</div>' + // close the modal-dialog
1591        '</div>'; // close the modal
1592
1593    $('body').append(dialog_html);
1594
1595    $('#aurora-confirm-dialog-ok-' + t).click(function (event) {
1596        event.preventDefault();
1597        // make sure folder name is completed
1598        var folderName = $('#auroraConfirmDialogFolderName').val();
1599        var folderId = folder.id == null ? '' : folder.id;
1600        if (folderName.trim().length == 0) {
1601            browser.showWarning('Folder Name Is Required!');
1602            $('#auroraConfirmDialogFolderName').focus();
1603        } else {
1604            $.ajax({
1605                url: '/service/file/manage/addFolder?parent_id=' + folderId + '&folder_name=' + folderName,
1606                dataType: 'json',
1607                beforeSend: function () {
1608                    browser.showWait();
1609                },
1610                success: function (data) {
1611                    browser.hideWait();
1612                    if (data.success) {
1613                        browser.showMessage('Folder, ' + folderName + ', created');
1614
1615                        // add the folder to the folder trees
1616                        var newFolder = new AuroraFolder(data.data);
1617                        folder.addChild(newFolder);
1618
1619                        // update the parent folder element with the new child
1620                        var parentElement = browser.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1621                        parentElement.data('folder', folder);
1622                        var uploadParentElement = browser.uploadFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1623                        uploadParentElement.data('folder', folder);
1624
1625                        var elementState = parentElement.data('state');
1626                        if (elementState == 'empty') {
1627                            parentElement.find('.fa-minus-circle').removeClass('fa-minus-circle').addClass('fa-chevron-right');
1628                            parentElement.data('state', 'closed');
1629
1630                            uploadParentElement.find('.fa-minus-circle').removeClass('fa-minus-circle').addClass('fa-chevron-right');
1631                            uploadParentElement.data('state', 'closed');
1632                        }
1633
1634                        // generate the new folder DOM element
1635                        var level = data.data.data.bread_crumb.length;
1636                        var folderElement = browser.generateFolderDisplayElement(newFolder, level);
1637                        var uploadFolderElement = browser.generateFolderDisplayElement(newFolder, level);
1638                        if (elementState == 'opened') {
1639                            folderElement.style.display = 'block';
1640                            uploadFolderElement.style.display = 'block';
1641                        }
1642
1643                        parentElement.after(folderElement);
1644                        uploadParentElement.after(uploadFolderElement);
1645                    } else {
1646                        browser.showError(data.message);
1647                    }
1648                    $('#' + dialog_id).modal('hide');
1649                },
1650                error: function (XMLHttpRequest, textStatus, errorThrown) {
1651                    browser.hideWait();
1652                    browser.showError('Unable To Create Folder, ' + folderName + '!');
1653                    $('#' + dialog_id).modal('hide');
1654                }
1655            });
1656        }
1657    });
1658
1659    $('#' + dialog_id).on('hidden.bs.modal', function () {
1660        $('#' + dialog_id).remove();
1661        if ($('.modal-backdrop').length > 0) {
1662            $('body').addClass('modal-open');
1663        }
1664    }).on('shown.bs.modal', function () {
1665        $('#auroraConfirmDialogFolderName').focus();
1666    });
1667
1668    $('#' + dialog_id).modal({
1669        'show': true,
1670        'keyboard': false,
1671        'backdrop': 'static'
1672    });
1673
1674};
1675
1676AuroraBrowser.prototype.deleteFolder = function (folder) {
1677    if (folder.canDelete()) {
1678        var browser = this;
1679
1680        var url = '/service/file/manage/deleteFolder?parent_id=' + folder.id + '&hash=' + this.dialogHash;
1681        var message = '<p>Do you want to delete folder, <b>' + folder.getName() + '</b></p>';
1682        message += '<p>This will remove all the files and subfolders contained in the folder.</p>';
1683        var title = 'Delete Folder';
1684        var success = function (data) {
1685            browser.hideWait();
1686            if (data.success) {
1687                browser.showMessage('Folder, ' + folder.getName() + ', deleted');
1688
1689                // get the folder tree item
1690                var folderItem = browser.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1691
1692                // check if the folder contained the selected folder
1693                // if the folder contained the selected folder select the parent folder
1694                var activeFolder = browser.findActiveFolder(folder);
1695
1696                var parentFolderElement = browser.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.parentId + ']');
1697                var uploadFolderElement = browser.uploadFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.parentId + ']');
1698                var parentFolder = parentFolderElement.data('folder');
1699                // remove the child folder from the parent folder
1700                parentFolder.removeChild(folder);
1701                if (parentFolder.children.length == 0) {
1702                    // folder is now empty
1703                    parentFolderElement.find('.tree-icon')
1704                        .removeClass('fa-chevron-down')
1705                        .removeClass('fa-chevron-right')
1706                        .addClass('fa-minus-circle')
1707                        .data('state', 'empty');
1708                    uploadFolderElement.find('.tree-icon')
1709                        .removeClass('fa-chevron-down')
1710                        .removeClass('fa-chevron-right')
1711                        .addClass('fa-minus-circle')
1712                        .data('state', 'empty');
1713                }
1714
1715                // update the folder data in the folder trees
1716                parentFolderElement.data('folder', parentFolder);
1717                uploadFolderElement.data('folder', parentFolder);
1718
1719                if (activeFolder != null) {
1720                    // the deleted folder or one of its subfolders was active
1721                    browser.setFileFolder(parentFolder);
1722                }
1723
1724                // need to remove subfolders
1725                browser.removeFolder(folder);
1726            } else {
1727                browser.showError(data.message);
1728            }
1729        };
1730        var error = function () {
1731            browser.hideWait();
1732            browser.showError('Unable to delete folder, ' + folder.getName());
1733        };
1734        var beforeSend = function () {
1735            browser.showWait();
1736        };
1737        le_confirm_delete(url, message, title, success, error, beforeSend);
1738    } else {
1739        this.showWarning('Can not delete folder ' + folder.getName(), '');
1740    }
1741};
1742
1743AuroraBrowser.prototype.removeFolder = function (folder) {
1744    for (var i in folder.children) {
1745        this.removeFolder(folder.children[i]);
1746    }
1747
1748    this.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']').remove();
1749    this.uploadFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']').remove();
1750};
1751
1752AuroraBrowser.prototype.findActiveFolder = function (folder) {
1753    var browser = this;
1754    var activeFolder = null;
1755
1756    var folderElement = browser.fileManagerFolderPanel.find('.abn-tree-row[data-folder_id=' + folder.id + ']');
1757    if (folderElement.hasClass('active')) {
1758        activeFolder = folder;
1759    } else {
1760        browser.fileManagerFolderPanel.find('.abn-tree-row[data-parent_folder_id=' + folder.id + ']').each(function (index, value) {
1761            var childElement = $(value);
1762            var childFolder = childElement.data('folder');
1763            if (activeFolder == null) {
1764                activeFolder = browser.findActiveFolder(childFolder);
1765            }
1766        });
1767    }
1768
1769    return activeFolder;
1770};
1771
1772function AuroraFile(file, sourceType) {
1773    if (sourceType == undefined) {
1774        sourceType = 'file';
1775    }
1776
1777    var defaultValues = {
1778        id: null,
1779        parent_id: null,
1780        type: null,
1781        caption: null,
1782        filename: null,
1783        url: null,
1784        content_type: null,
1785        size: 0,
1786        width: 0,
1787        height: 0,
1788        created_date: null,
1789        modified_date: null,
1790        created_by_uuid: null,
1791        modified_by_uuid: null,
1792        thumb: null,
1793        Children: []
1794    };
1795    file = $.extend(defaultValues, file);
1796
1797    this.id = file.id;
1798    this.parentId = file.parent_id;
1799    this.type = file.type;
1800    this.caption = file.caption;
1801    this.filename = file.filename;
1802    this.url = file.url;
1803    this.contentType = file.content_type;
1804    this.size = file.size;
1805    this.width = file.width;
1806    this.height = file.height;
1807    this.createdDate = file.created_date;
1808    this.modifiedDate = file.modified_date;
1809    this.createdBy = file.created_by_uuid;
1810    this.modifiedBy = file.modified_by_uuid;
1811    this.thumbnail = file.thumb;
1812    this.sourceType = sourceType;
1813
1814    this.children = [];
1815    for (var i in file.Children) {
1816        this.addChild(file.Children[i], sourceType);
1817
1818        if ((this.thumbnail == null || this.thumbnail.length == 0) && file.Children[i].type == 'squarethumb') {
1819            this.thumbnail = file.Children[i].url;
1820        }
1821    }
1822
1823    if (this.thumbnail == null || this.thumbnail.length == 0) {
1824        this.thumbnail = this.url;
1825    }
1826}
1827
1828AuroraFile.prototype.addChild = function (file, sourceType) {
1829    if (file instanceof AuroraFile) {
1830        this.children.push(file);
1831    } else {
1832        if (sourceType == undefined) {
1833            sourceType = 'file';
1834        }
1835        this.children.push(new AuroraFile(file, sourceType));
1836    }
1837};
1838
1839AuroraFile.prototype.getName = function () {
1840    return this.filename;
1841};
1842
1843AuroraFile.prototype.getDescription = function () {
1844    return this.filename;
1845};
1846
1847AuroraFile.prototype.getThumbnail = function () {
1848    return this.thumbnail;
1849};
1850
1851AuroraFile.prototype.getImageSize = function (display) {
1852    if (display == undefined) {
1853        display = false;
1854    }
1855
1856    if (display) {
1857        return this.type + ' - ' + this.width + 'px <i class="fa fa-times"></i> ' + this.height + 'px';
1858    }
1859
1860    return this.width + ' x ' + this.height;
1861};
1862
1863AuroraFile.prototype.isImage = function () {
1864    return /^image/.test(this.contentType);
1865};
1866
1867function AuroraFolder(folder) {
1868    var defaultValues = {
1869        label: null,
1870        children: [],
1871        data: {
1872            id: null,
1873
1874            parent_id: null
1875        }
1876    };
1877    folder = $.extend(defaultValues, folder);
1878
1879    this.id = folder.data.id == "" ? null : folder.data.id;
1880    this.parentId = folder.data.parent_id == "" ? null : folder.data.parent_id;
1881    this.folderName = folder.label;
1882    this.noDelete = this.id == null ? true : false;
1883
1884    this.children = [];
1885    for (var i in folder.children) {
1886        this.addChild(folder.children[i]);
1887    }
1888}
1889
1890AuroraFolder.prototype.addChild = function (folder) {
1891    if (folder instanceof AuroraFolder) {
1892        this.children.push(folder);
1893    } else {
1894        this.children.push(new AuroraFolder(folder));
1895    }
1896};
1897
1898AuroraFolder.prototype.getName = function () {
1899    return this.folderName;
1900};
1901
1902AuroraFolder.prototype.canDelete = function () {
1903    return !this.noDelete;
1904};
1905
1906AuroraFolder.prototype.removeChild = function (folder) {
1907    this.removeChildId(folder.id);
1908};
1909
1910AuroraFolder.prototype.removeChildId = function (folderId) {
1911    var index = null;
1912    for (var i in this.children) {
1913        if (this.children[i].id == folderId) {
1914            index = parseInt(i);
1915            break;
1916        }
1917    }
1918
1919    if (index != null) {
1920        this.children = this.children.slice(0, index).concat(this.children.slice((index + 1), this.children.length));
1921    }
1922};

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.