/**********************************************************************************
**
**		file: jquery.tristate.js
**		version: 1.0
**		author: Ben Belcourt
**		creation date: 09.17.2009
**		dependencies: "jquery-1.3.2.js" or higher
**
**		This file contains the functionality for implementing 3 state checkboxes.
**
**********************************************************************************/

(function(g){g.fn.tristate=function(l){var c=g.extend({checkedClass:"checked",fullClass:"full",heading:"span.label",partialClass:"partial",showOriginalInputs:false},l);return this.each(function(){obj=g(this);var e={init:function(){obj.find(c.heading).before('<a href="#" class="checkbox">Heading</a>').wrap("<label></label>");for(var a=obj.find('input[type="checkbox"]'),d=0,b=a.length;d<b;d++)e.hideInput(g(a[d]));e.updateProxyStates();obj.find("a.checkbox, label").bind("click",function(f){f.preventDefault(); e.initProxyClick(g(this))})},checkSiblings:function(a,d){var b=a.parent("li").siblings().children("a.checkbox"),f=0,h=a.parent("li").parent("ul"),i=h.find("ul"),j;d&&f++;for(var k=0;k<b.length;k++)if(g(b[k]).hasClass(c.checkedClass)||g(b[k]).hasClass(c.partialClass))f++;f<b.length+1?(j=c.partialClass):(j=c.fullClass);for(b=0;b<i.length;b++)if(g(i[b]).hasClass(c.partialClass))j=c.partialClass;if(f===0)j="";h.removeClass(c.partialClass+" "+c.fullClass).addClass(j)},initProxyClick:function(a){var d; e.setInputField(a);g(a).hasClass(c.checkedClass)===true||g(a).hasClass(c.partialClass)===true?(d=true):(d=false);e.checkSiblings(a,d);e.setLabel(a,d);e.setDescendants(a,d);e.setAncestors(a,d);e.updateProxyStates()},updateProxyStates:function(){for(var a=g("input:checked",obj),d,b=0,f=a.length;b<f;b++){d=g(a[b]).siblings("a.checkbox");e.setInputField(d,"checked");e.checkSiblings(g(a[b]),true);e.setAncestors(g(a[b]),true)}},hideInput:function(a){var d=a.attr("name"),b=g('<a href="#" class="checkbox">'+ d+"</a>");b.data("name",d);a.before(b);c.showOriginalInputs||a.hide()},setAncestors:function(a,d){var b;b=a.parent("li").parent("ul");var f=b.parent("li").children("a.checkbox");if(!b.hasClass(c.partialClass)&&!b.hasClass(c.fullClass)){f.removeClass(c.checkedClass+" "+c.partialClass);e.setInputField(f,"unchecked");e.setLabel(f,d);b=false}else{e.setInputField(f,"checked");e.setLabel(f,d);b.hasClass(c.partialClass)&&f.removeClass(c.checkedClass).addClass(c.partialClass);b.hasClass(c.fullClass)&&f.removeClass(c.partialClass).addClass(c.checkedClass); b=true}if(f.length>0){e.checkSiblings(f,b);e.setAncestors(f,f.hasClass(c.checkedClass))}},setDescendants:function(a,d){var b=a.parent("li"),f=b.find("ul");b=b.find("a.checkbox");if(d){for(var h=0,i=b.length;h<i;h++){e.setInputField(g(b[h]),"checked");e.setLabel(g(b[h]),d)}f.removeClass(c.partialClass+" "+c.fullClass).addClass(c.fullClass)}else{h=0;for(i=b.length;h<i;h++){e.setInputField(g(b[h]),"unchecked");e.setLabel(g(b[h]),d)}f.removeClass(c.partialClass+" "+c.fullClass)}},setInputField:function(a, d){switch(d||""){case "":a.hasClass(c.checkedClass)===true?e.uncheckInput(a):e.checkInput(a);break;case "checked":e.checkInput(a);break;case "unchecked":e.uncheckInput(a);break}},setLabel:function(a,d){$label=a.siblings("label");d?e.checkLabel($label):e.uncheckLabel($label)},checkInput:function(a){a.removeClass(c.partialClass).addClass(c.checkedClass).siblings('input[name="'+a.data("name")+'"]').attr("checked","checked")},uncheckInput:function(a){a.removeClass(c.checkedClass+" "+c.partialClass).siblings('input[name="'+ a.data("name")+'"]').attr("checked","")},checkLabel:function(a){a.removeClass(c.partialClass).addClass(c.checkedClass)},uncheckLabel:function(a){a.removeClass(c.checkedClass+" "+c.partialClass)}};e.init()})}})(jQuery);

