
var SearchProcessor = {

	/* Search Processor Class
		for FloristExchange.com
		Martin Latter 28/4/11 */

	sFieldHighlight: "#e6f18b",
	sFieldClear: "#eee",
	iMinFieldLength: 3,

	/* checkboxes:
		0 town
		1 county
		2 zip
		3 deltown
		x delcounty - removed 10/10/11
		4 delzip */


	init: function() {

		document.getElementById("nojs").style.display = 'none';
		SearchProcessor.checkCountry(); // for reload GB
		document.getElementById("country").onchange = SearchProcessor.checkCountry;
		SearchProcessor.getElementsByClass("searchchoice"); // assign event handlers for search fields
		
		document.getElementById("searchf").onsubmit = function() {
			return SearchProcessor.formsubmitcheck(this);
		};
	},


	formsubmitcheck: function(oF) {

		var oRBError = document.getElementById("searcherrors");
		oRBError.innerHTML = "";

		// check that a radio button is selected
		var bRBFlag = false;
		var aRBs = document.getElementsByName("searchchoice");
		for (var i = -1, n = aRBs.length; ++i < n;) {
			if (aRBs[i].checked === true) {
				bRBFlag = true;
				break;
				break;
			}
		}

		if (!bRBFlag) {
			oRBError.innerHTML = "Please first select a search field by clicking a radio button and then typing a search term.";
			return false;
		}
		else {
			var bFlag;
			if ((!document.getElementById("2").checked) && (!document.getElementById("4").checked)) { // not zips
				bFlag = SearchProcessor.nonZipsCheck(oF);
				return bFlag;
			}
			else {
				bFlag = SearchProcessor.checkZips(oF); // this = searchf
				return bFlag;
			}
		}
	},


	getElementsByClass: function(sClassName) {

		/* Martin Latter: 2/2/11
		interesting dodge of inline event handlers */

		var aElements = document.getElementsByName(sClassName);

		for (var i = -1, n = aElements.length; ++i < n;) {

			aElements[i].onclick = function(e) {
				var oEvt = (e || window.event); // make sure event captured for non-IE
				var oTarg = (oEvt.srcElement)? oEvt.srcElement : oEvt.target;
				var aSearchFields = [];
				var oInputs = document.getElementsByTagName("input");
				for (i = -1, n = oInputs.length; ++i < n;) {
					if (oInputs[i].className === "searchfield") { // reset fields
						oInputs[i].style.background = SearchProcessor.sFieldClear;
						oInputs[i].disabled = true;
						aSearchFields.push(oInputs[i]);
					}
				}

				var t = parseInt(oTarg.id, 10);
					// take id off radio button id which corresponds with pushed array of input.searchfield
				aSearchFields[t].style.background = SearchProcessor.sFieldHighlight;
				aSearchFields[t].disabled = false;
				aSearchFields[t].focus();
			};
		}
	},


	checkCountry: function() {

		var oDropDown = document.getElementById("country");

		if (oDropDown.options[oDropDown.selectedIndex].value === "GB") {
			document.getElementById("ziplabel").innerHTML = "postcode";
			document.getElementById("delziplabel").innerHTML = "delivery postcode";
			document.getElementById("deltown").disabled = true; // disable delivery towns for UK
			document.getElementById("2").disabled = false;
			document.getElementById("3").disabled = true;
			document.getElementById("4").disabled = false;
		}
		else if (oDropDown.options[oDropDown.selectedIndex].value === "IE" || oDropDown.options[oDropDown.selectedIndex].value === "NZ") { // disable postcodes for Eire and New Zealand
			document.getElementById("zip").disabled = true;
			document.getElementById("delzip").disabled = true;
			document.getElementById("2").disabled = true;
			document.getElementById("3").disabled = false;
			document.getElementById("4").disabled = true;
		}
		else { // not UK or IE
			document.getElementById("ziplabel").innerHTML = "zip";
			document.getElementById("delziplabel").innerHTML = "delivery zip";
			document.getElementById("deltown").disabled = false;
			document.getElementById("zip").disabled = false;
			document.getElementById("delzip").disabled = false;
			document.getElementById("2").disabled = false;
			document.getElementById("3").disabled = false;
			document.getElementById("4").disabled = false;
		}
	},


	nonZipsCheck: function(oF) {

		var oEF = document.getElementById("searcherrors");
		var sShortMessage = "The search term is too short <small>(minimum " + SearchProcessor.iMinFieldLength + " characters)</small>";
		var sEmptyMessage = "Please enter a search term into the selected (green highlighted) search field.";

		if (oF.searchchoice[0].checked) { // using passed form RB names (searchchoice) rather than DgEbyID
			if (oF.town.value === "") {
				oEF.innerHTML = sEmptyMessage;
				return false;
			}
			else if (oF.town.value.length < SearchProcessor.iMinFieldLength) { // casting will add unnecessarily, this is okay
				oEF.innerHTML = sShortMessage;
				return false;
			}
			else {
				return true;
			}
		}
		else if (oF.searchchoice[1].checked) {
			if (oF.county.value === "") {
				oEF.innerHTML = sEmptyMessage;
				return false;
			}
			else if (oF.county.value.length < SearchProcessor.iMinFieldLength) {
				oEF.innerHTML = sShortMessage;
				return false;
			}
			else {
				return true;
			}
		}
		else if (oF.searchchoice[3].checked) {
			if (oF.deltown.value === "") {
				oEF.innerHTML = sEmptyMessage;
				return false;
			}
			else if (oF.deltown.value.length < SearchProcessor.iMinFieldLength) {
				oEF.innerHTML = sShortMessage;
				return false;
			}
			else {
				return true;
			}
		}
		/*else if (oF.searchchoice[4].checked) {
			if (oF.delcounty.value === "") {
				oEF.innerHTML = sEmptyMessage;
				return false;
			}
			else if (oF.delcounty.value.length < SearchProcessor.iMinFieldLength) {
				oEF.innerHTML = sShortMessage;
				return false;
			}
			else {
				return true;
			}
		}*/
		else {
			return true;
		}
	},


	checkZips: function(oF) {

		var oDropDown = document.getElementById("country");
		var sCountryCode = oDropDown.options[oDropDown.selectedIndex].value;
		var sZIP = (sCountryCode !== "GB")? "ZIP" : "postcode";

		var oErrorField = document.getElementById("searcherrors");
		var sEmptyMessage = "Please enter a " + sZIP + " into the selected (green highlighted) search field.";
		var sTooShortMessage = sZIP + " is too short <small>(minimum " + SearchProcessor.iMinFieldLength + " characters)</small>";

		if (oF.searchchoice[2].checked && (oF.zip.value === "")) {
			oErrorField.innerHTML = sEmptyMessage;
			return false;
		}
		else if (oF.searchchoice[4].checked && (oF.delzip.value === "")) {
			oErrorField.innerHTML = sEmptyMessage;
			return false;
		}
		else if (sCountryCode !== "GB") {
			if (oF.searchchoice[2].checked && (oF.zip.value.length < SearchProcessor.iMinFieldLength)) {
				oErrorField.innerHTML = sTooShortMessage;
				return false;
			}
			else if (oF.searchchoice[4].checked && (oF.delzip.value.length < SearchProcessor.iMinFieldLength)) {
				oErrorField.innerHTML = sTooShortMessage;
				return false;
			}
			else {
				return true; // head back if not UK
			}
		}

		/* UK postcode verification */
		var rUKPostcodeShort = /^[A-Z]{1,2}[0-9]{1,2}/i;
		var rUKPostCodeLong = /^[A-Z]{1,2}[0-9]{1,2}[A-Z]{0,1}\s[0-9][A-Z]{2}/i;
		var sSPCErrorMessage = "Invalid UK postcode - postcode minimum should be at least one character and one number e.g. B1.";
		var sLPCErrorMessage = "Invalid UK postcode - postcode should be in the format BN11\nor BN11 1RT, including a space separator.";

		if (oF.searchchoice[2].checked) {
			if (oF.zip.value.length < 5) {
				if (!rUKPostcodeShort.test(oF.zip.value)) {
					oErrorField.innerHTML = sSPCErrorMessage;
					oF.zip.select();
					oF.zip.focus();
					return false;
				}
			}
			else {
				if (!rUKPostCodeLong.test(oF.zip.value)) {
					oErrorField.innerHTML = sLPCErrorMessage;
					oF.zip.select();
					oF.zip.focus();
					return false;
				}
			}
		}
		else if (oF.searchchoice[4].checked) {

			if (oF.delzip.value.length < 5) {
				if (!rUKPostcodeShort.test(oF.delzip.value)) {
					oErrorField.innerHTML = sSPCErrorMessage;
					oF.delzip.select();
					oF.delzip.focus();
					return false;
				}
			}
			else {
				if (!rUKPostCodeLong.test(oF.delzip.value)) {
					oErrorField.innerHTML = sLPCErrorMessage;
					oF.delzip.select();
					oF.delzip.focus();
					return false;
				}
			}
		}
		else {
			oErrorField.innerHTML = "";
			return true;
		}

		return true;
	}
};


window.onload = SearchProcessor.init;


window.onunload = function() {

	SearchProcessor = null;
};


/*addLoadListener(
	function() {
		SearchProcessor.init();
		listenForEvent(document.getElementById("searchf"), "submit", function() {
			if (SearchProcessor.formsubmitcheck(document.getElementById("searchf"))) {return false;}
			else {return true;}
		})
	}
);*/
