/* 
 ----------------------------
 Custom Javascript - Asafisk
 ----------------------------
 1. Global Functions
 2. Event Listeners
 3. Page Rendering
 4. URL Manipulation
 5. AJAX Handler
 6. Validation (see also options.js)
 6.1. Generic form disbling
 7. Specific Pages
 7.1. Homepage
 7.2. Product search
 7.3. Product Page
 7.4. Basket Summary
 7.5. Registration
 7.6. Checkout
 7.7. Site Docs / Forms
 7.8. Landing Pages
 8.	Google Optimiser for Admins
 9. FAQ page functions
 10. Social Media
 11. Enclosed Cart
 11.1. Modal windows
 11.2. Payment Methods page
 11.3. Enclosed Cart general functions
 12. Lens Power descriptions - Basket and Checkout
 ----------------------------
*/

/*
 * 1. Global functions
 */

/*
 * Check whether a variable exists 
 */
function isset(variable) {
	return(typeof(variable) != 'undefined');
}
/*
 * Check whether a string exists in an array
 */
function inArray(needle, haystack) {
	var length = haystack.length;
	for(var i = 0; i < length; i++) {
		if(haystack[i] == needle) return true;
	}
	return false;
}
/*
 * Create an object reference using the element ID
 */
function getObById(id) {
	/*
	if (document.layers) //Netscape 4
		return eval('document.' + id);
	else if (navigator.userAgent.indexOf("Opera") != -1) //Opera
		return eval("document.all."+id);
	else // all others . . .
	*/
		return document.getElementById(id);
}
/*
 * Create array of object references by className within the document
 */
function getElementsByClassName(classname){
	return getSubElementsByClassName(document, classname);
}

// Create array of object references by className within a named parent node.
function getSubElementsByClassName(parentnode, classname){
	var i;
	var j;
	var rl = new Array();
	var re = new RegExp('(^| )'+classname+'( |$)');
	var ael = parentnode.getElementsByTagName('*');
	var op = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
	if (parentnode.all && !op) ael = parentnode.all;
		for(i=0, j=0 ; i<ael.length ; i++) {
			if(re.test(ael[i].className)) {
				rl[j]=ael[i];
				j++;
			}
		}
	return rl;
}

// return true if the user's browser is IE6, otherwise return false.
function isIE6() {
	// (the browserIsIE6 var is created in ie6.js, which is only loaded within IE6-specific conditional comments)
	if(typeof(browserIsIE6) != "undefined" && browserIsIE6) {
		return true;
	}else{
		return false;
	}
}

/* If there's a form of id formID, submit it */
function submitForm(formID) {
	if(formEl = getObById(formID)){
		if(formEl.tagName.toLowerCase() == "form") {
			formEl.submit();
		}
	}
}
/*
 * 2. Event Listeners
 */
function trInit()  {
	var iBase = TextResizeDetector.addEventListener(onFontResize,null);
}
function onFontResize(e,args) {
	positionSEODiv('Main', 'mainHolder', 0, 0);
}
TextResizeDetector.TARGET_ELEMENT_ID = 'Wrapper';
TextResizeDetector.USER_INIT_FUNC = trInit;

/*
 * 3. Page Rendering
 */
/*
 * Load an additional stylesheet
 */
function loadExtraStyle(cssfile, isForOverlay) {
	if(cssfile && cssfile.indexOf('default') == -1) {
		if(document.domain + "" == 'localhost') {
			baseloc = '';
		} else {
			baseloc = document.location.protocol + '//' + document.domain + "/";
		}
		cssfileloc = baseloc + 'skins/' + storeSkin + '/styleSheets/' + cssfile + '.css';
		var fileref = document.createElement("link");
		fileref.setAttribute("rel", "stylesheet");
		fileref.setAttribute("type", "text/css");
		fileref.setAttribute("href", cssfileloc);
		if(isForOverlay && isForOverlay == "yes") {
			fileref.setAttribute("class", "overlayStyle");
			fileref.setAttribute("className", "overlayStyle"); // Needed for IE6 / IE7
		}
		if (typeof(fileref) != 'undefined') {
			document.getElementsByTagName("head")[0].appendChild(fileref);
		}
	}
}
function removeExtraOverlayStyle() {
	var fileEls  = getElementsByClassName("overlayStyle")
	if( fileEls.length > 0 ) {
		for(var i = 0; i < fileEls.length; i++) {
			var fileEl = fileEls[i];
			document.getElementsByTagName("head")[0].removeChild(fileEl);
		}
	}
}

/*
 * Draw buttons and trigger font alterations
 */
function drawButtons() {
	//xfont();  this causes links to disappear on the MAC!!!!!!
	var platf = navigator.appVersion;
	if(platf.indexOf("Windows") != -1) { 
		redrawNav();
	}
	var buttons = getElementsByClassName('button');
	var blen = buttons.length;
	//buttons.each(function(b){
	for(var i=0 ; i<blen ; i++) {
		var content = '';
		content = '<span class="left"><span class="lt"><span class="lb"><span class="lm">[</span></span></span></span><span class="top"><span class="bottom"><span class="buttonText"><span>';
		content += buttons[i].innerHTML;
		content += '</span></span></span></span><span class="right"><span class="rt"><span class="rb"><span class="rm">]</span></span></span></span>';
		buttons[i].innerHTML = content;
		buttons[i].style.backgroundColor = 'transparent';
		buttons[i].style.padding = '0';
	}
}

/*
 * Re-render h-nav slightly narrower (for non MS browsers)
 */
function redrawNav() {
	var hlinks = getElementsByClassName('hlink');
	var hlinklen = hlinks.length;
	for(var i=0 ; i<hlinklen ; i++) {
		hlinks[i].style.paddingLeft = '17px';
		hlinks[i].style.paddingRight = '17px';
	}
}

/*
 * Load additional CSS for Praxis font
 */
function xfont() {
	var xlink = getObById('praxis');
	if(init('PraxisEF') == true) {
		xlink.disabled = false;
		xlink.rel = 'stylesheet';
	} else {
		xlink.disabled = true;
	}
}

/* 
 * Content rendered first
 */
var putInLeftNavID = false;
function positionSEODiv(overlayName, holderName, extraOffSetTop, extraOffSetLeft) {
	if(shiftB == true) {
		shiftContent();
	}
	var overlayDiv = getObById(overlayName);
	var holderDiv = getObById(holderName);
	var shiftDiv = getObById('Shift');
	if(holderDiv && overlayDiv) {
		offsetTop = holderDiv.offsetTop;
		offsetLeft = holderDiv.offsetLeft;
		offsetHeight = overlayDiv.offsetHeight;
		if(shiftDiv) {
			offsetHeight += shiftDiv.offsetHeight + 20;
			shiftDiv.style.top = overlayDiv.offsetHeight + 'px';
		}
		/*
		//af - removed as it doesn't seem to be required here. 11/12/09
		if(/MSIE 7/.test(navigator.userAgent)) {
			offsetTop = offsetLeft = 0;
			obj = holderDiv;
			do {
				offsetTop += obj.offsetTop;
				offsetLeft += obj.offsetLeft;
			} while(obj = obj.offsetParent)
		}
		*/
		overlayDiv.style.top = offsetTop + extraOffSetTop + 'px';
		overlayDiv.style.left = offsetLeft + extraOffSetLeft + 'px';
		holderDiv.style.height = offsetHeight + 'px';
		overlayDiv.style.zIndex = '80';
	}
	if(putInLeftNavID != false) {
		putInLeftNav(putInLeftNavID);
	}
}

var shiftB = false;
function shiftContent() {
	var overlayDiv = document.getElementById('relatedShift');
	var holderDiv = document.getElementById('relatedInfo');
	offsetTop = holderDiv.offsetTop;
	offsetHeight = overlayDiv.offsetHeight;
	overlayDiv.style.top = offsetTop + 'px';
	holderDiv.style.height = offsetHeight + 'px';
	overlayDiv.style.zIndex = '90';
}

//Google website optimizer layout shift /
//Product page /
function gwoLayoutProduct(opt) {
	var accessories = getObById('accessoryBlock');
	var rightpanel = getObById('panel');
	var linkbar = getObById('linkBar');
	var relatedShift = getObById('relatedShift');
	var serviceinfo = getObById('serviceInfo');
	
	//show accessories in right, hide testimonials
	if(opt == 1) {
		if(rightpanel != null) {
			if(accessories != null) {
				rightpanel.innerHTML = accessories.innerHTML;
			} else {
				rightpanel.innerHTML = '';
			}
			rightpanel.style.visibility = 'visible';
		}
		if(accessories != null) {
			accessories.innerHTML = '<br /><br /><br /><br />';
		}
		if(linkbar != null) {
			linkbar.style.width = '452px';
		}
		if(relatedShift != null) {
			relatedShift.style.width = '494px';
		}
		if(serviceinfo != null) {
			serviceinfo.style.display = 'none';
		}
	}
	 
	//show accessories in right, testimonials at the bottom
	else if(opt == 2) {
		if(rightpanel != null && accessories != null) {
			var rightpaneltmp = rightpanel.innerHTML;
			rightpanel.innerHTML = accessories.innerHTML;
			rightpanel.style.visibility = 'visible';
			accessories.innerHTML = rightpaneltmp;
			accessories.style.borderWidth = '3px';
			accessories.style.borderColor = '#e5e5e5';
			accessories.style.borderStyle = 'solid';
			accessories.style.width = '278px';
			accessories.style.marginTop = '1em';
			accessories.style.marginBottom = '1em';
			accessories.style.marginLeft = '17px';
			accessories.style.paddingBottom = '15px';
			accessories.style.paddingRight = '20px';
			accessories.style.backgroundColor = '#ffffff';
			accessories.style.visibility = 'visible';
		} else if(rightpanel != null) {
			rightpanel.style.visibility = 'visible';
		}
		if(serviceinfo != null) {
			serviceinfo.style.display = 'none';
		}
		if(linkbar != null) {
			linkbar.style.width = '452px';
		}
		if(relatedShift != null) {
			relatedShift.style.width = '494px';
		}
	}
	
	//info box in right, accessories at the bottom
	else if(opt == 3) {
		if(rightpanel != null && serviceinfo != null) {
			rightpanel.innerHTML = serviceinfo.innerHTML;
			rightpanel.style.visibility = 'visible';
			serviceinfo.style.display = 'none';
		}
		if(accessories != null) {
			accessories.style.visibility = 'visible';
		}
	}
	
	//info box in right, testimonials at the bottom
	else if(opt == 4) {
		if(rightpanel != null) {
			var rightpaneltmp = rightpanel.innerHTML;
		}
		if(rightpanel != null && serviceinfo != null) {
			rightpanel.innerHTML = serviceinfo.innerHTML;
			rightpanel.style.visibility = 'visible';
			serviceinfo.style.display = 'none';
		}
		if(accessories != null && rightpanel != null) {
			accessories.innerHTML = rightpaneltmp;
			accessories.style.borderWidth = '3px';
			accessories.style.borderColor = '#e5e5e5';
			accessories.style.borderStyle = 'solid';
			accessories.style.width = '278px';
			accessories.style.marginTop = '1em';
			accessories.style.marginBottom = '1em';
			accessories.style.marginLeft = '17px';
			accessories.style.paddingBottom = '15px';
			accessories.style.paddingRight = '20px';
			accessories.style.backgroundColor = '#ffffff';
			accessories.style.visibility = 'visible';
		}
	}
	
	//default
	else {
		if(accessories != null) {
			accessories.style.visibility = 'visible';
		}
		if(rightpanel != null) {
			rightpanel.style.visibility = 'visible';
		}
		if(serviceinfo != null) {
			serviceinfo.style.display = 'none';
		}
	}
	
}

/*
 * 4. URL Manipulation
 */

/*
 * 5. AJAX - Create connection to server 
 */
function getXMLHttp() {
  var xmlHttp
  try
  {
    //Firefox, Opera 8.0+, Safari
    xmlHttp = new XMLHttpRequest();
  }
  catch(e)
  {
    //Internet Explorer
    try
    {
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
      try
      {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e)
      {
        alert("Your browser does not support AJAX!")
        return false;
      }
    }
  }
  return xmlHttp;
}

/*
 * 6. Validation
 */

/*
 * Registration - Confirm T&Cs checked
 */
var contreg = false;
function contReg() {
	contreg = true;
	validate();
}

/*
 * Email validator
 */
function emailCheck(emailStr) {
	if(emailStr == '') {
		return '';
	}
	emailStr = emailStr.replace(/\s/g, "");
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);
	var errStr = null;
	if (matchArray==null) {
		errStr = "Please check the email address format. ";
		return errStr;
	}
	var user=matchArray[1]
	var domain=matchArray[2]
	if ((user.match(userPat)==null) && (errStr == null)) {
		errStr = "The username part of the email address doesn't seem to be valid. ";
		return errStr;
	}
	var IPArray = domain.match(ipDomainPat);
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if ((IPArray[i]>255) && (errStr == null)) {
				errStr = "The email address domain's IP address doesn't seem to be valid. ";
				return errStr;
			}
		}
	}
	var domainArray = domain.match(domainPat);
	if ((domainArray==null) && (errStr == null)) {
		errStr = "The email address domain name doesn't seem to be valid. ";
		return errStr;
	}
	var atomPat = new RegExp(atom,"g");
	var domArr = domain.match(atomPat);
	var len = domArr.length;
	if ((len<2) && (errStr == null)) {
		errStr = "The email address is missing part of the domain.";
		return errStr;
	}
	var otherTLDs = Array('aero','coop','info','museum','name');
	if ((domArr[domArr.length-1].length<2 || (domArr[domArr.length-1].length>3 && inArray(domArr[domArr.length-1],otherTLDs) == false)) && (errStr == null)) {
		errStr = "The email address domain ending, " + domArr[domArr.length-1] + " is not valid.";
		return errStr;
	}
	return errStr;
}

/*
 * Helper to convert color codes
 */
function toHex(rgb) {
	var h = rgb.toString(16);
	if (h.length == 1) {h = '0' + h;}
	if (h.length == 0) {h = '00';}
	if (h.length > 2) {h = 'ff';}
	return h;
}

/*
 * Color form elements on error
 */
function colorError(fld,r,g,b) {
	var box = getObById(fld);
	if (r>rtarg+rstep || r<rtarg-rstep || g>gtarg+gstep || g<gtarg-gstep || b>btarg+bstep || b<btarg-bstep) {
		if (r<1) { r=0; }
		if (g<1) { g=0; }
		if (b<1) { b=0; }
		var rh = toHex(r);
		var gh = toHex(g);
		var bh = toHex(b);
		var hex = '#' + rh + gh + bh;
		if(mode.indexOf(' border ') != -1) { box.style.borderColor = hex; }
		if(mode.indexOf(' background ') != -1) { box.style.backgroundColor = hex; }
		if(mode.indexOf(' text ') != -1) { box.style.color = htext; }
		if (testmode == true) {
			var errpr = getObById('jsErrors');
			errpr.innerHTML += '<span style="width:1px; height:5px; background-color:' + hex + '; color:' + hex + ';">.</span>';
		}
		if (r>rtarg) {r=r-rstep;}
		if (r<rtarg) {r=r+rstep;}
		if (g>gtarg) {g=g-gstep;}
		if (g<gtarg) {g=g+gstep;}
		if (b>btarg) {b=b-bstep;}
		if (b<btarg) {b=b+bstep;}
		
		var f = function() { colorError(fld,r,g,b); };
		setTimeout(f,30);
		
	}
}

/*
 * Double click prevention
 */
function preventDbleClick() {
	var i;
	var j;
	var re = new RegExp('(^| )'+'button'+'( |$)');
	var ael = document.getElementsByTagName('*');
	var op = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
	if (document.all && !op) ael = document.all;
	for(i=0, j=0 ; i<ael.length ; i++) {
		if(re.test(ael[i].type)) {
			ael[i].disabled=true;
			j++;
		}
	}
}
/*
 * Disable and Enable submit button
 */
var tfid = false;
function disableFSubmit(but,ani) {
	var b = getObById(but);
	var a = getObById(ani);
	b.disabled = true;
	a.style.display = 'block';
	tfid = true;
}
function enableSubmit(but,ani) {
	var b = getObById(but);
	var a = getObById(ani);
	b.disabled = false;
	a.style.display = 'none';
	tfid = false;
}
/*
 * General global form validation
 */
function validate() {
	//preventDbleClick();
	if(tfid == true) {
		return false;
	}
	if(typeof(disableButton) != 'undefined') {
		disableFSubmit(disableButton[0],disableButton[1]);
	}
	var re_date = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
	var re_tel = /^[\d\.\s\-]+$/;
	var es = ''; //Error String/
	var en = 0; //Error number/
	var vlen = ftv.length; // count the fields to validate 
	var efsarr = efs.split(" ");
	var efslen = efsarr.length; // count the email fields to check 
	var tfsarr = tlfs.split(" ");
	var tfslen = tfsarr.length; // count the telephone fields to check 
	//Prime the form fields/
	for (i=0 ; i<vlen ; i++) {
		if (!getObById(ftv[i])) {
			if (testmode == true) {
				alert("unkown form field in validation list - '" + ftv[i] + "'");
				return false;
			}
		} else {
			var rd = toHex(r);
			var gd = toHex(g);
			var bd = toHex(b);
			getObById(ftv[i]).style.borderColor = '#' + rd + gd + bd;
		}
	}
	for (i=0 ; i<vlen ; i++) {
		if (getObById(ftv[i])) {
		
			var fob = getObById(ftv[i]);
			var lastone = '';
			
			if ((fob.type == 'text') || (fob.type == 'textarea') || (fob.type == 'password')) {
				//Do empty fields first
				if (fob.value == "") {
					colorError(ftv[i],r,g,b);
					var lastone = fob;
					if (es.indexOf('all required') == -1) {
						en += 1;
						es += en + '. ' + 'Please complete all required form fields.<br />';
					}
				} else {
					//Check email formats
					if (efs.indexOf(' ' + ftv[i] + ' ') != -1) {
						var emailStr = fob.value;
						var emailErr = emailCheck(emailStr);
						if (emailErr != null) {
							colorError(ftv[i],r,g,b);
							var lastone = fob;
							if (es.indexOf(emailErr) == -1) {
								en += 1;
								es += en + '. ' + emailErr + '<br />';
							}
						}
					}
					//Check date formats
					if (dfs.indexOf(' ' + ftv[i] + ' ') != -1) {
						if (!fob.value.match(re_date)) {
							colorError(ftv[i],r,g,b);
							var lastone = fob;
							en += 1;
							es += en + '. ' + 'Please use the correct date format ( dd/mm/yyyy ).<br />';
						} else {
							if ((ood.indexOf(' ' + ftv[i] + ' ') != -1) && (contreg == false)) {
								var today = new Date();
								var endDate = new Date();
								var ed = fob.value;
								var darr = ed.split('/');
								var endDay = darr[0];
								var endMonth = darr[1]-1;
								var endYear = darr[2];
								endDate.setFullYear(endYear,endMonth,endDay);
								if (endDate < today) {
									colorError(ftv[i],r,g,b);
									var lastone = fob;
									en += 1;
									es += en + '. ' + 'Your prescription has expired. You will not be able to complete an order without a valid prescription.<br /><a href="javascript:contReg();">Click here to continue anyway</a><br />';
								}
							}
						}
					}
					//Check telephone formats
					if (tlfs.indexOf(' ' + ftv[i] + ' ') != -1) {
						var tlfld = fob;
						if (!tlfld.value.match(re_tel)) {
							colorError(ftv[i],r,g,b);
							var lastone = tlfld;
							en += 1;
							es += en + '. ' + 'Telephone numbers should not contain letters.<br />';
						}
					}
					//Check passwords match
					if ((same.length == 2) && ((ftv[i] == same[0]) || (ftv[i] == same[1]))) {
						if ((getObById(same[0]).value != getObById(same[1]).value) && (getObById(same[0]).value != '') && (getObById(same[1]).value != '')) {
							colorError(ftv[i],r,g,b);
							if ((ftv[i] == same[1])) {
								var lastone = fob;
								en += 1;
								es += en + '. ' + 'Passwords do not match.<br />';
							}
						}
					}
					//Check passwords match
					if(typeof(esame) != 'undefined') {
						if ((esame.length == 2) && ((ftv[i] == esame[0]) || (ftv[i] == esame[1]))) {
							if ((getObById(esame[0]).value != getObById(esame[1]).value) && (getObById(esame[0]).value != '') && (getObById(esame[1]).value != '')) {
								colorError(ftv[i],r,g,b);
								if ((ftv[i] == esame[1])) {
									var lastone = fob;
									en += 1;
									es += en + '. ' + 'Emails do not match.<br />';
								}
							}
						}
					}
				}
			}
			if (fob.type == 'select-one') {
				var sindx = fob.selectedIndex;
				var sopval = fob.options[sindx].value;
				if ((sopval == "--") || (sopval == "") || (sopval == null) || (sopval.indexOf("Please Select") != -1)) {
					var oldmode = mode;
					var oldrtarg = rtarg;
					var oldgtarg = gtarg;
					var oldbtarg = btarg;
					var oldrstep = rstep;
					var oldgstep = gstep;
					var oldbstep = bstep;
					mode = ' background '; //Force the highlight mode to include background for IE /
					rtarg = 245;
					gtarg = 245;
					btarg = 245;
					rstep = 3;
					gstep = 2;
					bstep = 2;
					colorError(ftv[i],255,183,183);
					mode = oldmode;
					rtarg = oldrtarg
					gtarg = oldgtarg;
					btarg = oldbtarg;
					rstep = oldrstep;
					gstep = oldgstep;
					bstep = oldbstep;
					var lastone = fob;
					if ((es.indexOf('select an option') == -1) && (es.indexOf('all required') == -1)) {
						en += 1;
						es += en + '. ' + 'Please select an option where required.<br />';
					}
				}
			}
			if (fob.type == 'radio') {
				var radnm = fob.name;
				var radgp = document.getElementsByName(radnm);
				var radlen = radgp.length;
				var chk = 0;
				for (j=0; j<radlen; j++) {
					if (radgp[j].checked == true) {
						chk = 1;
					}
				}
				if (chk == 0) {
					colorError(ftv[i],r,g,b);
					var lastone = fob;
					if ((es.indexOf('select an option') == -1) && (es.indexOf('all required') == -1)) {
						en += 1;
						es += en + '. ' + 'Please select an option where required.<br />';
					}
				}
			}
			if (fob.type == 'checkbox') {
				//need to write this/
				
				//Check terms are agreed to
				if (terms && (terms.indexOf(ftv[i]) != -1)) {
					if (fob.checked != true) {
						colorError(ftv[i],r,g,b);
						var lastone = fob;
						if (es.indexOf('all required') == -1) {
							en += 1;
							es += en + '. ' + 'Please confirm that you agree to the terms &amp; conditions.<br />';
						}
					}
				}		
			}
		}
	}
	
	for (var k=0 ; k<efslen ; k++) {
		if(efsarr[k].length > 0) {
			var ftvstr = ftv.toString();
			if (ftvstr.indexOf(efsarr[k]) == -1) {
				var fob = getObById(efsarr[k]);
				var emailStr = fob.value;
				if (emailStr != '') {
					var emailErr = emailCheck(emailStr);
					if ((emailErr != '') && (emailErr != null)) {
						colorError(efsarr[k],r,g,b);
						if (lastone == '') {
							var lastone = fob;
						}
						if (es.indexOf(emailErr) == -1) {
							en += 1;
							es += en + '. ' + emailErr + '<br />';
						}
					}
				}
			}
		}
	}

	for (var t=0 ; t<tfslen ; t++) {
		if (tfsarr[t].length > 0) {
			var ftvstr = ftv.toString();
			if (ftvstr.indexOf(tfsarr[t]) == -1) {
				var fob = getObById(tfsarr[t]);
				if (!fob.value.match(re_tel) && fob.value != '') {
					colorError(tfsarr[t],r,g,b);
					if (lastone == '') {
						var lastone = fob;
					}
					if (es.indexOf('Telephone') == -1) {
						en += 1;
						es += en + '. ' + 'Telephone numbers should not contain letters.<br />';
					}
				}
			}
		}
	}
	
	if(lastone != '') {
		lastone.focus();
	}
	var errp = getObById('jsErrors');
	if (es != '') {
		errp.innerHTML = es;
		if(typeof(disableButton) != 'undefined') {
			enableSubmit(disableButton[0],disableButton[1]);
		}
		return false;
	} else {
		if(typeof(deferr) != 'undefined') {
			errp.innerHTML = deferr;
		} else {
			errp.innerHTML = '&nbsp;';
		}
		return true;
	}
}


/*
 * 7. Specific Pages
 */
/*
 * 7.1. Homepage - reminder request box
 */
function showReminder() {
	getObById('Reminder').style.display = 'block';
	getObById('weeksFrom').focus();
}
function hideReminder() {
	getObById('Reminder').style.display = 'none';
}

/*
 * 7.2. Product search
 */
function doSearch() {
	if (getObById('searchBox') != null) {
		var srch = getObById('searchBox');
		srch = srch.value;
		if(srch != '') {
			var reg_replace = /[^a-zA-Z0-9\s]/g;
			srch = srch.replace(reg_replace,'');
			srch = srch.replace(' ','+');
			if(document.domain + "" == 'localhost') {
				return true;
			} else if(isset(rootURL)) {
				srch = rootURL + 'search/' + srch;
				document.location = srch;
			} else {
				pc = document.location.protocol + '//';
				dm = document.domain + '';
				srch = pc + dm + '/search/' + srch;
				document.location = srch;
			}
		}
	}
	return false;
}

/*
 * 7.3. Product Page
 */
/*
 * Show / hide second eye
 */
function toggleRightEye()
{
	var yops = getObById('Options1');
	var xops = getObById('Options2');
	var opst = getObById('optntitle');
	var units = getObById('units');
	var unitval = units.selectedIndex;
	if (unitval == 0) {
		xops.style.display = 'block';
		yops.style.paddingBottom = '0';
		opst.innerHTML = 'Right Eye:';
		opst.style.width = '6em';
	} else {
		xops.style.display = 'none';
		yops.style.paddingBottom = '3px';
		opst.innerHTML = 'One Eye Only:';
		opst.style.width = '8em';
	}
	movePanel();
}
/*
 * Read another testimonial 
 */
function readAnother(siteroot,partner) {
	Animate('start');
  var xmlHttp = getXMLHttp();
	xmlHttp.onreadystatechange = function() {
    if(xmlHttp.readyState == 4) {
      HandleResponse(xmlHttp.responseText);
    }
  }
  xmlHttp.open("GET", siteroot+"/?_g=rm&type=rt&ps="+partner+"&rand="+Math.random(), true);
  xmlHttp.send(null);
}
// Show spinner during testimonial update
function Animate(op) {
	ob = getObById('loading');
	if(op == 'start') {
		ob.style.visibility = 'visible';
	} else {
		ob.style.visibility = 'hidden';
	}
}
// Fill div#testimonial with new testimonial content
function HandleResponse(response) {
  getObById('testimonial').innerHTML = response;
  positionSEODiv('Main', 'mainHolder', 0, 0);
  Animate('stop');
}
/*
 * Expand testimonial 
 */
function showText() {
	getObById('fullTestimonialBox').style.display = 'inline';
	getObById('showText').innerHTML = "<a href=\"javascript:hideText();\">[-]</a>";
}
function hideText() {
	getObById('fullTestimonialBox').style.display = 'none';
	getObById('showText').innerHTML = "<a href=\"javascript:showText();\">[+]</a>";
}

/*
 * Reposition testimonial 
 */
function movePanel() {
	var panel = getObById('panel');
	var opts = getObById('Options1');
	var opbox = getObById('optionContainer');
	if(opts != null) {
		var opw = opts.scrollWidth * 1;
		var oph = opts.scrollHeight * 1;
		var opos = findPos(opts) * 1;
		if(opw > 470) {
			ppos = opos + oph - 130;
			panel.style.top = ppos + 'px';
		}
		opbox.style.width = Math.round(opw * 1.2) + 'px';
	}
}








/*
 * Basket summary - cart light to show product added -- ## NOT USED ##
 */
function cartLight() {
	getObById('flashBasket').className = 'flashBasket';
}
/*
 * Basket summary - Display empty basket text 
 */
function emptyCart() {
	var cartbox	= getObById('BasketSummary');
	cartbox.innerHTML = '<p class="h2"><a title="Click &ldquo;Add More Items&rdquo; below to return to the store">Your Basket</a></p><p>Processing&nbsp;&nbsp;&nbsp;<strong>&hellip;</strong></p>';
}

/*
 * Step1 - Validate email address /
 */
function validateRepeat() {
	var neweml = getObById('new_email');
	var emailStr = neweml.value;
	var newemlerr = getObById('newError');
	if(emailStr != '') {
		var emailErr = emailCheck(emailStr);
		if ((emailErr != '') && (emailErr != null)) {
			colorError('new_email',r,g,b);
			newemlerr.innerHTML = emailErr;
			return false;
		} else {
			//newemlerr.innerHTML = '<span>Please enter your email address and click \'Continue\'.</span>';
			return true;
		}
	} else {
		colorError('new_email',r,g,b);
		newemlerr.innerHTML = 'Please enter your email address.';
		return false;
	}
}

/*
 * Registration - Show information panels 
 */
function showWhy(textbloc,trigger) {
	var marker = getObById(trigger);
	var bloc = getObById(textbloc);
	var posX = marker.offsetLeft;
	var posY = marker.offsetTop;
	bloc.style.display = 'block';
	bloc.style.left = (posX + -236) + 'px';
}

/* Reuse the information panel functionality to display the CV2 explanation in the checkout */
function showWhyRight(textbloc,trigger) {
	var marker = getObById(trigger);
	var bloc = getObById(textbloc);
	var posX = marker.offsetLeft;
	var posY = marker.offsetTop;
	bloc.style.display = 'block';
	bloc.style.left = (posX + 25) + 'px';
}
/* Reuse the information panel functionality to display the co.uk / .eu options pages */
function showWhyEu(textbloc,trigger) {
	var marker = getObById(trigger);
	var bloc = getObById(textbloc);
	bloc.style.display = 'block';
	var posX = marker.offsetLeft - bloc.offsetWidth;
	var posY = marker.offsetTop;
	bloc.style.left = (posX - 25) + 'px';
}
function hideWhy(textbloc) {
	var bloc = getObById(textbloc);
	bloc.style.display = 'none';
}
function toggleInfo(inf) {
	var ob = getObById(inf);
	if(ob.style.display == 'block') {
		ob.style.display = 'none';
		positionSEODiv('Main', 'mainHolder', 0, 0);
	} else {
		ob.style.display = 'block';
		positionSEODiv('Main', 'mainHolder', 0, 0);
	}
}
/*
 * Registration - Date synchronisation 
 */
function syncDates() {
	var startdate = getObById('prescription_start');
	var enddate = getObById('prescription_end');
	enddate.selectedIndex = startdate.selectedIndex;
}

/*
 * Checkout - Hide pay button
 */
function hidepb() {
	var f = function() { getObById('payButton').style.display = 'none'; };
	setTimeout(f,50);	
}

/*
 * Site Docs / Forms - Get currently selected form elements (Estelle)
 */
function setSelection(element_name, option_value) {
	if (option_value == '')
		return;
	elems = document.getElementsByName(element_name);
	for (var i=0; elems && i<elems.length; i++) {
		el = elems[i];
		if (el && !el.length && el.value == option_value) {
			el.checked = true;
		} else if (el) {
			for (var j=0; j < el.length; j++) {
				if (el[j].value == option_value) {
					if (el.options) el[j].selected = true;
					else el[j].checked = true;
				}
			}
		}
	}
}

/*
 * Landing Pages - Reposition to Left Nav 
 */
function findPos(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		do {
			curtop += obj.offsetTop;
		} 
		while (obj = obj.offsetParent);
		return [curtop];
	}
}
function findPosH(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
		} 
		while (obj = obj.offsetParent);
		return [curleft];
	}
}
function putInLeftNav(eid) {
	var block = getObById(eid);
	var mark = getObById('brandsEnd');
	//var mhpos = findPosH(mark);
	var mhpos = -237;
	var mvpos = findPos(mark);
	mvpos = parseInt(mvpos) - 100;
	block.style.left = mhpos + 'px';
	block.style.top = mvpos + 'px';	
}

/*
 * Google Optimiser for Admins
 */
function utmx_section(section) {
	//empty function to satisfy browser 
	//in case GWO scripts are not present 
	//for a test area, eg. administrators.
}

/*
 * 9. FAQ page open and close code
 */
 
// Called by onload. Sets up the FAQ page.
function faqSetup(definitelyDoSetup) {
	if(document.location.href.indexOf("faqs") > -1 || document.location.href.indexOf("?_a=viewDoc&docId=6") > -1 || (definitelyDoSetup && definitelyDoSetup == "yes")) {
		var questions=getElementsByClassName("faq_question");
		insertNavElements(questions);
		closeQuestions();
		listenerElements = questions.concat(getElementsByClassName("faq_closer"));
		addFaqEventListeners(listenerElements);
		document.body.className = document.body.className.replace( "has_script", "");
		// Necessary for earlier IEs.
		if(hashval = window.location.hash.replace('#','') ) {
			var hashelement;
			if(hashelement = getObById(hashval)) {
				hashelement.scrollIntoView();
			}
		}
	}
}

//Given an HTML element, recurse up the parent nodes until the parent node is a <div>
function getParentUntilDiv(el) {					
	return ((el.parentNode.tagName.toLowerCase() == "div"))? el.parentNode : getParentUntilDiv(el.parentNode);
}

// Alternate a div's class between faq_unit_closed and faq_unit_open
// Also calls positionSEODiv again, as seen in the page's onload. This ensures the footer fits perfectly at the bottom of the faq page, regardless of which questions are opened or closed.
function toggleAnswer() {
	el = (window.event)? window.event.srcElement : this;
 	var parent_el = getParentUntilDiv(el);
 	if(parent_el.className.indexOf("faq_unit_closed") == -1 && parent_el.className.indexOf("faq_unit_open") == -1) {
 		parent_el = getParentUntilDiv(parent_el);
 	}
	parent_el.className = replaceFaqClassName(parent_el.className);
	positionSEODiv('Main', 'mainHolder', 0, 0);
}

//replaces open / closed value within className string, without stripping out any other values within className string
function replaceFaqClassName(str) {
	if(str.indexOf("faq_unit_open") > -1) return str.replace("faq_unit_open", "faq_unit_closed");
	if(str.indexOf("faq_unit_closed") > -1) return str.replace("faq_unit_closed", "faq_unit_open")		
}

// On load, sets all elements with class faq_unit_open to faq_unit_closed, unless they also have the class top_question
function closeQuestions() {
	var hashval = "";
	var open_questions=getElementsByClassName("faq_unit_open");
	//Check whether the url has any hash value - if so, we leave that question open, too. 
	if(hashval = window.location.hash.replace('#','')){
		for(i=0; i<open_questions.length ; i++) {
			if (open_questions[i].id.indexOf(hashval) == -1) open_questions[i].className = "faq_unit_closed";
		}
	}
	else
	{
		for(i=0; i<open_questions.length ; i++) {
			 open_questions[i].className = "faq_unit_closed";
		}
	}
}

// create an event listener for each listed element - both IE & non-IE versions of code
function bindEvent(el, eventName, eventHandler) {
  if (el.addEventListener){
    el.addEventListener(eventName, eventHandler, false); 
  } else if (el.attachEvent){
    el.attachEvent('on'+eventName, eventHandler);
  }
}

// Function to add event listener to each faq_question element
function addFaqEventListeners(questions) {
	for(i=0; i<questions.length ; i++) {
		bindEvent(questions[i], "click", toggleAnswer);
	}
}

// Inserts the + and - symbols at the beginning of faq questions, and the close link at the end of faq_answer.
function insertNavElements(questions) {
	for(i=0; i<questions.length ; i++) {
		questions[i].className += " indicate";
		var parent_el = getParentUntilDiv(questions[i]);
		answerDivs = getSubElementsByClassName(parent_el, "faq_answer");
		if (answerDivs.length > 0 ) {
			answerDivs[0].innerHTML +="<p class=\"faq_bottom\"><span class=\"faq_closer\">Close</span></p>";
		}
	}
}

/* Smooth Scrolling functions */
function currentYPosition() {
  // Firefox, Chrome, Opera, Safari
  if (self.pageYOffset) {
  	return self.pageYOffset;
  }
  // Internet Explorer 6 - standards mode
  if (document.documentElement && document.documentElement.scrollTop) {
  	return document.documentElement.scrollTop;
  }
  // Internet Explorer 6, 7 and 8
  if (document.body.scrollTop) {
  	return document.body.scrollTop;
  }
  return 0;
}

function elmYPosition(eID) {
	var elm = document.getElementById(eID);
	var y = elm.offsetTop;
	var node = elm;
	while (node.offsetParent && node.offsetParent != document.body) {
		node = node.offsetParent;
		y += node.offsetTop;
	} 
	return y;
}

function smoothScroll(eID) {
	var startY = currentYPosition();
	var stopY = elmYPosition(eID);
	var distance = stopY > startY ? stopY - startY : startY - stopY;
	if (distance < 100) {
		scrollTo(0, stopY); return;
	}
	var speed = Math.round(distance / 100);
	if (speed >= 20) {
		speed = 20;
	}
  var step = Math.round(distance / 25);
  var leapY = stopY > startY ? startY + step : startY - step;
  var timer = 0;
  if (stopY > startY) {
  	for ( var i=startY; i<stopY; i+=step ) {
    	setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
      leapY += step; if (leapY > stopY) leapY = stopY; timer++;
    } 
    return;
  }
  for ( var i=startY; i>stopY; i-=step ) {
  	setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
    leapY -= step; if (leapY < stopY) leapY = stopY; timer++;
  }
}

// Social media stuff

function prepSocial() {
	expandMainHeight();
	var sOb;
	if( (sOb = getObById("socialNetworking")) || (sOb = getObById("socMed")) ) {
		sOb.style.display = "block";
		doGooglePlusOne();
		doFacebookLike();
		doTwitter();
	}
}
function doFacebookLike() {
	window.fbAsyncInit = function() {
    FB.init({
      appId      : '137799619629966', // App ID
      channelUrl  : document.location.protocol+'//' + document.domain + '/channel.php',  // custom channel - May be necessary to prevent fb fragment URLs, which dilute SEO and show blank pages to users. See http://searchengineland.com/a-solution-to-the-facebook-fb-xd-fragment-problem-77387 , among others.
      status     : true, // check login status
      cookie     : true, // enable cookies to allow the server to access the session
      oauth      : true, // enable OAuth 2.0
      xfbml      : true  // parse XFBML
    });

    // Additional initialization code here
  };

  // Load the SDK Asynchronously
  (function(d){
     var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/en_GB/all.js";
     d.getElementsByTagName('head')[0].appendChild(js);
   }(document));
}

function doGooglePlusOne() {
	(function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = document.location.protocol + '//apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
  })();
}
function doTwitter() {
	var e = document.createElement('script');
	e.type="text/javascript"; 
	e.async = true; 
	e.src = '//platform.twitter.com/widgets.js'; 
	document.getElementsByTagName('head')[0].appendChild(e);
}
/* If there's a right-hand accessories bar, and it's longer than (#Main + space needed for social media), rejig the height of Main again with positionSEODiv. */
function expandMainHeight() {
	var panel = [];
	if( (pRi = getObById("productRight")) && (panel = getSubElementsByClassName(pRi, "prodRightPanel")) && panel.length > 0 ) {
		if(main = getObById("Main")) {
			panel = panel[0];
			mainbottom = main.offsetHeight;
			panelbottom = panel.offsetHeight + panel.offsetTop;
			if(panelbottom > mainbottom || mainbottom - panelbottom < 100) {
				positionSEODiv('Main', 'mainHolder', 0, 0); 
			}
		}
	}
}


/*
 * 11. Enclosed cart
 */
 
/*
 * 11.1. Modal windows 
 */
 
// If a sitedoc has an associated additional stylesheet, get it via AJAX and apply it to the page. 
function getRemoteStyleSheet(docID, siteroot) {
	var xmlHttp = getXMLHttp();
	xmlHttp.onreadystatechange = function() {
    if(xmlHttp.readyState == 4) {
    	if(xmlHttp.responseText != "") {
    		loadExtraStyle(xmlHttp.responseText.replace(".css", ""), "yes");
    	}
    }
  }
  xmlHttp.open("GET", siteroot+'\/\?\_g\=rm\&type\=gs\&docid\='+docID+'\&rand\='+Math.random(), true);
  xmlHttp.send(null);
}
// Pull sitedoc content vis AJAX
function getRemoteData(element_to_update, url_string, docID, siteroot) {
  var xmlHttp = getXMLHttp();
	xmlHttp.onreadystatechange = function() {
    if(xmlHttp.readyState == 4) {
      modalHandleResponse(element_to_update, xmlHttp.responseText, docID);
    }
  }
  xmlHttp.open("GET", siteroot+url_string+Math.random(), true);
  xmlHttp.send(null);
}
// Show a "loading" spinner.
function modalAnimate(op, image_append_part) {
	loadingob = getObById('loading'+image_append_part);
	if(op == 'start') {
		loadingob.style.display = 'block';
	} else {
		loadingob.style.display = 'none';
	}
}
// Fill element with AJAX-collected content
function modalHandleResponse(element_to_update, response, docID) {
  getObById(element_to_update).innerHTML = response;
  if(docID=="6"){
  	faqSetup("yes");
  }
  modalAnimate('stop', element_to_update);
}
// Display semi-transparent overlay.
function darken() {
	getObById("Overlay").style.display = "block";
}
// Hide semi-transparent overlay.
function lighten() {
	getObById("Overlay").style.display = "none";
}
// Apply a style.visibility value to all elements which include a particular classname 
function classComponentsVisibility(nameOfClass, vis) {
	components = getElementsByClassName(nameOfClass);
	for (var i=0; i < components.length; i++) {
		components[i].style.visibility = vis;
	}
}
// Apply a style.display value to all elements which include a particular classname 
function classComponentsDisplay(nameOfClass, dis) {
	components = getElementsByClassName(nameOfClass);
	for (var i=0; i < components.length; i++) {
		components[i].style.display = dis;
	}
}
// Hide the various contents of a loading or loaded modal window.
function hideOverlay() {
	if(isIE6()) {
		toggleInputSelects("show");
	}
	modalAnimate('stop', 'OverlayDocument');
	getObById('OverlayDocument').innerHTML = '';
	removeExtraOverlayStyle();
	classComponentsDisplay('OverlayComponent', 'none');
  classComponentsDisplay('OverlayDocumentComponent', 'none');
  docTop = getObById("OverlayTop");
	docTop.className= docTop.className.replace("opened", "");
}
// Open a modal window showing the contents of a particular sitedoc
function showOverlay(docID, siteroot) {
	darken();
	if(isIE6()) { 
		// IE6 will show select boxes through an overlay, so they must be hidden
		toggleInputSelects("hide");
	}
	smoothScroll("OverlayContentHolder");
	getRemoteStyleSheet(docID, siteroot);
	var docOb;
	if(docOb = getObById("OverlayDocument")){
		docOb.innerHTML = "";
	}
	modalAnimate('start', 'OverlayDocument');
	classComponentsDisplay('OverlayComponent', 'block');
	getRemoteData('OverlayDocument', '\/\?\_g\=rm\&type\=gd\&docid\='+docID+'\&rand\=', docID, siteroot );
	var docOb = getObById("OverlayDocument");
	var docTop = getObById("OverlayTop");
	if(docID =="6") {
		faqSetup();
	}
	docOb.style.display = "block";
	return false;
}
// Set any select box's visibility to 'hidden' on opening overlay. If you're not using IE6, then this isn't needed 
function toggleInputSelects(command) {
	var selects = document.getElementsByTagName('select');
	for(var i=0; i < selects.length; i++) {
		var selectEl = selects[i]
		if(command=="hide") {
			selectEl.style.visibility = "hidden";
		} else if(command=="show") {
			selectEl.style.visibility = "visible";
		}
	}
}
/* 
 * 11.2. Payment Methods page
 */
 
// Check whether to disable the Continue buttons
function checkContinueBlocks() {
	if(paymentMethodsCount() < 1){
		disableContinueButtons("no_methods");
	} else {
		enableContinueButtons();
	}
}
// Returns the number of payment methods in table#paymentMethodsTable
function paymentMethodsCount() {
	var methodsTable;
	if(methodsTable = getObById("paymentMethodsTable") ) {
		var rows;
		if( (rows=getSubElementsByClassName(methodsTable, "paymentMethodRow") ) && (rows.length > 0)) {
			rowsCount = rows.length;
			for(var i=0; i < rows.length; i++) {
				// expired_lang_val is assigned in paymentMethods.tpl
				if(rows[i].className.indexOf(expired_lang_val) != -1) {
					rowsCount--;
				}
			}			
			return rowsCount;
		} else {
			return 0;
		}
	} else {
		return 0;
	}
}

// Switches continue buttons to a disabled state and overlays a tooltip 
function disableContinueButtons(disReason) {
	var button1, button2, overlays;
	if(button1 = getObById("firstPaymentButton")) {
		button1.disabled=true;
		button1.className = button1.className + " disabled";
	}
	if(button2 = getObById("secondPaymentButton")) {
		button2.disabled=true;
		button2.className = button2.className + " disabled";
	}
	if((overlays = getElementsByClassName("buttonOverlay")) && (overlays.length > 0)) {
		for(var i=0; i < overlays.length; i++) {
			if(overlays[i].className.indexOf(disReason) != -1) {
				overlays[i].style.display = "block";
			} else {
				overlays[i].style.display = "none";
			}
		}
	}
}

// Enables continue buttonsand hides tooltip 
function enableContinueButtons() {
	var button1, button2, overlays;
	if(button1 = getObById("firstPaymentButton")) {
		button1.disabled=false;
		button1.className = button1.className.replace("disabled", "");
	}
	if(button2 = getObById("secondPaymentButton")) {
		button2.disabled=false;
		button2.className = button2.className.replace("disabled", "");
	}
	if((overlays = getElementsByClassName("buttonOverlay")) && (overlays.length > 0)) {
		for(var i=0; i < overlays.length; i++) {
			overlays[i].style.display = "none";
		}
	}
}
// Swap between the Add Card button and a spinner 
function showButtonOrSpinner(elem) {
	var btn = null;
	var spinner = null;
	if( (btn = getObById("firstPlaceYourOrderButton")) && (btn2 = getObById("secondPlaceYourOrderButton")) &&	(spinner = getObById("orderSpinner")) && (spinner2 = getObById("orderSpinner2"))) {
		if(elem == "spinner") {
			spinner.style.display = "block";
			spinner2.style.display = "block";
			btn.style.display = "none";
			btn2.style.display = "none";
		} else {
			spinner.style.display = "none";
			spinner2.style.display = "none";
			btn.style.display = "block";
			btn2.style.display = "block";
		}
	} 
}
// On clicking the button that submits an order, covers the order form with a semitransparent layer.
function toggleOrderForm(elem) {
	var mO = null;
	var fO = null;
	var mC = null;
	var fC = null;
	if( (mO = getObById("orderOverlay")) && (fO = getObById("orderFooterOverlay")) && (mC = getObById("completeContainerContent")) && (fC = getObById("FooterNav")) && (cB = getObById("completeContainerBottom"))) {
		if(elem == "spinner") {
			mO.style.display = "block";
			fO.style.display = "block";
			if(isIE6()){
				// IE6 doesn't play nicely with absolutely-positioned elements with all four sides positioned. So we hide these sections completely but retain their spacing.
				mC.style.visibility = "hidden";
				fC.style.visibility = "hidden";
				cB.style.visibility = "hidden";
			}
		} else {
			mO.style.display = "none";
			fO.style.display = "none";
			if(isIE6()){
				mC.style.visibility = "visible";
				fC.style.visibility = "visible";
				cB.style.visibility = "visible";
			}
		}
	} 
	return false;
}
// Either a) disable all form elements, and overlay a semitransparent layer and a spinner, or b) hide semitransparent layer and spinner, and enable form elements.
// "command" is "disable" or "enable"
function toggleCardForm(command) {
	var f, co;
	if( (f=getObById("payment")) && (co=getObById("cardOverlay")) ) {
		elems = getSubElementsByClassName(f, "cardFormField");
		button = getObById("addCardButton");
		if(command=="disable") {
			/* disable form elements, show big spinner overlay*/
			for(var i=0; i < elems.length; i++) {
				elems[i].disabled = true;
			}
			button.disabled = true;
			co.style.display="block";
		} else if(command=="enable") {
			/* enable form elements, hide big spinner overlay*/
			for(var i=0; i < elems.length; i++) {
				elems[i].disabled = false;
			}
			button.disabled = false;
			co.style.display="none";
		}		
	}
}
// Check submitted card details
function sendCardDetails(siteroot) {
	toggleCardForm("disable");
	var xmlhttp = getXMLHttp();
	var cardNumber = document.payment.cardnumber.value;
	var cardholderName = document.payment.cardholdersname.value;
	var cardType = document.payment.cardtype.value;
	var cardExpireMonth = document.payment.cardexpiremonth.value;
	var cardExpireYear = document.payment.cardexpireyear.value;
	var cv2 = document.payment.cv2.value;
	if(document.payment.storeCard.checked == true) {
		var storeCard = 1;
	} else {
		var storeCard = 0;
	}
	if(cardNumber.length > 0) {
		var parameters = "&cardnumber=" + cardNumber + "&cardholdersname=" + cardholderName + "&cardtype=" + cardType + "&cardexpiremonth=" + cardExpireMonth + "&cardexpireyear=" + cardExpireYear + "&cv2=" + cv2 + "&storeCard=" + storeCard;
  }
  else {
  	return;
  }
  xmlhttp.onreadystatechange = function() {
		if(xmlhttp.readyState == 4) {
			if(document.getElementById("cardError")) {
				document.getElementById("cardnumber").className = document.getElementById("cardnumber").className.replace(" error", "");
				document.getElementById("cardexpiremonth").className = document.getElementById("cardexpiremonth").className.replace(" error", "");
				document.getElementById("cardexpireyear").className = document.getElementById("cardexpireyear").className.replace(" error", "");
				document.getElementById("cardholdersname").className = document.getElementById("cardholdersname").className.replace(" error", "");
				document.getElementById("cv2").className = document.getElementById("cv2").className.replace(" error", "");
				document.getElementById("cardtype").className = document.getElementById("cardtype").className.replace(" error", "");
				toggleCardForm("enable");
			}
			if(xmlhttp.responseText.indexOf('noStore') != -1) {
				document.location.href = "?_g=co&_a=submitOrder";
				return false;
			}
			if(xmlhttp.responseText.indexOf("cardError") == -1) {
				document.getElementById("errorContainer").style.display = 'none';
				document.getElementById("payment").reset();
				toggleCardForm("enable");
				document.getElementById("paymentSection").style.display = 'none';
				document.getElementById("addCard").style.display = 'block';
				document.getElementById("card").innerHTML = xmlhttp.responseText;
				/* Setting the added payment method message */
				document.getElementById("addedMethod").style.display = 'block';
				document.getElementById("addedMethod").innerHTML = added_payment_method;
				setPageTitle();
				highlightSelectedRow();
				checkContinueBlocks();
			}
			else {
				if(xmlhttp.responseText.indexOf('redirect') != -1) {
					document.location.href = "?_g=co&_a=step2&error=gateway";
				}
				else {
					document.getElementById("errorContainer").style.display = 'block';
					document.getElementById("errorContainer").innerHTML = xmlhttp.responseText;
					toggleCardForm("enable");
					if(xmlhttp.responseText.indexOf(card_non_numeric_card_number_error) != -1 || xmlhttp.responseText.indexOf(card_invalid_card_number_error) != -1) {
						document.getElementById("cardnumber").className += " error";
					}
					if(xmlhttp.responseText.indexOf(card_expired_date_error) != -1) {
						document.getElementById("cardexpiremonth").className += " error";
						document.getElementById("cardexpireyear").className += " error";
					}
					if(xmlhttp.responseText.indexOf(card_no_cardholder_name_error) != -1) {
						document.getElementById("cardholdersname").className += " error";
					}
					if(xmlhttp.responseText.indexOf(card_no_cv2_error) != -1 || xmlhttp.responseText.indexOf(card_non_numeric_cv2_error) != -1 || xmlhttp.responseText.indexOf(card_cv2_response_error) != -1) {
						document.getElementById("cv2").className += " error";
					}
					if(xmlhttp.responseText.indexOf(card_invalid_visa_card_number_error) != -1 || xmlhttp.responseText.indexOf(card_invalid_mastercard_number_error) != -1 || xmlhttp.responseText.indexOf(card_invalid_visa_electron_card_number_error) != -1 || xmlhttp.responseText.indexOf(card_invalid_solo_card_number_error) != -1) {
						document.getElementById("cardtype").className += " error";
					}
				}
			}
		}
	}
	if(storeCard != 1){
		xmlhttp.open("POST", siteroot+"/?_g=ex&type=nostore&rand="+Math.random(), true);
	}
	else {
		xmlhttp.open("POST", siteroot+"/?_g=ex&type=store&rand="+Math.random(), true);
	}
	xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlhttp.send(parameters);
	return false;
}
// Replace "Remove payment method" button with spinner.
function showRemoveOrSpinner(elem, payment_method) {
	var btn = null;
	var spinner = null;
	if( (btn = getObById("removeMethod"+payment_method)) &&	(spinner = getObById(payment_method+"RemoveSpinner"))) {
		if(elem == "spinner") {
			spinner.style.display = "block";
			btn.style.display = "none";
		} else {
			spinner.style.display = "none";
			btn.style.display = "block";
		}
	}
}
// Remove a payment method from the list
function removePaymentMethod(payment_method, siteroot, identVal) {
	var xmlhttp = getXMLHttp();
  xmlhttp.onreadystatechange = function() {
		if(xmlhttp.readyState == 4) {
			document.getElementById("card").innerHTML = xmlhttp.responseText;
			if (payment_method == 'paypal') {
				document.getElementById("paypal").style.display = 'block';
				showPayPalOrSpinner("button");
			}
			/* Setting the added payment method message to be hidden */
			document.getElementById("addedMethod").style.display = 'none';
			setPageTitle();
			highlightSelectedRow();
			checkContinueBlocks();
		}
	}
	if(confirm('Are you sure you wish to delete this payment method? ')){
		showRemoveOrSpinner("spinner", payment_method);
		xmlhttp.open("GET", siteroot+"/?_g=ex&type=remove&remove="+payment_method+"&rand="+Math.random(), true);
		xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlhttp.send();
		return false;
	}
	else {
		return false;
	}
}
// Replace "Add PayPal" button with a spinner
function showPayPalOrSpinner(elem) {
	var btn = null;
	var spinner = null;
	if( (btn = getObById("smallAddPayPalButton")) &&	(spinner = getObById("payPalSpinner"))) {
		if(elem == "spinner") {
			spinner.style.display = "inline";
			btn.style.display = "none";
		} else {
			spinner.style.display = "none";
			btn.style.display = "inline";
		}
	}
}
// Add PayPal to the listed payment options
function addPaypal(siteroot) {
	showPayPalOrSpinner("spinner");
	var xmlhttp = getXMLHttp();
  var parameters = "&paypal_added=" + 1;
  xmlhttp.onreadystatechange = function() {
		if(xmlhttp.readyState == 4) {
			showPayPalOrSpinner("button");
			document.getElementById("paypal").style.display = 'none';
			document.getElementById("card").innerHTML = xmlhttp.responseText;
			/* Setting the added payment method message */
			document.getElementById("addedMethod").style.display = 'block';
			document.getElementById("addedMethod").innerHTML = added_payment_method;
			setPageTitle();
			highlightSelectedRow();
			checkContinueBlocks();
		}
	}
	xmlhttp.open("POST", siteroot+"/?_g=ex&type=store&rand="+Math.random(), true);
	xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlhttp.send(parameters);
	return false;
	
}
function setPageTitle() {
	pageTitle = document.getElementById("paymentNewTitle").innerHTML;
	document.getElementById("paymentPageTitle").innerHTML = pageTitle;
}
// Toggle display state of Add Card section
function showAddCard() {
	var state = document.getElementById("paymentSection").style.display;

	if(document.getElementById('error')) {
		document.getElementById("paymentSection").style.display = 'block';
		document.getElementById("addCard").style.display = 'none';
	}
	else if(state == 'none') {
		document.getElementById("paymentSection").style.display = 'block';
		document.getElementById("addCard").style.display = 'none';
	}
	else {
		document.getElementById("paymentSection").style.display = 'none';
		document.getElementById("addCard").style.display = 'block';
	}
	return false;
}
// Enable / disable Order Submit button, depending on whether the T&Cs checkbox has been ticked.
function checkCheckBoxTicked(checkboxId) {
	var checkbox = getObById(checkboxId); 
	var buttons = getElementsByClassName("placeOrderButton");
	var overlays = getElementsByClassName("buttonOverlay");
	if(!checkbox.checked) {
		for (x in buttons) {
			buttons[x].disabled = true;
		}
		for (x in overlays) {
			overlays[x].style.display = "block";
		}
	}else{
		for (x in buttons) {
			buttons[x].disabled = false;
		}
		for (x in overlays) {
			overlays[x].style.display = "none";
		}
	}
}
// Swap buttons on Add Card section, according to whether customer has chosen to store card details
function storeCardCheckBoxTicked() {
	var checkbox = getObById("storeCardBox");
	var addCardButton = getObById("addCardButton");
	if(checkbox && addCardButton) {
		if(!checkbox.checked) {
			addCardButton.className = "useOnceButton";
			toggleNoStoreMessage("show");
			disableContinueButtons("no_store");
		}else{
			addCardButton.className = "addCardButton";
			toggleNoStoreMessage("hide");
			checkContinueBlocks();
		}
	}
}
// Show / hide a message regarding not storing card details.
function toggleNoStoreMessage(command) {
	var par;
	if(par = getObById("noCardStore")) {
		if(command == "show") {
			par.style.display = "block";
		} else {
			par.style.display = "none";
		}
	}
}
// Clears card details entered into the form, and hides Add Card area.
function resetCardForm() {
	var pS, f;
	if((pS = getObById("paymentSection")) && (f = getObById("payment"))) {
		f.reset();
		toggleNoStoreMessage("hide");
		storeCardCheckBoxTicked();
		if(paymentMethodsCount() > 0) {
			showAddCard();
		}
		checkContinueBlocks();
	}

}
// Iterate through each row in the payment methods table. Remove " highlighted" className from each row, but add it if radio button is checked 
function highlightSelectedRow(){
	table=getObById("paymentMethodsTable");
	rows = table.getElementsByTagName("tr");
	for(i=0; i <rows.length ; i++) {
		var row=rows[i];
		var box;
		if(box = getSubElementsByClassName(row, "paymentMethodsRadio")[0] ) {
			row.className = row.className.replace( " highlighted", "");
			if(box.checked){
				row.className += " highlighted"
			}
		}
	}	
}
/*
 * 11.3. Enclosed Cart general functions
 */
// Add a second Continue / Place Order button to the bottom of a page. Used both in Payment and Submit Order
function displaySecondButton() {
	if(getObById("firstPaymentButton")) {
		firstButton = getObById("firstPaymentButton");
		secondButton = getObById("secondPaymentButton");
		secondButton.style.display = "block";
	}
	else if(getObById("firstPlaceYourOrderButton")) {
		firstButton = getObById("firstPlaceYourOrderButton");
		secondButton = getObById("secondPlaceYourOrderButton");
		secondButton.style.display = "block";
	}
}

/*
 * 12. Lens Power descriptions - Basket and Checkout
 */

// Show the lens power element's associated information block
function showPowerExp(el) {
	if(el.className.indexOf("hoverable") == -1){
		// Switch the cursor style to a pointer the first time it's hovered over
		el.className = el.className + " hoverable";
	}
	elp = el.parentNode; // parentNode will always be the containing span which also contains the relevant explanation span.
	showel = getSubElementsByClassName(elp, "power_desc_exp");
	showel = showel[0];
	showel.style.display = "block";
}
// Hide any visible lens power elements
function hidePowerExp() {
	var els;
	if (els = getElementsByClassName("power_desc_exp")) {
		for(var i=0; i<els.length; i++) {
			els[i].style.display = "none";
		}
	}
}
