
// alert('/js/booking_date_select.js : top');

YAHOO.namespace("triasia.booking");

YAHOO.triasia.booking.init = function() {

	function getMinDateString(){
		var sep = '/';
		var d = new Date();
		return d.getMonth()+sep+d.getDay()+sep+d.getFullYear();
	}
	
	function getMaxDateString(){
		var sep = '/';
		var d = new Date();
		d.setDate(d.getDate() + 365*3);
		return d.getMonth()+sep+d.getDay()+sep+d.getFullYear();
	}

	function createSelPack(str){

		var sPrefix = 'sel'+str;

		var sYear 	= sPrefix+"Year";
		var sMonth 	= sPrefix+"Month";
		var sDay 	= sPrefix+"Day";

		var x = 
			{
				year: document.getElementById(sYear),
				month: document.getElementById(sMonth),
				day: document.getElementById(sDay)
			};

		return x;
	}

	function setCalDate(oCal, oDate){
		var nYear = oDate.getFullYear();
		var nMonth = oDate.getMonth() + 1;
		var nDay = oDate.getDate();

		oCal.select(nMonth + "/" + nDay + "/" + nYear);
		oCal.cfg.setProperty("pagedate", nMonth + "/" + nYear);
	}

	function getNextDay(oDate){
		oDateNext = new Date(oDate.getTime());
		oDateNext.setDate(oDate.getDate() + 1);
		return oDateNext;
	}

	function setSelDate(oSelPack, oDate){

		oSelPack.month.selectedIndex = oDate.getMonth() + 1;
		oSelPack.day.selectedIndex = oDate.getDate();

		var sYear = oDate.getFullYear();

		//alert('setSelDate: sYear = '+sYear);
		//alert('setSelDate: oSelPack.year = '+oSelPack.year);
		//alert('setSelDate: oSelPack.year.options.length = '+oSelPack.year.options.length);

		for (var y = 0; y < oSelPack.year.options.length; y++) {
		
			var val = oSelPack.year.options[y].value;
			//alert('setSelDate: val = '+val);
			if (oSelPack.year.options[y].value == sYear) {
				oSelPack.year.options[y].selected = true;
				break;
			}
		}			
	}

	function getSelDate(oSelPack){
	
		var y = parseInt(oSelPack.year.value);
		var m = parseInt(oSelPack.month.value);
		var d = parseInt(oSelPack.day.value);
		
		if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
	
			return new Date(
				oSelPack.year.value,
				oSelPack.month.value - 1,
				oSelPack.day.value
			);
		} else {
			return false;
		}
	}
	
	function createCal(jsId, divId, label){
		return new YAHOO.widget.Calendar(
			jsId,
			divId,
			{
				start_weekday: 1,
				title: label,
				close: true,
				mindate: getMinDateString(),
				maxdate: getMaxDateString()
			}
		);
	}
	
	function handleCalDateSelect(type, args, obj){
	
		
		// alert('handleCalDateSelect: type = '+type);

		var dates = args[0]; 
		var date = dates[0];
		var year = date[0], month = date[1], day = date[2];

		var selPack = createSelPack(obj.src);
		
		// alert('handleCalInDateSelect: cal = '+cal);
		// alert('handleCalInDateSelect: selPack = '+selPack);
		

		setSelDate(
			createSelPack(obj.src),
			new Date(year, month - 1, day)
		);

		// alert('handleCalInDateSelect: cal = '+cal);

		obj.cal.hide();
		
		// if he has modified his check-in, then massage his check-out;
		if (obj.src == 'In'){
			massageCheckOut();
		}
	}
	
	// if we have a value set for check-in date, but there is either no value for check-out or the value for 
	// checkout is less than check-in, then let's auto massage the check-out.
	function massageCheckOut(){

		var selPackIn = createSelPack('In');
		var selPackOut = createSelPack('Out');
		var oDateIn = getSelDate(selPackIn);
		
		if (oDateIn){


			// alert('massageCheckOut : oDateIn = '+oDateIn);
		
			var oDateOut = getSelDate(selPackOut);
			if (!oDateOut || (oDateOut.getTime() <= oDateIn.getTime())){

				var oDateOut = getNextDay(oDateIn);

				// alert('massageCheckOut : oDateOut = '+oDateOut);

				// set this date as the date for selOut
				setSelDate(selPackOut, oDateOut);

			}
		}
	}

	function handleCalImgClickIn(e){

		// prevent default click actions
		YAHOO.util.Event.preventDefault(e); 
	
		// hide the other cal
		YAHOO.triasia.booking.calOut.hide();
			
		// get the date represented by selIn
		var oDateIn = getSelDate( createSelPack('In') );
		
		if (oDateIn){

			// set that date into the calIn
			setCalDate(YAHOO.triasia.booking.calIn, oDateIn);
		}

		// render the cal
		YAHOO.triasia.booking.calIn.render();

		// show the cal
		YAHOO.triasia.booking.calIn.show();

	}

	function handleCalImgClickOut(e){

		// prevent default click actions
		YAHOO.util.Event.preventDefault(e); 
	
		// hide the other cal
		YAHOO.triasia.booking.calIn.hide();
			
		// get the date represented by selOut
		var oDateOut = getSelDate( createSelPack('Out') );
		
		if (oDateOut){
			// set that date into the calIn
			setCalDate(YAHOO.triasia.booking.calOut, oDateOut);
		}

		// render the cal
		YAHOO.triasia.booking.calOut.render();

		// show the cal
		YAHOO.triasia.booking.calOut.show();
	}
	
	function handleSelClick(){

		// hide all cals
		YAHOO.triasia.booking.calIn.hide();
		YAHOO.triasia.booking.calOut.hide();
	}
	
	function handleSelChange(){
		massageCheckOut()		
	}
	
	function handleAvailDateFormSubmit(e){
		
		var aErrors = new Array();
	
		form = document.getElementById('form_date_select');
		if (!form) { return false; }
		
		// get the date represented by selOut
		var oDateIn = getSelDate( createSelPack('In') );
		
		if (!oDateIn){
			aErrors.push('- Arrival date is required');
		}

		var oDateOut = getSelDate( createSelPack('Out') );
		
		if (!oDateOut){
			aErrors.push('- Departure date is required');
		}

		if (oDateIn && oDateOut){
			if (oDateIn.getTime() >= oDateOut.getTime()){
				aErrors.push('- Arrival date must precede departure date');
			}
		}
		
		if (oDateIn && oDateOut){

			// alert('oDateIn and oDateOut : msssssg'); // YAHOO.util.Event.preventDefault(e); return false;

			var eltDateCurr = document.getElementById('dateCurr');
			if (eltDateCurr){


				var sDateCurr = eltDateCurr.value.trim();
				var aDateCurrComps= sDateCurr.split('-');
				var oDateCurr = new Date(aDateCurrComps[0], aDateCurrComps[1]-1, aDateCurrComps[2]);

				// alert('handleAvailDateFormSubmit:  oDateCurr = '+ oDateCurr);
				// alert('function : msssssg'); YAHOO.util.Event.preventDefault(e); return false;
				
				if (oDateIn.getTime() < oDateCurr.getTime()){	
					aErrors.push('- Arrival must occur in the future');
				}
			}
		}
		
		var oUnitTypeId = form.utId;
		if (oUnitTypeId){
		
			var nUnitTypeId = parseInt(oUnitTypeId.value);
			if (isNaN(nUnitTypeId)){
				aErrors.push('- Unit type is required');
			}
		
		}
		
		var oPaxAdult = form.selPaxAdult;
		if (oPaxAdult){
			var nPaxAdult = parseInt(oPaxAdult.value);
			if (isNaN(nPaxAdult) || nPaxAdult == 0){
				aErrors.push('- At least one adult is required');
			}
		}

		if (aErrors.length == 0){
		
			// alert('No errors, Returning false as hard test');
			// return false;
			return true;

		} else {
		
			var sErrors = '';
			sErrors += "Please correct the following:\n";
			sErrors += aErrors.join("\n");
			alert(sErrors);

			YAHOO.util.Event.preventDefault(e);

			return false;
		
		}

		
	}

	// create cals
	YAHOO.triasia.booking.calIn 	= createCal('calIn', 	'bookingCalIn', 	'Select arrival date');
	YAHOO.triasia.booking.calOut 	= createCal('calOut', 	'bookingCalOut', 	'Select departure date');

	// hide cals to start
	YAHOO.triasia.booking.calIn.hide();
	YAHOO.triasia.booking.calOut.hide();

	// add handlers for sel events
	YAHOO.util.Event.addListener(["selInMonth","selInDay","selInYear"], "click", handleSelClick);
	YAHOO.util.Event.addListener(["selOutMonth","selOutDay","selOutYear"], "click", handleSelClick);

	YAHOO.util.Event.addListener(["selInMonth","selInDay","selInYear"], "change", handleSelChange);
	YAHOO.util.Event.addListener(["selOutMonth","selOutDay","selOutYear"], "change", handleSelChange);


	YAHOO.util.Event.addListener("selInCalLink", "click", handleCalImgClickIn);


	YAHOO.util.Event.addListener("selOutCalLink", "click", handleCalImgClickOut);

	// add handlers for cal events
	YAHOO.triasia.booking.calIn.selectEvent.subscribe(handleCalDateSelect, { src: 'In', cal: YAHOO.triasia.booking.calIn, calOut: YAHOO.triasia.booking.calOut }, false);
	YAHOO.triasia.booking.calOut.selectEvent.subscribe(handleCalDateSelect, { src: 'Out', cal: YAHOO.triasia.booking.calOut }, false);

	// display the cal graphics
	document.getElementById('selInCalLink').style.display = 'inline';
	document.getElementById('selOutCalLink').style.display = 'inline';


	// add form validation
	YAHOO.util.Event.addListener("form_date_select", "submit", handleAvailDateFormSubmit);
	
}

