// NEWA application form validator
NEWA.application_form = {};
NEWA.application_form = function ()
{
    var obj = {};
	obj.aPickupAreas = {};
	obj.aPickupPrices = {};
	obj.nEntryFee = 0;
	obj.nWebLinkFee = 0;
	obj.aPriceDetails = {};
	
	
	// ACCESSORS AND MUTATORS
	
	obj.setPickupAreas = function (aPickupAreas) {
		obj.aPickupAreas = eval('(' + aPickupAreas + ')');
	}; // setPickupAreas function end
	
	obj.getPickupAreas = function () {
		return obj.aPickupAreas;
	}; // getPickupAreas function end
	
	obj.setPickupPrices = function (aPickupPrices) {
		obj.aPickupPrices = eval('(' + aPickupPrices + ')');
	}; //  setDeliveryPrices function end
	
	obj.getPickupPrices = function () {
		return obj.aPickupPrices;
	}; // getDeliveryPrices function end
	
	obj.setEntryFee = function (nEntryFee) {
		obj.nEntryFee = nEntryFee;
	}; // setEntryFee function end
	
	obj.getEntryFee = function () {
		return obj.nEntryFee;
	}; // getEntryFee function end
	
	obj.setWebLinkFee = function (nWebLinkFee) {
		obj.nWebLinkFee = nWebLinkFee;
	}; // setWebLinkFee function end
	
	obj.getWebLinkFee = function () {
		return obj.nWebLinkFee;
	}; // getWebLinkFee function end
	
	obj.setPriceDetails = function (aPriceDetails) {
		obj.aPriceDetails = aPriceDetails;
	}; // setPriceDetails function end
	
	obj.getPriceDetails = function () {
		return obj.aPriceDetails;
	}; // getPriceDetails function end
	
	
	// CALLABLE FUNCTIONS
	
	obj.displayDivs = function (nPictures) {

		// picture one is always going to be shown
		document.getElementById("picture_one").style.display="block";

		switch(nPictures) {
			case '1':
				document.getElementById("picture_two").style.display="none";
				document.getElementById("picture_three").style.display="none";
				document.getElementById("picture_four").style.display="none";
				obj.resetPictureDiv(2);
				obj.resetPictureDiv(3);
				obj.resetPictureDiv(4);
			break;

			case '2':
				document.getElementById("picture_two").style.display="block";
				document.getElementById("picture_three").style.display="none";
				document.getElementById("picture_four").style.display="none";
				obj.resetPictureDiv(3);
				obj.resetPictureDiv(4);
			break;

			case '3':
				document.getElementById("picture_two").style.display="block";
				document.getElementById("picture_three").style.display="block";
				document.getElementById("picture_four").style.display="none";
				obj.resetPictureDiv(4);
			break;

			case '4':
				document.getElementById("picture_two").style.display="block";
				document.getElementById("picture_three").style.display="block";
				document.getElementById("picture_four").style.display="block";
			break;

			default:
				alert('Error');
			break;
		} // switch end
		
		document.getElementById("numpics").value = nPictures;
		obj.displayPickupOptions(false);
	}; // displayDivs function end
	
	obj.displayWebLinkBox = function (lShow) {
		
		if(lShow === true) {
			document.getElementById("linkbox").style.display = "block";
		} // show link box check end
		else {
			document.getElementById("linkbox").style.display = "none";
			document.getElementById("weblink").value = "http://";
		} // show link box check else end
		
		// recalculate incase link has been removed
		obj.calculatePrice();
	}; // displayWebLinkBox function end
	
	obj.displayPickupOptions = function (lShow) {
		
		if(lShow === true) {
			document.getElementById("pickupdiv").style.display = "block";
			document.getElementById("pickupradio_no").checked = false;
			document.getElementById("pickupradio_yes").checked = true;
		} // show link box check end
		else {
			document.getElementById("pickupdiv").style.display = "none";
			document.getElementById("pickuparea").value = "";
			document.getElementById("del_15").value = 0;
			document.getElementById("del_30").value = 0;
			document.getElementById("del_42").value = 0;
			document.getElementById("del_60").value = 0;
			document.getElementById("pickupradio_no").checked = true;
			document.getElementById("pickupradio_yes").checked = false;
		} // show link box check else end
		
		// recalculate incase delivery has been removed
		obj.calculatePrice();
	}; // displayPickupOptions function end function end
	
	obj.validatePickupNumbers = function () {
		
		var nDel15Items = parseInt(document.getElementById("del_15").value);
		var nDel30Items = parseInt(document.getElementById("del_30").value);
		var nDel42Items = parseInt(document.getElementById("del_42").value);
		var nDel60Items = parseInt(document.getElementById("del_60").value);
		var nNumPics = document.getElementById("numpics").value;
		
		// check they haven't put more pictures than they are entering
		if((nDel15Items + nDel30Items + nDel42Items + nDel60Items) > nNumPics) {
			alert('Error: You have entered more pictures than you are entering.');
			return false;
		} // too many check end
		
		// check they haven't exceeded the maximum allowed
		if(nDel15Items > 4 || nDel30Items > 3 || nDel42Items > 2 || nDel60Items > 1) {
			alert('Error: Too many pictures entered of a size entered.');
			return false;
		} // to many entered check end
		
		// recalculate application prices to reflect changes
		obj.calculatePrice();
		
		// must be ok to get here so return true
		return true;
	}; // validatePickupNumbers function end
	
	obj.validateAndSubmit = function () {
		// final validation of form and submit if ok
		
		// check the personal details fields are entered
		if(obj.checkPersonalFields() === false) {
			return false;
		} // personal fields check end
		
		// check the picture details fields are entered
		if(obj.checkPictureFields() === false) {
			return false;
		} // picture fields check end
		
		// check the pictures sizes meet rules
		if(obj.validatePictureSizes === false) {
			return false;
		} // picture sizes check end
		
		if(obj.validatePickupOptions() == false) {
			return false;
		} // pickup options validate check end

		if(obj.webLinkChecker() == false) {
			return false;
		} // pickup options validate check end
		
		if(obj.termsCheck() == false) {
			return false;
		} // terms validate check end
	
		document.getElementById("applicationform").submit();
	}; // validateAndSibmit function end
	
	// UTILITY FUNCTIONS
	
	obj.checkPersonalFields = function () {
		
		var cFirstName = document.getElementById("firstname").value;
		var cLastName = document.getElementById("lastname").value;
		var cAddress = document.getElementById("address").value;
		var cPostCode = document.getElementById("postcode").value;
		var cDayPhone = document.getElementById("dayphone").value;
		var cEmail = document.getElementById("email").value;
		var cApplicationType = document.getElementById("capplicationtype").value;

		if(cFirstName == "" || cFirstName == " " || cFirstName == null) {
			alert('Please enter your first name.');
		} // field check end 
		else if(cLastName == "" || cLastName == " " || cLastName == null) {
			alert('Please enter your last name.');
		}// field check end
		else if(cAddress == "" || cAddress == " " || cAddress == null) {
			alert('Please enter your address.');
		}// field check end
		else if(cPostCode== "" || cPostCode == " " || cPostCode == null) {
			alert('Please enter your postcode.');
		}// field check end
		else if(cDayPhone == "" || cDayPhone == " " || cDayPhone == null) {
			alert('Please enter your day time phone number.');
		}// field check end
		else if(isInteger(cDayPhone) == false) {
			alert('Your day time phone number should be a numeric value with no spaces.');
		} // check if phone number is valid integer if end
		else if(cApplicationType != "manual" && (cEmail == "" || cEmail == " " || cEmail == null)){
			alert("You must enter an email address");
		} // manual application check end
		else {
			return true;
		} // else end
		
		// must have errored to get here
		return false;
	}; // checkvitalfields function end
	
	obj.checkPictureFields = function () {
		
		var nPics = document.getElementById("numpics").value;
		
		for(var i=1;i<=nPics;i++) {
			var cTitleField = "title" + i;
			var cWidthField = "width" + i;
			var cHeightField = "height" + i;
			var cMediumField = "medium" + i;
			var cPriceField = "price" + i;
			var cKeywordsField = "keywords" + i;
		
			var cTitle = document.getElementById(cTitleField).value;
			var cWidth = document.getElementById(cWidthField).value;
			var cHeight = document.getElementById(cHeightField).value;
			var cMedium = document.getElementById(cMediumField).value;
			var nPrice = document.getElementById(cPriceField).value;
			var cKeywords = document.getElementById(cKeywordsField).value;
		
			if(cTitle == "" || cTitle == " " || cTitle == null) {
				alert('Please enter a title for picture ' + i);
				return false;
			} // field check end
			else if(cWidth == "" || cWidth == " " || cWidth == null) {
				alert('Please enter a width for picture ' + i);
				return false;
			} // field check end
			else if(cHeight == "" || cHeight == " " || cHeight == null) {
				alert('Please enter a height for picture ' + i);
				return false;
			} // field check end
			else if(cMedium == "" || cMedium == " " || cMedium == null) {
				alert('Please enter a medium for picture ' + i);
				return false;
			} // field check end
			else if(nPrice == "" || nPrice == " " || nPrice == null) {
				alert('Please enter a price for picture ' + i);
				return false;
			} // field check end
			else if(cKeywords == "" || cKeywords == " " || cKeywords == null) {
				alert('Please enter some keywords for picture ' + i);
				return false;
			} // field check end
			else if(isInteger(nPrice)  == false) {
				alert('The price you have entered for picture ' + i + ' is invalid. It must be a numeric value.');
				return false;
			} // integer check end
			else if(nPrice < 100) {
				alert('Picture ' + i + ' is priced below the £100 minimum.');
				return false;
			} // minumum price check end
			// must have errored to get here so return false
		} // pictures for loop end
		
		return true;
	}; // checkPictureFields function end
	
	obj.resetPictureDiv = function (nID) {
		
		var nPics = document.getElementById("numpics").value;
		
			var cTitleField = "title" + nID;
			var cWidthField = "width" + nID;
			var cHeightField = "height" + nID;
			var cDepthField = "width" + nID;
			var cMediumField = "medium" + nID;
			var cPriceField = "price" + nID;
			var cKeywordsField = "keywords" + nID;
			
			document.getElementById(cTitleField).value = "";
			document.getElementById(cWidthField).value = "";
			document.getElementById(cHeightField).value = "";
			document.getElementById(cDepthField).value = "";
			document.getElementById(cMediumField).value = "";
			document.getElementById(cPriceField).value = "";
			document.getElementById(cKeywordsField).value = "";
	}; // resetPictureDiv function end
	
	obj.checkPickupArea = function () {
		
		var aPickupAreas = obj.getPickupAreas();
		var cPickupArea = document.getElementById("pickuparea").value;
		
		if(cPickupArea.length > 0) {
			if(aPickupAreas[cPickupArea] == undefined) {
				alert("You have entered an invalid pickup area, please try again.");
			} // valid pickup area check end
			else {
				return true;
			} // valid pickup area check else end
		} // entry given check end
		else {
			alert("Please enter a pickup area");
		} // entry given check else end
		
		// must have errored to get here so return false
		return false;
	}; // checkPickUpArea function end
	
	obj.termsCheck = function () {
		if(document.getElementById("terms").checked == true) {
			document.getElementById("terms_error").style.display = "none";
			return true;
		} // if end
		else {
			document.getElementById("terms_error").style.display = "block";
			alert("You must agree to our terms and conditions.")
			return false;
		} // else end
	}; // termsCheck function end
	
	obj.webLinkChecker = function () {
		
		var cWebLink = document.getElementById("weblink").value;
		
		if(document.getElementById("linkradio_yes").checked === true) {
			if(cWebLink == "" || cWebLink == " " || cWebLink == null || cWebLink == "http://" || cWebLink == "http:// " || cWebLink == "na") {
				alert('You have chosen to submit a weblink, please enter your web sites address in the field provided.');
				return false;
			} // field check if end
			else {
				return true;
			} // field check else end
		} // yes there should be a web link if end
		else {
			return true;
		} // no there should not be a web link else end
	}; // webLinkChecker function end
	obj.termsCheck = function () {
		if(document.getElementById("terms").checked == true) {
			document.getElementById("terms_error").style.display = "none";
			return true;
		} // if end
		else {
			document.getElementById("terms_error").style.display = "block";
			alert("You must agree to our terms and conditions.")
			return false;
		} // else end
	}; // termsCheck function end
	
	obj.webLinkChecker = function () {
		
		var cWebLink = document.getElementById("weblink").value;
		
		if(document.getElementById("linkradio_yes").checked === true) {
			if(cWebLink == "" || cWebLink == " " || cWebLink == null || cWebLink == "http://" || cWebLink == "http:// " || cWebLink == "na") {
				alert('You have chosen to submit a weblink, please enter your web sites address in the field provided.');
				return false;
			} // field check if end
			else {
				return true;
			} // field check else end
		} // yes there should be a web link if end
		else {
			return true;
		} // no there should not be a web link else end
	}; // webLinkChecker function end
	
	obj.validatePickupOptions = function () {

		var nNumDeliveryMethods = 0;
		var lPersonalDelivery = document.getElementById("lpersonaldelivery_yes").checked;
		var lCourierDelivery = document.getElementById("lcourier_yes").checked;
		var lPickupNeeded = document.getElementById("pickupradio_yes").checked;
		
		var nDel15Items = parseInt(document.getElementById("del_15").value);
		var nDel30Items = parseInt(document.getElementById("del_30").value);
		var nDel42Items = parseInt(document.getElementById("del_42").value);
		var nDel60Items = parseInt(document.getElementById("del_60").value);
		var nTotalPickupItems = nDel15Items + nDel30Items + nDel42Items + nDel60Items;
		
		var cPickupArea = document.getElementById("pickuparea").value;
				
		if(lPersonalDelivery === true) {
			nNumDeliveryMethods++;
		} // pickup check end

		if(lCourierDelivery === true) {
			nNumDeliveryMethods++;
		} // pickup check end
		
		if(lPickupNeeded === true) {
			nNumDeliveryMethods++;
		} // pickup check end
		
		// check they've selected a deliver method
		if(nNumDeliveryMethods == 0) {
			alert("You need to choose one of the delivery methods.");
			return false;
		} // no delivery method check end
		
		// check the haven't chosen more than one deliver method'
		if(nNumDeliveryMethods > 1){
			alert("You can only choose one delivery method.");
			return false;
		} // too many delivery methods check end
		
		// check they have given some items if they have said yes to delivery
		if(lPickupNeeded === true && nTotalPickupItems == 0) {
			alert('You have selected our pickup option but not specified any items for pickup, please check this field.');
			return false;
		} // no items check end

		// double check the pickup area
		if(lPickupNeeded === true && obj.checkPickupArea() === false) {
			return false;
		} // pickup needed check end

		// double check the pickup numbers
		if(obj.validatePickupNumbers === false) {
			return false;
		} // pickup numbers check ned

		// must be ok to get here
		return true;
	}; // validatePickupOptions function end
	
	obj.validatePickupOptions = function () {

		var nNumDeliveryMethods = 0;
		var lPersonalDelivery = document.getElementById("lpersonaldelivery_yes").checked;
		var lCourierDelivery = document.getElementById("lcourier_yes").checked;
		var lPickupNeeded = document.getElementById("pickupradio_yes").checked;
		
		var nDel15Items = parseInt(document.getElementById("del_15").value);
		var nDel30Items = parseInt(document.getElementById("del_30").value);
		var nDel42Items = parseInt(document.getElementById("del_42").value);
		var nDel60Items = parseInt(document.getElementById("del_60").value);
		var nTotalPickupItems = nDel15Items + nDel30Items + nDel42Items + nDel60Items;
		
		var cPickupArea = document.getElementById("pickuparea").value;
				
		if(lPersonalDelivery === true) {
			nNumDeliveryMethods++;
		} // pickup check end

		if(lCourierDelivery === true) {
			nNumDeliveryMethods++;
		} // pickup check end
		
		if(lPickupNeeded === true) {
			nNumDeliveryMethods++;
		} // pickup check end
		
		// check they've selected a deliver method
		if(nNumDeliveryMethods == 0) {
			alert("You need to choose one of the delivery methods");
			return false;
		} // no delivery method check end
		
		// check the haven't chosen more than one deliver method'
		if(nNumDeliveryMethods > 1){
			alert("You can only choose one delivery method.");
			return false;
		} // too many delivery methods check end
		
		// check they have given some items if they have said yes to delivery
		if(lPickupNeeded === true && nTotalPickupItems == 0) {
			alert('You have selected our pickup option but not specified any items for pickup, please check this field.');
			return false;
		} // no items check end

		// double check the pickup area
		if(lPickupNeeded === true && obj.checkPickupArea() === false) {
			return false;
		} // pickup needed check end

		// double check the pickup numbers
		if(obj.validatePickupNumbers === false) {
			return false;
		} // pickup numbers check ned

		// must be ok to get here
		return true;
	}; // validatePickupOptions function end
	
	obj.validatePictureSizes = function () {
		var n15Items = 0;
		var n30Items = 0;
		var n42Items = 0;
		var n60Items = 0;
		var nWidth = 0;
		var nHeight = 0;
		var nDepth = 0;
		var nMaxDimension = 0;
		var nPics = document.getElementById("numpics").value;
		
		for(var i=1;i<=nPics;i++) {
			nWidth = parseFloat(document.getElementById("width" + i).value);
			nHeight = parseFloat(document.getElementById("height" + i).value);
			nDepth = parseFloat(document.getElementById("depth" + i).value);

			nWidth = isNaN(nWidth) ? 0 : nWidth;
			nHeight = isNaN(nHeight) ? 0 : nHeight;
			nDepth = isNaN(nDepth) ? 0 : nDepth;

			nMaxDimension = Math.max(nWidth,nHeight,nDepth);
			
			if(nMaxDimension > 60) {
				// none of theses are allowed
				alert("You are not allowed any items over 60ins, please check the sizing rules on page 1 of exhibition rules.")
				return false;
			} // > 60 check end
			else if(nMaxDimension > 42) {
				n60Items++;
			} // > 62 check end
			else if(nMaxDimension > 30) {
				n42Items++;
			} // 42 check end
			else if(nMaxDimension > 15) {
				n30Items++;
			} // 30 check end
			else {
				n15Items++;
			} // 15 check end
		} // pictures loop end
		
		if(n60Items > 1) {
			alert("You are only allowed 1 picture up to 60ins, please check the sizing rules on page 1 of exhibition rules.");
			return false;
		} // 60 items check end
		
		if(n42Items > 2) {
			alert("You are only allowed 2 pictures up to 42ins, please check the sizing rules on page 1 of exhibition rules.");
			return false;
		} // 60 items check end
		
		if(n30Items > 3) {
			alert("You are only allowed 3 picture up to 30ins, please check the sizing rules on page 1 of exhibition rules.");
			return false;
		} // 60 items check end
		
		return true;
	}; // validatePictureSizes function
	
	
	obj.calculatePrice = function () {
		
		var aPriceDetails = new Array();
		var nTotalPrice = 0;
		var nPickupPrice = 0;
		
		var nEntryFee = obj.getEntryFee();
		var nWebLinkFee = obj.getWebLinkFee();
		
		var aPickupPrices = obj.getPickupPrices();
		var nDel15Items = document.getElementById("del_15").value;
		var nDel30Items = document.getElementById("del_30").value;
		var nDel42Items = document.getElementById("del_42").value;
		var nDel60Items = document.getElementById("del_60").value;
		
		var lWebLinkNeeded = document.getElementById("linkradio_yes").checked;
		
		// calculate the delivery price
		nPickupPrice = ((nDel15Items * aPickupPrices.del_15) + (nDel30Items * aPickupPrices.del_30) + (nDel42Items * aPickupPrices.del_42) + (nDel60Items * aPickupPrices.del_60));
		
		// calculate the web link price
		nWebLinkPrice = (lWebLinkNeeded === true) ? nWebLinkFee : 0;
		
		nTotalPrice = nEntryFee + nPickupPrice + nWebLinkPrice;
		
		aPriceDetails["web_link_price"] = nWebLinkPrice;
		aPriceDetails["pickup_price"] = nPickupPrice;
		aPriceDetails["total_price"] = nTotalPrice;
		
		// save the price details
		obj.setPriceDetails(aPriceDetails);
		
		// refresh the price display
		obj.refreshPriceDisplay();
	}; // calculate price function end
	
	obj.refreshPriceDisplay = function () {
		
		var aPriceDetails = obj.getPriceDetails();
		
		document.getElementById("linkcost").innerHTML = aPriceDetails["web_link_price"];
		document.getElementById("pickupcost").innerHTML = aPriceDetails["pickup_price"];
		document.getElementById("totalcost").innerHTML = aPriceDetails["total_price"];
		document.getElementById("price").value = aPriceDetails["total_price"];
	}; // refreshPriceDisplay function end
	
	return obj;
}(); // NEWA.application_form end
