function MM_openBrWindow(theURL,winName,features) { //v1.2
	window.open(theURL,winName,features);
	return false;
}

function hasClass(ele,cls) {
	return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
function addClass(ele,cls) {
	if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
function removeClass(ele,cls) {
	if (hasClass(ele,cls)) {
		var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
		ele.className=ele.className.replace(reg,' ');
	}
}

function confirmDelete(url) {
	var answer = confirm("Are you sure you want to delete this item (cannot be undone)?");
	if(answer) {
		window.location.href = url;
	} else {
		return false;
	}
}

function resetStyle(f) {
	f.style.cssText = "";
}

function textCounter(f, ml) {
	if(f.value.length > ml){f.value = f.value.substring(0, ml);}
	
	var c = document.getElementById(f.id+"_counter");
	var l = ml - f.value.length;
	
	if(l==0) {
		c.innerHTML = "<span style=\"color:red;\">0 characters left</span>";
	} else if(l==1) {
		c.innerHTML = "1 character left";
	} else {
		c.innerHTML = l + " characters left";
	}
}

function showAddCart() {
	addClass(document.getElementById("postcodeLookup"),"hide");
	removeClass(document.getElementById("addCart"),"hide");
}
function showPostcodeLookup() {
	addClass(document.getElementById("addCart"),"hide");
	removeClass(document.getElementById("postcodeLookup"),"hide");
}

function toggleDeliveryAccessOther(f) {
	var requiredFields = document.getElementById("requiredFields").value;
	var extraRequiredFields = ",delivery_access_other";
	if(f.value == "Other") {
		// Add the the delivery required fields
		document.getElementById("requiredFields").value = requiredFields + extraRequiredFields;
		removeClass(document.getElementById("delivery_access_other_div"),"hide");
	} else {
		// Remove the delivery required fields
		document.getElementById("requiredFields").value = requiredFields.replace(extraRequiredFields, "");
		addClass(document.getElementById("delivery_access_other_div"),"hide");
	}
}

function toggleDelivery(f) {
	var requiredFields = document.getElementById("requiredFields").value;
	var extraRequiredFields = ",delivery_name,delivery_address1,delivery_town,delivery_postcode";
	if(f.checked == true) {
		// Remove the delivery required fields
		document.getElementById("requiredFields").value = requiredFields.replace(extraRequiredFields, "");
		addClass(document.getElementById("delivery"),"hide");
	} else {
		// Add the the delivery required fields
		document.getElementById("requiredFields").value = requiredFields + extraRequiredFields;
		removeClass(document.getElementById("delivery"),"hide");
	}
}

function toggleSwitchSolo(f) {
	//var requiredFields = document.getElementById("requiredFields").value;
	//var extraRequiredFields = ",start_date_mm,start_date_yyyy,issue_number";
	if(f.value == "solo" || f.value == "switch") {
		// Add the the delivery required fields
		//document.getElementById("requiredFields").value = requiredFields + extraRequiredFields;
		removeClass(document.getElementById("switchSolo"),"hide");
	} else {
		// Remove the delivery required fields
		//document.getElementById("requiredFields").value = requiredFields.replace(extraRequiredFields, "");
		addClass(document.getElementById("switchSolo"),"hide");
	}
}

function toggleSubmit() {
	if(document.getElementById("accept_tc").checked == true){
		document.getElementById("buy").disabled = false;
		removeClass(document.getElementById("buy"),"disabled");
	} else {
		document.getElementById("buy").disabled = true;
		addClass(document.getElementById("buy"),"disabled");
	}
}

// validateCalculatorForm
function validateCalculatorForm(of) {
	// Define the error message
	var jsErrorID = "js_messageerror";
	var errorClass = "message error"
	var errorMsg = "There are errors in the information you submitted. Please check the fields marked below - and that you have entered a quantity - and try again.";
	
	// Test if DOM is available and there is an element called requiredFields
	if(!document.getElementById || !document.createTextNode){return;}
	if(!document.getElementById("requiredFields")){return;}

	// Split the fields
	var reqfields = document.getElementById("requiredFields").value.split(",");

	// Clean up existing alerts
	if(document.getElementById(jsErrorID)) {
		var em = document.getElementById(jsErrorID);
		em.parentNode.removeChild(em);
	}
	for(var i=0;i<reqfields.length;i++) {
		var f = document.getElementById(reqfields[i]);
		if(!f){continue;}
		f.style.cssText = "";
	}
	
	// Loop over required fields
	for(var i=0;i<reqfields.length;i++) {
		// Check if required field is there
		var f = document.getElementById(reqfields[i]);
		if(!f){continue;}
		
		// Test if the required field has an error
		if(f.value == "" || isNaN(f.value) || f.value <= 0){cf_addReqErr(f)}
	}
	
	if(!document.getElementById(jsErrorID)) {
		var len = document.getElementById("length").value;
		var wid = document.getElementById("width").value;
		var dep = document.getElementById("depth").value;
		
		// Convert the input to metric
		if(document.getElementById("length_uom").value == "yd"){len = len * 0.9144};
		if(document.getElementById("length_uom").value == "ft"){len = len * 0.3048};
		if(document.getElementById("width_uom").value == "yd"){wid = wid * 0.9144};
		if(document.getElementById("width_uom").value == "ft"){wid = wid * 0.3048};
		if(document.getElementById("depth_uom").value == "mm"){dep = dep / 1000};
		if(document.getElementById("depth_uom").value == "cm"){dep = dep / 100};
		if(document.getElementById("depth_uom").value == "in"){dep = dep * 0.0254};
		
		var area = len * wid; area = area.toFixed(1);
		var volume = len * wid * dep; volume = volume.toFixed(1);
		
		// Populate the elements
		document.getElementById("area").innerHTML = area + "m2";
		document.getElementById("volume").innerHTML = volume + "m3";
		
		var inputs = document.getElementsByTagName("input");
		for(var i=0;i<inputs.length;i++) {
			if(inputs[i].id.indexOf("qty_") != -1){
				var f = document.getElementById(inputs[i].id);
				var id = f.id.replace(/qty_/i, "");
				var coverage = document.getElementById("cov_"+id).value;
				f.value = Math.ceil(volume / coverage);
			}
		}
		
		// Show the parts
		removeClass(document.getElementById("introBlock"),"hide");
		removeClass(document.getElementById("parts"),"hide");
		
		window.scroll(of.offsetLeft,of.offsetTop-12);
	}
	
	return false;
	
	/* Tool methods */
	function cf_addReqErr(o) {
		if(o){o.style.cssText = "border-color:red;"}
		
		// Check if there is no error message
		if(!document.getElementById(jsErrorID)) {
			// Create the error message
			var em = document.createElement("div");
			em.id = jsErrorID;
			em.className = errorClass;
			var newp = document.createElement("p");
			newp.appendChild(document.createTextNode(errorMsg))
			em.appendChild(newp);
			
			// Insert the msg before the form element
			of.parentNode.insertBefore(em,of);
			
			window.scroll(em.offsetLeft,em.offsetTop-12);
		}
	}
}

// validateNewsletterForm validation
function validateNewsletterForm(of) {
	// Define the error message
	var jsErrorID = "js_messageerror";
	var errorClass = "message error"
	var errorMsg = "There are errors in the information you submitted. Please check the fields marked below - and that you have entered a quantity - and try again.";
	var f = document.getElementById("newsletter_email")
	
	// Clean up existing alerts
	if(document.getElementById(jsErrorID)) {
		var em = document.getElementById(jsErrorID);
		em.parentNode.removeChild(em);
	}
	f.style.cssText = "";
	
	if(!cf_isEmailAddr(f.value)){cf_addReqErr(f)}
	
	return !document.getElementById(jsErrorID);
	
	/* Tool methods */
	function cf_addReqErr(o) {
		if(o){o.style.cssText = "border-color:red;"}
		
		// Check if there is no error message
		if(!document.getElementById(jsErrorID)) {
			// Create the error message
			var em = document.createElement("div");
			em.id = jsErrorID;
			em.className = errorClass;
			var newp = document.createElement("p");
			newp.appendChild(document.createTextNode(errorMsg))
			em.appendChild(newp);
			
			// Insert the msg before the form element
			of.parentNode.insertBefore(em,of);
			
			window.scroll(em.offsetLeft,em.offsetTop-12);
		}
	}
	
	function cf_isEmailAddr(str) {
		return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
	}
}

// addCart validation
function validateAddCart(of) {
	// Define the error message
	var jsErrorID = "js_messageerror";
	var errorClass = "message error"
	var errorMsg = "There are errors in the information you submitted. Please check the fields marked below - and that you have entered a quantity - and try again.";
	var formElements = of.elements;
	
	// Clean up existing alerts
	if(document.getElementById(jsErrorID)) {
		var em = document.getElementById(jsErrorID);
		em.parentNode.removeChild(em);
	}
	for(var i=0;i<formElements.length;i++) {
		if(formElements[i].id.indexOf("qty_") == 0){
			var f = document.getElementById(formElements[i].id);
			f.style.cssText = "";
		}
	}
	
	// Check we have at least one value
	var hasValue = 0;
	for(var i=0;i<formElements.length;i++) {
		if(formElements[i].id.indexOf("qty_") == 0){
			var f = document.getElementById(formElements[i].id);
			if(f.value && f.value > 0){hasValue = 1;}
		}
	}
	
	if(hasValue == 0){cf_addReqErr()};
	
	// Check for errors
	for(var i=0;i<formElements.length;i++) {
		if(formElements[i].id.indexOf("qty_") == 0){
			var f = document.getElementById(formElements[i].id);
			if(Math.ceil(f.value) != Math.floor(f.value)){cf_addReqErr(f)}
		}
	}
	
	return !document.getElementById(jsErrorID);
	
	/* Tool methods */
	function cf_addReqErr(o) {
		// Colourise the error fields
		if(o){o.style.cssText = "border-color:red;"}
		
		// Check if there is no error message
		if(!document.getElementById(jsErrorID)) {
			// Create the error message
			var em = document.createElement("div");
			em.id = jsErrorID;
			em.className = errorClass;
			var newp = document.createElement("p");
			newp.appendChild(document.createTextNode(errorMsg))
			em.appendChild(newp);
			
			// Insert the msg before the h1 element
			h = of.getElementsByTagName("h1")[0];
			h.parentNode.insertBefore(em,h);
			
			window.scroll(em.offsetLeft,em.offsetTop-12);
		}
	}
}

// TGA validation
function validateTGAForm(of) {
	// Define the error message
	var jsErrorID = "js_messageerror";
	var cfErrorID = "cf_messageerror";
	var cfMessageID = "cf_message";
	var errorClass = "message error"
	var errorMsg = "There are errors in the information you submitted. Please check the fields marked below and try again.";
	
	// Test if DOM is available and there is an element called requiredFields
	if(!document.getElementById || !document.createTextNode){return;}
	if(!document.getElementById("requiredFields")){return;}
	
	// Update the requiredFields with extra elements
	for(var i=1;i<=7;i++) {
		if(document.getElementById("seed_species"+i).value != "" ||
			document.getElementById("seed_cultivar"+i).value != "" ||
			document.getElementById("seed_percentage"+i).value != "") {
			document.getElementById("requiredFields").value = document.getElementById("requiredFields").value + ",seed_species" + i;
			document.getElementById("requiredFields").value = document.getElementById("requiredFields").value + ",seed_cultivar" + i;
			document.getElementById("requiredFields").value = document.getElementById("requiredFields").value + ",seed_percentage" + i;
		}
	}
	for(var i=1;i<=8;i++) {
		if(document.getElementById("cover_species"+i).value != "" ||
			document.getElementById("cover_percentage"+i).value != "") {
			document.getElementById("requiredFields").value = document.getElementById("requiredFields").value + ",cover_species" + i;
			document.getElementById("requiredFields").value = document.getElementById("requiredFields").value + ",cover_percentage" + i;
		}
	}
	
	// Split the fields
	var reqfields = document.getElementById("requiredFields").value.split(",");
	
	// Clean up existing alerts
	if(document.getElementById(jsErrorID)) {
		var em = document.getElementById(jsErrorID);
		em.parentNode.removeChild(em);
	}
	if(document.getElementById(cfErrorID)) {
		var em = document.getElementById(cfErrorID);
		em.parentNode.removeChild(em);
	}
	if(document.getElementById(cfMessageID)) {
		var em = document.getElementById(cfMessageID);
		em.parentNode.removeChild(em);
	}
	for(var i=0;i<reqfields.length;i++) {
		var f = document.getElementById(reqfields[i]);
		if(!f){continue;}
		f.style.cssText = "";
	}
	
	// Loop over required fields
	for(var i=0;i<reqfields.length;i++) {
		// Check if required field is there
		var f = document.getElementById(reqfields[i]);
		if(!f){continue;}
		
		// Test if the required field has an error, according to its type
		switch(f.type.toLowerCase()) {
			case "text":
				if(f.value==""){cf_addReqErr(f)}
				// Check special fields
				if((f.id == "purity" || f.id.indexOf("seed_percentage") != -1 || f.id.indexOf("cover_percentage") != -1) && (isNaN(f.value) || f.value > 100)){cf_addReqErr(f)}
				if((f.id == "weight" || f.id == "soil_thickness" || f.id == "thatch_thickness" || f.id == "sward_height") && isNaN(f.value)){cf_addReqErr(f)}
				break;
			case "textarea":
				if(f.value==""){cf_addReqErr(f)}
				break;
			case "checkbox":
				if(!f.checked){cf_addReqErr(f)}
				break;
			case "select-one":
				if(f.value==""){cf_addReqErr(f)}
				break;
			case "file":
				if(f.value==""){cf_addReqErr(f)}
		}
	}
	
	return !document.getElementById(jsErrorID);
	
	/* Tool methods */
	function cf_addReqErr(o) {
		// Find the parent fieldset
		var testObj = o.parentNode;
		var found = 1;
		while(testObj.nodeName != "FIELDSET") {
			if(testObj.nodeName == "FORM"){found = 0; break};
			testObj = testObj.parentNode;
		}
		// Expand the fieldset if necessary
		if(found == 1 &&
			testObj.className.search(/collapsed/i) != -1) {
			testObj.className = "collapsible expanded";
		}
		
		// Colourise the error fields
		o.style.cssText = "border-color:red;";
		
		// Check if there is no error message
		if(!document.getElementById(jsErrorID)) {
			// Create the error message
			var em = document.createElement("div");
			em.id = jsErrorID;
			em.className = errorClass;
			var newp = document.createElement("p");
			newp.appendChild(document.createTextNode(errorMsg))
			em.appendChild(newp);
			
			// Insert the msg before the form element
			of.parentNode.insertBefore(em,of);
			
			window.scroll(em.offsetLeft,em.offsetTop-12);
		}
	}
}

// Generic validation
function validateForm(of) {
	// Define the error message
	var jsErrorID = "js_messageerror";
	var cfErrorID = "cf_messageerror";
	var cfMessageID = "cf_message";
	var errorClass = "message error"
	var errorMsg = "There are errors in the information you submitted. Please check the fields marked below and try again.";
	var formElements = of.elements;
	
	// Format certain fields
	for(var i=0;i<formElements.length;i++) {
		if(formElements[i].id.indexOf("postcode") != -1 &&
			document.getElementById("requiredFields").value.indexOf(formElements[i].id) != -1 &&
			formElements[i].value != ""){
			var postcodeField = document.getElementById(formElements[i].id);
			// Convert to upper and remove non-alphanumeric
			var formattedPostcode = postcodeField.value.toUpperCase();
			formattedPostcode = formattedPostcode.replace(/[^a-zA-Z0-9]+/g,"");
			// Recompile the postcode
			var firstPart = formattedPostcode.substr(0,formattedPostcode.length-3);
			var secondPart = formattedPostcode.substr(formattedPostcode.length-3);
			postcodeField.value = firstPart + " " + secondPart;
		}
	}
	
	// Test if DOM is available and there is an element called requiredFields
	if(!document.getElementById || !document.createTextNode){return;}
	if(!document.getElementById("requiredFields")){return;}
	
	// Split the fields
	var reqfields = document.getElementById("requiredFields").value.split(",");
	var c = document.getElementById("confirmFields");
	if(c){
		var confields = document.getElementById("confirmFields").value.split(",");
	}
	var u = document.getElementById("urlFields");
	if(u){
		var urlfields = document.getElementById("urlFields").value.split(",");
	}
	
	// Clean up existing alerts
	if(document.getElementById(jsErrorID)) {
		var em = document.getElementById(jsErrorID);
		em.parentNode.removeChild(em);
	}
	if(document.getElementById(cfErrorID)) {
		var em = document.getElementById(cfErrorID);
		em.parentNode.removeChild(em);
	}
	if(document.getElementById(cfMessageID)) {
		var em = document.getElementById(cfMessageID);
		em.parentNode.removeChild(em);
	}
	for(var i=0;i<reqfields.length;i++) {
		var f = document.getElementById(reqfields[i]);
		if(!f){continue;}
		f.style.cssText = "";
	}
	if(confields) {
		for(var i=0;i<confields.length;i++) {
			var f = document.getElementById(confields[i]);
			if(!f){continue;}
			f.style.cssText = "";
		}
	}
	if(urlfields) {
		for(var i=0;i<urlfields.length;i++) {
			var f = document.getElementById(urlfields[i]);
			if(!f){continue;}
			f.style.cssText = "";
		}
	}
	
	// Loop over required fields
	for(var i=0;i<reqfields.length;i++) {
		// Check if required field is there
		var f = document.getElementById(reqfields[i]);
		if(!f){continue;}
		
		// Test if the required field has an error, according to its type
		switch(f.type.toLowerCase()) {
			case "text":
				if(f.value=="" && f.id!="email" && f.id!="user_name" && f.id!="postcode" && f.id!="qty"){cf_addReqErr(f)}
				// Email is a special field and needs checking
				if((f.id=="email" || f.id.indexOf("_email") != -1) && !cf_isEmailAddr(f.value)){cf_addReqErr(f)}
				// Username is a special field and needs checking
				if(f.id=="user_name" && (f.value.length < 5 || f.value.indexOf(' ', 0) != -1)){cf_addReqErr(f)}
				// Postcode is a special field and needs checking
				if((f.id=="postcode" || f.id.indexOf("_postcode") != -1) && !cf_isPostcode(f.value)){cf_addReqErr(f)}
				// Qty is a special field and needs checking
				if((f.id=="qty" || f.id.indexOf("qty_") != -1) && Math.ceil(f.value)!=Math.floor(f.value)){cf_addReqErr(f)}
				// seed_percentage is a special field and needs checking
				if((f.id.indexOf("seed_percentage") != -1) && isNaN(f.value)){cf_addReqErr(f)}
				// special_offer_discount is a special field and needs checking
				if((f.id.indexOf("special_offer_discount") != -1) && (isNaN(f.value) || f.value <= 0)){cf_addReqErr(f)}
				break;
			case "password":
				if(f.value.length < 6 || f.value.indexOf(' ', 0) != -1){cf_addReqErr(f)}
				break;
			case "textarea":
				if(f.value==""){cf_addReqErr(f)}
				break;
			case "checkbox":
				if(!f.checked){cf_addReqErr(f)}
				break;
			case "select-one":
				if(f.value==""){cf_addReqErr(f)}
				break;
			case "file":
				if(f.value==""){cf_addReqErr(f)}
		}
	}
	
	if(confields) {
		// Loop over confirm fields
		for(var i=0;i<confields.length;i++) {
			// Check if confirm field pairing is there
			var f = document.getElementById(confields[i]);
			var cf = document.getElementById("confirm_"+confields[i]);
			if(!f && !cf){continue;}
			// Test if the pair have the same value
			if(f.value!=cf.value || f.value=="" || cf.value==""){
				cf_addReqErr(f)
				cf_addReqErr(cf)
			}
		}
	}
	
	if(urlfields) {
		// Loop over url fields
		for(var i=0;i<urlfields.length;i++) {
			// Check if url field is there and it has a value
			var f = document.getElementById(urlfields[i]);
			if(!f){continue;}
			// Test if the format is valid
			if(f.value!="" && f.value!="http://" && f.value!="https://" &&
				f.value.search(/http/i) == -1){
				//cf_addReqErr(f)
				f.value = "http://"+f.value;
			}
		}
	}
	
	return !document.getElementById(jsErrorID);
	
	/* Tool methods */
	function cf_addReqErr(o) {
		// Find the parent fieldset
		var testObj = o.parentNode;
		var found = 1;
		while(testObj.nodeName != "FIELDSET") {
			if(testObj.nodeName == "FORM"){found = 0; break};
			testObj = testObj.parentNode;
		}
		// Expand the fieldset if necessary
		if(found == 1 &&
			testObj.className.search(/collapsed/i) != -1) {
			testObj.className = "collapsible expanded";
		}
		
		// Colourise the error fields
		o.style.cssText = "border-color:red;";
		
		// Check if there is no error message
		if(!document.getElementById(jsErrorID)) {
			// Create the error message
			var em = document.createElement("div");
			em.id = jsErrorID;
			em.className = errorClass;
			var newp = document.createElement("p");
			newp.appendChild(document.createTextNode(errorMsg))
			em.appendChild(newp);
			
			// Insert the msg before the form element
			of.parentNode.insertBefore(em,of);
			
			window.scroll(em.offsetLeft,em.offsetTop-12);
		}
	}
	
	function cf_isEmailAddr(str) {
		return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
	}
	function cf_isPostcode(str) {
		return str.match(/\b[A-PR-UWYZ][A-HK-Y0-9][A-HJKSTUW0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}\b/g);
	}
}
