function GroupCheckBox(domId, categoryGroup)
{
	var me = this;
	me.domId_ = domId;
	me.categoryGroup_ = categoryGroup;
	
	jQuery(domId).bind("click", function(){
		me.toggleMe();
	});
	
	jQuery.each(categoryGroup, function(i, val) {
		jQuery("#" + val).bind("click", function(){
			
			var load = true;
			
			var domId = me.domId_;
	
			var test = (document.getElementById(val).checked == false);
			if(test)
			{
				load = false;
				me.someChecked_(false, val);
				
			} else {
				me.someChecked_(true, val);
			}
			callLoadUnloadMe(val, load);
			
		});
	});
	
	me.unCheckAll_ = function()
	{
		me.unCheckAll();  
	};
	me.checkAll_ = function()
	{
		me.checkAll();  
	};
	me.someChecked_ = function(checking, checkingValue)
	{
		me.someChecked(checking, checkingValue);
	};
	me.countChecked_ = function(excludeId)
	{
		return me.countChecked(excludeId);
	};
};

GroupCheckBox.prototype.someChecked = function(checking, checkingValue)
{
	var me = this;
	var domId = me.domId_;
	var categoryGroup = this.categoryGroup_;
	
	
	if(jQuery(domId))
	{
		var checkedCount = me.countChecked_(checkingValue);
		
		if(checking) 
		{
			if(!jQuery(domId).hasClass("allChecked") && !jQuery(domId).hasClass("someChecked"))
			{
				jQuery(domId).addClass("someChecked");
				jQuery(domId).removeClass("noneChecked");
			} else if(categoryGroup.length == (checkedCount+1))
			{
				jQuery(domId).removeClass("someChecked");
				jQuery(domId).addClass("allChecked");
			}
		} else
		{
			
			if(checkedCount == 0)
			{
				jQuery(domId).removeClass("someChecked");
				jQuery(domId).addClass("noneChecked");
				
			} else if(jQuery(domId).hasClass("allChecked") && !jQuery(domId).hasClass("someChecked"))
			{
				jQuery(domId).addClass("someChecked");
				jQuery(domId).removeClass("allChecked");
			}
		}
		
	}
}

GroupCheckBox.prototype.countChecked = function(excludeId)
{
	var me = this;
	var count = 0;
	var categoryGroup = this.categoryGroup_;
	jQuery.each(categoryGroup, function(i, val) {
			if(val != excludeId){
				if(document.getElementById(val).checked == true)
				{
					count++;
				}
			}
	});
	return count;
}

GroupCheckBox.prototype.checkAll = function()
{
	var me = this;
	var categoryGroup = this.categoryGroup_;
	jQuery.each(categoryGroup, function(i, val) {
      if(document.getElementById(val) != null)
      {
         if(document.getElementById(val).checked == false)
         {
            document.getElementById(val).checked = true;
            callLoadUnloadMe(val, true);
         }
      }
	});
};

GroupCheckBox.prototype.unCheckAll = function()
{
	var me = this;
	var categoryGroup = this.categoryGroup_;
	jQuery.each(categoryGroup, function(i, val) {
      if(document.getElementById(val) != null)
      {
         if(document.getElementById(val).checked == true)
         {
            document.getElementById(val).checked = false;
            callLoadUnloadMe(val, false);
         }
      }
	});
};

GroupCheckBox.prototype.toggleMe = function()
{
	var me = this;
	var domId = this.domId_;
	if(jQuery(domId).hasClass("allChecked"))
	{
		me.unCheckAll_();
		jQuery(domId).removeClass("allChecked");
		jQuery(domId).addClass("noneChecked");
	} else
	{
		me.checkAll_();
		jQuery(domId).addClass("allChecked");
		jQuery(domId).removeClass("noneChecked");
		jQuery(domId).removeClass("someChecked");
	}
}


//interacts with the global mgr
function callLoadUnloadMe(catid, load)
{
	if(load)
	{
		mgr.addCategoryToManager(catid);
	} else
	{
		mgr.clearCategoryMarkersFromMap(catid);
	}
}
