//	ListOptions.js
//	copyright BrightShinyObject.com
//	feel free to do whatever you want with it
//
//	these are just some really re-usable functions for common <select> form elements
//	canadian postal codes based on http://www.canadapost.ca/tools/pg/manual/b03-e.asp

//	2006-01-11 added optional numbers to the beginnings of months
//	2006-04-22 added code so calendar functions wouldn't overwrite any existing elements (like '--year--' for default)
//	2006-04-24 added ListOptionsHours
//	2006-12-02 added ListNumbersRange

	var LIST_OPTIONS_DEFAULT_TODAY = -1;

	var STATES_USE_USA_AND_CANADA = -2;
	var STATES_USE_CANADA_ONLY = -1;
	var STATES_USE_USA_ONLY = 0;

	function ListOptionsStates(elementTarget, txtDefault, statesToUse)
		{
		var saProvinces = new Array('AB','BC','MB','NB','NL','NT','NS','NU','ON','PE','QC','SK','YT');
		var saStates = new Array('AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC' ,'FL', 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'PR', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'VI', 'WA', 'WV', 'WI', 'WY');

		if (statesToUse == STATES_USE_CANADA_ONLY)
			var saToUse = saProvinces;
		else if(statesToUse == STATES_USE_USA_AND_CANADA)
			{
			var saToUse = saStates.concat(saProvinces);
			saToUse.sort();
			}
		else	// (statesToUse == STATES_USE_USA_ONLY)
			var saToUse = saStates;

		for (iIndex = 0; saToUse[iIndex]; iIndex++)
			{
			elementTarget.options[iIndex] = new Option(saToUse[iIndex],saToUse[iIndex]);
			if (saToUse[iIndex] == txtDefault)
				elementTarget.options[iIndex].selected = 'true';
			}
		}


	//	COMMON USE
	//	ListOptionsYears(obj, 0, 5, LIST_OPTIONS_DEFAULT_TODAY)
	function ListOptionsYears(elementTarget, iYearsBeforeNow, iYearsInTheFuture, iDefault, iDefaultOffset)
		{
		var dateToday = new Date();
		var iNumStartingOptions = elementTarget.options.length;

		if (iDefault == LIST_OPTIONS_DEFAULT_TODAY)
			{
			iDefault = dateToday.getFullYear();
			//	adjust the offset, so that last month would be iDefaultOffset - 1
			if (!isNaN(iDefaultOffset))
				iDefault += iDefaultOffset;
			}

		iStartYear = dateToday.getFullYear() - iYearsBeforeNow;
		duration = iYearsBeforeNow + 1;

		if (!isNaN(iYearsInTheFuture))
			duration += iYearsInTheFuture;
		for (iYearIndex = 0; iYearIndex <  duration; iYearIndex++)
			{
			elementTarget.options[iYearIndex + iNumStartingOptions] = new Option(iYearIndex + iStartYear,iYearIndex + iStartYear);
			if (iYearIndex + iStartYear == iDefault)
				elementTarget.options[iYearIndex + iNumStartingOptions].selected = 'true';
			}
		}

	function ListOptionsDays(elementTarget,iDefault,iDefaultOffset)
		{
		var iNumStartingOptions = elementTarget.options.length;

		if (iDefault == LIST_OPTIONS_DEFAULT_TODAY)
			{
			var dateToday = new Date();
			iDefault = dateToday.getDate();
			//	adjust the offset, so that last month would be iDefaultOffset - 1
			if (!isNaN(iDefaultOffset))
				iDefault += iDefaultOffset;
			}

		for (iDay = 1; iDay < 32; iDay++)
			{
			elementTarget.options[iDay+iNumStartingOptions-1] = new Option(iDay,iDay);
			if (iDay == iDefault)
				elementTarget.options[iDay + iNumStartingOptions - 1].selected = 'true';
			}
		}

	function ListOptionsMonths(elementTarget, iDefault, bShowNumber, iDefaultOffset)
		{
		var iNumStartingOptions = elementTarget.options.length;
		var saMonthNames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

		if (iDefault == LIST_OPTIONS_DEFAULT_TODAY)
			{
			var dateToday = new Date();
			iDefault = dateToday.getMonth();
			//	adjust the offset, so that last month would be iDefaultOffset - 1
			if (!isNaN(iDefaultOffset))
				iDefault += iDefaultOffset;
			}
		else
			iDefault--;	//	to compensate for counting from 0

		for (iMonth = 0; iMonth < 12; iMonth++)
			{
			if (bShowNumber)
				elementTarget.options[iMonth+iNumStartingOptions] = new Option((iMonth+1)+ " "+saMonthNames[iMonth],iMonth+1);
			else
				elementTarget.options[iMonth+iNumStartingOptions] = new Option(saMonthNames[iMonth],iMonth+1);

			if (iMonth == iDefault)
				elementTarget.options[iMonth+iNumStartingOptions].selected = 'true';
			}
		}

	//	to list times between 8am and 8pm, (elem, 8, 20)
	//	to list times "after 1am...after 2am... just set txtPrefix to "after"
	function ListOptionsHours(elementTarget, i24HourStart, i24HourStop,txtPrefix)
		{
		var iNumStartingOptions = elementTarget.options.length;

		if (i24HourStop > 23)	//	keep people from blowing over the top
			i24HourStop = 23;

		txtPrefix = txtPrefix + " ";	//	make sure it has a trailing space

		for (iHour = i24HourStart; iHour <= i24HourStop; iHour++)
			{
			iTempHour = (iHour % 12) + (!(iHour % 12) * 12);
			if (iHour < 12)
				iTempHour = iTempHour + "am";
			else
				iTempHour = iTempHour + "pm";

			elementTarget.options[iHour+iNumStartingOptions-i24HourStart] = new Option(txtPrefix+iTempHour,iHour);
			}
		}

	//	to list number range
	//	ListNumbersRange(0,3) would return the values/elements 0,1,2,3
	//	defaults to first element if iDefault isn't provided
	function ListNumbersRange(elementTarget, iStart, iEnd, iDefault)
		{
		iIndex = 0;	//	figured this would be assumed, but got javascript errors in Firefox 2.0
		for (;iStart <= iEnd; iStart++)
			{
			elementTarget.options[iIndex++] = new Option(iStart, iStart);
			if (iDefault == iStart)
				elementTarget.options[iIndex-1].checked;
			}
		}
