$(document).ready(function(){
	jQuery.validator.setDefaults({ 
		errorElement: "div",
		invalidHandler: function(form, validator) {
			var errors = validator.numberOfInvalids();
			if (errors) {
				$("#cMessages").hide();
				$("#cMessages-error").hide();
				$("#messages p").html("Sorry, there was a problem with your form. Please check the fields highlighted below and try again.");
				$("#messages").show();
				$.scrollTo("#messages", 120, {offset:-12});
			} else {
				$("#messages").hide();
			}
		}
	});
	
	//$("#colorboxClose").click(function(event){
	//	$.fn.colorbox.close();
	//	event.preventDefault();
	//});
	
	// Home page add2basket
	$(".addtobasket-inline").click(function(){
		$.getJSON(this.href, processJson);
		return false;
	});
	
	// Mailing list
	$("#newsletterForm").validate({
		rules: {nfemail: {email: true}},
		highlight: function(element, errorClass){
			$(element).addClass(errorClass);
			$(element.form).find("input[type=submit]").addClass(errorClass);
		},
		unhighlight: function(element, errorClass) {
			$(element).removeClass(errorClass);
			$(element.form).find("input[type=submit]").removeClass(errorClass);
		},
		errorPlacement: function(error, element) {
			error.insertAfter("#nfbut");
		},
		invalidHandler: function(form, validator) {
			var errors = validator.numberOfInvalids();
			if (errors) return false;
		},
		submitHandler: function(form){
			$(form).ajaxSubmit({
				dataType: "json",
				success: function(data){
					var url = $(form).attr("action");
					if (data.SUCCESS != true) url += "?fuseaction=error";
					$.fn.colorbox({
						height: "229px",
						width: "475px",
						open: true,
						href: url
					});
					$("#nfemail").val("");
				}
			});
		}
	});
	
	// Help desk
	$("#helpForm").validate({
		invalidHandler: function(form, validator) {
			var errors = validator.numberOfInvalids();
			if (errors) return false;
		},
		submitHandler: function(form){
			var url = $(form).attr("action");
			var fuseaction = $(form).find("input[name=fuseaction]").val();
			var safeName = $("#hfname").val().replace(/[><()\[\]{}'";:\/\\|*]/g, "");
			var safePhone = $("#hfphone").val().replace(/[><()\[\]{}'";:\/\\|*]/g, "");
			$.getJSON(url, {
					fuseaction: fuseaction, 
					hfname: safeName,
					hfphone: safePhone
				}, function(){
					var url = $(form).attr("action");
					$.fn.colorbox({
						height: "229px",
						width: "475px",
						open: true,
						href: url
					});
					$("#hfname").val("");
					$("#hfphone").val("");
				}
			);
			//$(form).ajaxSubmit({
			//	dataType: "json",
			//	success: function(data){
			//		var url = $(form).attr("action");
			//		$.fn.colorbox({
			//			height: "229px",
			//			width: "475px",
			//			open: true,
			//			href: url
			//		});
			//		$("#hfname").val("");
			//		$("#hfphone").val("");
			//	}
			//});
		}
	});
	
	// List parts: remove section ref if a category has been selected
	$("#cat").change(function(){
		$("#hSec").remove();
		this.form.submit();
	});
	
	// Products
	$("#priceMatchLink").click(function(event){
		$("#priceMatchText").show();
		$("#moreInfoText").hide();
		$("#fuseaction").val("processpricematch");
		$("label[for=message]").html("Please tell us where you found the product for less and<br />how much are they selling it for?<span title='Required Field'>*</span>");
		$.fn.colorbox({
			href: "#commsPop",
			inline: true,
			open: true
		});
		event.preventDefault();
	});
	$("#moreInfoLink").click(function(event){
		$("#priceMatchText").hide();
		$("#moreInfoText").show();
		$("#fuseaction").val("processmoreinfo");
		$("label[for=message]").html("Message<span title='Required Field'>*</span>");
		$.fn.colorbox({
			href: "#commsPop",
			inline: true,
			open: true
		});
		event.preventDefault();
	});
	$("#commsForm").validate({
		rules: {
			email: {email: true}
		},
		invalidHandler: function(form, validator) {
			var errors = validator.numberOfInvalids();
			if (errors) return false;
		}
	});
	$("#closeColorbox").click(function(event){
		$.fn.colorbox.close();
		event.preventDefault();
	});
	
	// Products add2basket
	$("#addtobasket").ajaxForm({
		beforeSubmit: validateAddtobasket,
		dataType: "json",
		resetForm: true,
		success: processJson
	});
	$("a#continueLink[rel=cartConfirm]").click(function(){
		$.fn.colorbox.close();
		return false;
	});
	
	// Basket validation
	jQuery.validator.addClassRules("qty", {digits: true});
	jQuery.validator.messages.digits = "";
	$("#basketForm").validate({errorElement: "span"});
	$("#basketFormLink").click(function(event){
		$("#basketForm").submit();
		event.preventDefault();
	});
	
	// Billing & Delivery
	$("#payment_country").val($("#payment_country").attr("def"));
	$("#delivery_country").val($("#delivery_country").attr("def"));
	$("input[name='order_priority']").change(function() {
		if ($("input[name='order_priority']:checked").val() != "reserve"){
			$("#billingLeg").html("Billing Details");
			$("#billingDesc").show();
			$("#cardLab").html("Cardholder's Name<span title='Required Field'>*</span>");
			$("#deliverToDets").show();
			if ($("#deliver_to").attr("checked") != true) {
				$("#deliveryDets").show();
			}
		} else {
			$("#billingLeg").html("Your Details");
			$("#billingDesc").hide();
			$("#cardLab").html("Name<span title='Required Field'>*</span>");
			$("#deliverToDets").hide();
			$("#deliveryDets").hide();
		}
	});
	$("#deliver_to").click(function(){
		if ($(this).attr("checked")){
			$("#deliveryDets").hide();
		} else {
			$("#deliveryDets").show();
			$.scrollTo("#deliveryDets", 120, {offset:-12});
		}
	});
	$("#billingForm").validate({
		rules: {
			contact_email: {email: true},
			confirm_contact_email: {equalTo: "#contact_email"},
			delivery_name: {required: "#deliver_to:not(:checked)"},
			delivery_address1: {required: "#deliver_to:not(:checked)"},
			delivery_town: {required: "#deliver_to:not(:checked)"},
			delivery_postcode: {required: "#deliver_to:not(:checked)"}
		},
		messages: {
			confirm_contact_email: {equalTo: "Emails do not match."}
		}
	});
	
	// Payment Method
	var p = $("#payPalBut");
	$("#accept_tc").click(function(){
		if ($(this).attr("checked")){
			$("#buy").removeAttr("disabled");
			$("#buy").removeClass("off");
			p.removeAttr("disabled");
			p.removeClass("off");
			p.attr("src", p.attr("src").replace("_off.gif", ".gif"));
		} else {
			$("#buy").attr("disabled", "disabled");
			$("#buy").addClass("off");
			p.attr("disabled", "disabled");
			p.addClass("off");
			p.attr("src", p.attr("src").replace(".gif", "_off.gif"));
		}
	});
	$("#tc").colorbox({inline:true, href:"#tcPopup"});
	$("#payServer button").click(function(event){
		$("#checkoutForm").show();
		$.scrollTo("#checkoutForm", 240, {offset:-12});
		event.preventDefault();
	});
	$("#paypalAjaxForm").ajaxForm({
		beforeSubmit: function(){
			p.attr("disabled", "disabled");
			p.addClass("off");
			p.attr("src", p.attr("src").replace(".gif", "_off.gif"));
		},
		dataType: "json",
		success: function(data){
			if (data.SUCCESS == true){
				$("#cboxClose").remove();
				$.fn.colorbox({
					href: "#ppPopup",
					inline: true,
					open: true,
					overlayClose: false
				});
				$("#paypalForm").submit();
			} else {
				$("#cMessages").hide();
				$("#cMessages-error").hide();
				$("#messages p").html("Sorry, there was a problem with submitting your order. Please contact customer services for more information.");
				$("#messages").show();
				$.scrollTo("#messages", 120, {offset:-12});
			};
		}
	});
	$("#submitPaypalForm").click(function(event){
		$("#paypalForm").submit();
		event.preventDefault();
	});
	
	$("#card_type").change(function(){
		if ($(this).val() == "switch" ||
			$(this).val() == "solo"){
			$("#Startdate").show();
		} else {
			$("#Startdate").hide();
		}
	});
	$.validator.addMethod("cardNumber", function(value, element) {
		return (/[^0-9- ]+/.test(value) ? false : true);
	}, "Please enter a valid card number.");
	$.validator.addMethod("expiryDate", function(value, element) {
		var currDate = new Date();
		var day = currDate.getDate();
		var month = $("#expiry_date_mm").val();
		var year = $("#expiry_date_yyyy").val();
		var expiryDate = new Date();
		expiryDate.setFullYear(year, month-1, day);
		if (expiryDate < currDate){
			$("#expiry_date_mm").addClass("error");
			$("#expiry_date_yyyy").addClass("error");
			return false;
		} else {
			$("#expiry_date_mm").removeClass("error");
			$("#expiry_date_yyyy").removeClass("error");
			return true;
		}
	}, "Your card has expired.");
	$.validator.addMethod("startDate", function(value, element) {
		var currDate = new Date();
		var day = currDate.getDate();
		var month = $("#start_date_mm").val();
		var year = $("#start_date_yyyy").val();
		var startDate = new Date();
		startDate.setFullYear(year, month-1, day);
		if (($("#start_date_mm").val() || $("#start_date_yyyy").val()) && startDate > currDate){
			$("#start_date_mm").addClass("error");
			$("#start_date_yyyy").addClass("error");
			return false;
		} else {
			$("#start_date_mm").removeClass("error");
			$("#start_date_yyyy").removeClass("error");
			return true;
		}
	}, "Your card is not active yet.");
	$("#paymentForm").validate({
		groups: {
			expirydate: "expiry_date_mm expiry_date_yyyy",
			startdate: "start_date_mm start_date_yyyy"
		},
		rules: {
			card_number: {cardNumber: true},
			security_number: {
				minlength: 3,
				digits: true
			},
			expiry_date_mm: {expiryDate: true},
			expiry_date_yyyy: {expiryDate: true},
			start_date_mm: {
				required: "#start_date_yyyy:not(:blank)",
				startDate: true
			},
			start_date_yyyy: {
				required: "#start_date_mm:not(:blank)",
				startDate: true
			},
			issue_number: {digits: true}
		},
		messages: {
			security_number: {
				minlength: "Please enter 3 characters.",
				digits: "Please only enter digits."
			},
			start_date_mm: {required: "Please select a valid date."},
			start_date_yyyy: {required: "Please select a valid date."},
			issue_number: {digits: "Please only enter digits."}
		}
	});
	
	// Receipt
	$("#printPage[rel=receipt]").click( function() {
		$("#receipt").jqprint();
		return false;
	});
	
	// Contact
	$("#contactForm").validate({
		errorElement: "span",
		rules: {
			femail: {email: true},
			fconfemail: {equalTo: "#femail"}
		},
		messages: {
			fconfemail: {equalTo: "Emails do not match."}
		}
	});
});

// Add to basket
function validateAddtobasket(formData, jqForm, options) {
	// Define the error message
	var jsErrorID = "js_messageerror";
	var errorClass = "messages error";
	var errorMsg = "Please enter a quantity as a whole number for at least one product and try again.";
	
	// Clean up existing alerts
	if(document.getElementById(jsErrorID)) {
		var em = document.getElementById(jsErrorID);
		em.parentNode.removeChild(em);
	}
	for(var i=0; i < formData.length; i++) {
		if(formData[i].name.indexOf("qty_") == 0){
			var f = document.getElementById(formData[i].name);
			removeClass(f,"error");
		}
	}
	
	// Check we have at least one value
	var hasValue = 0;
	for(var i=0; i < formData.length; i++) {
		if(formData[i].name.indexOf("qty_") == 0){
			var f = document.getElementById(formData[i].name);
			if(f.value && f.value > 0){hasValue++;}
		}
	}
	if(hasValue == 0){cf_addReqErr()};
	// Check for errors
	for(var i=0; i < formData.length; i++) {
		if(formData[i].name.indexOf("qty_") == 0
			&& formData[i].value != "qty"){
			var f = document.getElementById(formData[i].name);
			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){addClass(o,"error");}
		// Check if there isn't an error message already present
		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 and scroll to the msg
			jqForm[0].parentNode.insertBefore(em,jqForm[0]);
			var hash = "#"+em.id;
			$.scrollTo(hash, 120, {offset:-12});
		}
	}
}

function processJson(data) { 
	// Check to see if the response was successful.
	if (data.SUCCESS){
		// Build the window contents
		var jBasket = $("#aBasket");
		var jItems = $("#aItems");
		var jValue = $("#aValue");
		var jBasketSummaryItems = $("#basketsummary-items");
		var theClass = "";
		var partCount = 0;
		jBasket.empty();
		$.each(data.DATA.PARTS, function(key,val){
			if (theClass == ""){theClass = "odd ";} else {theClass="";}
			partCount++;
			var arrParts = [];
			arrParts.push("<div class='node-item " + theClass + "ca'>");
			arrParts.push(val.THUMBNAILFILE);
			arrParts.push("<h4>" + val.QTY + " x <strong>" + val.FULLPARTNAME + "</strong></h4>");
			if (val.PARTDESCRIPTION.length){
				arrParts.push("<p>" + val.PARTDESCRIPTION + "</p>");
			}
			arrParts.push("<div class='price'>");
			if (val.RETAILERPRICE < val.RETAILERLISTPRICE){
				arrParts.push("<em>&pound;" + val.RETAILERLISTPRICE + "</em>");
			}
			arrParts.push("&pound;" + val.RETAILERPRICE);
			if (val.RETAILERDELIVERYSURCHARGE > 0){
				arrParts.push(" <span>+ &pound;" + val.RETAILERDELIVERYSURCHARGE + " delivery surcharge</span>");
			}
			arrParts.push("</div>");
			if (val.MANUFACTURERSTOCKCODE.length){
				arrParts.push("<div class='sku'>" + val.MANUFACTURERSTOCKCODE + "</div>");
			}
			arrParts.push("</div>");
			jBasket.append(arrParts.join(""));
		});
		jItems.html(data.DATA.ITEMS);
		jValue.html(data.DATA.VALUE);
		jBasketSummaryItems.html(data.DATA.ITEMS);
		// Open the window
		if (partCount <= 1){
			$("#cartConfirm").attr({style: "height:330px;"});
		} else if (partCount == 2){
			$("#cartConfirm").attr({style: "height:450px;"});
		} else {
			$("#cartConfirm").attr({style: "height:525px;"});
		}
		$.fn.colorbox({
			open:true, 
			inline:true, 
			href:"#cartConfirm"
		});
	} else {
		alert(data.ERRORS);
	}
}

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,' ');
	}
}