if(jQuery) (function($){ $.extend($.fn, { violetTree : function (o) { if( !o ) var o = {}; if( o.data == undefined ) o.data = null; if( o.rootName == undefined ) o.rootName = 'Thư mục gốc'; if( o.draggable == undefined ) o.draggable = false; if( o.expandSpeed == undefined ) o.expandSpeed= 500; if( o.collapseSpeed == undefined ) o.collapseSpeed= 500; if( o.expandEasing == undefined ) o.expandEasing = null; if( o.collapseEasing == undefined ) o.collapseEasing = null; if( o.manager == undefined) o.manager = null; var treeNodes = []; var oContainer = this; var selectedNode = null; var documentBoundEvent = false; var createNode = function (node) { if( !node ) var node = {}; if( node.item == undefined ) node.item = null; //item.id, item.name, item.parentID if( node.isRoot == undefined ) node.isRoot = false; if( node.defaultStatus == undefined ) node.defaultStatus = 0; //0: collapsed; 1:expanded; if( node.showContextMenu == undefined ) node.showContextMenu = true; //0: collapsed; 1:expanded; var parentNode = node.isRoot == true ? oContainer : $(oContainer).find('UL.vstree > LI[rel="folder"] > A#' + node.item.parentID); var nodeClass = node.isRoot == true ? 'home':'directory'; var hidden = (node.isRoot == true || node.item.parentID == 0 ) ? null:'display:none'; var defaulState = (node.isRoot == false && node.defaultStatus == 1 ) ? 'expanded' : 'collapsed'; var a = $('',{id: node.item.id,href: '#',rel: node.item.name,text: node.item.name}); var li = $('
  • ',{'class': nodeClass,rel: 'folder'}).append(a); var ul = $('',{'class':'vstree',style:hidden}).append(li); $(li).addClass(defaulState); bindNodeEvents(a); treeNodes[node.item.id] = {id:node.item.id, name:node.item.name, parentID:node.item.parentID, html:ul, status:defaulState, isRoot:node.isRoot}; if (node.isRoot == false) $(parentNode).parent().append(ul); else $(parentNode).append(ul); return (parentNode.length == 1); }; var bindNodeEvents = function (node) { if (node == null) return false; //click event $(node).bind("click", function (e){if(e.button == 0)nodeClick(this);return false;}); //Press F2 to rename, ESC to cancel rename if (documentBoundEvent == false) { $(oContainer).bind('keydown','keypress', function(e) { switch( e.keyCode ) { case 113: renameInit(selectedNode); break; case 27: renameCancel(selectedNode); break; case 46: var dirID = $(selectedNode).attr('id'); var dirObj = {}; dirObj.id = treeNodes[dirID].id; dirObj.name = treeNodes[dirID].name; dirObj.parentID = treeNodes[dirID].parentID; dirObj.type = 'directory'; if (e.keyCode == 46) o.manager.deleteItem([dirObj]); break; case 13: default: break; } }); documentBoundEvent = true; } disabledItemsList = []; $(node).contextMenu({menu: 'treeMenu',disabledItems: disabledItemsList}, function(action, el, pos) { var dirID = $(el).attr('id'); var item = $(treeNodes[dirID].html).find('> LI > A#' + dirID); var dirObj = {}; dirObj.id = treeNodes[dirID].id; dirObj.name = treeNodes[dirID].name; dirObj.parentID = treeNodes[dirID].parentID; dirObj.type = 'directory'; switch(action) { case 'rename': renameInit(item); break; case 'newfolder': o.manager.createNewFolder(); break; case 'share': case 'copy': case 'cut': break; case 'delete': o.manager.deleteItem([dirObj]); break; default: break; } }); }; var nodeClick = function (node) { var folderID = $(node).attr('id'); selectedNode = hightlightNode(node); o.manager.setTreeCurrentNode(folderID); if (treeNodes[folderID].isRoot) { return; } if (treeNodes[folderID].status == 'collapsed') { expandNode(node); treeNodes[folderID].status = 'expanded'; } else { collapNode(node); treeNodes[folderID].status = 'collapsed'; } }; var hightlightNode = function (node) { $(oContainer).find('.currentDir').removeClass('currentDir'); $(node).addClass('currentDir'); $(node).select(); return node; } var expandNode = function (node) { var li = $(node).parent(); $(li).find('> UL:hidden').slideDown({ duration: o.expandSpeed, easing: o.expandEasing }); $(li).removeClass('collapsed').addClass('expanded'); }; var collapNode = function (node) { var li = $(node).parent(); $(li).find('> UL').slideUp({ duration: o.expandSpeed, easing: o.expandEasing }); $(li).removeClass('expanded').addClass('collapsed'); }; var initTree = function () { if (o.data == null) { console.error(o.data, 'No directory to display!'); return; } $(oContainer).find ('.vstree').remove(); var homeNode = createNode({ item: {id:0, name:o.rootName, parentID:-1}, isRoot: true }); if (homeNode && o.data.length > 0) { for (var i = 0; i < o.data.length; i++) { createNode ({item: o.data[i]}); } } o.manager.setTreeCurrentNode(0); $(oContainer).attr('unselectable','on') .css({'-moz-user-select':'-moz-none', '-moz-user-select':'none', '-o-user-select':'none', '-khtml-user-select':'none', '-webkit-user-select':'none', '-ms-user-select':'none', 'user-select':'none' }).bind('selectstart', function(){ return false;}); }; /****************** * RENAME - START * ******************/ var renameInit = function (node) { var editor = $('',{class:'rename', type: 'text', value:$(node).text()}); $(editor).bind('focusout', function(e){renameCancel(node)}); $(editor).bind('keypress', function(e){ var keycode = (e.keyCode ? e.keyCode : e.which); if(keycode == '13') renameComplete(node); e.stopPropagation(); }); $(node).text(''); $(node).append(editor); $(editor).focus(); $(editor).select(); } var renameCancel = function (node) { var dirID = $(node).attr('id'); $(node).find('>INPUT').remove(); $(node).text(treeNodes[dirID].name); $(node).select(); } var renameComplete = function (node) { var editor = $(node).find('>INPUT'); var dirID = $(node).attr('id'); var newName = $(editor).val(); $(node).attr('rel', newName); $(node).text(newName); $(node).find('>INPUT').remove(); treeNodes[dirID].name = newName; updateData(dirID, 'rename'); } /****************** * RENAME - END * ******************/ /****************** * DELTE - START * ******************/ var destroyNode = function (node) { var dirID = $(node).attr('id'); $(node).parent().parent().remove(); delete treeNodes[dirID]; } /****************** * DELTE - END * ******************/ /******************************* * COPY & PASTE & MOVE - START * *******************************/ var copyNode = function (source){ } var pasteNode = function (destination) { } var moveNode = function (source, destination) { } /***************************** * COPY & PASTE & MOVE - END * *****************************/ var updateData = function (id, act) { for (var i = 0; i < o.data.length; i++) { if (o.data[i].id == id) { if(act == 'deletion') { delete o.data[i]; } else { o.data[i].name = treeNodes[id].name o.data[i].parentID = treeNodes[id].parentID; } break; } } o.manager.updateData({item:treeNodes[id], from:'tree', type:'directory', callback:act}); } this.deletion = function (id) { destroyNode($(oContainer).find('A#'+id)); } this.setData = function (data) { o.data = data; } this.getRoot = function () { return treeNodes[0]; } this.initialize = function () { initTree(); return this; }; return this.initialize(); } }); })(jQuery);