// add the current page to favourites page title unless a substitute is supplied
function addToFavorite( favTitle ){
   if ((navigator.appVersion.indexOf("MSIE") > 0) && (parseInt(navigator.appVersion) >= 4)) {
      ft = (favTitle) ? favTitle : document.title;
      window.external.AddFavorite(location.href, unescape(ft));
   }
}

// call from the onsubmit event to display the contents of the form in an alert box, returning false unless true is specified
// e.g. onsubmit="return showFormElements( this )"
function showFormElements( oForm ){
	els = oForm.elements;
	txt = 'FORM ' + oForm.name + " (" + els.length + " element" + ((els.length>1) ? "s" : "") + ")\n\n";
	for (var x=0; x<els.length; x++){
		txt += els[x].name + " = " + els[x].value + "\n";
		}
  txt += "\nClicking OK to submit form, CANCEL to, well, cancel";

	return confirm(txt);
}

// this lot will allow a field to be cleared when it it receives the focus for the first time (ONLY!)
var rClearOnFirstClick = new Array();

function clearOnFirstClick(thisfield) {
	if (!rClearOnFirstClick[thisfield.id]) {
		thisfield.value = "";
		rClearOnFirstClick[thisfield.id]=1;
	}
}

function countChecked( oField ) {
	count = 0;

	if (oField.length == undefined) {
		count += (oField.checked);
	}
	else
		for (ii=0; ii<oField.length; ii++) {
			count += (oField[ii].checked);
		}
	return count;
}


//##################################################     T R I M     F U N C T I O N S     #############################
// remove trailing spaces from a string
function rTrim( strText ) {
strTemp = strText;
while( strTemp.length > 0 && strTemp.charAt(strTemp.length-1)==" " ) {
	strTemp = strTemp.substring(0,strTemp.length-1);
}
return strTemp;
}

// remove leading spaces from a string
function lTrim( strText ) {
strTemp = strText;
while( strTemp.length > 0 && strTemp.charAt(0)==" " ) {
	strTemp = strTemp.substring(1,strTemp.length-1);
}
return strTemp;
}

// remove leading & trailing spaces from a string
function Trim( strText ) {
return lTrim( rTrim( strText ) );
}

//##################################################     T R I M     M E T H O D S     #############################
// http://www.developingskills.com/ds.php?article=jstrim&page=1
function strltrim() {
	//Match spaces at beginning of text and replace with a null string
	return this.replace(/^\s+/,'');
}

function strrtrim() {
	//Match spaces at end of text and replace with a null string
	return this.replace(/\s+$/,'');
}

function strtrim() {
	//Match spaces at beginning and end of text and replace with null strings
	//return this.replace(/^\s+/,'').replace(/\s+$/,'');
	return this.ltrim().rtrim();
}

String.prototype.ltrim = strltrim;
String.prototype.rtrim = strrtrim;
String.prototype.trim  = strtrim;
                  

//##############################################      F O R M     V A L I D A T I O N      ################################

function validateForm( oForm, tMsg ) {
//  alert( oForm.elements.length );
	ok = true;
	str = "";
	if (!tMsg) tMsg = 'Errors must be corrected before you can update this record';
	
	// this loop basically checks to see that all required fields have a value in
	for (ii=0;ii<oForm.elements.length;ii++) {
		xx = oForm.elements[ii];

		// this bit changes the class on any description fields for images/thumbs/supers
		if (xx.name && (prefix=xx.name.substr(0,5).toLowerCase()))
			if (prefix == 'image' || prefix == 'thumb' || prefix == 'super') {
				// getting the prefix allows for image10..image999 etc.
				prefix = (pos = xx.name.indexOf('_')) ? xx.name.substr(0,pos) : xx.name;
				if (desc = eval("oForm." + prefix + "Desc"))	{		// e.g. Image1Desc
					desc.className = xx.value ? 'required' : '';
//					alert( desc.name + " class changed to : " + desc.className );
					window.status = desc.name + " class changed to : " + desc.className;
				}
			}
		fldName = (xx.title) ? xx.title : (xx.name) ? xx.name : xx.id;		// use Title, else Name, else Id for alert box
		
		// if field classname says it's a required field
		if (xx.className.substr(0,8) == "required") {
			switch( xx.type ) {
				case "radio":
					break;
				case "checkbox":
					if (!xx.checked) {
						str += fldName + "\n";
						if (ok) oField = xx;    		// identify first field in error
						ok = false;
					}
					break;
				default:
					xx.value = xx.value.trim();		// remove leading and trailing spaces
					if (xx.value == "") {
						str += fldName + "\n";
						if (ok) oField = xx;    		// identify first field in error
						ok = false;
		//				alert( fldName + " classname=" + xx.classname + " type=" + xx.type +  " value=" + xx.value + " result=" + ok);
					}
			} // switch
		}	// required
	}	// for
		 
	// if all required fields have a value, check to see that it's of the required (!) type
	if (ok) {
		for (ii=0;ii<oForm.elements.length;ii++) {
			xx = oForm.elements[ii];
			fldName = (xx.title) ? xx.title : (xx.name) ? xx.name : xx.id;
			if (xx.value != '') {
				valType = (xx.className.substr(8)).toLowerCase();		// drop off 'required' or 'optional'
				switch( valType ) {
					case "n" :
						xx.value = xx.value.replace("%","");					// handle percentages
//						xx.value = eval(xx.value.replace(",",""));		// remove commas from numbers
						xx.value = xx.value.replace(",","");		// remove commas from numbers
						
						if (xx.value.match(/^\d*$/)==null) {	// zero or more digits only
							str += fldName + " must be a valid integer\n";
							window.status = xx.value + " must be a valid integer";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						break;
					case "email":
						var exclude = /[^@\-\.\w]|^[_@\.\-]|[\._\-]{2}|[@\.]{2}|(@)[^@]*\1/;
						var check = /@[\w\-]+\./;
						var checkend = /\.[a-zA-Z]{2,6}$/;
//						alert( xx.value.search(exclude) + "\n" + xx.value.search(check) + "\n" + xx.value.search(checkend) );
						if(((xx.value.search(exclude) != -1) || (xx.value.search(check)) == -1) || (xx.value.search(checkend) == -1)) {
							str += fldName + " must be a valid email address\n";
							window.status = xx.value + " is not a valid email address";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						break;
					case "price" :
						xx.value = xx.value.replace("£","");					// remove pound signs
						xx.value = eval(xx.value.replace(",",""));		// remove commas from numbers
						// match pounds only or pounds and 2 decimal pence
						if (xx.value.match(/^\d+(\.\d{2})?$/) == null) {
							str += fldName + " must be a valid price\n";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						break;
					case "file" :
//					allow colons and back slashes through as they'll go during the POST process.
						if (xx.value.match(/^([\w]|[-]|[_]|[ ]|[:]|[\\])+\./) == null) {
							str += fldName + " - filename can only contain letters, digits, space, hyphen or underscore\n";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						// must END with one of specified document types
						if (xx.value.match(/\.(doc|csv|mdb|pdf|ppt|sfi|xls|zip)+$/) == null) {
							str += fldName + " - file can only be of the following types : .doc, .csv, .mdb, .pdf, .ppt, .sfi, .xls, .zip\n";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						break;
					case "image" :
//					allow colons and back slashes through as they'll go during the POST process.
						imgname = xx.value.split('\\');
												
						if (imgname[imgname.length-1].match(/^([\w]|[_]|[ ]|[-]|[:]|[\\])+\./) == null) {
							str += fldName + " - filename can only contain letters, digits, hyphen or underscore\n";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						// must END with one of specified image types
						if ((xx.value.toLowerCase()).match(/\.(gif|jpeg|jpg|wmf)+$/) == null) {
							str += fldName + " - file can only be of the following types : .gif, .jpeg, .jpg, .wmf\n";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						break;
					case "date" :
					case "datetime" :
						// match dates in 1900-2099, no checks on days in month though
						// match 1-9, 01-09 or 10-29, or 30-31, then /, then 1-9, 01-09, or 10-12, then /, then 20, or null, then 00-99
						if (valType == "date")
							dtArr = xx.value.match(/^([0]?[1-9]|[1-2][0-9]|[3][0-1])(\/)([0]?[1-9]|[1][0-2])(\/)((19|20)?[0-9][0-9])$/);
						else {
							// this works for datetime values, but they're not nice to enter on a form for a user
							dtArr = xx.value.match(/^([0]?[1-9]|[1-2][0-9]|[3][0-1])(\/)([0]?[1-9]|[1][0-2])(\/)((19|20)?[0-9][0-9])?(( )+([0-1][0-9]|[2][0-3])(:)([0-5][0-9]))?$/);
//							alert(xx.value + " = " + dtArr);
							}


						if ((dtArr) != null) {
							dt = new Date();
							if ((dtYear = dtArr[5]).length == 2) dtYear = dt.getFullYear().toString().substr(0,2) + dtYear;	// prefix yy years with current cc (20 I guess!)
							dtLeap = (dtYear % 4 == 0) && (dtYear % 400 != 0); 
	//						window.status = xx.value + " = " + dtArr + " " + dtLeap;
							switch ( dtArr[3] * 1 ) {		// month entered
								case 4:	case 6: case 9: case 11:
									if (dtArr[1]*1 > 30) {
										str += fldName + " must be a valid date\n";
										window.status = xx.value + " is not a valid date [2]";
										if (ok) oField = xx;    		// identify first field in error
										ok = false;
									}
									break;
								case 2:
									if (dtArr[1]*1 > (28+dtLeap)) {
										str += fldName + " must be a valid date\n";
										window.status = xx.value + " is not a valid date [3]";
										if (ok) oField = xx;    		// identify first field in error
										ok = false;
									}
									break;
								default:
							} // switch							
						}
						else {
							str += fldName + " must be a valid date\n";
							window.status = xx.value + " is not a valid date [1]";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						break;
					case "date2" :
						// match dates in 2003-9, no checks on days in month though
						// match 1-9, 01-09 or 10-29, or 30-31, then /, then 1-9, 01-09, or 10-12, then /, then 20, or null, then 00-99
						window.status = xx.value + " = " + 
							(xx.value.match(/^([0]?[1-9]|[1-2][0-9]|[3][0-1])(\/)([0]?[1-9]|[1][0-2])(\/)((20)?[0-9][0-9])?$/));
						break;
					case "time" :
						if (xx.value.match(/^([0-1][0-9]|[2][0-3])(:)([0-5][0-9])$/) == null) {
							str += fldName + " must be a valid time\n";
							window.status = xx.value + " is not a valid time";
							if (ok) oField = xx;    		// identify first field in error
							ok = false;
						}
						break;
					default :
				}		// switch
			}
		}	// for
		if (!ok) {
			alert( str += "\n" + tMsg );
			if (oField.type != "hidden")
				oField.focus();   // set focus on first field in error
		}
	}
	else {
		alert( str += "\n" + tMsg );
		if (oField.type != "hidden")
			oField.focus();   // set focus on first field in error
	}

	window.status = "final value WOULD have been : " + ok;
	setTimeout("window.status=''", 1500);
	if (oForm.debug && oForm.debug.value.toLowerCase()=='y')			// if debugging is 'on'
		ok = ok && showFormElements(oForm);		// do whatever user wants to do, if OK

	return ok;											// go ahead and submit
}


function FormatNumber(num,decimalNum,bolLeadingZero,bolParens,bolCommas)
/**********************************************************************
coutesy of 4 guys from rolla... fixed by JPN!!!!!!!!!!!

IN:
		NUM - the number to format
		decimalNum - the number of decimal places to format the number to
		bolLeadingZero - true / false - display a leading zero for
										numbers between -1 and 1
		bolParens - true / false - use parenthesis around negative numbers
		bolCommas - put commas as number separators.
 
	RETVAL:
		The formatted number!
 **********************************************************************/
{ 
        if (isNaN(parseInt(num))) return "NaN";

	var tmpNum = num;
	var iSign = num < 0 ? -1 : 1;		// Get sign of number
	
	// Adjust number so only the specified number of numbers after
	// the decimal point are shown.
	tmpNum *= Math.pow(10,decimalNum);
	tmpNum = Math.round(Math.abs(tmpNum))
//	tmpNum /= Math.pow(10,decimalNum);
	tmpNum *= iSign;					// Readjust for sign
	
	// Create a string object to do our formatting on
	var tmpNumStr = new String(tmpNum);

	// this FIX added by JPN 19 March 2004 to stop errors by division and conversion to binary
	if (decimalNum>0)
		tmpNumStr = tmpNumStr.substring(0,tmpNumStr.length-decimalNum) + '.' + tmpNumStr.substring(tmpNumStr.length-decimalNum);
	else
		tmpNum /= Math.pow(10,decimalNum);		// originally higher up!


	// See if we need to strip out the leading zero or not.
	if (!bolLeadingZero && num < 1 && num > -1 && num != 0)
		if (num > 0)
			tmpNumStr = tmpNumStr.substring(1,tmpNumStr.length);
		else
			tmpNumStr = "-" + tmpNumStr.substring(2,tmpNumStr.length);
		
	// See if we need to put in the commas
	if (bolCommas && (num >= 1000 || num <= -1000)) {
		var iStart = tmpNumStr.indexOf(".");
		if (iStart < 0)
			iStart = tmpNumStr.length;

		iStart -= 3;
		while (iStart >= 1) {
			tmpNumStr = tmpNumStr.substring(0,iStart) + "," + tmpNumStr.substring(iStart,tmpNumStr.length)
			iStart -= 3;
		}		
	}

	// See if we need to use parenthesis
	if (bolParens && num < 0)
		tmpNumStr = "(" + tmpNumStr.substring(1,tmpNumStr.length) + ")";

	return tmpNumStr;		// Return our formatted string!
}


// @ checkout this allows the qty to be updated by clicking the +/- buttons
	function updateup(obj){
		document.getElementById(obj).value = parseFloat(document.getElementById(obj).value) + 1;
	}
	function updatedown(obj){
		document.getElementById(obj).value = parseFloat(document.getElementById(obj).value) - 1;
	}

	function checkNights(oVal, peeps) {
		var msg = "If you would like to see another show click ok";
		if(oVal>1) {
			alert("Additional Nights are charged at £65 per night per person;\n\nYou will be charged an extra £65 per person per night unless you add another show")
			var oMoreNights = false;
			oMoreNights = confirm(msg)
			//alert(oMoreNights)
			if(oMoreNights) {
				//Probably want to display the drop down box of other shows
				window.location.href = 'http://www.westendbreaks.co.uk/index.asp?pageID=54'; 
				}else{
				//alert("move On and do nothing");
			}
		}
	}
	
	//function to check of the box is ticked or not - if it's not we'll add the tick for them
	function checkTick(oVal) {
		if(document.STEP3.extrasquantity[oVal].value>0) {
		 if(!document.STEP3.morningExtras[oVal].checked) {document.STEP3.morningExtras[oVal].checked = true};
		}
		if(document.STEP3.extrasquantity[oVal].value==0) {
		 if(document.STEP3.morningExtras[oVal].checked) {document.STEP3.morningExtras[oVal].checked = false};
		}
	}
	
	function addone(oVal, x) {
		if(x>0) {
		document.updateAHScart.qty[oVal].value = parseFloat(document.updateAHScart.qty[oVal].value) + 1
		}else{
		document.updateAHScart.qty.value = parseFloat(document.updateAHScart.qty.value) + 1
		}
	}
	
	function addone2(oField) {
		document.JUMPER[oField].value = parseFloat(document.JUMPER[oField].value) + 1;
	}
	
	//function to strip out any spaces in the credit card details
	function strip_spaces(oVal) {
	var cc 			= oVal
	var d				= "" 
	var ccfield = ""
	len = cc.length 
	for(x=0;x<len;++x) { 
		if(cc.charAt(x)!=" "){d=d +cc.charAt(x)} 
		document.creditcardinfo.cardnumber.value = (""+d+"") ;
		}
	}
	
	function validateThisForm( oForm ) {
		var correct = true;
		var msg = "There are problems with the form\nPlease correct the following errors\n\n"
		if(oForm.email.value!=oForm.email2.value){correct = false; msg = msg + 'Email Address Do Not Match\n';}
		if(oForm.nameoncard.value==""){correct = false; msg = msg + 'You have not entered your card holders name\n';}
		if(oForm.cardnumber.value==""){correct = false; msg = msg + 'You have not entered a card number\n';}
		if(oForm.cardnumber.value.length<15){correct = false; msg = msg + 'Your card number appears a little short\n';}
		if(oForm.telephone.value==""){correct = false; msg = msg + 'You have not provided us with a telephone number\n';}
		if(oForm.securitycode.value==""){correct = false; msg = msg + 'You have not provided us with the security code of your card\n - turn the card over and enter the last three digits of the number on the back';}
		if(oForm.cardholdersaddress.value==""){correct = false; msg = msg + 'You have not entered an address\n';}
		if(oForm.fullname.value==""){correct = false; msg = msg + 'You have not given us a full name\n';}
		if(oForm.postcode.value==""){correct = false; msg = msg + 'To process your order we need the postcode of the card holder\n';}
		if(!oForm.terms.checked){correct = false; msg = msg + 'You must agree to our terms of business\n';}
		if(!correct) {
			alert(msg)
		}
		return correct;
	}
	
	function show(id) {
		if(document.creditcardinfo.deliveryops.checked){document.getElementById(id).style.display = 'block';}else{document.getElementById(id).style.display = 'none';}
	}
	
	function alertUser(oField, oval) {
		if(oval==0) {
			if(oField){alert("If your stay includes a child(ren) in a triple room\nYour nightly fee is reduced to £70, for one of the children\n\nPlease read our terms for full clarification of this;")};
		}
		if(oval==1) {
			if(oField){alert("You have selected a single room.\nThere is a single room supplement of £60 which will be added at checkout per night")};
		}
		}
		
	
	
	//function to build in the shownight option dynamically based on the number of nights
	function buildshowNights(oVal, obj) {
		var numNights = oVal;
		var html = "";
		var a = "";
		var arr = new Array
		 arr[0] = "st"
		 arr[1] = "nd"
		 arr[2] = "rd"
		if(numNights>1) {
			html = html + '<div class="container">Which night would you like to watch this show on?&nbsp;&nbsp;';
			html = html + '<select class="slt" name="showNight" onChange="document.JUMPER.oShowNight.value = this.value;">';
			for(i=1;i<=numNights;i++) {
				if(i<=3) {
						a = arr[i-1];
					}else{
						a = "th";
					}
				html = html + '<option value="'+ i + '">'+ i + a +' night</option>';
			}
			html = html + '</select></div>';
			for(i=0;i<=obj;i++) {
				document.getElementById("showNight"+i).style.display = 'block';
				document.getElementById("showNight"+i).innerHTML = html;
			}
			}
	}
