function autoClickLink(linkName) {
	var fireOnThis = document.getElementById(linkName);

	if( document.createEvent ) {

		if (isSafariNoFireEventSupport()) {
			// Safari under 2.0 (Build 412) 
			execOnClick(fireOnThis);

		} else {
			// for firefox / mozilla 
			var evObj = document.createEvent('MouseEvents');
			evObj.initEvent( 'click', true, false );
			fireOnThis.dispatchEvent(evObj);
		}

	} else if( document.createEventObject ) {
		// for IE 
		fireOnThis.fireEvent('onclick');
	}

}			

function execOnClick(element) {
	var onClickScript = element.getAttribute("onclick");

	onClickScript = onClickScript.replace(/ this./g, ' document.getElementById(\'' + element.id + '\').');

	eval(onClickScript);
}

function isSafariNoFireEventSupport() {
	var strPos = navigator.userAgent.indexOf('Safari');
	if (strPos != -1) {
		var version = navigator.userAgent.substr((strPos + 7), 5);

		if (parseFloat(version) < 412) {
			return true;
		} else {
			return false;
		}
	} else {
		return false;
	}
}

//This function is used to adjust the return date to departure date automatically 
//if return date is before departure date
//trigger when date onchange
function setValidArrDate(fromDateElement, toDateElement) {
	var fromDateVal = getDateValue(fromDateElement);
	var toDateVal = getDateValue(toDateElement);
	
	if (parseInt(fromDateVal)>parseInt(toDateVal))
	{
		setDateValue(toDateElement, fromDateVal);
	}
}

//This function is used to adjust the selected departure date to the referenced departure date automatically
//if the selected departure date is before the referenced departure date
//trigger when date onchange (Complex Availability)
function setValidDeptDate(refDateElementId, thisDateElementId, refRow, thisRow) {	
	if (refRow != undefined && thisRow != undefined) 
	{
		if (parseInt(refRow) >= 0 && parseInt(thisRow) < 5) 
		{	
			var refDateVal = getDateValue(refDateElementId, refRow);
			var thisDateVal = getDateValue(thisDateElementId, thisRow);			
			if (parseInt(refDateVal) > parseInt(thisDateVal))
			{
				setDateValue(thisDateElementId, refDateVal, thisRow);
			}
		}
	} else {
		var refDateVal = getDateValue(refDateElementId);
		var thisDateVal = getDateValue(thisDateElementId);
		if (parseInt(refDateVal) > parseInt(thisDateVal)) {
			setDateValue(thisDateElementId, refDateVal);
		}	
	}
}

/*
function setValidDeptDate( refDateElementId, thisDateElementId ) {
	var refDateVal = getDateValue(refDateElementId);
	var thisDateVal = getDateValue(thisDateElementId);
	if (parseInt(refDateVal) > parseInt(thisDateVal)) {
		setDateValue(thisDateElementId, refDateVal);
	}
}
*/

//This function is used to adjust the date to current date automatically
//if date selected is before today
//trigger when departure date onchange
function validateToday(dateElement, row) {
	var dateVal = getDateValue(dateElement, row);

	//convert current date as string format yyyyMMdd	
	var now = new Date();
	var nowVal = String(now.getFullYear());
	if (now.getMonth()+1<10)
		nowVal += "0"+String(now.getMonth()+1);
	else
		nowVal += String(now.getMonth()+1);
	if (now.getDate()<10)
		nowVal += "0"+String(now.getDate());
	else
		nowVal += String(now.getDate());

	var nowVal1 = addDays(nowVal, -1); 
	if (parseInt(dateVal)<parseInt(nowVal1)) 
	{
		setDateValue(dateElement, nowVal, row);
	}
}
function addDays(strDate, noOfDays){
	var strDateVal = strDate;
	var days = 0;
	if (noOfDays !=null){
		days = parseInt(noOfDays);
	}
	if (strDateVal != null && strDateVal.length==8){
		var year = parseInt(strDateVal.substr(0,4));
		var month = parseInt(strDateVal.substr(4,2),10);
		var day = parseInt(strDateVal.substr(6,2),10);
		var strYear = String(year);
		var strMonth = String(month);
		if (month<10){
			strMonth = '0' + strMonth;
		}
		var strDay = String(day+noOfDays);
		if ((day+noOfDays)<10){
			strDay = '0'+strDay;
		}
		if ((day + days)<=0){
			if ((month - 1)<= 0){
				year--;
				month = 12;
				strYear = String(year);
				strMonth = String(month);
			} else {
				month--;
				strMonth = String(month);
				if (month<10){
					strMonth = '0'+String(month);
				}
			}
			day = day+getDays(month-1, year) + days;
			strDay = String(day);
		}
		else if ((day + days) >getDays(month-1, year)){
			var noDaysInOldMth = getDays(month-1, year);
			if ((month + 1)>12){
				year++;
				month = 1;
				strYear = String (year);
				strMonth = '0'+String(month);
			} else {
				month++;
				strMonth = String(month);
				if (month<10){
					strMonth = '0'+String(month);
				}
			}
			day = day + days - noDaysInOldMth;	
			strDay = String(day);
			if (day <10){
				strDay = '0'+strDay;
			}		
		}
		return strYear+strMonth+strDay;
	}
	return strDateVal;
}
//This function is used to adjust the date to the last valid day of month automatically
//if date selected is invalid date
//trigger when date onchange
function setValidDate(dateElement, row){
	var dateVal = getDateValue(dateElement, row);
	var year = parseInt(dateVal.substr(0,4));
	var mth = parseInt(dateVal.substr(4,2),10)-1;
	var day = parseInt(dateVal.substr(6,2),10);
	if (day>getDays(mth,year))
		setDateValue(dateElement, dateVal.substr(0,6)+getDays(mth,year), row);
}

function getDays(month, year)
{
	// Test for leap year when February is selected.
	if (1 == month)
		return ((0 == year % 4) && (0 != (year % 100))) ||
			(0 == year % 400) ? 29 : 28;
	else
		return daysInMonth[month];
}

//This function is used to get the value of date Element in format yyyyMMdd
function getDateValue(dateElementId, row)
{
	var date0;
	var date1;
	var date2;
	var date3;

	if (row != undefined) 
	{
		date0 = dateElementId + "[" + row + "]";
		date1 = dateElementId + "_1[" + row + "]";
		date2 = dateElementId + "_2[" + row + "]";
		date3 = dateElementId + "_3[" + row + "]";
	}
	else 
	{
		date0 = dateElementId;
		date1 = dateElementId + "_1";
		date2 = dateElementId + "_2";
		date3 = dateElementId + "_3";
	}
		
	if (document.getElementById(date0) != null)
	{
		return document.getElementById(date0).value;
	}
	else
	{
		if (document.getElementById(date3) != null)
		{
			var val1 = document.getElementById(date1).value;
			var val2 = document.getElementById(date2).value;
			var val3 = document.getElementById(date3).value;			
			return val1+val2+val3;
		} 
		else
		{
			var val1 = document.getElementById(date1).value;
			var val2 = document.getElementById(date2).value;		
			return val1+val2;
		}
	}
	return null;
}

//This function is used to set the value of date Element
//(dateValue in format yyyyMMdd)
function setDateValue(dateElementId, dateValue, row)
{
	var date0;
	var date1;
	var date2;
	var date3;

	if (row != undefined) 
	{
		date0 = dateElementId + "[" + row + "]";
		date1 = dateElementId + "_1[" + row + "]";
		date2 = dateElementId + "_2[" + row + "]";
		date3 = dateElementId + "_3[" + row + "]";
	}
	else 
	{
		date0 = dateElementId;
		date1 = dateElementId + "_1";
		date2 = dateElementId + "_2";
		date3 = dateElementId + "_3";
	}

	if (document.getElementById(date0) != null)
	{
		document.getElementById(date0).value = dateValue;
	} else 
	{
		if (document.getElementById(date3) != null)
		{
			document.getElementById(date1).value = dateValue.substr(0,4); //yyyy
			document.getElementById(date2).value = dateValue.substr(4,2); //MM
			document.getElementById(date3).value = dateValue.substr(6,2); //dd
		}
		else if (document.getElementById(date1) != null)
		{
			document.getElementById(date1).value = dateValue.substr(0,6); //yyyyMM
			setDay(document.getElementById(date1),date2);
			document.getElementById(date2).value = dateValue.substr(6,2); //dd
		}
	}
}

function setArrivalDateEditableByTripType(tripTypeVal, dateElementId)
{
	if (tripTypeVal == "O") //One-way
	{
		document.getElementById(dateElementId).disabled = true;
	} else if (tripTypeVal == "R") //Round-trip
	{
		document.getElementById(dateElementId).disabled = false;	
	}
}
function setDateDisableByTripType(tripTypeVal, rDateElementId, dDateElementId)
{
	if (tripTypeVal == "O") //One-way
	{
		document.getElementById(rDateElementId+"_1").value = document.getElementById(dDateElementId+"_1").value;
		document.getElementById(rDateElementId+"_2").value = document.getElementById(dDateElementId+"_2").value;
		document.getElementById(rDateElementId+"_1").disabled = true;
		document.getElementById(rDateElementId+"_2").disabled = true;
		document.getElementById(rDateElementId+"Cal").style.display = "none";			
	} else if (tripTypeVal == "R") //Round-trip
	{
		document.getElementById(rDateElementId+"_1").disabled = false;	
		document.getElementById(rDateElementId+"_2").disabled = false;			
		document.getElementById(rDateElementId+"Cal").style.display = "inline";					
	}
}

function refreshPaxDropdown(cabinClass)
{
	var adultSize = document.getElementById("adult").options.length;
	var childSize = document.getElementById("child").options.length;
	var selAdult = document.getElementById("adult").selectedIndex;
	var selChild = document.getElementById("child").selectedIndex;

	if (cabinClass == "E")
	{
		while(adultSize<adultNumEcon){
			adultSize++;
			document.getElementById("adult").options[adultSize-1]=new Option(adultSize,adultSize);
		}
		while(childSize<childNumEcon+1){
			childSize++;
			document.getElementById("child").options[childSize-1]=new Option(childSize-1,childSize-1);
		}

		while (adultSize>adultNumEcon){
			document.getElementById("adult").options[adultSize-1]=null;		
			adultSize--;
		}
		while(childSize>childNumEcon+1){
			document.getElementById("child").options[childSize-1]=null;		
			childSize--;		
		}
		if (selAdult < adultNumEcon)
			document.getElementById("adult").selectedIndex = selAdult;
		else
			document.getElementById("adult").selectedIndex = 0;
			
		if (selChild <= childNumEcon)
			document.getElementById("child").selectedIndex = selChild;
		else
			document.getElementById("child").selectedIndex = 0;		
				
		
	} else if (cabinClass == "B")
	{
		while(adultSize<adultNumBuss){
			adultSize++;
			document.getElementById("adult").options[adultSize-1]=new Option(adultSize,adultSize);
		}
		while(childSize<childNumBuss+1){
			childSize++;
			document.getElementById("child").options[childSize-1]=new Option(childSize-1,childSize-1);
		}		
		while (adultSize>adultNumBuss){
			document.getElementById("adult").options[adultSize-1]=null;		
			adultSize--;
		}	
		while(childSize>childNumBuss+1){
			document.getElementById("child").options[childSize-1]=null;		
			childSize--;		
		}	
		if (selAdult < adultNumBuss)
			document.getElementById("adult").selectedIndex = selAdult;
		else
			document.getElementById("adult").selectedIndex = 0;
			
		if (selChild <= childNumBuss)
			document.getElementById("child").selectedIndex = selChild;
		else
			document.getElementById("child").selectedIndex = 0;							
	} else if (cabinClass == "F")
	{
		while(adultSize<adultNumFirst){
			adultSize++;
			document.getElementById("adult").options[adultSize-1]=new Option(adultSize,adultSize);
		}
		while(childSize<childNumFirst+1){
			childSize++;
			document.getElementById("child").options[childSize-1]=new Option(childSize-1,childSize-1);
		}				
		while (adultSize>adultNumFirst){
			document.getElementById("adult").options[adultSize-1]=null;		
			adultSize--;
		}			
		while(childSize>childNumFirst+1){
			document.getElementById("child").options[childSize-1]=null;		
			childSize--;		
		}			
		if (selAdult < adultNumFirst)
			document.getElementById("adult").selectedIndex = selAdult;
		else
			document.getElementById("adult").selectedIndex = 0;
			
		if (selChild <= childNumFirst)
			document.getElementById("child").selectedIndex = selChild;
		else
			document.getElementById("child").selectedIndex = 0;					
	} 
}

function fnHome() {
	window.location = homepageUrl;
}

function fnLogout() {
	if(isLogoutEnabled()) {
		actionName = "LOG_OUT";
		returnUrl = location.href;
		eval("document.profileBarForm2.target = '_self'");
		eval("document.profileBarForm2.ACTION.value = actionName");
		eval("document.profileBarForm2.RETURN_URL.value = returnUrl");
		//eval("document.profileBarForm2.TARGETURL.value = returnUrl");
		eval("var url=document.profileBarForm2.TARGETURL; if(url!=undefined && url.value=='') {document.profileBarForm2.TARGETURL.value=returnUrl;}");
		eval("document.profileBarForm2.submit()");
	} else {
		window.status = "Logout is not allowed.";
	}
}
	
function fnYourAccount() {
	 window.location = yourAcconutUrl;
}

function disableEnterKey(e) {
     var key;

     if(window.event)
          key = window.event.keyCode; //IE
     else
          key = e.which; //firefox

     if(key == 13)
          return false;
     else
          return true;
}

function resetChildSelect( childSelectId, adultCount, paxCountPerChild ) {
	var childOptionCount = Math.floor(adultCount * paxCountPerChild);
	var selectControl = document.getElementById(childSelectId);
	if( selectControl ) {
		selectControl.length = 0; // Reset the select dropdown
		for( var i=0; i<=childOptionCount; i++ ) { // Recreate the select dropdown
			selectControl.options[selectControl.options.length] = new Option(i, i);
		}
	}
}

// ****************************************************************
//     Following codes are related to fare's departure period
// ****************************************************************

function validateDeptPeriod(controllder, fareId, dateElement, row) {
	var deptDate = getDateValue(dateElement, row);
	var correctDeptDate = controllder.validDeptDate(fareId, deptDate);
	if( deptDate!=correctDeptDate ) {
		setDateValue(dateElement, correctDeptDate+"", row);
		var arrId = convertId(dateElement,'departureDate','arrivalDate'); // get arrival date id
		if( document.getElementById(arrId+'_2') ) { // if arrival date select exists
			setValidDeptDate(dateElement, arrId); // set arrival date according to the changed departure date
		}
	}
}

/*
 * JS object deptPeriod has properties: startDate, endDate
 */
function deptPeriod( startDate, endDate ) {
	this.startDate = parseInt(startDate,10);
	this.endDate = parseInt(endDate,10);
	this.withinPeriod = function( date ) {
		var intDate = parseInt(date,10);
		if( startDate<=intDate  && endDate>=intDate ) {
			return true;
		}
		return false;
	}
	this.diffWithStartDate = function( date ) { // Returns the number of days difference from the deptPeriods' startDate
		var intDate = parseInt(date,10);
		return startDate - intDate;
	}
	this.print = function() {
		alert(this.startDate + " - " + this.endDate);
	}
}

/*
 * JS object deptPeriods maps a fare id to fare's departure periods
 */
function deptPeriods( fareId ) {
	this.fareId = fareId;
	this.periods = new Array();
	this.add = function( startDate, endDate ) {
		this.periods[this.periods.length] = new deptPeriod( startDate, endDate );
	}
	this.withinPeriod = function( date ) {
		for( var i=0; i<this.periods.length; i++ ) {
			return this.periods[i].withinPeriod(date);
		}
	}
	this.validDeptDate = function( date ) { // Given a specific date (string), this function returns the next available date according to the fare's depature periods
		var cloestPeriod = null;
		for( var i=0; i<this.periods.length; i++ ) {
			if( this.periods[i].withinPeriod(date) ) {
				return date;
			} else {
				var tmp = this.periods[i].diffWithStartDate(date);
				if( tmp>0 ) { // period startDate later than input date
					if( cloestPeriod==null ) {
						cloestPeriod = this.periods[i];
					} else {
						if( tmp<cloestPeriod.diffWithStartDate(date) ) {
							cloestPeriod = this.periods[i];
						}
					}
				}
			}
		}
		if( cloestPeriod!=null ) {
			return cloestPeriod.startDate;
		} else { // return today's date
			return formatDate(new Date(), "yyyymmdd");
		}
	}
	this.print = function() {
		alert("fareId: " + this.fareId);
		for( var i=0; i<this.periods.length; i++ ) {
			this.periods[i].print();
		}
	}
}

/*
 * JS object deptPeriodController controls and manage a collection of deptPeriods (fare/departure periods mapping)
 */
function deptPeriodController() {
	this.periods = new Array();
	this.add = function( fareId, startDate, endDate ) {
		var newPeriod = true;
		for( var i=0; i<this.periods.length; i++ ) {
			if( this.periods[i].fareId==fareId ) {
				this.periods[i].add( startDate, endDate )
				newPeriod = false;
			}
		}
		if( newPeriod ) {
			var tmp = new deptPeriods(fareId);
			tmp.add(startDate, endDate);
			this.periods[this.periods.length] = tmp;
		}
	}
	this.validDeptDate = function( fareId, date ) {
		var result = formatDate(new Date(), "yyyymmdd");
		for( var i=0; i<this.periods.length; i++ ) {
			if( this.periods[i].fareId==fareId ) {
				return this.periods[i].validDeptDate(date);
			}
		}
		return result;
	}
	this.print = function() {
		for( var i=0; i<this.periods.length; i++ ) {
			this.periods[i].print();
		}
	}
}

/*
 * Convert string date in specific format into javascript date object, input params:
 * date - javascript date string
 * format - string
 */
function convertDate( date, format ) {
	date += ""; // convert to string
	var year, month, day;
	if( format=='yyyymmdd' ) {
		year = (date+"").substring(0,4);
		month = (date+"").substring(4,6);
		day = (date+"").substring(6,8);
	}
	if( year!=undefined && month!=undefined && day!=undefined ) {
		var result = new Date();
		result.setFullYear(parseInt(year,10));
		result.setMonth(parseInt(month,10)-1);
		result.setDate(day);
		return result;
	}
	return null;
}

/*
 * Convert javascript date to a string in specific format, input params:
 * date - javascript date object
 * format - string
 */
function formatDate( date, format ) {
	var result = "";
	for( var i=0; i<format.length; i++ ) {
		if( format.substring(i,i+4)=='yyyy' ) {
			result += date.getFullYear();
			i += 3;
		} else if( format.substring(i,i+2)=='yy' ) {
			result += (date.getFullYear()+"").substring(2,4);
			i += 1;
		} else if( format.substring(i,i+2)=='mm' ) {
			var month = date.getMonth() + 1;
			month<10? result+="0"+month : result+=month;
			i += 1;
		} else if( format.substring(i,i+1)=='m' ) {
			result += date.getMonth() + 1;
		} else if( format.substring(i,i+2)=='dd' ) {
			var day = date.getDate();
			day<10? result+="0"+day : result+=day;
			i += 1;
		} else if( format.substring(i,i+1)=='d' ) {
			result += date.getDate();
		} else {
			result += format.charAt(i);
		}
	}
	return result;
}
