// 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;
	}

// Format Number 
// just(thenthevalue);
	function just(here)
	{
	string = "" + here;
	number = string.length - string.indexOf('.');
	if (string.indexOf('.') == -1)
		return string + '.00';
	if (number == 1)
		return string + '.00';
	if (number == 2)
		return string + '0';
	if (number > 3)
		return string.substring(0,string.length-number+3); return string;
	}
	
	function movetoPay( oForm ) {
		alert( oForm );
	oForm.nextpage.value = "cartdetails";
	}
	
	function doQuantity(thisAction, oQTY ) {
		var myqty = document.getElementById(oQTY);
		val = myqty.value
		if(thisAction=="down") {
		myqty.value = (parseFloat(val) - 1)
			}
		if(thisAction=="up") {
		myqty.value = (parseFloat(val) + 1)
			}

		document.updateAHScart.submit()
	}



		//anything checked?
		function checkem( oForm, thisVal ){
		var i = 0;
		var bookId = 0;
		var correct = true;
		if(thisVal>1) {
		for(i=0;i<oForm.addressBookID.length;i++) {
			if(oForm.addressBookID[i].checked) {
				correct = true; 
				//this looks to see if the button is checked
				break;
				//Ross this will break the for loop which will stop correct becoming false again
				}else{
				correct = false;
				//if  the button is not checked then its set to false
				}
		} //close from the for i = 0
		if(!correct) {
		//if correct is false then alert the user to select an address
			alert("Please select an address\nfrom your address book");
			}
		} else {
	if(document.deliveryAddress.addressBookID.checked) {
		correct = true;
		}else{
		correct = false;
		alert("please select an address")
		}
}
	return correct;
} 

	function someaction(obj) {
		if(obj==0) {
			document.getElementById("newaddressnotice").style.display = 'block';
			document.getElementById("showaddressnotice").style.display = 'none';
			}
		if(obj!=0) {
			window.location.href = '/index.asp?call=deliverydetails&display=checkout&deliveryaddressid=' + obj;
			document.getElementById("showaddressnotice").style.display = 'block';
			document.getElementById("newaddressnotice").style.display = 'none';
			}
	}


		function getMultimapLink(oVal) {
			// Split Value to get Postcode
			var AgentDetails = oVal.split(",");
			var Pcode = AgentDetails[1];
			
			if (Pcode != "0") {
				document.getElementById("Location").innerHTML = "<a href=\"http://www.multimap.com/map/browse.cgi?client=public&search_result=&db=pc&lang=&keepicon=true&pc=" + Pcode + "&advanced=&client=public&addr2=&quicksearch=" + Pcode + "&addr3=&addr1=\">Location</a>"
			}
			else {
				document.getElementById("Location").innerHTML = ""
			}
		}

	function swapMainImage(newImage) {
		var sel = document.getElementById("mainImage");
		sel.src = "/images/" + newImage;		
	}
	
	
	
	
	
/*
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/

// This file is not required by CKEditor and may be safely ignored.
// It is just a helper file that displays a red message about browser compatibility
// at the top of the samples (if incompatible browser is detected).

if ( window.CKEDITOR )
{
	(function()
	{
		var showCompatibilityMsg = function()
		{
			var env = CKEDITOR.env;

			var html = '<p><strong>Your browser is not compatible with CKEditor.</strong>';

			var browsers =
			{
				gecko : 'Firefox 2.0',
				ie : 'Internet Explorer 6.0',
				opera : 'Opera 9.5',
				webkit : 'Safari 3.0'
			};

			var alsoBrowsers = '';

			for ( var key in env )
			{
				if ( browsers[ key ] )
				{
					if ( env[key] )
						html += ' CKEditor is compatible with ' + browsers[ key ] + ' or higher.';
					else
						alsoBrowsers += browsers[ key ] + '+, ';
				}
			}

			alsoBrowsers = alsoBrowsers.replace( /\+,([^,]+), $/, '+ and $1' );

			html += ' It is also compatible with ' + alsoBrowsers + '.';

			html += '</p><p>With non compatible browsers, you should still be able to see and edit the contents (HTML) in a plain text field.</p>';

			var alertsEl = document.getElementById( 'alerts' );
			alertsEl && ( alertsEl.innerHTML = html );
		};

		var onload = function()
		{
			// Show a friendly compatibility message as soon as the page is loaded,
			// for those browsers that are not compatible with CKEditor.
			if ( !CKEDITOR.env.isCompatible )
				showCompatibilityMsg();
		};

		// Register the onload listener.
		if ( window.addEventListener )
			window.addEventListener( 'load', onload, false );
		else if ( window.attachEvent )
			window.attachEvent( 'onload', onload );
	})();
}


	function countCharacters( objectId, num ) {
	var obj 				= document.getElementById(objectId);
	var content 		= obj.value;
	var len 				= content.length;
	var newContent 	= content.substring(0, num);
		if(len>num) { obj.value = ""; obj.value = newContent; }
	}
