// 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;
	}


//TAKEN FROm incQryDb.asp not fully sure if in use

	function updateHidden( oVal, obj ) {
	if(oVal!="Other" && oVal!="Search engine" && oVal!="National Press" && oVal!="Local Press" && oVal!="Magazine") {
		document.getElementById(obj + "b").style.display = 'none';
		document.getElementById(obj).value=oVal;
		}else{
		document.getElementById(obj + "b").style.display = 'block';
		}
	}
	function updateHiddenValue() {
	if(document.getElementById("etypeOfAccommodationa").value=="Other") {
		document.getElementById("etypeOfAccommodation").value = document.getElementById("typeOfAccommodationb").value;
		}
	if(document.getElementById("ehowDidYouFindUsa").value=="Other" || 
		document.getElementById("ehowDidYouFindUsa").value=="Search engine" || 
		document.getElementById("ehowDidYouFindUsa").value=="National Press" || 
		document.getElementById("ehowDidYouFindUsa").value=="Local Press" || 
		document.getElementById("ehowDidYouFindUsa").value=="Magazine") {
		document.getElementById("ehowDidYouFindUs").value = document.getElementById("howDidYouFindUsb").value;
		}
	}

	function showBooking() {	
		var sel
		sel = document.getElementById('BookingDetails');
		sel.style.display = 'block';
	}

	function showhidden(oVal) {
		document.getElementById("hidden"+oVal).style.display = 'block';
		}

	function checkValues( PostForm ) {
	//alert(PostForm)
		var oForm = PostForm;
		if(parseFloat(oForm.adults.value) + parseFloat(oForm.child.value) > 6) { 
			alert("The maximum capacity online is 6, however for greater numbers please contact us on 07941049509"); 
			oForm.child.selectedIndex = 1; 
			return false; 
			}
	}

	function validateNewsSubs( oForm ) {
		var correct = true;
		if(oForm.email.value.indexOf('@') == -1 || oForm.email.value.indexOf('.') == -1) { correct = false; alert("your email address appears to be invalid"); }
		if(oForm.email.value.length < 9) { correct = false; alert("your email address appears to be too short"); }
		return correct;
	}

	function clearField( obj , str ) { if(obj.value == str) {	obj.value = ''; }	}
	//scrapped for problems with IE...function changeFieldType( obj ) { if(obj.type == "text") { obj.type = 'password'; } }

	function iDo( objVal, oForm ) {if(objVal=="view") { oForm = document[oForm]; oForm.myX.value = objVal; 	}}

	function fillmein( oVal ) {
		var str = oVal.split(",")
		alert( oVal )
		document.CustomersAddress.address1.value = str[0];		
		document.CustomersAddress.address2.value = str[1];		
		document.CustomersAddress.town.value = str[2];		
		document.CustomersAddress.county.value = str[3];		
		document.CustomersAddress.postcode.value = str[4];		
		document.CustomersAddress.country.value = str[5];		
		document.CustomersAddress.telephone.value = str[6];
		document.CustomersAddress.daytimetelephone.value = str[6];		
		document.CustomersAddress.email.value = str[7];		
	}

	function transformText( id )	{ 
		document.getElementById( id ).style.textTransform = "capitalize"; 
		}
		
