/*************************************************
 *  Formhandler class - used to handle forms     *
 *                                               *
 *************************************************/

var __FH_date_opts_len;

function Formhandler(fobj)
{
	var formobj;
	var dateopts;

	this.dateopts=new Array();
	
	this.formobj=null;
	if (typeof(fobj)=='object')
	{
		this.formobj=fobj;
	} else if(typeof(fobj)=='string' && document.forms[fobj])
	{
		this.formobj=document.forms[fobj];
	}
	if (typeof(this.formobj)=='undefined' || this.formobj==null)
	{
		alert("Bad form object... Correct error!");
	}
	__FH_date_opts_len=0;

	/* Set the methods ... */
	this.getTextValue=FH_getTextValue;
	this.setTextValue=FH_setTextValue;
	this.addOption=FH_addOption;
	this.delOption=FH_delOption;
	this.emptyOption=FH_emptyOption;
	this.selectOption=FH_selectOption;
	this.getOption=FH_getOption;
	this.setOptionChange=FH_setOptionChange;
	this.submit=FH_submit;

	this.dateOption=FH_dateOption;
	this.dateOptionSet=FH_dateOptionSet;
	this.dateOptionGet=FH_dateOptionGet;
	this.dateOptionCheck=FH_dateOptionCheck;
	this.dateOptionCheckHandler=FH_dateOptionCheckHandler;

	/* The methods... */

	/* General stuff to handle form elements */
	
	function FH_getTextValue(fname)
	{
		return this.formobj.elements[fname].value;
	}

	function FH_setTextValue(fname,val)
	{
		this.formobj.elements[fname].value=val;
	}

	/* Option fields */
	function FH_addOption(fname,name,value)
	{
		olist=this.formobj.elements[fname];
		olen=olist.options.length;
		olist.options[olen]=new Option(name,value);
	}

	function FH_delOption(fname,name,value)
	{
		optlen=this.formobj.elements[fname].options.length;
		i=0;
		while (i<optlen)
		{
			curropt=this.formobj.elements[fname].options[i];
			if (curropt.value==value && curropt.text==name)
			{
				this.formobj.elements[fname].options[i]=null;
				optlen--;
			}
			i++;
		}
	}

	function FH_emptyOption(fname)
	{
		optlen=this.formobj.elements[fname].options.length;
		for (i=0;i<optlen;++i)
		{
			this.formobj.elements[fname].options[0]=null;
		}
	}

	function FH_selectOption(fname,name,value)
	{
		optlen=this.formobj.elements[fname].options.length;
		for (i=0;i<optlen;++i)
		{
			this.formobj.elements[fname].options[i].selected=false;
		}
		for (i=0;i<optlen;++i)
		{
			curropt=this.formobj.elements[fname].options[i];
			if ((name==null || curropt.text==name) && (value==null || curropt.value==value))
			{
				this.formobj.elements[fname].options[i].selected=true;
				return;
			}
		}
	}

	function FH_getOption(fname)
	{
		retval=new Array();

		opt=this.formobj.elements[fname];
		optlen=opt.options.length;
		for (i=0;i<optlen;++i)
		{
			if (opt.options[i].selected)
			{
				retval['text']=opt.options[i].text;
				retval['value']=opt.options[i].value;
				return retval;
			}
		}
		return null;
	}

	function FH_setOptionChange(fname,handler,arg1,arg2)
	{
		eventhandler.addEvent('onchange',fname,null,handler,arg1,arg2);
	}


	function FH_submit()
	{
		this.formobj.submit();
	}


	/* Date option lists */
	function FH_dateOption(dayname,monthname,yearname,yearstart,yearend)
	{
		optparams=new Array(dayname,monthname,yearname);
		this.dateopts.push(optparams);
		currentindex=this.dateopts.length-1;

		this.emptyOption(dayname);
		this.emptyOption(monthname);
		this.emptyOption(yearname);

		if (yearend==null) yearend=yearstart;

		if (yearstart>yearend) 
		{
			i=yearstart;
			yearstart=yearend;
			yearend=i;
		}

		if (yearend==yearstart) this.addOption(yearname,yearstart,yearstart);
		else
		{
			for (i=yearstart; i<=yearend; ++i)
			{
				this.addOption(yearname,i,i);
			}
		}
		for (i=1;i<13;++i) this.addOption(monthname,i,i);
		for (i=1;i<29;++i) this.addOption(dayname,i,i);

		this.dateOptionCheck(currentindex);

		this.setOptionChange(monthname,this.dateOptionCheckHandler,currentindex,this);
		this.setOptionChange(yearname,this.dateOptionCheckHandler,currentindex,this);

		__FH_date_opts_len=this.dateopts.length;
		return currentindex;
	}

	function FH_dateOptionSet(idx,day,month,year)
	{
		params=this.dateopts[idx];

		dayname=params[0];
		monthname=params[1];
		yearname=params[2];

		this.selectOption(monthname,null,month);
		this.selectOption(yearname,null,year);

		this.dateOptionCheck(idx);

		this.selectOption(dayname,null,day);
	}

	function FH_dateOptionGet(idx)
	{
		params=this.dateopts[idx];

		dayname=params[0];
		monthname=params[1];
		yearname=params[2];

		retval=new Array();

		currday=this.getOption(dayname);
		currmonth=this.getOption(monthname);
		curryear=this.getOption(yearname);
		
		retval['day']=currday['value'];
		retval['month']=currmonth['value'];
		retval['year']=curryear['value'];

		return retval;
	}

	function FH_dateOptionCheck(idx)
	{
		params=this.dateopts[idx];

		dayname=params[0];
		monthname=params[1];
		yearname=params[2];

		seldate=this.dateOptionGet(idx);

		currday=seldate['day'];
		currmonth=seldate['month'];
		curryear=seldate['year'];

		this.emptyOption(dayname);
		
		for (i=1;i<29;++i) this.addOption(dayname,i,i);
		for (;i<33;++i)
		{
			d=new Date(curryear,currmonth-1,i)
			if (i!=d.getDate()) break;
			this.addOption(dayname,i,i);
		}
		i--;
		if (currday>i) currday=i;
		this.selectOption(dayname,currday,currday);
	}

	function FH_dateOptionCheckHandler(evt)
	{
		idx=evt['arg1'];
		me=evt['arg2'];

		me.dateOptionCheck(idx);
	}

}

