/*

START OF COMMON INDEPENDENT CODE
*/
//Script to generate select box option calendar
var oldBrowser = 0;
if (navigator.appVersion.charAt(0) == "2") {
   if (navigator.appName != "Microsoft Internet Explorer") {
      oldBrowser=1;
   }
}

var daysInMonth = new Array(12);
daysInMonth[0] = 31;	
daysInMonth[1] = 28;
daysInMonth[2] = 31;
daysInMonth[3] = 30;
daysInMonth[4] = 31;
daysInMonth[5] = 30;
daysInMonth[6] = 31;
daysInMonth[7] = 31;
daysInMonth[8] = 30;
daysInMonth[9] = 31;
daysInMonth[10] = 30;
daysInMonth[11] = 31;

var month = new Array(12);
month[0] = "Jan";
month[1] = "Feb";
month[2] = "Mar";
month[3] = "Apr";
month[4] = "May";
month[5] = "Jun";
month[6] = "Jul";
month[7] = "Aug";
month[8] = "Sep";
month[9] = "Oct";
month[10] = "Nov";
month[11] = "Dec";

var curDate = new Date();
var curDay =  curDate.getDate() + 21;
var curMonth = curDate.getMonth();
var curYear = curDate.getYear();
while (curDay>daysInMonth[curMonth]) {
    curDay-=daysInMonth[curMonth];
    curMonth+=1;
    if (curMonth>11) {
        curMonth=0;
        curYear++;
    }
}
var nextDate = curDate;
nextDate.setDate(curDate);
var nextDay = curDay + 4;
var nextMonth = curMonth;
var nextYear = curYear;
if (nextDay>daysInMonth[nextMonth]) {
    nextDay-=daysInMonth[nextMonth];
    nextMonth+=1;
    if (nextMonth>11) {
        nextMonth=0;
        nextYear++;
    }
}




/**
 * DHTML date validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2005;
var emptyString = /^\s*$/

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		//alert("The date format should be : mm/dd/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert(date_month_validity)
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert(date_day_validity)
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert(date_year_validity)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert(date_validity)
		return false
	}
return true
}

// CC verification by modules algo
function checkCardNumWithMod10(cardNum) {
	var i;
	var cc = new Array(16);
	var checksum = 0;
	var validcc;

	// assign each digit of the card number to a space in the array	
	for (i = 0; i < cardNum.length; i++) {
		cc[i] = Math.floor(cardNum.substring(i, i+1));
	}

	// walk through every other digit doing our magic
	// if the card number is sixteen digits then start at the
	// first digit (position 0), otherwise start from the
	// second (position 1)
	for (i = (cardNum.length % 2); i < cardNum.length; i+=2) {
		var a = cc[i] * 2;
		if (a >= 10) {
			var aStr = a.toString();
			var b = aStr.substring(0,1);
			var c = aStr.substring(1,2);
			cc[i] = Math.floor(b) + Math.floor(c);
		} else {
			cc[i] = a;
		}
	}

	// add up all of the digits in the array
	for (i = 0; i < cardNum.length; i++) {
		checksum += Math.floor(cc[i]);
	}

	// if the checksum is evenly divisble by 10
	// then this is a valid card number
	validcc = ((checksum % 10) == 0);

	return validcc;
}

// clean CC nos for invalid charecters
function cleanCardNum(cardNumObj) {
	var i;
	var ch;
	var newCard = "";
    var cardNum = cardNumObj.value;
	// walk through the string character by character to build
	// a new string with numbers only
	i = 0;
	while (i < cardNum.length) {
		// get the current character
		ch = cardNum.substring(i, i+1);
		if ((ch >= "0") && (ch <= "9")) {
			// if the current character is a digit then add it
			// to the numbers-only string we're building
			newCard += ch;
		} else {
			// not a digit, so check if its a dash or a space
			if ((ch != " ") && (ch != "-")) {
				// not a dash or a space so fail
				alert(invalid_card_number);
				cardNumObj.focus();
				return "";
			}
		}
		i++;
	}

	// we got here if we didn't fail, so return what we built
	return newCard;
}

// assign the CardTypes
function getCardType(CCType) {
	var type;
	if(CCType == "VISA") type = "V";
	if(CCType == "MASTER") type = "M";
	if(CCType == "AMEX") type = "A";
	if(CCType == "DinnersClub") type = "D";
	if(CCType == "JCB") type = "J";
	return type;
}

// check the CardType
function checkCardType(cardTypeObj) {
	var cardType = getCardType(cardTypeObj.value);
	// check if the card type is valid
	if ((cardType != "V") && (cardType != "M") && (cardType != "A") && (cardType != "D") && (cardType != "J")) {
		alert(invalid_card_type);
		cardTypeObj.focus();
		return false;
	} else {
	 return true;
	}
}

// check for valid credit card nos
function checkCreditCard(cardTypeObj, cardNumObj) {
	var validCard;
	var cardLength;
	var cardLengthOK;
	var cardStart;
	var cardStartOK;
	
	var cardType = getCardType(cardTypeObj.value);
	var cardNum = cardNumObj.value;

    validCard = cleanCardNum(cardNumObj);
	if (validCard != "") {
		// check the first digit to see if it matches the card type
		cardStart = validCard.substring(0,1);
		cardStartOK = ( ((cardType == "V") && (cardStart == "4")) ||
				        ((cardType == "M") && (cardStart == "5")) ||
				        ((cardType == "A") && (cardStart == "3")) ||
				        ((cardType == "D") && (cardStart == "3")) ||
				        ((cardType == "J") && ((cardStart == "3") || (cardStart == "2") || (cardStart == "1")))
				      );
		if (!(cardStartOK)) {
			// card number's first digit doesn't match card type
			alert(invalid_card_number);
			cardNumObj.focus();
			return false;
		}

		// the card number is good now, so check to make sure
		// it's a the right length
		cardLength = validCard.length;		
		cardLengthOK = ( ((cardType == "V") && ((cardLength == 13) || (cardLength == 16))) ||
				         ((cardType == "M") && (cardLength == 16)) ||
				         ((cardType == "A") && (cardLength == 15)) ||
				         ((cardType == "D") && (cardLength == 14)) ||
				         ((cardType == "J") && ((cardLength == 15) || (cardLength == 16)))
					   );
		if (!(cardLengthOK)) {
			// not the right length
			alert(invalid_card_number);
			cardNumObj.focus();
			return false;
		}

		// card number seems OK so do the Mod10
		if (checkCardNumWithMod10(validCard)) {
			return true;
		} else {
			alert(invalid_card_number);
			cardNumObj.focus();
			return false;
		}
	} else {
		return false;
	}
}

// check CC CVV nos
function checkCreditCardCVN(cardTypeObj, CVNObj)
{
  var tfld = trim(CVNObj.value);
  var ccAmex = /^[0-9]{4}$/;
  var ccOthers = /^[0-9]{3}$/
  var cardType = getCardType(cardTypeObj.value);
  if (cardType == "A")  
	 ccRE =  ccAmex;
   else 
     ccRE =  ccOthers;
  if (!ccRE.test(tfld)) 
  {
	alert(invalid_card_cvn);
	CVNObj.focus();
	return false;
  }
  return true;
}

// check only for alphabets
function checkAlpha(fieldObj,msg)
{
  var tfld = (fieldObj.value);
  var ccRE = /^[a-zA-Z ]{1,50}$/
  if (!ccRE.test(tfld)) 
  {
    if (msg!="") alert(msg);
    fieldObj.focus();
    return false;
  }
  return true;
}

// check only for alphabets
function checkAlphaNoSpace(fieldObj, msg)
{
  var tfld = (fieldObj.value);
  var ccRE = /^[a-zA-Z]{1,50}$/
  if (!ccRE.test(tfld)) 
  {
    if (msg!="") alert(msg);
    fieldObj.focus();
    return false;
  }
  return true;
}

// check only for alphabets
function checkAlphaNumNoSpace(fieldObj, msg)
{
  var tfld = (fieldObj.value);
  var ccRE = /^[a-zA-Z0-9]{1,50}$/
  if (!ccRE.test(tfld)) 
  {
    if (msg!="") alert(msg);
    fieldObj.focus();
    return false;
  }
  return true;
}


// trim the filed for whitespaces
function trimField(name)
{
	name.value = name.value.replace(/^\s+|\s+$/g, '')
	return ;
}

// trim the string for whitespaces
function trim(str)
{
  return str.replace(/^\s+|\s+$/g, '')
};


// validate if something has been entered
function validatePresent(vfld,msg)   // element to be validated
{
	if (emptyString.test(vfld.value))
	{
		alert(msg);
		vfld.focus();
		return false;
	}
	return true;
};

// Tel no validation 
function validateTelnr(vfld)
{
	var invalid_telephone_range = 'Please Enter a valid Telephone Number';
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/
  if (!telnr.test(tfld)) {
    alert('Invalid Telephone Number');
    vfld.focus();
    return false;
  }

  var numdigits = 0;
  for (var j=0; j<tfld.length; j++) 
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  	if (numdigits<6) {
    	alert(invalid_telephone_range);
    	vfld.focus();
    	return false;
  	}
	
  	if (numdigits>14) {
    	alert(invalid_telephone_range);
    	vfld.focus();
    	return false;
  	}

  return true;
};

// Email ID validation 
function mailIDCheck(valueMailID,errText) {

		if(valueMailID=="") {
	    if (errText!="") alert(errText);
        return false;
    } else {
			//errText=required_emaild + " \n"; 	     
			if (!/^\w+([\.]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test (valueMailID)) {
				alert(errText);
		   	return false;
			} else {
		    var at="@";	var uc="_";	var dot=".";
		    var lat=valueMailID.indexOf(at)
		    var ldot=valueMailID.lastIndexOf(dot)
		    var dn = valueMailID.substring(lat+1,ldot);
		   	if (dn.indexOf(uc) != -1) {
		    	alert(errText);
		    	return false;
		    } else {		   		
			    return true;
    		}
			}
		}
}
//Email Validation Overiding Method
//function mailIDCheck(valueMailID){

//		return mailIDCheck(valueMailID,"");
//}



// validate the TravellerPaymentInfo
function valTravellerPaymentInfoForm(myForm)
{
	if (!validatePresent(myForm.paymentMethod,invalid_card_type)) return false;
	else if (!checkCardType(myForm.paymentMethod)) return false;
	if (!validatePresent(myForm.paymentMethodNumber,invalid_card_number)) return false;
	else if (!checkCreditCard(myForm.paymentMethod,myForm.paymentMethodNumber)) return false;
	
	if (!validatePresent(myForm.paymentMethodCVN,invalid_card_cvn)) return false;
	else if (!checkCreditCardCVN(myForm.paymentMethod,myForm.paymentMethodCVN)) return false;

	if (!validatePresent(myForm.billingFirstName,required_nameF)) return false;
	else if(!checkAlphaNoSpace(myForm.billingFirstName)) return false;
	if (!validatePresent(myForm.billingLastName,required_nameL)) return false;
	else if(!checkAlphaNoSpace(myForm.billingLastName)) return false;

	if (!validatePresent(myForm.billingAddressLine1,invalid_address)) return false;
	if (!validatePresent(myForm.billingCity,city_needed)) return false;
	//else if(!checkAlpha(myForm.billingCity)) return false;
	//if (myForm.billingState.value != "") {
	//	if(!checkAlpha(myForm.billingState)) return false;
	//}
	if (!validatePresent(myForm.billingZip,postalCode_needed)) return false;
	if (!validatePresent(myForm.billingCountry,country_needed)) return false;
	else if(!checkAlpha(myForm.billingCountry)) return false;
	if (!validatePresent(myForm.billingTelephone,required_telephone)) return false;
	else if (!validateTelnr(myForm.billingTelephone)) return false;
	
	if(myForm.tandC.checked != true || myForm.tandC.value != "IAgree")	{
		 alert(agree_tandC)
		 return false;
	 } else {	 
	    showWaitMessage('waitDivHotels','dispDiv', 1, 0);
		return true;
	 }
};

function writeOption(myNum, myValue, mySelected) {
   if (oldBrowser == 0) {
      if (mySelected == 1) {
         document.write ("<option value='" + myNum + "' selected>" + myValue );
      } else {
         document.write ("<option value='" + myNum + "'>" + myValue );
      }
   }
}

function showMonth(toSelect) {
   for (var i=0; i < 12; i++ ) {
      if (i == toSelect) {
         writeOption(i+1, month[i], 1);
      } else {
         writeOption(i+1, month[i], 0);
      }
   }
}

function showDay(toSelect, myMonth, myYear) {
   for (i=1; i <= 31; i++) {
      if (i == toSelect) {
         writeOption(i, i, 1);
      } else {
         writeOption(i, i, 0);
      }
   }
}


function changeReturnMonth(selectfieldprefix1, selectfieldprefix2) {
	document.book["select_" + selectfieldprefix2 + "_month"].selectedIndex = document.book["select_" + selectfieldprefix1 + "_month"].selectedIndex;
	changeReturnDay(selectfieldprefix1, selectfieldprefix2);
} // changeReturnMonth	Flights and Cars

function changeReturnDay(selectfieldprefix1, selectfieldprefix2) {	
	// plus 1 for auto return date, i.e one day out
	var out_date = document.book["select_" + selectfieldprefix1 + "_day"].selectedIndex + 4;
	var out_month = document.book["select_" + selectfieldprefix1 + "_month"].selectedIndex;
	
	while (out_date>=daysInMonth[out_month]) {
    	out_date-=daysInMonth[out_month];
    	out_month+=1;
    	if (out_month>=12) {
        	out_month=0;
    	}
	}
	
	document.book["select_" + selectfieldprefix2 + "_day"].selectedIndex = out_date;
	document.book["select_" + selectfieldprefix2 + "_month"].selectedIndex = out_month;	
	
} // changeReturnDay Flights and Cars


//DHTML wait search page
function calWaitPage() {
	showWaitMessage('waitDivHotel','dispDiv', 1, 0);
    return true;
}

DHTML = (document.getElementById || document.all || document.layers);
function getObj(name) {
	if (document.getElementById) { 
		return document.getElementById(name).style; 
	} else if (document.all) { 
		return document.all[name].style;
	} else if (document.layers) { 
		return document.layers[name]; 
	}
}


function changeMode(strMode) {
	var arrModes = new Array("Flights", "Hotels", "Cars");
	for (var i = 0; i < arrModes.length; i++) {
		if (arrModes[i] == strMode) {
			document.getElementById('span'+arrModes[i]).className = "selected";
			document.getElementById('header'+arrModes[i]).className = "modeheader_selected";
		}
		else {
			document.getElementById('span'+arrModes[i]).className = "deselected";
			document.getElementById('header'+arrModes[i]).className = "modeheader_deselected";
		}
	}
	switch (strMode) {
		case "Flights": 
			MM_showHideLayers('flight','','show','tab_flight_exact','','show','tab_flight_flexible','','hide','hotel','','hide','tab_hotel_countries','','hide','tab_hotel_us','','hide','tab_hotel_ca','','hide','car','','hide');
			changeFlightDate(tab_Flight_Date);
			break;
		case "Hotels": 
			MM_showHideLayers('flight','','hide','tab_flight_exact','','hide','tab_flight_flexible','','hide','hotel','','show','tab_hotel_countries','','hide','tab_hotel_us','','hide','tab_hotel_ca','','hide','car','','hide'); 
			changeHotelDestDetails(tab_Hotel_Country);
			break;
		case "Cars": 
			MM_showHideLayers('flight','','hide','tab_flight_exact','','hide','tab_flight_flexible','','hide','hotel','','hide','tab_hotel_countries','','hide','tab_hotel_us','','hide','tab_hotel_ca','','hide','car','','show'); 
			break;
	}
}


function field_disable() {
	var args=field_disable.arguments;
	for (temp=1; temp<args.length; temp++) {
		document.book[args[temp]].disabled = args[0];
	}
    if (arguments.length>0 && arguments[0] == "true" & arguments[1] == "select_flightreturn_time" && arguments[2] == "select_flightreturn_day" & arguments[3] == "select_flightreturn_month") {
       document.write('<input type="hidden"  name="returnMonth" value="">');
	}	
}

//Pop up window for infant page
function launchWindow( url, HT, WD ) {
	var windowOptions
	var myLocation = url
	var WN = "newWindow"
	var AR = "yes"
	var TB = "no"
	var LC = "no"
	var SB = "no"
	var DR = "no"
	var ST = "no"
	var MB = "no"
	var RS = "yes"
	var CH = "yes"
	var PX = ""
	var PY = ""
	switch( arguments.length ) {
		case 16:
		case 15: PY = arguments[14];
		case 14: PX = arguments[13];
		case 13: CH = arguments[12];
		case 12: RS = arguments[11];
		case 11: MB = arguments[10];
		case 10: ST = arguments[9];
		case  9: DR = arguments[8];
		case  8: SB = arguments[7];
		case  7: LC = arguments[6];
		case  6: TB = arguments[5];
		case  5: AR = arguments[4];
		case  4: WN = arguments[3];
	}

	windowOptions  = "height="
	windowOptions += HT
	windowOptions += ",width="
	windowOptions += WD
	windowOptions += ",alwaysRaised="
	windowOptions += AR
	windowOptions += ",toolbar="
	windowOptions += TB 
	windowOptions += ",location="
	windowOptions += LC 
	windowOptions += ",scrollbars="
	windowOptions += SB 
	windowOptions += ",directories="
	windowOptions += DR 
	windowOptions += ",status="
	windowOptions += ST
	windowOptions += ",menubar="
	windowOptions += MB 
	windowOptions += ",resizable="
	windowOptions += RS 
	windowOptions += ",copyhistory="
	windowOptions += CH
	windowOptions += ",screenX="
	windowOptions += PX
	windowOptions += ",screenY="
	windowOptions += PY
	windowOptions += ",left="
	windowOptions += PX
	windowOptions += ",top="
	windowOptions += PY

	var w=window.open(myLocation, "Infants_popup", windowOptions);
	w.focus();
}


function PushBack() {
 var ie=(document.all)?1:0;
 if (ie) dummyvar=document.forms[0].dropdown.value
 else {
  IndexSelect = document.forms["MyForm"].dropdown.selectedIndex;
  NameSelect  = document.forms["MyForm"].dropdown[IndexSelect].value; 
 }
 if (ie) parent.frames.footle.location = "footer.html?"  + document.forms[0].dropdown.value
 else {
  parent.footle.location = "footer.html?" + escape(NameSelect);
 }
};

/*
GENL SCRIPT TO LEFT TRIM
*/
function ltrim(argvalue) {
  while (1) {
    if (argvalue.substring(0, 1) != " ")
      break;
    argvalue = argvalue.substring(1, argvalue.length);
  }
  return argvalue;
};

function rtrim(argvalue) {
  while (1) {
    if (argvalue.substring(argvalue.length - 1, argvalue.length) != " ")
      break;
    argvalue = argvalue.substring(0, argvalue.length - 1);
  }
  return argvalue;
};

function trim(argvalue) {
  argvalue = argvalue.substring(1, argvalue.length);
  argvalue = argvalue.substring(0, argvalue.length - 1);
  return argvalue;

};

function PushBack2(inp) {
 var ie=(document.all)?1:0;
 if (ie) parent.opener.document.forms[2].elements[parent.name].value=unescape(inp)
 else {
  parent.opener.document.forms[2].elements[parent.name].value=unescape(inp);
 }
};
/*

END OF COMMON SCRIPTS

*/