//multi checkboxes group selector
function CheckBoxesSelector(inFormName,itsNames,inFilterIDs,itsType)
{
	var self = this;
	var itsName;
	var itsCheckBoxesGroup;

	self.initialize = function(inProperties)
	{
		itsCheckBoxesGroup = new CheckBoxesGroup(inFormName,itsNames,itsType);
		itsCheckBoxesGroup.initialize(inProperties);
		Publisher(self);
		
		if (inFilterIDs)
			for(var i = 0; i < inFilterIDs.length; i++)
			{
				var theFilterDisplay = new FilterDisplay(inFilterIDs[i]);
				itsCheckBoxesGroup.addSubscriber(theFilterDisplay,theFilterDisplay.show);
				//self.addSubscriber(theFilterDisplay,theFilterDisplay.show);
			}

		
	};

	self.isAllSelected = function() {
		return itsCheckBoxesGroup.isAllSelected();
	};

	self.getSize = function() {
		return itsCheckBoxesGroup.getSize();
	};
	
	self.setName = function(inName)
	{
		itsName = inName;
	};
	
	self.getName = function()
	{
		return itsName;
	};
	
	
	

	self.setAll = function(inCheck)
	{
		//itsCheckBoxesGroup.setAll(inCheck);
		self.notifySubscribers(itsName, itsCheckBoxesGroup.getFilterOn());
	}

	
	self.reset = function(inFlag)
	{
		self.resetWithoutNotify(inFlag);
		self.notifySubscribers(itsName);		
	};
		
	self.resetAll = function(inFlag)
	{
		if(inFlag == undefined || inFlag)
			itsCheckBoxesGroup.resetAll(true);
		else
			itsCheckBoxesGroup.resetAll(false);
			
		self.notifySubscribers(itsName);		
	};
	
	
	self.resetWithoutNotify = function(inFlag)
	{
		if(inFlag == undefined || inFlag)
			itsCheckBoxesGroup.reset(true);
		else
			itsCheckBoxesGroup.reset(false);
	};


	self.selectOneOnly = function(inID)
	{
		itsCheckBoxesGroup.selectOneOnly(inID);
		self.notifySubscribers(itsName, itsCheckBoxesGroup.getFilterOn());
	};


	self.changeState = function()
	{
		itsCheckBoxesGroup.changeState();
		self.notifySubscribers(itsName, itsCheckBoxesGroup.getFilterOn());
	};

	self.getState = function()
	{
		return itsCheckBoxesGroup.getProperties();
	};

	self.setState = function(inProperties)
	{
		itsCheckBoxesGroup.setCheckBoxesWithProperties(inProperties);
	};

	self.getFilterOn = function()
	{
		return itsCheckBoxesGroup.getFilterOn();
	};
	

}

/*
	single checkbox selector
*/

function CheckBoxSelector(inElementID,inFilterIDs)
{
	var self = this;
	var itsName;
	var itsElement = document.getElementById(inElementID);
	var itsState;
	var itsFilterDisplays = new Array()

	self.initialize = function()
	{
		if (itsElement.checked)
			itsState = true;
		else
			itsState = false;
		this.setState(itsState);

		Publisher(self);

		if (inFilterIDs)
			for(var i = 0; i < inFilterIDs.length; i++)
			{
				itsFilterDisplays[i] = new FilterDisplay(inFilterIDs[i]);
				self.addSubscriber(itsFilterDisplays[i],itsFilterDisplays[i].show);
			}
	};

	self.setName = function(inName)
	{
		itsName = inName;
	};

	self.getState = function()
	{
		return itsState;
	};

	self.setState = function(inValue)
	{
		if (!inValue)
			itsElement.checked = false;
		else
			itsElement.checked = true;
		itsState = inValue;

		//todo: need to see if self.notifySubscribers(itsName,itsState) will recurse forever, for now manually handle displays
		  self.setFilters();
	};

	self.changeState = function()
	{
		if (itsElement.checked)
			itsState = true;
		else
			itsState = false;
		self.notifySubscribers(itsName,itsState);
	};

	self.reset = function()
	{
		self.resetWithoutNotify();
		self.notifySubscribers(itsName,false);
	};

	self.resetWithoutNotify = function()
	{
		itsState = false;
		itsElement.checked = false;
		//hack..the reset functionality is terribley designed!
		for(var i = 0; i < itsFilterDisplays.length; i++)
		{
			itsFilterDisplays[i].show(null,false);
		}
	}


	self.setFilters = function()
	{
		var theFlag = (itsState != false);
		for(var i = 0; i < itsFilterDisplays.length; i++)
		{
			itsFilterDisplays[i].show(null,theFlag);
		}
	};

	self.getFilterOn = function()
	{
		return itsState;
	};
}


/*
	radio buttons selector
*/
function RadioButtonsSelector(inFormName,inFilterIDs)
{
	var self = this;
	var itsName;
	var itsState;
	var itsElements = document.forms[inFormName].elements;
	var itsFilterDisplays = new Array();

	self.initialize = function()
	{
		if (inFilterIDs)
			for(var i = 0; i < inFilterIDs.length; i++)
				itsFilterDisplays[i] = new FilterDisplay(inFilterIDs[i]);
		
		//default is -1, what a hack...radio buttons must have one entry with value = -1
		itsState = -1;
		self.setState(itsState);
		
		Publisher(self);
	}

	self.setName = function(inName)
	{
		itsName = inName;
	};

	self.getName = function()
	{
		return itsName;
	};
	
	self.changeState = function()
	{
		//reset default to false
		itsState = false;
		for (var i = 0; i < itsElements.length; i++)
		{
			if (itsElements[i].checked && itsElements[i].getAttribute("type").toLowerCase() == "radio")
			{
				itsState = itsElements[i].value;
				break;
			}
		}
		self.notifySubscribers(itsName,(itsState != -1));
		self.setFilters();
	};

	self.setState = function(inValue)
	{
		for (var i = 0; i < itsElements.length; i++)
		{
			if (itsElements[i].value == inValue  && itsElements[i].getAttribute("type").toLowerCase() == "radio")
			{
				itsState = itsElements[i].value;
				itsElements[i].checked = true;
				break;
			}
		}
		self.setFilters();
	};

	self.getState = function()
	{
		return itsState;
	};

	self.reset = function()
	{
		self.resetWithoutNotify();
		self.notifySubscribers(itsName,(itsState != -1));
	};

	self.resetWithoutNotify = function()
	{
		itsState = -1;
		self.setState(itsState);
		self.setFilters();
	};

	self.setFilters = function()
	{
		var theFlag = (itsState != -1);
		for(var i = 0; i < itsFilterDisplays.length; i++)
		{
			itsFilterDisplays[i].show(null,theFlag);
		}
	};


	self.getFilterOn = function()
	{
		return (itsState != -1);
	}
}