/** * CheckTree(ycTIN Edition) v0.1 (jQuery Plugins) * * @author Timmy Tin (ycTIN) * @license GPL * @version 0.1 * @copyright Timmy Tin (ycTIN) * @website http://project.yctin.com/checktree/ * * this plugins is improved CheckTree v0.2, Project * Website: http://static.geewax.org/checktree/ * Author: JJ Geewax <jj@geewax.org> * * @edit by: James * @edit date: 2010-06-07 */ // Create a closure (function(jQuery){ // Your base, I'm in it! /* jQuery.fn['original'+methods+'Method'] = jQuery.fn.addClass; jQuery.fn.addClass = function(){ // Execute the original method. var result = jQuery.fn.originalAddClassMethod.apply( this, arguments ); // trigger a custom event jQuery(this).trigger('cssClassChanged'); // return the original result return result; } */ var methods = ['addClass', 'toggleClass', 'removeClass']; $.each(methods, function (index, method) { var originalMethod = $.fn[method]; $.fn[method] = function () { //var oldClass = this[0].className; var result = originalMethod.apply(this, arguments); //var newClass = this[0].className; this.trigger("on"+method); return result; }; }); })(jQuery); (function(jQuery){ jQuery.fn.checkTree = function(settings){ settings = jQuery.extend({ /* Callbacks The callbacks should be functions that take one argument. The checkbox tree will return the jQuery wrapped LI element of the item that was checked/expanded. */ onExpand: null, onCollapse: null, onCheck: null, onUnCheck: null, onHalfCheck: null, onLabelHoverOver: null, onLabelHoverOut: null, /* Valid choices: 'expand', 'check' */ labelAction: "check", attrHalfChecked: "checked", collapseAll: false, debug: false }, settings); var $tree = this; $tree.clear = function(){ $tree.find(":checkbox").attr("checked", ""); }; $tree.getValue = function(){ var checked = []; $tree.find(":checkbox").filter(":checked").each(function(){ checked.push(jQuery(this).val()); }); return checked.join(','); }; $tree.setValue = function(fieldValues){ /* $field = $tree.find(":checkbox").each(function(){ var value = jQuery(this).val(); if($.inArray(value, fieldValue)!=-1){ jQuery(this).attr('checked','true'); }else{ jQuery(this).attr('checked',''); } });*/ $tree.find(":checkbox").val(fieldValues); }; $tree.update = function(){ $tree.find("li").each(function(){ var $checkbox = jQuery(this).children('.checkbox'); if (jQuery(this).children(':checkbox').attr("checked")) $checkbox.addClass('checked'); else { $checkbox.removeClass('checked'); } }); $tree.find("li").each(function(){ if (jQuery(this).is(":has(ul)")) { var $checkbox = jQuery(this).children('.checkbox'); var $input_checkbox = jQuery(this).contents().find('.checkbox'); var $input_checkbox_checked = jQuery(this).contents().find('.checked'); if ($input_checkbox_checked.length == 0) { $checkbox.removeClass("checked half_checked").siblings(":checkbox").attr("checked", ""); } else if ($input_checkbox.length == $input_checkbox_checked.length) { $checkbox.removeClass("half_checked").addClass('checked').siblings(":checkbox").attr("checked", "checked"); } else { $checkbox.removeClass("checked").addClass('half_checked').siblings(":checkbox").attr("checked", settings.attrHalfChecked); } } }); }; //------------------------------------------------------------- $tree.find("li").find(":checkbox").change(function(){ var $all = jQuery(this).siblings("ul").find(":checkbox"); var $checked = $all.filter(":checked"); if ($all.length == $checked.length) { jQuery(this).attr("checked", "checked").siblings(".checkbox").removeClass("half_checked").addClass("checked"); if (settings.onCheck) settings.onCheck(jQuery(this).parent()); } else if ($checked.length == 0) { jQuery(this).attr("checked", "").siblings(".checkbox").removeClass("checked").removeClass("half_checked"); if (settings.onUnCheck) settings.onUnCheck(jQuery(this).parent()); } else { if (settings.onHalfCheck && !jQuery(this).siblings(".checkbox").hasClass("half_checked")) settings.onHalfCheck(jQuery(this).parent()); jQuery(this).attr("checked", settings.attrHalfChecked).siblings(".checkbox").removeClass("checked").addClass("half_checked"); } }).hide().end().each(function(){ if (settings.collapseAll) { jQuery(this).find("ul").each(function(){ if (!jQuery(this).siblings(".expanded").length) jQuery(this).hide(); }); } var $label = jQuery(this).children("label").clone(); var $inputCheckbox = jQuery(this).children(":checkbox"); var $checkbox = jQuery('<div class="checkbox"></div>'); var $arrow = jQuery('<div class="arrow"></div>'); if (jQuery(this).is(":has(ul)")) { //if (jQuery(this).children("ul").is(":hidden")){ // bug when container was hiden if (jQuery(this).children("ul").css("diaplay")== "hidden"){ $arrow.addClass("collapsed"); } else{ $arrow.addClass("expanded"); } $arrow.click(function(){ jQuery(this).siblings("ul").toggle(); if (jQuery(this).hasClass("collapsed")) { jQuery(this).addClass("expanded").removeClass("collapsed"); if (settings.onExpand){ settings.onExpand(jQuery(this).parent()); } } else { jQuery(this).addClass("collapsed").removeClass("expanded"); if (settings.onCollapse){ settings.onCollapse(jQuery(this).parent()); } } }); } $checkbox.click(function(){ jQuery(this).toggleClass("checked").removeClass("half_checked"); jQuery(this).siblings(":checkbox").attr("checked", (jQuery(this).hasClass("checked") ? "checked" : "")); if (jQuery(this).hasClass("checked")) { if (settings.onCheck) settings.onCheck(jQuery(this).parent()); jQuery(this).siblings("ul").find(".checkbox").not(".checked").removeClass("half_checked").addClass("checked").each(function(){ if (settings.onCheck) settings.onCheck(jQuery(this).parent()); }).siblings(":checkbox").attr("checked", "checked"); } else { if (settings.onUnCheck) settings.onUnCheck(jQuery(this).parent()); jQuery(this).siblings("ul").find(".checkbox").removeClass("half_checked").filter(".checked").each(function(){ if (settings.onUnCheck) settings.onUnCheck(jQuery(this).parent()); jQuery(this).removeClass("checked"); }).siblings(":checkbox").attr("checked", ""); } jQuery(this).parents("ul").siblings(":checkbox").change(); }); if (jQuery(this).children('.checkbox').hasClass('checked')) $checkbox.addClass('checked'); else if (jQuery(this).children(':checkbox').attr("checked")) { $checkbox.addClass('checked'); jQuery(this).parents("ul").siblings(":checkbox").change(); } else if (jQuery(this).children('.checkbox').hasClass('half_checked')) $checkbox.addClass('half_checked'); jQuery(this).children(".arrow").remove(); jQuery(this).children(".checkbox").remove(); jQuery(this).children("label").remove(); if (jQuery(this).is(":has(ul)")){ jQuery(this).prepend($label).prepend($checkbox).prepend($arrow); }else{ jQuery(this).prepend($label).prepend($checkbox); } }).find("label").click(function(){ switch (settings.labelAction) { case 'expand': jQuery(this).siblings(".arrow").click(); break; case 'check': jQuery(this).siblings(".checkbox").click(); break; } }).hover(function(){ jQuery(this).addClass("hover"); if (settings.onLabelHoverOver) settings.onLabelHoverOver(jQuery(this).parent()); }, function(){ jQuery(this).removeClass("hover"); if (settings.onLabelHoverOut) settings.onLabelHoverOut(jQuery(this).parent()); }).end(); return $tree; }; })(jQuery); (function(jQuery){ jQuery.fn.pagePermission = function(settings){ settings = jQuery.extend({ defaultPermission : { "PermisstionSave" : "0", "PermisstionEdit" : "0", "PermisstionDelete" : "0" } } , settings); var $permission = this; $permission.getPermission = function(){ var mapData = {}; $permission.find(".checkbox.permis_action_object").each(function(){ var self = $(this) , permis = null; var key = self.attr("keycode"); if(mapData[key]){ permis = mapData[key]; }else{ permis = jQuery.extend({} , settings.defaultPermission); mapData[key] = permis; } if( self.hasClass("checked") && !self.hasClass("disabled") ){ permis[self.attr("action_type")] = 1; } }); return mapData; } $permission.getPermissionString = function(){ return JSON.stringify($permission.getPermission()).replace(/"/g, "'"); } var datasource = {}; if( settings && settings.input_datasource ){ var strdata = settings.input_datasource.val(); if ( !(typeof strdata !== "string" || !strdata )) { strdata = jQuery.trim( strdata ).replace(/'/g, '"'); datasource = window.JSON.parse( strdata ); } } $permission.find("li").find(":checkbox").each(function(){ var self = jQuery(this); var parent = self.parent(); var checkBox = parent.find(".checkbox"); checkBox.attr("action_type" , "view"); if(self.attr("activepermis") == "1"){ var chkChild = parent.find("ul :checkbox"); if( chkChild.length == 0 ){ var objHtml = jQuery(createCheckListPermission(self)); checkBox.click(function(){ if(checkBox.hasClass("checked")){ objHtml.find(".checkbox").each(function(){ var selfCheck = jQuery(this); //selfCheck.addClass("checked"); // <---����͡����� view � ������ permiss ���� ������ʤ�ҷ����� ---> handleVertical(selfCheck.closest("ul") , selfCheck.attr("action_type")); }); }else{ objHtml.find(".checkbox").each(function(){ var selfCheck = jQuery(this); selfCheck.removeClass("checked"); handleVertical(selfCheck.closest("ul") , selfCheck.attr("action_type")); }); } }); objHtml.find(".checkbox").click(function(){ var selfCheck = jQuery(this); if(checkBox.hasClass("checked")){ selfCheck.toggleClass("checked"); } handleVertical(selfCheck.closest("ul") , selfCheck.attr("action_type")); /*jQuery(this).closest("ul").children("li.head-control").find("[action_type="+jQuery(this).attr("action_type")+"]").change(function(){ var $all = jQuery(this).siblings("ul").find(":checkbox"); var $checked = $all.filter(":checked"); if ($all.length == $checked.length) { jQuery(this).attr("checked", "checked").siblings(".checkbox").removeClass("half_checked").addClass("checked"); if (settings.onCheck) settings.onCheck(jQuery(this).parent()); } else if ($checked.length == 0) { jQuery(this).attr("checked", "").siblings(".checkbox").removeClass("checked").removeClass("half_checked"); if (settings.onUnCheck) settings.onUnCheck(jQuery(this).parent()); } else { if (settings.onHalfCheck && !jQuery(this).siblings(".checkbox").hasClass("half_checked")) settings.onHalfCheck(jQuery(this).parent()); jQuery(this).attr("checked", settings.attrHalfChecked).siblings(".checkbox").removeClass("checked").addClass("half_checked"); } });*/ }); objHtml.insertAfter(checkBox); objHtml.find(".checkbox.permis_action_object").each(function(){ var selfChk = jQuery(this); var permis = datasource[selfChk.attr("keycode")]; if( permis ){ if(permis[selfChk.attr("action_type")] == 1){ selfChk.addClass("checked"); handleVertical(selfChk.closest("ul") , selfChk.attr("action_type")); } } }); objHtml.closest("li").children(".checkbox[action_type=view][checktype!=head]").bind("onaddClass ontoggleClass onremoveClass" , function(){ var selfChk = jQuery(this); handleVertical(selfChk.closest("ul") , selfChk.attr("action_type")); }); var ulnode = parent.parent(); if( ulnode.children("li.head-control").length == 0 ){ var objHtmlHead = jQuery(createHeadCheckListPermission()); objHtmlHead.find(".checkbox").click(function(){ var self = jQuery(this); var isHandleChild = false; if( self.is("[action_type=view]") ){ self.toggleClass("checked").removeClass("half_checked"); isHandleChild = true; var isChecked = self.hasClass("checked"); self.closest("li").siblings().find(".checkbox[action_type="+self.attr("action_type")+"]").each(function(){ var selfChild = jQuery(this); if( isChecked ){ selfChild.addClass("checked"); selfChild.siblings(":checkbox").attr("checked" , "checked"); }else{ selfChild.removeClass("checked").siblings(":checkbox").attr("checked" , ""); } selfChild.parent().find(".checkbox[action_type!=view]").each(function(){ var selfChkPermis = jQuery(this); if( isChecked ){ //selfChkPermis.addClass("checked") // <---����͡������ view � �Ƿ���� head �лԴ �������� ������---> }else{ selfChkPermis.removeClass("checked") } handleVertical(selfChkPermis.closest("ul") , selfChkPermis.attr("action_type")); }); }); handleVertical(self.closest("ul") , self.attr("action_type")); self.parents("ul").siblings(":checkbox").change(); }else{ var viewSelf = self.siblings("[action_type=view]"); if( viewSelf.hasClass("checked") || viewSelf.hasClass("half_checked")){ self.toggleClass("checked").removeClass("half_checked"); isHandleChild = true; if(self.hasClass("checked")){ self.closest("li").siblings().find(".checkbox[action_type="+self.attr("action_type")+"]").each(function(){ var selfChild = jQuery(this); if( selfChild.attr("action_type") != "view" && selfChild.parent().siblings("[action_type=view]").hasClass("checked")){ selfChild.addClass("checked"); } }); }else{ self.closest("li").siblings().find(".checkbox[action_type="+self.attr("action_type")+"]").removeClass("checked"); } } } /*if( isHandleChild ){ var root = self.closest("ul").siblings(".checkbox"); if(self.hasClass("checked")){ self.closest("li").siblings().find(".checkbox[action_type="+self.attr("action_type")+"]").each(function(){ var selfChild = $(this); if( selfChild.attr("action_type") == "view" ){ selfChild.addClass("checked"); root.addClass("checked"); }else if( selfChild.attr("action_type") != "view" && selfChild.parent().siblings("[action_type=view]").hasClass("checked")){ selfChild.addClass("checked"); } }); }else{ self.closest("li").siblings().find(".checkbox[action_type="+self.attr("action_type")+"]").removeClass("checked"); } handleVertical(self.closest("ul") , self.attr("action_type")); // jQuery(root).parents("ul").siblings(":checkbox").change(); }*/ }); ulnode.prepend(objHtmlHead); } } } }); function handleVertical(rootElement , type){ var typeFilter = "[action_type="+type+"]"; var checkTarget = rootElement.children("li.head-control").find(typeFilter); var checkAllAmount = rootElement.find(".checkbox[checktype!=head]"+typeFilter).length; var checkedAmount = rootElement.find(".checkbox.checked[checktype!=head]"+typeFilter).length; if( checkAllAmount == checkedAmount ){ checkTarget.removeClass("half_checked").addClass("checked"); }else if(checkedAmount == 0){ checkTarget.removeClass("checked").removeClass("half_checked"); }else{ checkTarget.addClass("half_checked").removeClass("checked"); } } function handleHorizontal(rootElement){ } function createCheckListPermission(element){ var value; if( element instanceof jQuery ){ value = element.val(); }else{ value = element.value; } var statusEdit = element.attr("edit")==0?"disabled":"checkbox"; var statusSave = element.attr("save")==0?"disabled":"checkbox"; var statusDelete = element.attr("delete")==0?"disabled":"checkbox"; //var html = ""; var html = "<span class=\"permis_action\">"; html += "<label class=\"desc-head\"></label>"; html += "<div class=\"checkbox permis_action_object "+statusEdit+" \" action_type=\"PermisstionEdit\" keycode=\""+value+"\"></div>"; //html += "<input type=\"hidden\" name=\"__permis\" id=\"permis_e_"+value+"\" action_type=\"edit\" value=\""+value+"\" class=\"permis_action_object\"> "; html += "<label class=\"desc-head\"></label>"; html += "<div class=\"checkbox permis_action_object "+statusSave+" \" action_type=\"PermisstionSave\" keycode=\""+value+"\"></div>"; //html += "<input type=\"hidden\" name=\"__permis\" id=\"permis_d_"+value+"\" action_type=\"add\" value=\""+value+"\" class=\"permis_action_object\"> "; html += "<label class=\"desc-head\"></label>"; html += "<div class=\"checkbox permis_action_object "+statusDelete+" \" action_type=\"PermisstionDelete\" keycode=\""+value+"\"></div>"; //html += "<input type=\"hidden\" name=\"__permis\" id=\"permis_a_"+value+"\" upid=\"\" action_type=\"delete\" value=\""+value+"\" class=\"permis_action_object\"> "; html += "</span>"; return html; } function createHeadCheckListPermission(){ var html = "<li class=\"head-control\">"; html += "<span class=\"permis_action\">"; html += "<div class=\"checkbox\" action_type=\"view\" checktype=\"head\"></div>"; html += "<label class=\"desc-head\">"+swap2String("View")+"</label>"; html += "<div class=\"checkbox\" action_type=\"PermisstionEdit\" checktype=\"head\"></div>"; html += "<label class=\"desc-head\">"+swap2String("Update")+"</label>"; html += "<div class=\"checkbox\" action_type=\"PermisstionSave\" checktype=\"head\"></div>"; html += "<label class=\"desc-head\">"+swap2String("Insert")+"</label>"; html += "<div class=\"checkbox\" action_type=\"PermisstionDelete\" checktype=\"head\"></div>"; html += "<label class=\"desc-head\">"+swap2String("Delete")+"</label>"; html += "</span></li>"; return html; } return $permission; } })(jQuery);