source: pro-violet-viettel/www/deploy/20150304/assets/js/manager.js @ 923

Last change on this file since 923 was 923, checked in by dungnv, 10 years ago
File size: 82.4 KB
Line 
1if (jQuery)
2    (function ($) {
3        $
4                .extend(
5                        $.fn,
6                        {
7                            violetFileManager: function (o) {
8                                if (!o)
9                                    var o = {};
10                                if (o.tree == undefined)
11                                    o.tree = null;
12                                if (o.grid == undefined)
13                                    o.grid = null;
14
15                                if (o.maincontainer == undefined)
16                                    o.maincontainer = null;
17                                if (o.titlebar == undefined)
18                                    o.titlebar = null;
19                                if (o.toolsbar == undefined)
20                                    o.toolsbar = null;
21                                if (o.statusbar == undefined)
22                                    o.statusbar = null;
23                                if (o.navigationbar == undefined)
24                                    o.navigationbar = null;
25
26                                if (o.oTree == undefined)
27                                    o.oTree = null;
28                                if (o.oGrid == undefined)
29                                    o.oGrid = null;
30                                if (o.host == undefined)
31                                    o.host = 'http://localhost/';
32                                if (o.hostmodule == undefined)
33                                    o.hostmodule = 'privatecontent/';
34                                if (o.script == undefined)
35                                    o.script = 'getcontent';
36                                if (o.data == undefined)
37                                    o.data = null;
38                                if (o.datasource == undefined)
39                                    o.datasource = 'ajax';
40
41                                if (o.filehosting == undefined)
42                                    o.filehosting = 'http://sbgapi.violet.vn/uploads/space';
43                                if (o.filedomain == undefined)
44                                    o.filedomain = 'http://sbgapi.violet.vn';
45                                if (o.invisibledButtons == undefined)
46                                    o.invisibledButtons = null;
47
48                                o.host += 'ajax/';
49
50                                var isDev = false;
51                                var contextmenu = null;
52                                var oContainer = this;
53                                var tree = [];
54                                var totalItem = 0;
55                                var countItem = 0;
56                                var maxWidth = 0;
57                                var treeCurrentNode = null;
58                                var self = this;
59                                var oClipBoard = {
60                                    items: null,
61                                    act: null
62                                };
63
64                                var aryPath = [];
65
66                                if (o.homeNode == undefined)
67                                    o.homeNode = null;
68
69                                /**
70                                 * Toolbar defined
71                                 */
72                                var btnNewFolder = $('#'
73                                        + o.toolsbar
74                                        + ' > DIV.btn-group.basic > #btnNewFolder');
75                                var btnDel = $('#' + o.toolsbar
76                                        + ' > DIV.btn-group.basic > #btnDel');
77                                var btnCopy = $('#' + o.toolsbar
78                                        + ' > DIV.btn-group.basic > #btnCopy');
79                                var btnCut = $('#' + o.toolsbar
80                                        + ' > DIV.btn-group.basic > #btnCut');
81                                var btnPaste = $('#' + o.toolsbar
82                                        + ' > DIV.btn-group.basic > #btnPaste');
83                                var btnShare = $('#' + o.toolsbar
84                                        + ' > DIV.btn-group.social > #btnShare');
85                                var btnPreview = $('#'
86                                        + o.toolsbar
87                                        + ' > DIV.btn-group.social > #btnPreview');
88                                var btnDownload = $('#'
89                                        + o.toolsbar
90                                        + ' > DIV.btn-group.creation > #btnDownload');
91                                var btnUpload = $('#'
92                                        + o.toolsbar
93                                        + ' > DIV.btn-group.creation > #btnUpload');
94                                var btnRefresh = $('#'
95                                        + o.toolsbar
96                                        + ' > DIV.btn-group.control > #btnRefresh');
97
98                                var toolbarButtons = [btnNewFolder, btnDel,
99                                    btnCopy, btnCut, btnPaste, btnShare,
100                                    btnPreview, btnDownload, btnUpload,
101                                    btnRefresh];
102                                var statusbar = $('DIV#' + o.statusbar);
103
104                                var sendCommand = function (p) {
105                                    if (p.postdata == undefined)
106                                        p.postdata = null;
107                                    if (p.script == undefined)
108                                        p.script = o.script;
109                                    if (p.callbackSuccess == undefined)
110                                        p.callbackSuccess = null;
111                                    if (p.callbackDone == undefined)
112                                        p.callbackDone = null;
113                                    if (p.callbackFail == undefined)
114                                        p.callbackFail = null;
115                                    if (p.callbackAlways == undefined)
116                                        p.callbackAlways = null;
117                                    if (p.parseData == undefined)
118                                        p.parseData = null;
119                                    if (p.self == undefined)
120                                        p.self = this;
121
122                                    if (p.script != null
123                                            && (o.datasource == 'ajax' || isDev)) {
124                                        $.post(
125                                                        o.host + o.hostmodule
126                                                        + p.script,
127                                                        p.postdata,
128                                                        function (data) {
129                                                            if (data) {
130                                                                parseData = $.parseJSON(data);
131                                                                p.parseData = parseData;
132                                                            }
133
134                                                            if (p.callbackSuccess != null) {
135                                                                if (parseInt(parseData.ERROR.errCode) === 0)
136                                                                    p.callbackSuccess(parseData);
137                                                                else {
138                                                                    p.callbackFail(parseData.ERROR);
139                                                                }
140                                                            }
141                                                        })
142                                                .done(function () {
143                                                            if (p.callbackDone != null)
144                                                                p.callbackDone(p.parseData);
145                                                        })
146                                                .fail(function () {
147                                                    if (p.callbackFail != null)
148                                                        p.callbackFail(this);
149                                                })
150                                                .always(
151                                                        function () {
152                                                            if (p.callbackAlways != null)
153                                                                p.callbackAlways(this);
154                                                        });
155                                    } else if (o.datasource == 'json') {
156                                        if (p.callbackSuccess != null)
157                                            p.callbackSuccess(o.data);
158                                        if (p.callbackDone != null)
159                                            p.callbackDone(this);
160                                    }
161
162                                };
163
164                                var getDirTreeMaxWidth = function () {
165                                    //var scrWidth = $(o.maincontainer).width();
166                                    var scrWidth = $(document).width();
167                                    return parseInt(scrWidth / 3);
168                                }
169
170                                var layoutRender = function () {
171                                    var scrWidth = $('#' + o.maincontainer)
172                                            .width();
173                                    var scrHeght = $(window).innerHeight();
174                                    var dirTreeHeight = scrHeght
175                                            - $('#' + o.titlebar).height()
176                                            - $('#' + o.toolsbar).height()
177                                            - $('#' + o.statusbar).height() - 5;
178                                    $('#' + o.tree).parent().height(
179                                            dirTreeHeight);
180                                    $('#' + o.grid).parent().height(
181                                            dirTreeHeight);
182                                    $('#' + o.grid).parent().width(
183                                            'calc(100% - '
184                                            + ($('#' + o.tree).parent()
185                                                    .width() + 8)
186                                            + 'px)');
187                                    var scollWidth = $('#' + o.grid).parent()
188                                            .width();
189                                    maxWidth = getDirTreeMaxWidth();
190
191                                    console.log(maxWidth);
192
193                                    $(o.tree).height(dirTreeHeight - 5);
194
195                                    if (o.invisibledButtons != null) {
196                                        for (var i = 0; i < o.invisibledButtons.length; i++) {
197                                            $('#' + o.invisibledButtons[i])
198                                                    .hide();
199                                        }
200                                    }
201                                }
202
203                                var createFileManager = function (parseData) {
204                                    o.data = parseData;
205                                    totalItem = o.data.DIRECTORIES.length;
206                                    o.oTree = $('#' + o.tree).violetTree({
207                                        data: o.data.DIRECTORIES,
208                                        manager: oContainer
209                                    });
210                                    o.oGrid = $('#' + o.grid).violetGrid({
211                                        data: o.data,
212                                        manager: oContainer
213                                    });
214
215                                    self.setHomeNode();
216                                    self.refreshStatusBar();
217                                };
218
219                                var getAllDirChild = function (parentID,
220                                        aryChild) {
221                                    parentID = parentID == null ? 0 : parentID;
222                                    var dirList = searchItemsByParent(parentID,
223                                            'directory');
224                                    var index = aryChild.length;
225                                    aryChild[index] = parentID;
226                                    if (dirList.length > 0) {
227                                        for (var i = 0; i < dirList.length; i++) {
228                                            getAllDirChild(dirList[i].id,
229                                                    aryChild);
230                                        }
231                                    }
232                                }
233
234                                var buildTreeFromParent = function (dirID, node) {
235                                    var aryChildFiles = [];
236                                    var aryChildDirs = [];
237                                    var aryChildIDs = [];
238                                    var aryTmp = [];
239                                    var dir = o.data.DIRECTORIES[searchItemByID(
240                                            dirID, 'directory')];
241                                    aryChildDirs = searchItemsByParent(dirID,
242                                            'directory');
243                                    aryChildFiles = searchItemsByParent(dirID,
244                                            'file');
245
246                                    node.id = dir.id;
247                                    node.name = dir.name;
248                                    node.type = 'directory';
249
250                                    $(aryChildDirs).each(function (index) {
251                                        var id = this.id;
252                                        var name = this.name;
253                                        var type = 'directory';
254                                        var cDir = {
255                                            id: id,
256                                            name: name,
257                                            type: type,
258                                            childs: null
259                                        };
260                                        aryChildIDs[index] = cDir;
261                                    });
262
263                                    if ($(aryChildFiles).length > 0) {
264                                        if (node.files == undefined)
265                                            node.files = [];
266                                        $(aryChildFiles).each(function (index) {
267                                            var id = this.id;
268                                            var name = this.name;
269                                            var type = 'file';
270                                            var cFile = {
271                                                id: id,
272                                                name: name,
273                                                type: type
274                                            };
275                                            node.files[index] = cFile;
276                                        });
277                                    }
278
279                                    if ($(aryChildDirs).length > 0) {
280                                        if (node.childs == undefined)
281                                            node.childs = [];
282                                        $(aryChildIDs)
283                                                .each(
284                                                        function (index) {
285                                                            node.childs[index] = new Object;
286                                                            buildTreeFromParent(
287                                                                    aryChildIDs[index].id,
288                                                                    node.childs[index]);
289                                                        });
290                                    }
291                                }
292
293                                var checkChildExisted = function (id) {
294                                    var dirList = searchItemsByParent(id,
295                                            'directory');
296                                    var fileList = searchItemsByParent(id,
297                                            'file');
298                                    return (dirList.length > 0)
299                                            || (fileList.length > 0);
300                                }
301
302                                var doneInit = function () {
303                                    bindEventToToolbars();
304                                    documentEventsBinding();
305                                };
306
307                                var failInit = function (er) {
308                                    bootbox.alert(er.err);
309                                }
310
311                                var init = function () {
312                                    layoutRender();
313                                    $('#' + o.tree).parent().resizable({
314                                        maxWidth: maxWidth,
315                                        minWidth: 220,
316                                        handles: "e",
317                                        resize: function (event, ui) {
318                                            layoutRender();
319                                        }
320                                    });
321                                    $(window).resize(function () {
322                                        layoutRender();
323                                        $('#' + o.tree).parent().resizable({
324                                            maxWidth: maxWidth
325                                        });
326                                    });
327
328                                    $(document).on({
329                                            ajaxStart: function() { $("body").addClass("loading"); },
330                                            ajaxStop: function() { $("body").removeClass("loading"); }
331                                        });
332
333                                    sendCommand({
334                                        postdata: null,
335                                        callbackSuccess: createFileManager,
336                                        callbackDone: doneInit,
337                                        callbackFail: failInit
338                                    });
339                                };
340
341                                var searchItemByID = function (id, type) {
342                                    var data = {};
343                                    switch (type) {
344                                        case 'directory':
345                                            data = o.data.DIRECTORIES;
346                                            break;
347                                        case 'file':
348                                            data = o.data.FILES;
349                                            break;
350                                        default:
351                                            break;
352                                    }
353
354                                    // for (var i = 0; i < data.length; i++) {
355                                    for (var i in data) {
356                                        if (data[i].id == id) {
357                                            return i;
358                                        }
359                                    }
360                                }
361
362                                var searchItemsByParent = function (parentID, type) {
363                                    var data = {};
364                                    var aryItem = [];
365                                    var index = aryItem.length;
366
367                                    switch (type) {
368                                        case 'directory':
369                                            data = o.data.DIRECTORIES;
370                                            break;
371                                        case 'file':
372                                            data = o.data.FILES;
373                                            break;
374                                        default:
375                                            break;
376                                    }
377
378                                    for (i in data) {
379                                        if (data[i].parentID == parentID) {
380                                            aryItem[index] = data[i];
381                                            index++;
382                                        }
383                                    }
384
385                                    return aryItem;
386                                }
387
388                                /***********************************************
389                                 * TOOLBAR EVENTS - START *
390                                 **********************************************/
391                                var btnRefreshClick = function (obj) {
392                                    $(o).find('i').addClass('fa fa-spin');
393                                    sendCommand({
394                                        postdata: null,
395                                        callbackSuccess: function (parseData) {
396                                            o.data = parseData;
397                                            self.updateData({
398                                                updateAll: true
399                                            });
400                                            o.oTree.refeshTree();
401                                        },
402                                        callbackDone: function () {
403                                            $(o).find('i').removeClass(
404                                                    'fa fa-spin');
405                                        },
406                                        callbackFail: failInit
407                                    });
408                                }
409
410                                var btnNewFolderClick = function () {
411                                    createFolderStart();
412                                }
413
414                                var btnUploadClick = function () {
415                                    uploadStart();
416                                    uploadInit();
417
418                                }
419
420                                var btnDownloadClick = function () {
421                                    var items = o.oGrid.getHighLightItem();
422
423
424                                    for (var i = 0; i < items.length; i++) {
425                                        if (items[i].type == 'directory') {
426
427                                            items[i] = self.getAllDirChilds(items[i]);
428                                        }
429                                    }
430                                    if(items.length>0)
431                                    {
432                                    var url = o.host + "download/getFile/";
433                                    self.redirectPost(url, {
434                                              data: JSON.stringify(items)
435                                          });
436                                    }
437
438
439                                }
440
441                                var btnDelClick = function () {
442                                    var items = o.oGrid.getHighLightItem();
443                                    if ($(items).length == 0) {
444                                        var dirID = $(o.oTree.getSelectedNode())
445                                                .attr('id');
446                                        var item = o.data.DIRECTORIES[searchItemByID(
447                                                dirID, 'directory')];
448                                        item.type = 'directory';
449                                        items = [item];
450                                    }
451                                    self.deleteItem(items);
452                                }
453
454                                var btnCopyClick = function () {
455                                    copy('copy');
456                                }
457
458                                var btnPasteClick = function () {
459                                    paste();
460                                }
461
462                                var btnCutClick = function () {
463                                    copy('move');
464                                }
465
466                                var bindEventToToolbars = function () {
467                                    $(btnRefresh).click(function (e) {
468                                        btnRefreshClick(this)
469                                    });
470
471                                    $(btnNewFolder).click(function (e) {
472                                        btnNewFolderClick()
473                                    });
474                                    $(btnUpload).click(function (e) {
475                                        btnUploadClick()
476                                    });
477
478                                    $(btnDel).click(function (e) {
479                                        btnDelClick()
480                                    });
481                                    $(btnCopy).click(function (e) {
482                                        btnCopyClick()
483                                    });
484                                    $(btnCut).click(function (e) {
485                                        btnCutClick()
486                                    });
487                                    $(btnPaste).click(function (e) {
488                                        btnPasteClick()
489                                    })
490                                    $(btnPreview).click(function (e) {
491                                        btnPreviewClick()
492                                    })
493                                    $(btnDownload).click(function (e) {
494                                        btnDownloadClick()
495                                    })
496
497                                    /*
498                                     * btnShare btnPreview btnDownload btnUpload
499                                     */
500                                }
501                                /***********************************************
502                                 * TOOLBAR EVENTS - END *
503                                 **********************************************/
504
505                                /***********************************************
506                                 * DOCUMENT EVENTS BINDING - START *
507                                 **********************************************/
508                                var documentEventsBinding = function () {
509                                    $(document)
510                                            .bind(
511                                                    'keydown',
512                                                    function (e) {
513                                                        switch (e.which) {
514                                                            case 113:
515                                                            case 27:
516                                                                var gridSelectedItems = o.oGrid
517                                                                        .getHighLightItem();
518                                                                if ($(gridSelectedItems).length > 0) {
519                                                                    o.oGrid.rename(e.which);
520                                                                } else {
521                                                                    o.oTree.rename(e.which);
522                                                                }
523                                                                break;
524                                                            case 46:
525                                                                // delete
526                                                                btnDelClick();
527                                                                break;
528                                                            case 65:
529                                                                if (e.ctrlKey) {
530                                                                    o.oGrid.selectAllNode();
531                                                                }
532                                                                break;
533                                                            default:
534                                                                break;
535                                                        }
536                                                    });
537                                }
538                                /***********************************************
539                                 * DOCUMENT EVENTS BINDING - END *
540                                 **********************************************/
541
542                                /***********************************************
543                                 * CREATE FOLDER - START *
544                                 **********************************************/
545                                var createFolderStart = function () {
546                                    var promptOptions = {
547                                        title: "Tạo thư mục mới",
548                                        buttons: {
549                                            confirm: {
550                                                label: "Lưu"
551                                            },
552                                            cancel: {
553                                                label: "Há»§y"
554                                            }
555                                        },
556                                        callback: function (result) {
557
558                                                var folderName = result === null ? null:result.trim();
559                                                var errMessage = '';
560
561                                                if (folderName === null) return true;
562
563                                            if (folderName === '') {
564                                                errMessage = 'Hãy nhập tên thư mục cần tạo!';
565                                            }
566
567                                            if (errMessage !== '') {
568                                                $(this.message).parent().find('.error-message').remove();
569                                                var error = $('<div></div>',{'class':'error-message', text:errMessage}).insertBefore(this.message);
570                                                $(this.message).find('input').focus();
571                                                return false;
572
573                                            }
574
575                                            createFolder(treeCurrentNode,folderName);
576                                        }
577                                    };
578
579                                    return bootbox.prompt(promptOptions);
580                                }
581
582                                var uploadStart = function () {
583                                    var userid = o.data.userinfo.us_id;
584                                    var promptOptions = {
585                                        title: "Tải lên",
586                                        message: "<form id='upload' method='post'  action='"
587                                                + api_url
588                                                + "space/upload' enctype='multipart/form-data'><div id='drop'>Kéo thả tệp vào đây <a> Chọn tệp </a><input type='hidden' name='response' value='1'/><input type='hidden' name='dir' value='"
589                                                + self.getTreeCurrentNode()
590                                                + "'/><input type='hidden' name='userid' value='"
591                                                + userid
592                                                + "'/><input type='file' name='upload_file' multiple /></div><ul></ul></form>",
593                                        buttons: {
594                                            success: {
595                                                label: "Xong",
596                                                className: "btn btn-primary",
597                                                callback: function (result) {
598
599                                                }
600                                            },
601                                        },
602                                        onEscape: function () {
603                                            uploadDone(self.getTreeCurrentNode());
604                                        }
605                                    };
606
607
608                                    return bootbox.dialog(promptOptions);
609                                }
610
611                                var uploadDone = function (result) {
612
613                                }
614
615                                var btnPreviewClick = function () {
616                                    var items = o.oGrid.getHighLightItem();
617                                    if ($(items).length == 0) {
618                                        var dirID = $(o.oTree.getSelectedNode())
619                                                .attr('id');
620                                        var item = o.data.DIRECTORIES[searchItemByID(
621                                                dirID, 'directory')];
622                                        item.type = 'directory';
623                                        items = [item];
624                                    }
625                                    previewFile(items[0]);
626                                }
627
628                                var previewFile = function (node) {
629                                    var content = "";
630
631                                    $ext = node.fileurl.split('.').pop();
632                                    $ext = $ext.toLowerCase();
633                                    if ($.inArray($ext, ["jpg", "jpeg", "png","gif","tiff","dvg","bmp"]) >= 0) {
634
635                                        content = "<img style='width:100%' src='"
636                                                + node.fileurl
637                                                + "' /><br />"
638                                                + node.name;
639                                        bootbox.alert({message:content, className:'preview'});
640                                        return false;
641                                    }
642
643                                    if ($.inArray($ext, ["flv", "mp4", "avi","m4v"]) >= 0) {
644                                        $.ajax({
645                                                    url: o.host
646                                                            + "preview/getVideoPreview/",
647                                                    type: "POST",
648                                                    data: {
649                                                        fileurl: node.fileurl,
650                                                        name: node.name
651                                                    },
652                                                    success: function (data,
653                                                            textStatus, jqXHR) {
654                                                        bootbox.alert(data);
655                                                    },
656                                                    error: function (jqXHR,
657                                                            textStatus,
658                                                            errorThrown) {
659                                                    }
660                                                });
661                                                return false;
662                                    }
663
664                                    if ($.inArray($ext, ["ogg"]) >= 0) {
665                                        content = '<audio controls>\
666                        <source src="'
667                                                + node.fileurl
668                                                + '" type="audio/ogg">\
669                      Your browser does not support the audio element.\
670                      </audio> <br />'
671                                                + node.name;
672                                        bootbox.alert(content);
673                                        return false;
674                                    }
675                                    if ($.inArray($ext, ["mp3"]) >= 0) {
676                                        content = '<audio controls>\
677                        <source src="'
678                                                + node.fileurl
679                                                + '" type="audio/mpeg">\
680                      Your browser does not support the audio element.\
681                      </audio> <br />'
682                                                + node.name;
683                                        bootbox.alert(content);
684                                        return false;
685                                    }
686
687                                    if ($.inArray($ext, ["ppt", "xls", "doc","pdf", "docx", "pptx", "xlsx"]) >= 0) {
688
689                                        $.ajax({
690                                            url: o.host
691                                                    + "preview/getFilePreview/"
692                                                    + node.id,
693                                            type: "POST",
694                                            data: {},
695                                            success: function (data,
696                                                    textStatus, jqXHR) {
697                                                bootbox.alert(data);
698                                            },
699                                            error: function (jqXHR, textStatus,
700                                                    errorThrown) {
701
702                                            }
703                                        });
704                                        return false;
705                                    }
706                                    if ($.inArray($ext, ["xvl"]) >= 0) {
707                                        var url = o.host.replace("ajax/", "");
708                                        var redirect = url
709                                                + 'frontend/lecture/';
710                                        self.redirectPost(redirect, {
711                                            fileid: node.id
712                                        });
713                                        return false;
714                                    }
715                                    $(".bootbox").addClass("preview");
716                                    var content = "KhÃŽng hỗ trợ xem trước loại tệp này, vui lòng tải xuống và xem trên máy";
717                                     bootbox.alert(content);
718
719                                }
720
721                                var uploadInit = function () {
722                                    var ul = $('#upload ul');
723
724                                    $('#drop a').click(function () {
725                                        $(this).parent().find('input').click();
726                                    });
727
728                                    $('#upload').fileupload(
729                                                    {
730                                                        dropZone: $('#drop'),
731                                                        add: function (e, data) {
732
733                                                            var tpl = $('<li class="working"><input type="text" value="0" data-width="48" data-height="48"'
734                                                                    + ' data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" /><p></p><span></span></li>');
735                                                            tpl.find('p').text(data.files[0].name).append('<i>'+ formatFileSize(data.files[0].size)+ '</i>');
736                                                            data.context = tpl.appendTo(ul);
737                                                            tpl.find('input').knob();
738                                                            tpl.find('span').click(
739                                                                                    function () {
740                                                                                        if (tpl.hasClass('working')) {jqXHR.abort();
741                                                                                     }
742                                                                                     tpl.fadeOut(function () {tpl.remove();});
743                                                                            });
744                                                            var jqXHR = data.submit();
745                                                        },
746                                                        progress: function (e, data) {
747
748                                                            // Calculate the
749                                                            // completion
750                                                            // percentage of the
751                                                            // upload
752                                                            var progress = parseInt(data.loaded / data.total * 100, 10);
753
754                                                            // Update the hidden
755                                                            // input field and
756                                                            // trigger a change
757                                                            // so that the
758                                                            // jQuery knob
759                                                            // plugin knows to
760                                                            // update the dial
761                                                            data.context.find('input').val(progress).change();
762                                                            if (progress == 100) {
763                                                                data.context.removeClass('working');
764                                                            }
765                                                        },
766                                                        fail: function (e, data) {
767                                                            // Something has
768                                                            // gone wrong!
769                                                            data.context.addClass('error');
770                                                        },
771                                                        done: function (e, data) {
772                                                            var newFileData = data.result;
773                                                            newFileData = $.parseJSON(data.result);
774                                                            if (newFileData.ERROR.errCode == 0) {
775                                                                for (var i = 0; i < $(newFileData.FILES).length; i++) {
776                                                                    var file = newFileData.FILES[i];
777                                                                    var node = {
778                                                                        thumbnail: file.thumbnail == '' ? null : o.filedomain+"/"+ file.thumbnail,
779                                                                        id: file.id,
780                                                                        name: file.name,
781                                                                        fileurl: file.fileurl,
782                                                                        parentID: file.parentID,
783                                                                        minetype: file.minetype,
784                                                                        size: file.size
785                                                                    };
786                                                                    o.oGrid.createNode(node);
787                                                                    o.data.FILES.push(node);
788                                                                }
789
790                                                                for (var i = 0; i < $(newFileData.DIRECTORIES).length; i++) {
791                                                                    var file = newFileData.DIRECTORIES[i];
792                                                                    var node = {
793                                                                        id: file.id,
794                                                                        name: file.name,
795                                                                        parentID: file.parentID,
796                                                                        minetype: file.minetype
797                                                                    };
798                                                                    o.oTree.createNode(node);
799                                                                    o.oGrid.createNode(node);
800                                                                    o.data.DIRECTORIES.push(node);
801                                                                }
802
803                                                                self.refreshStatusBar();
804                                                            }
805                                                        }
806
807                                                    });
808
809                                    $(document).on('drop dragover',
810                                            function (e) {
811                                                e.preventDefault();
812                                            });
813
814                                    function formatFileSize(bytes) {
815                                        if (typeof bytes !== 'number') {
816                                            return '';
817                                        }
818
819                                        if (bytes >= 1000000000) {
820                                            return (bytes / 1000000000)
821                                                    .toFixed(2)
822                                                    + ' GB';
823                                        }
824
825                                        if (bytes >= 1000000) {
826                                            return (bytes / 1000000).toFixed(2)
827                                                    + ' MB';
828                                        }
829
830                                        return (bytes / 1000).toFixed(2)
831                                                + ' KB';
832                                    }
833
834                                };
835
836                                var createFolder = function (parent, name) {
837                                    var postdata = {
838                                        fname: name,
839                                        fparentid: parent
840                                    };
841                                    var script = 'createdir';
842                                    /* isDev = true; */
843                                    sendCommand({
844                                        postdata: postdata,
845                                        script: script,
846                                        callbackSuccess: function (parseData) {
847                                            createFolderFinish(parseData);
848                                        },
849                                        callbackFail: function () {
850                                        }
851                                    });
852                                }
853
854                                var createFolderFinish = function (parseData) {
855                                    /* isDev = false; */
856                                    if (parseData.ERROR.errCode == 0) {
857                                        var node = {
858                                            id: parseData.id,
859                                            name: parseData.name,
860                                            parentID: parseData.parentID
861                                        };
862                                        o.oTree.createNode(node);
863                                        o.data.DIRECTORIES.push(node);
864                                        if (o.oGrid)
865                                            o.oGrid.reloadGrid();
866                                    }
867                                }
868                                /***********************************************
869                                 * CREATE FOLDER - END *
870                                 **********************************************/
871                                /***********************************************
872                                 * RENAME - START *
873                                 **********************************************/
874                                        var rename = function (item) {
875                                                /*
876                                                 * item = {id,name,type,parentID,newName}
877                                                 */
878                                        var postdata = {
879                                                data: JSON.stringify(item)
880                                            };
881                                                 sendCommand({
882                                             postdata: postdata,
883                                             script: 'rename',
884                                             callbackSuccess: function (parseData) {
885                                                 console.log(parseData);
886                                             }
887                                         });
888                                        }
889                                /***********************************************
890                                 * RENAME - END *
891                                 **********************************************/
892                                /***********************************************
893                                 * COPY & PASTE & MOVE - START * =***********
894                                 **********************************************/
895                                var copy = function (act) {
896                                    // detect selected items
897                                    // push to clipboard
898                                    var items = o.oGrid.getHighLightItem();
899
900                                    if ($(items).length == 0) {
901                                        var node = o.oTree.getSelectedNode();
902                                        var itemID = $(node).attr('id');
903
904                                        if (itemID == 0)
905                                            return false;
906
907                                        items[0] = o.data.DIRECTORIES[searchItemByID(
908                                                itemID, 'directory')];
909                                        items[0].type = 'directory';
910                                    }
911
912                                    if ($(items).length > 0) {
913                                        oClipBoard.items = items;
914                                        oClipBoard.act = act;
915                                    }
916                                    return true;
917                                }
918
919                                var paste = function () {
920                                    if ((oClipBoard.act != 'copy' && oClipBoard.act != 'move')
921                                            || oClipBoard.items == null)
922                                        return;
923
924                                    var items = [];
925                                    var aryDupplicated = [];
926                                    var messageText = '';
927                                    var destination = self.getTreeCurrentNode();
928
929                                        var destinationChildDirs = searchItemsByParent(destination, 'directory');
930                                        var destinationChildFiles = searchItemsByParent(destination, 'file');
931
932                                    items = oClipBoard.items;
933
934                                    for (var i = 0; i < items.length; i++) {
935                                        if (items[i].type == 'directory' ) {
936                                                for (var d = 0; d < destinationChildDirs.length; d++) {
937                                                        if (destinationChildDirs[d].name == items[i].name) {
938                                                                aryDupplicated.push(items[i]);
939                                                        }
940                                                }
941                                        }
942
943                                        if (items[i].type == 'file' ) {
944                                                for (var f = 0; f < destinationChildFiles.length; f++) {
945                                                        if (destinationChildFiles[f].name == items[i].name) {
946                                                                aryDupplicated.push(items[i]);
947                                                        }
948                                                }
949                                        }
950                                    }
951
952                                    for (var i = 0; i < items.length; i++) {
953                                        if (items[i].type == 'directory') {
954                                                items[i].childDirs = self.buildDirectoriesTree(items[i]);
955                                                items[i].childFiles = searchItemsByParent(items[i].id, 'file');
956                                        }
957                                    }
958
959                                    if (aryDupplicated.length > 0) {
960                                        if (aryDupplicated.length > 1){
961                                                messageText = 'Các thư mục (files) ';
962                                                messageText += '<ul>';
963                                                for (var m = 0; m < aryDupplicated.length; m++) {
964                                                        messageText += '<li><strong>' + aryDupplicated[m].name  + '</strong></li>';
965                                                }
966                                                messageText += '</ul>';
967                                        }
968                                        else {
969                                                var type = aryDupplicated[0].type;
970                                                messageText = type == 'directory' ? 'Thư mục <strong>' + aryDupplicated[0].name + '</strong>' : 'File <strong>' + aryDupplicated[0].name + '</strong>';
971                                        }
972
973                                        messageText += ' đã tồn tại, bạn có muốn ghi đÚ lên khÃŽng?';
974
975                                        var confirmOptions = {
976                                                message: messageText,
977                                                buttons: {
978                                                    confirm: {
979                                                        label: "Ghi đÚ"
980                                                    },
981                                                    cancel: {
982                                                        label: "Há»§y bỏ"
983                                                    }
984                                                },
985                                                callback: function (result) {
986                                                        console.log(items);
987                                                }
988                                        }
989
990                                        bootbox.confirm(confirmOptions);
991                                    }
992
993                                    console.log(items);
994                                }
995
996                                var pasteComplete = function (items, destination) {
997                                        if (items.length == 0 || destination == null) return false;
998                                    var postdata = {
999                                            act: oClipBoard.act,
1000                                            destination: destination,
1001                                            data: JSON.stringify(items)
1002                                        };
1003                                        var script = oClipBoard.act;
1004
1005                                        sendCommand({
1006                                            postdata: postdata,
1007                                            script: script,
1008                                            callbackSuccess: function (parseData) {
1009                                                if (oClipBoard.act == 'copy') {
1010                                                    $(parseData.DIRECTORIES).each(
1011                                                            function (index) {
1012                                                                o.data.DIRECTORIES[$(o.data.DIRECTORIES).length] = this;
1013                                                            });
1014
1015                                                    $(parseData.FILES).each(
1016                                                            function (index) {
1017                                                                o.data.FILES[$(o.data.FILES).length] = this;
1018                                                            });
1019
1020                                                    o.data.DIRECTORIES.sort(function (a, b) {
1021                                                        return a.parentID - b.parentID;
1022                                                    });
1023
1024                                                    o.oTree.setData(o.data.DIRECTORIES);
1025                                                    o.oGrid.setData(o.data);
1026                                                    o.oTree.createCopyNode(parseData.DIRECTORIES);
1027                                                    o.oGrid.reloadGrid();
1028                                                } else if (oClipBoard.act == 'move') {
1029
1030                                                }
1031
1032                                                oClipBoard.act == '';
1033                                                oClipBoard.items = null;
1034                                            }
1035                                        });
1036                                }
1037
1038                                var move = function () {
1039
1040                                }
1041
1042                                var copyTo = function () {
1043
1044                                }
1045
1046                                var moveTo = function () {
1047
1048                                }
1049
1050                                /***********************************************
1051                                 * COPY & PASTE & MOVE - END *
1052                                 **********************************************/
1053                                this.rename = function (item) {
1054                                        rename(item);
1055                                }
1056
1057                                this.buildDirectoriesTree = function (objDir) {
1058                                        var parentID = objDir.id;
1059                                        var aryDirs = [];
1060                                        var branch = [];
1061                                        var childDirs = [];
1062                                        var childFiles = [];
1063
1064                                        for(var i = 0; i < o.data.DIRECTORIES.length; i++) {
1065                                                aryDirs[i] = o.data.DIRECTORIES[i];
1066                                        }
1067
1068                                        for (var i = 0; i < aryDirs.length; i++) {
1069                                                if (aryDirs[i].parentID == parentID) {
1070                                                        childDirs = self.buildDirectoriesTree(aryDirs[i]);
1071                                                        aryDirs[i].childDirs = childDirs;
1072                                                        aryDirs[i].childFiles = searchItemsByParent(aryDirs[i].id, 'file');
1073                                                        branch.push(aryDirs[i]);
1074                                                }
1075                                        }
1076
1077                                        return branch;
1078                                }
1079
1080                                this.searchParents = function (objDir) {
1081                                        var parentID = objDir.parentID;
1082                                        var aryDirs = [];
1083
1084                                        aryDirs[0] = o.homeNode;
1085                                        for(var i = 1; i <= o.data.DIRECTORIES.length; i++) {
1086                                                aryDirs[i] = o.data.DIRECTORIES[i - 1];
1087                                        }
1088
1089                                        for (var i = 0; i < aryDirs.length; i++) {
1090                                                if (aryDirs[i].id == parentID) {
1091                                                        self.searchParents(aryDirs[i]);
1092                                                        if ($.inArray(aryDirs[i], aryPath) == -1) aryPath.push(aryDirs[i]);
1093                                                }
1094                                        }
1095                                }
1096
1097                                this.deleteItem = function (item) {
1098
1099                                    var confirmText = 'Bạn có muốn xóa ';
1100
1101                                    if ($.isArray(item) && item.length > 1) {
1102                                        confirmText += 'các thư mục (và files) đã chọn?';
1103                                    } else if (item.length == 1) {
1104                                        if (item[0].id == 0)
1105                                            return false;
1106                                        confirmText += (item[0].type == 'directory') ? 'thư mục'
1107                                                : 'file';
1108                                        confirmText += ' <span style="font-weight:bold">'
1109                                                + item[0].name
1110                                                + "</span> khÃŽng?";
1111                                    }
1112
1113                                    confirmText += '<br /><div style="color:red">(hành động này sẜ xóa tất cả thư mục con và các file trong các thư mục đã chọn)</div>';
1114
1115                                    var parentID = item[0].parentID;
1116
1117                                    for (var i = 0; i < item.length; i++) {
1118                                        if (item[i].type == 'directory') {
1119                                            item[i] = self.getAllDirChilds(item[i]);
1120                                        }
1121                                    }
1122
1123                                    var confirmOptions = {
1124                                        message: confirmText,
1125                                        buttons: {
1126                                            confirm: {
1127                                                label: "Xóa"
1128                                            },
1129                                            cancel: {
1130                                                label: "KhÃŽng xóa"
1131                                            }
1132                                        },
1133                                        callback: function (result) {
1134                                            if (result) {
1135                                                var delobj = JSON.stringify(item);
1136                                                var postdata = {
1137                                                    delobj: delobj
1138                                                };
1139                                                var script = 'delete';
1140                                                sendCommand({
1141                                                    postdata: postdata,
1142                                                    script: script,
1143                                                    callbackSuccess: function (
1144                                                            parseData) {
1145                                                        if ($(parseData.DIRECTORIES).length > 0) {
1146                                                            $(parseData.DIRECTORIES).each(
1147                                                                function (index) {
1148                                                                    o.oTree.deletion(this);
1149                                                                    o.oGrid.deletion(this, 'directory');
1150                                                                });
1151                                                        }
1152
1153                                                        if ($(parseData.FILES).length > 0) {
1154                                                            $(parseData.FILES).each(
1155                                                                function (index) {
1156                                                                    var file = o.data.FILES[searchItemByID(this, 'file')];
1157                                                                    o.oGrid.deletion(this, file.minetype);
1158                                                                });
1159                                                        }
1160                                                    },
1161                                                    callbackDone: function (obj) {
1162                                                        if ($(parseData.DIRECTORIES).length > 0) {
1163                                                            $(parseData.DIRECTORIES).each(
1164                                                                function (index) {
1165                                                                    o.data.DIRECTORIES.splice(searchItemByID(this, 'directory'), 1);
1166                                                                });
1167                                                        }
1168
1169                                                        if ($(parseData.FILES).length > 0) {
1170                                                            $(parseData.FILES).each(
1171                                                                function (index) {
1172                                                                    o.data.FILES.splice(searchItemByID(this, 'file'), 1);
1173                                                                });
1174                                                        }
1175
1176                                                        o.oTree.setData(o.data.DIRECTORIES);
1177                                                        o.oGrid.setData(o.data);
1178                                                        self.setTreeCurrentNode(parentID);
1179                                                        o.oGrid.reloadGrid();
1180                                                        self.refreshStatusBar();
1181                                                    },
1182                                                    callbackFail: function () {
1183                                                    }
1184                                                });
1185                                            }
1186                                        }
1187                                    };
1188
1189                                    bootbox.confirm(confirmOptions);
1190                                }
1191
1192                                this.getAllDirChilds = function (oDirItem) {
1193                                    var aryChildDirTmp = [];
1194                                    var aryChildDirID = [];
1195                                    var aryChildFiles = searchItemsByParent(
1196                                            oDirItem.id, 'file');
1197                                    var aryChildDirs = [];
1198
1199                                    getAllDirChild(oDirItem.id, aryChildDirTmp);
1200                                    for (var d = 1; d < aryChildDirTmp.length; d++) {
1201                                        aryChildDirID[d - 1] = aryChildDirTmp[d];
1202                                    }
1203
1204                                    for (var j = 0; j < aryChildDirID.length; j++) {
1205                                        if (o.data.DIRECTORIES[searchItemByID(
1206                                                aryChildDirID[j], 'directory')] != undefined)
1207                                            aryChildDirs[aryChildDirs.length] = o.data.DIRECTORIES[searchItemByID(
1208                                                    aryChildDirID[j],
1209                                                    'directory')];
1210
1211                                        var aryTmp = searchItemsByParent(
1212                                                aryChildDirID[j], 'file');
1213                                        if (aryTmp.length > 0)
1214                                            for (var f in aryTmp) {
1215                                                aryChildFiles[aryChildFiles.length] = aryTmp[f];
1216                                            }
1217                                    }
1218
1219                                    oDirItem.childDirs = aryChildDirs;
1220                                    oDirItem.childFiles = aryChildFiles;
1221                                    return oDirItem;
1222                                }
1223
1224                                this.setTreeCurrentNode = function (treeNode) {
1225                                    // fire when click a node on Tree
1226                                    // then fire action of Grid
1227                                    treeCurrentNode = treeNode;
1228                                    if (o.oGrid)
1229                                        o.oGrid.reloadGrid();
1230                                }
1231
1232
1233                                this.getTreeCurrentNode = function () {
1234                                    return treeCurrentNode;
1235                                }
1236
1237                                this.gridNodeDblClick = function (node) {
1238                                    if (node.minetype == 'directory') {
1239                                        var treeNode = $('#' + o.tree)
1240                                                .find(
1241                                                        'UL.vstree[rel^="node'
1242                                                        + node.parentID
1243                                                        + '"] > LI[rel^="folder"] > A#'
1244                                                        + node.id);
1245                                        o.oTree.activeNode(treeNode);
1246                                    } else {
1247                                        // execute or preview file
1248                                        previewFile(node);
1249                                    }
1250                                };
1251
1252                                this.createNewFolder = function () {
1253
1254                                }
1255
1256                                this.updateData = function (p) {
1257                                    if (p.item == undefined)
1258                                        p.item = null;
1259                                    if (p.updateAll == undefined)
1260                                        p.updateAll = false;
1261                                    if (p.from == undefined)
1262                                        p.from = null;
1263                                    if (p.type == undefined)
1264                                        p.type = null;
1265                                    if (p.callback == undefined)
1266                                        p.callback = null;
1267
1268                                    var obj = p.from == 'tree' ? o.oGrid
1269                                            : o.oTree;
1270                                    if (!p.updateAll) {
1271                                        var index = searchItemByID(p.item.id,
1272                                                p.type);
1273                                        switch (p.type) {
1274                                            case 'directory':
1275                                                o.data.DIRECTORIES[index].name = p.item.name;
1276                                                o.data.DIRECTORIES[index].parentID = p.item.parentID;
1277                                                break;
1278                                            case 'file':
1279                                                o.data.FILES[index].name = p.item.name;
1280                                                o.data.FILES[index].parentID = p.item.parentID;
1281                                                o.data.FILES[index].minetype = p.item.minetype;
1282                                                o.data.FILES[index].fileurl = p.item.fileurl;
1283                                                break;
1284                                            default:
1285                                                break;
1286                                        }
1287                                    }
1288
1289                                    o.oTree.setData(o.data.DIRECTORIES);
1290                                    o.oGrid.setData(o.data);
1291
1292                                    if (p.callback != null) {
1293                                        eval('obj.' + p.callback + '(p.item);')
1294                                    }
1295
1296                                    // call sendCommand
1297                                }
1298
1299                                this.searchItemsByParent = function (parentID, type) {
1300                                    return searchItemsByParent(parentID, type);
1301                                }
1302
1303                                this.searchItemByID = function (id, type) {
1304                                    return searchItemByID(id, type);
1305                                }
1306
1307                                this.refreshStatusBar = function () {
1308                                    var totalSize = 0;
1309                                    var message = '';
1310                                    if (o.data.FILES.length > 0) {
1311                                        for (var i = 0; i < o.data.FILES.length; i++) {
1312                                            totalSize += parseInt(o.data.FILES[i].size);
1313                                        }
1314                                    }
1315
1316                                    message = '<span>Tổng dung lượng đã sá»­ dụng: <strong>'
1317                                            + self.formatFileSize(totalSize)
1318                                            + '</strong></span>';
1319
1320                                    var items = o.oGrid.getHighLightItem();
1321                                    if (items.length == 0) {
1322                                        var id = $(o.oTree.getSelectedNode()).attr('id');
1323                                        var item = o.data.DIRECTORIES[self.searchItemByID(id, 'directory')];
1324                                    }
1325                                    if (items.length == 1) {
1326                                        if ((typeof items[0].minetype !== 'undefined')) {
1327                                            message += '<span>Tệp: <strong>'
1328                                                    + items[0].name
1329                                                    + '</strong></span>';
1330                                            message += '<span> - Dung lượng: <strong>'
1331                                                    + self
1332                                                    .formatFileSize(items[0].size)
1333                                                    + '</strong></span>';
1334                                        } else {
1335                                            message += '<span>Thư mục: <strong>'
1336                                                    + items[0].name
1337                                                    + '</strong></span>';
1338                                        }
1339                                    } else if (items.length > 1) {
1340                                        var selectedSize = 0;
1341                                        for (var i = 0; i < items.length; i++) {
1342                                            selectedSize += (typeof items[i].minetype !== 'undefined') ? parseInt(items[i].size)
1343                                                    : 0;
1344                                        }
1345                                        message += '<span><strong>'
1346                                                + items.length
1347                                                + ' tệp (thư mục)</strong> được chọn</span>';
1348                                        message += '<span> - Dung lượng: <strong>'
1349                                                + self
1350                                                .formatFileSize(selectedSize)
1351                                                + '</strong></span>';
1352                                    }
1353
1354                                    $(statusbar).html(message);
1355                                }
1356
1357                                this.refreshNavigator = function () {
1358                                        var navigatorBar = $('DIV#' + o.navigationbar + ' > UL.breadcrumb');
1359                                        $(navigatorBar).find('LI').remove();
1360
1361                                        var nodeID = self.getTreeCurrentNode();
1362                                        if (nodeID != 0) {
1363                                                var node = o.data.DIRECTORIES[searchItemByID(nodeID, 'directory')];
1364                                                self.searchParents(node);
1365                                                aryPath.push(node);
1366                                        }
1367                                        else {
1368                                                if (o.homeNode == null) self.setHomeNode();
1369                                                aryPath.push(o.homeNode);
1370                                        }
1371
1372                                        for(var idx = 0; idx < aryPath.length; idx++) {
1373                                                var i = $('<i></i>',{'class':'ace-icon fa fa-folder home-icon'});
1374                                                var a = $('<a></a>',{text: aryPath[idx].name});
1375                                                var li = $('<li></li>');
1376                                                if (aryPath[idx].id == 0)
1377                                                        $(li).append(i, a);
1378                                                else
1379                                                        $(li).append(a);
1380
1381                                                $(navigatorBar).append(li);
1382                                        }
1383
1384                                        aryPath.splice(0,aryPath.length);
1385                                }
1386
1387                                this.redirectPost = function (location, args) {
1388                                    var form = '';
1389                                    $.each(args, function (key, value) {
1390
1391                                        form += "<input type='hidden' name='"
1392                                                + key + "' value='" + value
1393                                                + "'>";
1394                                    });
1395                                    $(
1396                                            '<form action="' + location
1397                                            + '" method="POST">' + form
1398                                            + '</form>').appendTo(
1399                                            'body').submit();
1400                                }
1401
1402                                this.formatFileSize = function (size) {
1403                                    var i;
1404                                    i = Math.floor(Math.log(size)
1405                                            / Math.log(1024));
1406                                    if ((size === 0) || (parseInt(size) === 0)) {
1407                                        return "0 kB";
1408                                    } else if (isNaN(i)
1409                                            || (!isFinite(size))
1410                                            || (size === Number.POSITIVE_INFINITY)
1411                                            || (size === Number.NEGATIVE_INFINITY)
1412                                            || (size == null) || (size < 0)) {
1413                                        console.info("Throwing error");
1414                                        throw Error(""
1415                                                + size
1416                                                + " did not compute to a valid number to be humanized.");
1417                                    } else {
1418                                        return (size / Math.pow(1024, i))
1419                                                .toFixed(2)
1420                                                * 1
1421                                                + " "
1422                                                + ["B", "KB", "MB", "GB",
1423                                                    "TB", "PB", "EB", "ZB",
1424                                                    "YB"][i];
1425                                    }
1426                                }
1427
1428                                this.setHomeNode = function () {
1429                                        o.homeNode = {id:0, name:o.oTree.getRootName(), parentID:-1};
1430                                }
1431
1432                                this.getFileHosting = function () {
1433                                        return o.filehosting;
1434                                }
1435                                this.getFileDomain = function () {
1436                                        return o.filedomain;
1437                                }
1438
1439                                this.initialize = function () {
1440                                    init();
1441                                    return this;
1442                                };
1443
1444                                return this.initialize();
1445                            }
1446
1447                        });
1448                    })(jQuery);
Note: See TracBrowser for help on using the repository browser.