/**
 * zudolab AllCheck
 *
 * @version    1
 * @copyright    (c)2008 Takeshi Takatsudo (http://zudolab.net/)
 * @license    MIT (http://www.opensource.org/licenses/mit-license.php)
 */
(function($){

	AllCheck = function(settings)
	{
		this.multiple = settings.multiple ? true : false;
		this.selector_container = settings.container ? settings.container : null;
		this.selector_all = settings.all ? settings.all : null;
		this.selector_children = settings.children ? settings.children : null;
		this.elemSets = [];
		
		/* exec setup when onload */
		var self = this;
		$(function(){ self.setup(); });
	}
	
	AllCheck.prototype.setup = function()
	{
		var self = this;
		$(function(){
			self.prepareSets();
			if(!self.elemSets) return;
			self.setEvents();
		});
	}
	AllCheck.prototype.prepareSets = function()
	{
		var self = this;
		if(self.multiple){
			multiSet();
		}else{
			singleSet();
		}
		
		function singleSet(){
			var $all = $(self.selector_all).eq(0);
			if(!$all.length) return;
			var children = $(self.selector_children);
			self.elemSets.push({
				all: $all.get(0),
				children: children
			});
		}
		function multiSet(){
			$(self.selector_container).each(function(){
				var $container = $(this);
				self.elemSets.push({
					all: $container.find(self.selector_all).eq(0).get(0),
					children: $container.find(self.selector_children)
				});
			});
		}
	}
	AllCheck.prototype.setEvents = function()
	{
		var self = this;
		for(var i=0,currentSet; currentSet=this.elemSets[i]; i++){
			$(currentSet.all).click(allCheckerClick);
			for(var j=0,checkbox; checkbox=currentSet.children[j]; j++){
				$(checkbox).click(childrenClick);
			}
		}
		function allCheckerClick()
		{
			var set = self.getElemSetFromAllChecker(this);
			if(this.checked){
				self.checkAll(set.children);
			}else{
				self.uncheckAll(set.children);
			}
		}
		function childrenClick()
		{
			var set = self.getElemSetFromChildrenCheck(this);
			if(self.areAllChecked(set.children)){
				set.all.checked = true;
			}else{
				set.all.checked = false;
			}
		}
	}
	/*
	 * checker functions
	 */
		AllCheck.prototype.areAllChecked = function(checkboxes)
		{
			for(var i=0,checkbox; checkbox=checkboxes[i]; i++){
				if(!checkbox.checked) return false;
			}
			return true;
		}
		AllCheck.prototype.uncheckAll = function(checkboxes)
		{
			for(var i=0,checkbox; checkbox=checkboxes[i]; i++){
				checkbox.checked = false;
			}
		}
		AllCheck.prototype.checkAll = function(checkboxes)
		{
			for(var i=0,checkbox; checkbox=checkboxes[i]; i++){
				checkbox.checked = true;
			}
		}
	/*
	 * get elemSet
	 */
		AllCheck.prototype.getElemSetFromAllChecker = function(clickedCheckbox)
		{
			for(var i=0,set; set=this.elemSets[i]; i++){
				if(set.all==clickedCheckbox) return set;
			}
		}
		AllCheck.prototype.getElemSetFromChildrenCheck = function(clickedCheckbox)
		{
			for(var i=0,set; set=this.elemSets[i]; i++){
				for(var j=0,checkbox; checkbox=set.children[j]; j++){
					if(checkbox==clickedCheckbox) return set;
				}
			}
		}
})(jQuery);
