/**
 *	Generate three selection boxes base and hidden input form.
 *	Usage:
 *	<form name="formname" ...>
 *		<script>
 *			var ds = new DateSelect("formname", "hiddenname", "initialdate");
 *			ds.show();	// actually generate from by document.write()
 *		</script>
 *	</form>
 *
 *	output:
 *		<input name="hiddenname" type="hidden" value="initialdate">
 *
 *	if any change occurs on selection boxes, the hidden input value will be changed after changing.
 *
 *
 *	@author	$Author: RICHARD_HUA $
 *	@version $Id: DateSelect.js,v 1.4 2002/04/03 02:16:48 RICHARD_HUA Exp $
 */

var __private_DateSelect_currentLocale = 0;

function __private_DateSelect_init( form, name, initDate ) {
	try {
		if( initDate.indexOf('/') < 0 )
			throw "initial date format Error: '" + initDate + "'";

		if( form == "" || eval( 'document.' + form ) == null )
			throw "invalid form name: '" + form + "'";

		if( name == "" || typeof eval( 'document.' + form + '.' + name ) != "undefined" )
			throw "exists the same input name within the form: '" + name + "'";
	} catch( e ) {
		throw "illegal arguments " + e;
	}
}


function __private_DateSelect_initYear( n, n2, start, end, ini ) {
	with( eval('document.' + n + '.__' + n2 + '__Year__') ) {
		for( var y = start, i = 0; y <= end; i++, y++ ) {
			options[i] = new Option( y, y );
			if( y == ini.getFullYear() ) options[i].selected = true;
		}
	}
}


function __private_DateSelect_initMonth( n, n2, ini ) {
	with( eval('document.' + n + '.__' + n2 + '__Month__') ) {
		for( var i = 0; i < 12; i++ ) {
			options[i] = new Option( i + 1, i + 1 );
			if( i == ini.getMonth() ) options[i].selected = true;
		}
	}
}


function __private_DateSelect_initDay( n, n2, ini ) {
	with( eval('document.' + n + '.__' + n2 + '__Day__') ) {
		for( var i = 0; i < 31; i++ ) {
			if( options[i] != null )
				options[i] = null;	// delete options[i]; can't delete? strange
		}

		for( var i = 0; i < __private_DateSelect_caculateDay(ini); i++ ) {
			options[i] = new Option( i + 1, i + 1 );
			if( i == (ini.getDate() - 1) ) options[i].selected = true;
		}
	}
}


function __private_DateSelect_getNameByLocale( key ) {
	var keys = new Array("YEAR", "MONTH", "DAY");
	var names = new Array(
			new Array("Y", "M", "D"),
			new Array("¦~", "¤ë", "¤é")
		)
	var index = -1;

	key = key.toUpperCase();
	for( var i = 0; i < keys.length; i++ ) {
		if( key == keys[i] )
			index = i;
	}

	return names[__private_DateSelect_currentLocale][index]
}


var __private_DateSelect_DaysInMonth = new Array( 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );

function __private_DateSelect_caculateDay( date ) {
	var y = date.getFullYear();
	var m = date.getMonth();

	var i = __private_DateSelect_DaysInMonth[m];
	if( i > 0 ) return i;
	return ( y % 4 == 0 && ( y % 100 != 0 || y % 400 == 0 ) ) ? 29 : 28; 
}


function __public_DateSelect_show() {
	var selects = new Array( "Day", "Month", "Year");
	var ehandler = '__public_DateSelect_change(\'' + this.form + '\', \'' + this.name + '\');';
	for( i in selects ) {
		// in order to create unique naming for each date selection
		// every elements named as "__NAME__YEAR__"
		document.write('<select name="__' + this.name + '__' + selects[i] + '__" onchange="' + ehandler +
			'"></select>' + __private_DateSelect_getNameByLocale(selects[i]) );
	}
	document.write('<input type="hidden" name="' + this.name + '" value="' + this.initDate + '">');

	var d = new Date(this.initDate);

	__private_DateSelect_initYear(this.form, this.name , this.startYear, this.endYear, d);
	__private_DateSelect_initMonth(this.form, this.name, d);
	__private_DateSelect_initDay(this.form, this.name, d);
}


function __public_DateSelect_change( form, n ) {
	if( typeof form == 'undefined' || typeof n == 'undefined' ) {
		if( typeof this.form == 'undefined' ) throw "you need to specified parameters";
		form = this.form;
		n = this.name;
	}

	with( eval( 'document.' + form ) ) {
		var obj = eval( n );

		var year = eval( '__' + n + '__Year__' );
		var month = eval( '__' + n + '__Month__' );
		var day = eval( '__' + n + '__Day__' );

		obj.value = year.value + "/" + month.value + "/" + day.value;
		__private_DateSelect_initDay( form, n, new Date(obj.value) );
		obj.value = year.value + "/" + month.value + "/" + day.value;
	}
}


function __public_DateSelect_setLocale( locale ) {
	__private_DateSelect_currentLocale = locale;
}


function DateSelect( form, name, initDate ) {
	// check values of these parameters
	__private_DateSelect_init( form, name, initDate );	// throws e

	// private
	this.startYear = 1999;
	this.endYear = new Date().getFullYear();
	this.form = form;
	this.name = name;
	this.initDate = initDate;

	// public method
	this.show = __public_DateSelect_show;
	this.change = __public_DateSelect_change;	// throws e
	this.setLocale = __public_DateSelect_setLocale;
}
