// A COLLECTION OF FUNCTIONS THAT ALLOW A POP UP CALENDAR TO INTERACT WITH DROP DOWN FORM FIELDS
// THIS FILE USES FUNCTIONS FROM THE UTILS.JS FILE. YOU MUST INCLUDE THAT FILE BEFORE INCLUDING THIS FILE

// UPDATE THE TEXT FIELD WHEN THE DROP DOWN FIELDS CHANGE
function $updateTextDate(field,year,month,day) {
	// ALLOW ARGUMENTS TO BE PASSED AS STRINGS OR OBJECTS
	var objDate = (typeof field == "string") ? $(field) : field;
	var objMonth = (typeof month == "string") ? $(month) : month;
	var objYear = (typeof year == "string") ? $(year) : year;
	var objDay = (typeof day == "string") ? $(day) : day;
	// ENSURE THAT A VALID DATE HAS BEEN PASSED IN BEFORE UPDATING THE TEXT FIELD
	if ( $isUSDate(objMonth.value + '/' + objDay.value + '/' + objYear.value) && objYear.value.length == 4 ) {
		objDate.value = objMonth.value + '/' + objDay.value + '/' + objYear.value;
	} else {
		// IF A VALID DATE WAS NOT PASSED IN, CLEAR THE TARGET FIELD. WHY?
		// IF THEY CHANGE FROM A VALID DATE TO AN INVALID DATE WE NEED TO CLEAR THE
		// FIELD SO IT WILL NOT PASS VALIDATION.
		objDate.value = '';
	}
}

// UPDATE THE DROP DOWN FIELDS WHEN THE TEXT DATE CHANGES
function $updateSelectDate(field,year,month,day) {
	// ALLOW ARGUMENTS TO BE PASSED AS STRINGS OR OBJECTS
	var objDate = (typeof field == "string") ? $(field) : field;
	var objMonth = (typeof month == "string") ? $(month) : month;
	var objYear = (typeof year == "string") ? $(year) : year;
	var objDay = (typeof day == "string") ? $(day) : day;
	
	// CHECK TO SEE IF THE VALUE OF THE TEXT FIELD IS A DATE
	if ( $isUSDate(objDate.value) ) {
		// SINCE WE KNOW THIS IS A VALID DATE, SPLIT IT OUT INTO AN ARRAY
		var arrDate = objDate.value.split('/');
		// POSITION 0 WILL BE THE MONTH, 1 IS THE DAY AND 2 IS THE YEAR
		// WE NEED TO SUBTRACT 1 FROM THE MONTH BECAUSE JAVASCRIPT 
		// MONTHS START WITH 0 AND COLDFUSION MONTHS START WITH 1
		var newDate = new Date(arrDate[2],arrDate[0]-1,arrDate[1]);
		// UPDATE THE YEAR SELECT
		for ( y=0; y<objYear.length; y++ ) {
			if ( objYear[y].value == newDate.getFullYear() ) {
				objYear.selectedIndex = y;
				break;
			}
		}
		// UPDATE THE MONTH SELECT
		for ( m=0; m<objMonth.length; m++ ) {
			if ( objMonth[m].value == newDate.getMonth() + 1 ) {
				objMonth.selectedIndex = m;
				break;
			}
		}
		// UPDATE THE DAY SELECT
		for ( d=0; d<objDay.length; d++ ) {
			if ( objDay[d].value == newDate.getDate() ) {
				objDay.selectedIndex = d;
				break;
			}
		}
	} else {
		// IF THE TEXT DATE FIELD WAS MODIFIED DIRECTLY WITH AN INVALID DATE THEN CLEAR THE DROPDOWNS
		objYear.selectedIndex = 0;
		objMonth.selectedIndex = 0;
		objDay.selectedIndex = 0;
	}
}

// THE DAYSINMONTH FUNCTION RETURNS THE NUMBER OF DAYS FOR A GIVEN MONTH
// TECHNICALLY WHAT IT DOES IS ASKS FOR THE DAY BEFORE THE THE MONTH YOU PASS IN.
// SO THE DAY BEFORE THE FIRST DAY OF JUNE 2008 IS MAY 31, 2008, THEREFORE MAY HAS 31 DAYS.
// BECAUSE OF THIS THE MONTH SHOULD BE PASSED IN AS 1-12 INSTEAD OF 0-11
// SINCE LEAP YEAR LOGIC IS BUILT INTO JAVASCRIPT WE DON'T NEED TO WORRY ABOUT THAT.
function $daysInMonth(year,month) {
	var dd = new Date(year, month, 0);
	return dd.getDate();
}

// UPDATE THE DAY DROP DOWN WITH THE APPROPRIATE NUMBER OF DAYS WHILE KEEPING THE CORRECT DAY SELECTED
function $updateDaysInMonth(year,month,day) {
	// ALLOW ARGUMENTS TO BE PASSED AS STRINGS OR OBJECTS
	var objMonth = (typeof month == "string") ? $(month) : month;
	var objYear = (typeof year == "string") ? $(year) : year;
	var objDay = (typeof day == "string") ? $(day) : day;
	// OPTIONALLY ALLOW THE DISPLAY TEXT OF THE FIRST OPTION TO BE PASSED IN
	var label = arguments[3] || 'Day';
	
	// SAVE THE CURRENT DAY
	var currentDay = objDay.value;
	
	// GET THE MAX DAYS FOR THE SELECTED MONTH AND YEAR SINCE THE DAYSINMONTH
	// FUNCTION EXPECTS MONTHS 1-12 WE DON'T NEED TO SUBTRACT 1 FROM THE MONTH
	var maxDays = $daysInMonth(objYear.value,objMonth.value);
	
	// REMOVE ALL CURRENT OPTION TAGS
	$removeChildNodes(objDay.id);
	
	// CEATE THE HEADING OPTION TAG
	var option = document.createElement("option");
	option.value = 0;
	// CREATE THE TEXT NODE (THE DISPLAYED TEXT FOR THE OPTION)
	option.appendChild(document.createTextNode(label));
	// ADD IT TO THE SELECT TAG
	objDay.appendChild(option);
	
	// CREATE THE REST OF THE OPTION TAGS
	for (var d=1; d <= maxDays; d++) {
		var option = document.createElement("option");
		if ( d < 10 ) {
			option.value = '0' + d;
		} else {
			option.value = d;
		}
		// CREATE THE TEXT NODE (THE DISPLAYED TEXT FOR THE OPTION)
		option.appendChild(document.createTextNode(d));
		// ADD IT TO THE SELECT TAG
		objDay.appendChild(option);
	}
	
	// IF THE DAY THAT WAS SELECTED IS GREATER THAN THE MAX DAYS IN THE MONTH
	// DEFAULT THE DAY TO THE LAST DAY IN THE MONTH, OTHERWISE SELECT THE SAME DAY.
	// USE PARSEINT TO MAKE SURE BOTH NUMBERS ARE TREATED AS INTEGERS OTHERWISE
	// YOU COULD GET RESULTS THAT 8 > 31 AND THE DAY CHANGES TO 31 INSTEAD OF STAYING AT 8
	if ( parseInt(currentDay,10) > parseInt(objDay[objDay.length-1].value,10) ) {
		// THE CURRENT DAY IS GREATER THAN THE LAST DAY. SET THE DAY TO THE LAST DAY IN THE MONTH
		objDay.selectedIndex = objDay.length -1;
	} else {
		// SET THE NEW INDEX TO THE CURRENT DAY. THIS WORKS BECAUSE THE INDEX STARTS AT 0,
		// WHICH IS OUR DEFAULT OPTION WITH A VALUE OF 0. THEN WE ARE JUST CREATING DAYS
		// SO DAY 1 WOULD BE INDEX POSITION 1 AND SO ON. SO THERE IS NO NEED TO LOOP THROUGH
		// THE OPTIONS TO FIND THE MATCH BECAUSE WE ALREADY KNOW THE INDEX.
		objDay.selectedIndex = parseInt(currentDay,10);
	}
}

// UPDATE THE TEXT FIELD WHEN THE DROP DOWN FIELDS CHANGE FOR A DATE_MY FIELD
function $updateTextDate_my(field,year,month) {
	// ALLOW ARGUMENTS TO BE PASSED AS STRINGS OR OBJECTS
	var objDate = (typeof field == "string") ? $(field) : field;
	var objMonth = (typeof month == "string") ? $(month) : month;
	var objYear = (typeof year == "string") ? $(year) : year;
	var day = 1;
	// ENSURE THAT A VALID DATE HAS BEEN PASSED IN BEFORE UPDATING THE TEXT FIELD (ASSUME THE FIRST DAY OF THE MONTH)
	if ( $isUSDate(objMonth.value + '/' + day + '/' + objYear.value) && objYear.value.length == 4 ) {
		objDate.value = objMonth.value + '/' + objYear.value;
	} else {
		// IF A VALID DATE WAS NOT PASSED IN, CLEAR THE TARGET FIELD. WHY?
		// IF THEY CHANGE FROM A VALID DATE TO AN INVALID DATE WE NEED TO CLEAR THE
		// FIELD SO IT WILL NOT PASS VALIDATION.
		objDate.value = '';
	}
}

