
/**
 * This function parses the date in the format of MM/DD/YYYY and returns a date object.
 * Validation are done according to the values for MM and DD
 * @param {Object} dateStr
 * @param {String} the policy to round the out of bound days to down or up
 */
function parseDate(dateStr , rndPolicy , element) {
	var list = dateStr.split("/");
	var date = Date.parse('today') ;
	if (list.length == 3) {
		var mon = list[0] ;
		var day = list[1] ;
		var year = list[2] ;
		try {
			mon = mon - 1 ;
			day = day - 0 ;
			year = year - 0 ;
			
			if (year > 0 && year <= Date.parse('today').getFullYear()+1) {
				if (mon >= 0 && mon < 12) {
					date.setDate(1);
					date.setMonth(mon);
					date.setFullYear(year);
					// Negative date rounds to 1
					if (day <= 0) {
						day = 1 ;
					}
					// bigger day is rounded in two ways
					else if (day > daysInMonth(mon, year)) {
						// down rouding  round the day to the biggest of current month
						if (rndPolicy == 'down' || rndPolicy == 'up') {
							//day = daysInMonth(mon, year);
							day = 1 ;
							date.setMonth(date.getMonth()+1);
						}
					}
					date.setDate(day);
					//debugger;
					setDateString(element ,strToDisplayStr(dateToStr(date)));
					return date ; 
				} else {
					return null;
				}
			} else {
				return null ;
			}
		}catch (ex) {
			return null ;
		}
	}
}

/**
 * This function sets back the adjusted Date in the UI
 * @param {Object} dateStr
 */
function setDateString(element,dateStr) {
	$(element).value = dateStr ;
}

//This function adds the numMon number of months to the provided date
function getMonthAfter(date , numMon) {
	currMon = date.getMonth();
	if ( (currMon + numMon ) > 11 ) {
		date.setFullYear(date.getFullYear()+1);
		date.setMonth((currMon + numMon ) - 12);
	} else {
		date.setMonth = (currMon + numMon ) ;
	}
	return date ;
}  
/**
 * Determine the number of days in the given month
 * @param {Object} iMonth
 * @param {Object} iYear
 */
function daysInMonth(iMonth, iYear)
{
	return 32 - new Date(iYear, iMonth, 32).getDate();
}

/**
 * Validates the code and return true if any error detected
 */
function validateDepartDate() {
		
//	debugger ;
	
	var departDate = parseDate($F('departDate'),'down' ,'departDate');
	var returnDate = parseDate($F('returnDate'),'up' ,'returnDate' );
	
	
	
	today = Date.parse('today');
	var isAnyError = false ;
	
	/* Invalid date format or characters */
	if((departDate == null)){
		errorArray.depart_invalid_date = "You must choose a valid depart date";  isAnyError = true ;
	} else { 
		errorArray.depart_invalid_date = "" ; 
	}
	
	/* Date is not 3 days after today */
	if((departDate != null) && departDate < leastDepartDate() ){
		errorArray.depart_in3days_date = "Packages must be booked at least 3 days in advance" ;	isAnyError = true ;
	}else {
		errorArray.depart_in3days_date = "" ;
	}
	
	
	/* Date is beyond 11 month after today */
	if ((departDate != null) && departDate.compareTo(Date.today().add(11).months()) > 0 ) {
		errorArray.depart_beyond_date = "Trips may only be booked up to 11 months in advance. For groups contact 1-877-875-4565";	isAnyError = true ; 											   
	} else {
		errorArray.depart_beyond_date = "" ;
	}
	errorArray.night_toolong = "" ;
	/* If there exists a numnight and depart date change */
	if (departDate && !isNaN(parseInt($("numNights").value) )) {
		adjustReturnDate(parseInt($("numNights").value));
	}
	
	/* There exists a return date and no num nights */
	
	else if (departDate && returnDate) {
		var numNights = daysElapsed(departDate,returnDate);
		if (numNights < 3) {
			numNights = 3
		} else if (numNights > 30){
			errorArray.night_toolong = "For stays of more than 30 nights, please contact reservations at 1-877-875-4565" ; isAnyError = true ;
		}
		$("numNights").value = numNights ;
		adjustReturnDate(numNights);
	}
	
	return isAnyError ;
}

function validateReturnDate() {
	var isAnyError = false ;
	var endDate = parseDate($F('returnDate'),'up' ,'returnDate' );
	var startDate = parseDate($F('departDate'),'down' ,'departDate');
	
	/* invalid return date */
	if (endDate == null) {
		errorArray.return_invalid_date = "You must choose a valid return date"; isAnyError = true ;
	} else {
		errorArray.return_invalid_date = "";
	}
	
	/* more the 11 month after */
	if ((endDate != null) && endDate.compareTo(Date.today().add(11).months()) > 0 ) {
		errorArray.return_beyond_date = "Trips may only be booked up to 11 months in advance. For groups contact 1-877-875-4565";	isAnyError = true ; 											   
	} else {
		errorArray.return_beyond_date = "" ;
	}
	errorArray.night_toolong = "" ;
	if (endDate && startDate) {
		var numNights = daysElapsed(startDate,endDate);
		if (numNights < 3) {
			numNights = 3
		}else if (numNights > 30) {
			errorArray.night_toolong = "For stays of more than 30 nights, please contact reservations at 1-877-875-4565" ; isAnyError = true ;
		}
		$("numNights").value = numNights ;
		adjustDepartDate(numNights);
	}
	
	if (endDate!= null && startDate==null && !isNaN($("numNights").value)  ) {
		startDate = new Date(endDate);
		startDate.setDate(endDate.getDate() - $("numNights").value) ;
		$('departDate').value = strToDisplayStr(dateToStr(startDate));
		validateElement('departDate');
	}
	
	return isAnyError ;
}

function validateNights(){
	try {
		error = false ;
		
		/* Invalid night number */
		var numNights = parseInt($F("numNights"));
		if (isNaN(numNights)) {
			errorArray.night_invalid = "Number of nights is invalid" ; error = true ;
			document.getElementById("numNights").value= 3;
	    } else  {
			errorArray.night_invalid = "" ;
		}
		
		/* less than 3 nights */
		if (numNights < 3) {
			numNights = 3
			document.getElementById("numNights").value= numNights;
		}
		
		/* If num nights is in normal range */
		if(numNights < 30) {
			var departDate = parseDate($F('departDate'),'down' ,'departDate');
			var returnDate = parseDate($F('returnDate'),'up' ,'returnDate' );
			if (departDate) {
				adjustReturnDate(numNights);
			} else if ((!departDate && returnDate)) {
				adjustDepartDate(numNights);
			}
		}  
		
		/* Too long stay */
		else if (numNights > 30) {
			errorArray.night_toolong = "For stays of more than 30 nights, please contact reservations at 1-877-875-4565" ; error = true ;
		} else {
			errorArray.night_toolong = "" ;
		}
	} catch(err){
		errorArray.night_invalid = "Number of Nights is Invalid" ; error = true ;
	}
	
	return error ;
}

function validateForm() {
	document.getElementById("residual_booking_error").style.display = "none";
	
	errorArray.airport_invalid = "" ;
	errorArray.destination_invalid = "" ;
	
	
	validateElement('departDate');
	validateElement('returnDate');
	validateElement('numNights');
	validateElement('totalTravelers');
	
	if($F('destinationId') == -1){
		errorArray.destination_invalid = "You must choose a destination.";
		setErrorBorder('destinationId');
	}
	if(document.getElementsByName("bookOptionsRadio")[0].checked && ($F("departureCode") == "")){
		errorArray.airport_invalid = "Depart airport is invalid.";
		setErrorBorder(document.getElementsByName('departureKey')[0]);
		flight = true;
	}
	var infants = 0;
	var children = 0;
	var ages = document.getElementsByName("ages[]");
	for(i = 0; i < ages.length; i++) {
		age = ages[i].value;
		if(age < 0) {
			error += "Age " + age + " is invalid<br>";
		} else if (age > 17) {
			error += "Ages 18 and over are considered adults<br>";
		} else if(isNaN(age)) {
			error += "You must enter a number for the child age<br>";
		} 		
		
		if(age == 0 || age == 1){
			infants++;			
		}else if(age > 11 && age < 18){
			children++;
		}
	}
	
	if(flight){
		if(infants > ($F("totalTravelers") - (infants + children) ) ){
			error += "For infants requiring an airline seat, pleasae call 1.866.875.4565.<br>";
		}
	}
	
	/* String representation of all errors */
	var errorStr = "" ;
	
	/* String for alerts */
	var errorStr_alert = "" ;
	for(var err in errorArray) {
		if (errorArray[err].length > 0) {
			errorStr += "<li><span>"+errorArray[err]+"</span></li>";
			errorStr_alert += errorArray[err]+"\n" ;
			errorArray[err] = "" ;
		}
	}		
	if (errorStr.length > 0) {
		$("booking_error").update("<ul style='list-style-type: disc;'>"+errorStr+"</ul>");
		$("booking_error").show();
		return false;
		alert(errorStr_alert);
	} else {
		$("booking_error").hide();
		return true ;
	}
}

/**
 * Validate the form
 **/
function checkForm(){
	
	document.getElementById("residual_booking_error").style.display = "none";

	var error = "";
	var departDate = Date.parse($F('departDate'));
	var returnDate = Date.parse($F('returnDate'));
	
	if((departDate == null)){
		error += "You must choose a valid depart date<br>";
	}else if((departDate.compareTo(Date.parse('today')) < 0)){
		error += "You must choose a valid depart date<br>";
	}else if(departDate.compareTo(Date.today().add(48).hours()) < 0){
		error += "For trips departing within 48 hours please call 1.866.875.4565<br>";
	}else if (departDate.compareTo(getMonthAfter(Date.parse('today') , 11)) > 0 ) {
		error += "Dapart date is out of booking schedule<br>";	 											   
	} 
	
	if((returnDate == null)){
		error += "You must choose a valid return date<br>";
	}else if((departDate != null) && (departDate.compareTo(returnDate) > 0)){
		error += "You must choose a valid return date<br>";
	} else if (returnDate.compareTo(getMonthAfter(Date.parse('today') , 11)) > 0 ) {
		error += "Return date is out of booking schedule<br>";	 											   
	} 
		
	if(($F('totalTravelers') == "") || ($F('totalTravelers') <= 0)){
		error += "You must choose a number of travelers<br>";
	}
	
	var flight = false;
	//If the customer is booking a flight, make sure there is a departure code
	if(document.getElementsByName("bookOptionsRadio")[0].checked && ($F("departureCode") == "")){
		error += "Depart airport is invalid<br>";
		flight = true;
	}
	
	if($F('destinationId') == -1){
		error += "You must choose a destination<br>";
	}
	
	if($F("totalTravelers") > 6){
		error += "For more than 6 people please call 1.866.875.4565<br>";
	}
	
	var infants = 0;
	var children = 0;
	var ages = document.getElementsByName("ages[]");
	for(i = 0; i < ages.length; i++) {
		age = ages[i].value;
		if(age < 0) {
			error += "Age " + age + " is invalid<br>";
		} else if (age > 17) {
			error += "Ages 18 and over are considered adults<br>";
		} else if(isNaN(age)) {
			error += "You must enter a number for the child age<br>";
		} 		
		
		if(age == 0 || age == 1){
			infants++;			
		}else if(age > 11 && age < 18){
			children++;
		}
	}
	
	if(flight){
		if(infants > ($F("totalTravelers") - (infants + children) ) ){
			error += "For infants requiring an airline seat, pleasae call 1.866.875.4565.<br>";
		}
	}
	if(error == ""){
		return true;
	}else{
		$("booking_error").update(error);
		$("booking_error").show();
		return false;
	}
}

function bookOptionChange(){

	var button = document.getElementsByName("bookOptionsRadio");

	if(button[1].checked){
//		alert("checked " + button[1].value + " not " + button[0].value);
		document.getElementsByName("departureCode")[0].value="";
		document.getElementById("departureTitle").style.display="none";
		document.getElementById("departureCity").style.display="none";
		document.getElementById("nearbyAirports").style.display="none";
		document.getElementById("departDateLabel").innerHTML="Check-in";		
		document.getElementById("returnDateLabel").innerHTML="Check-out";	
		document.getElementById("BookingInfoForm_0").value="Search Hotels";	
	}else{
//		alert("checked " + button[0].value + " not " + button[1].value);
		document.getElementsByName("departureCode")[0].value="";
		document.getElementById("departureTitle").style.display="";
		document.getElementById("departureCity").style.display="";
		document.getElementById("nearbyAirports").style.display="";
		document.getElementById("departDateLabel").innerHTML="Depart Date";		
		document.getElementById("returnDateLabel").innerHTML="Return Date";				
		document.getElementById("BookingInfoForm_0").value="Search Packages";	
	}

}

function checkBestDay(){
	var params = "";
	
	var destinationId = $F('destinationId');
	
	switch(destinationId){
		case "34":
			params += "&destino=" + 2;
			break;
		case "48":			
			params += "&destino=" + 1;
			break;
		case "49":			
			params += "&destino=" + 8;
			break;
		case "50":			
			params += "&destino=" + 30;
			break;
		case "51":			
			params += "&destino=" + 16;
			break;
		case "52":			
			params += "&destino=" + 12;
			break;
		case "53":			
			params += "&destino=" + 13;
			break;
		default:
			break;
	}
	
	if(params != ""){

		var startDate = Date.parse($F("departDate"));
		var endDate = Date.parse($F("returnDate"));
	
		params += "&anio_desde=" + startDate.getFullYear();
		params += "&mes_desde=" + (startDate.getMonth() + 1);
		params += "&dia_desde=" + startDate.getDate();
		params += "&anio_hasta=" + endDate.getFullYear();
		params += "&mes_hasta=" + (endDate.getMonth() + 1);
		params += "&dia_hasta=" + endDate.getDate();
	
		//default hotel listing otherwise check for flights too
		var page = "list.aspx";
		if(document.getElementsByName("bookOptionsRadio")[0].checked){
			page = "Package.aspx";
		}
		
		$('BookingInfoForm').action = "http://www.e-travelsolution.com/Partners/Reservations/Hotels/" + page + "?Type=Hotel&asoc=stst&idioma=ING" + params;
	}
	
	return true;
}

function dateToStr(date){
	month = date.getMonth()+1;
	if(month < 10){
		month = "0"+month;
	}
	day = date.getDate();
	if(day < 10){
		day = "0"+day;
	}
	return date.getFullYear()+"-"+month+"-"+day;
}

function strToDisplayStr(str){
	var displayStr = "";
	var date = /(\d{4})-(\d{2})-(\d{2})/;
	if(date.test(str)){
		var year = RegExp.$1;
		var month = RegExp.$2;
		var day = RegExp.$3;
		displayStr = month+"/"+day+"/"+year;
	}
	return displayStr;
}

 /**
  * Calculate the number of nights
  */
 var lastChanged;
function departDateChange(){
	switch(lastChanged){
		case "numNights":
			numNightsChange();
			break;
		case "returnDate":
			returnDateChange();
			break;
		default:
			
	}
}

function checkForInfants(){
	var message = "Infants under the age of 2 are considered lap children.";
	errorArray.children_age_invalid = "" ;
	errorArray.children_tooold = "";
	
	var ages = document.getElementsByName("ages[]");
	var infants = 0;
	for(i = 0; i < ages.length; i++) {
		if (ages[i].value == null || ages[i].value.length == 0) 
			continue ;
		age = parseInt(ages[i].value);
		if (isNaN(age)) {
			errorArray.children_age_invalid = "Child Age is invalid.";
			setErrorBorder(ages[i]);
		} else {
			if(age == 0 || age == 1) {
				infants++ ;
				setErrorBorder(ages[i]);
			} else if (age > 18) {
				errorArray.children_tooold = "Ages 18 and over are considered adults";
				setErrorBorder(ages[i]);
			} else {
				resetErrorBorder(ages[i]);
			}
		}
		
	}
/*	errorStr = "" ;
	errorStr_alert= "" ;
	if(infants > 0){
		errorStr += "<li>"+message+"</li>" ;
		errorStr_alert += message+"\n";
	}
	if (errorArray.children_age_invalid.length > 0) {
		errorStr += "<li>"+errorArray.children_age_invalid+"</li>" ;
		errorStr_alert += errorArray.children_age_invalid+"\n";
	}
	
	if (errorArray.children_tooold.length > 0) {
		errorStr += "<li>"+errorArray.children_tooold+"</li>" ;
		errorStr_alert += errorArray.children_tooold+"\n";
	}
	
	if (errorStr.length > 0) {
		document.getElementById("infantmessage").innerHTML ="<ul style='list-style-type: disc;'>"+errorStr+"</ul>" ;
		document.getElementById("infantmessage").style.display = "";
		alert(errorStr_alert);
	} else{
		document.getElementById("infantmessage").innerHTML = "";
		document.getElementById("infantmessage").style.display = "none";
	}  */
}

function checkDepartDate(){
	var numNights = parseInt($F("numNights"));
	if(numNights > 0){
		numNightsChange();
	}
}



function daysElapsed(date1,date2) {
    var difference = "";
    if((date1 != null) && (date2 != null)){
		difference = Date.UTC(date2.getYear(),date2.getMonth(),date2.getDate(),0,0,0) - Date.UTC(date1.getYear(),date1.getMonth(),date1.getDate(),0,0,0);
    	difference = difference/1000/60/60/24;
    }
    return difference;
}

/*function returnDateChange(){
	var numNights = parseInt($F("numNights"));
	
	startDate = Date.parse($F('departDate'));
	endDate = Date.parse($F('returnDate'));

	if(endDate>=startDate) {
		var diffDays = Math.abs(daysElapsed(startDate, endDate));
		$("numNights").value = diffDays;
		lastChanged = "returnDate";
	}else{
		alert("Return Date must be a minimum of 1 day after Departure Date");
	}	
} */



/**
 *  (print the age input fields)
 **/
function printAgeInputs(){
 	var output = "";
	var error = false ;
	var totalTravelers = $F("totalTravelers");

	var totalNum = parseInt(totalTravelers);
	
	if (isNaN(totalNum)) {
		errorArray.travelers_total_invalid = "Total Number of travelers is Invalid"; error = true ;
	} else {
		errorArray.travelers_total_invalid = "";
		if (totalNum < 1) {
			errorArray.travelers_total_invalid = "Total Number of travelers is Invalid"; error = true ;
		} else {
			errorArray.travelers_total_invalid = "";
			errorArray.travelers_toomany = "" ;	
			if(totalNum <= 6 ){
				for(i = 0; ((i < totalTravelers - 1) && (i < 5)); i++){
					output += "<input name=\"ages[]\" type=\"text\" size=\"2\" style=\"width:25px\" onchange=\"validateInput('infant')\" /> ";
				}
				document.getElementById("childrensAges").innerHTML = output;
			}else {
				errorArray.travelers_toomany = "For more than 6 people please call 1.866.875.4565"; error = true ;
			}
	    }
	}
	
	return error ;

}

function adjustReturnDate(days) {
	var departDate = parseDate($F('departDate'),'down' ,'departDate');
	if(!departDate) {
		return ;
	}
	if (days > 0 && days < 3) {
		days = 3
	} 
	departDate.setDate(departDate.getDate() + days);
	document.getElementById("returnDate").value = strToDisplayStr(dateToStr(departDate));
}

function adjustDepartDate(days) {
	var returnDate = parseDate($F('returnDate'),'up' ,'returnDate' );
	if (days > 0 && days < 3) {
		days = 3
	} 
	if (!returnDate) {
		return;
	}
	returnDate.setDate(returnDate.getDate() - days);
	if (returnDate < leastDepartDate()) {
		returnDate = new Date(leastDepartDate());
		document.getElementById("departDate").value = strToDisplayStr(dateToStr(returnDate));
		adjustReturnDate(days);
	}
	else {
		document.getElementById("departDate").value = strToDisplayStr(dateToStr(returnDate));
	}
}

function leastDepartDate() {
	var today = new Date();
	today = today.setDate(today.getDate() + 2 );
	return today ;
}
