forked from cheton/jquery-checkboxset
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.checkboxset-1.0.min.js
24 lines (23 loc) · 2.57 KB
/
jquery.checkboxset-1.0.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(function($){$.fn.checkboxset=function(options){var defaults={tristate:true,data:{},change:function(name){}};options.tristate=isset(options.tristate)?options.tristate:defaults.tristate;options.data=options.data||defaults.data;options.change=options.change||defaults.change;var config={selector:$(this),tristate:options.tristate,data:options.data,change:options.change};this.checked=function(name){return config.selector.find("input[name='"+name+"']").attr("checked");}
this.indeterminate=function(name){return config.selector.find("input[name='"+name+"']").attr("indeterminate");}
__init__(config,config.data,"");return this;}
__init__=function(config,obj,prefix){for(var key in obj){var checked=false;var val=obj[key];if(isset(val.checked)){config.selector.find("input[name='"+key+"']").attr("checked",val.checked);delete val.checked;}
if(!empty(val)){__init__(config,val,empty(prefix)?key:prefix+"."+key);}
config.selector.find("input[name='"+key+"']").bind("click",{prefix:prefix,name:key,descendants:val},function(e){var checked=$(this).attr("checked");traverse_descendants(config,e.data.descendants,checked);traverse_ancestors(config,e.data.prefix);config.change(e.data.name);});}
traverse_ancestors(config,prefix);}
traverse_descendants=function(config,objs,checked){for(var key in objs){var val=objs[key];if(!empty(val)){traverse_descendants(config,val,checked);}
config.selector.find("input[name='"+key+"']").attr("checked",checked);if(config.tristate){config.selector.find("input[name='"+key+"']").attr("indeterminate",false);}}}
traverse_ancestors=function(config,prefix){if(empty(prefix))
return;var arr=prefix.split(".");var obj=config.data;for(var i=0;i<arr.length;i++){obj=obj[arr[i]];if(!isset(obj))
break;}
var count=0,checked=0,indeterminate=0;for(var name in obj){if(config.selector.find("input[name='"+name+"']").attr("checked")){++checked;}
if(config.selector.find("input[name='"+name+"']").attr("indeterminate")){++indeterminate;}
++count;}
var name=arr.pop();config.selector.find("input[name='"+name+"']").attr("checked",checked>0);if(config.tristate){config.selector.find("input[name='"+name+"']").attr("indeterminate",(checked>0&&count!=checked)||(indeterminate>0));}
traverse_ancestors(config,arr.join("."));}
function isset(mixed_var){return(mixed_var!=null)&&(mixed_var!=undefined);}
function empty(mixed_var){if(mixed_var===""||mixed_var===0||mixed_var==="0"||mixed_var===null||mixed_var===false||typeof mixed_var==='undefined'){return true;}
if(!mixed_var){return true;}
if(typeof mixed_var=='object'){for(var key in mixed_var){return false;}
return true;}
return false;}})(jQuery);