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

Last change on this file since 882 was 882, checked in by dungnv, 10 years ago

Đang sửa chức năng Copy khi thư mục đích có các item trùng tên

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