// $Id: find_search.js 7877 2010-06-28 09:35:30Z vincent $
// Functions to support validation of find_search

// Variables to be populated in the HTML
// requiredFields, fieldNames, valStrings should come from requiredFields.js
if (typeof valStrings == "undefined") {
	var valStrings = new Array;
}

// Global variables
var count;
var last;
var maxOptions = 10;

// Counts number of countries selected and does validation
function checkNumberCountries (formElement) {
	count = 0;
	for (var i = 0; i < formElement.options.length; i++) {
		if (formElement.options[i].selected) {
			count++;
			last = i;
			if (count > maxOptions) {
				formElement.options[i].selected = false;
			}
		}
	}
	if (count > maxOptions) {
		alert (valStrings["maxCountriesExceeded"]);
		return false;
	}
	
	return true;
}

// Provide city list if there's only one province selected
function changeProvince (formElement, updateSelect) {
	if (updateSelect == true) {
		updateSelection ('mProvinceID', 'provinceSelected');
	}
	var count = 0;
	for (var i = 0; i < formElement.options.length; i++) {
		if (formElement.options[i].selected) {
			count++;
		}
	}
	if (count > 1) {
		update(get(formElement), formElement, m[0]);
	} else {
		relate(formElement, m, 1);
	}
	if (updateSelect == true) {
		updateSelection ('mCityID', 'citySelected');
	}
	formChanged ();
	return true;
}

// Check that min & max are the right way round
function checkAge (formElement) {
	var mAgeMin = formElement.form.mAgeMin.selectedIndex;
	var mAgeMax = formElement.form.mAgeMax.selectedIndex;
	if (mAgeMax < mAgeMin) {
		formElement.form.mAgeMin.options[mAgeMax].selected = true;
		formElement.form.mAgeMax.options[mAgeMin].selected = true;
	}
	formChanged ();
	return true;
}

function updateHeightText () {
	if (typeof selectedOptions != 'undefined') {
		var mHeightMin = $('mHeightMin').selectedIndex;
		var mHeightMax = $('mHeightMax').selectedIndex;
		if ($('heightSelected') != null) {
			var minText = $('mHeightMin').options[mHeightMin].innerHTML;
			var maxText = $('mHeightMax').options[mHeightMax].innerHTML;
			var heightText = copyItems["field_between"] + ' ' + minText + ' ' + copyItems["field_and"] + ' ' + maxText + ' ' + copyItems["field_inclusive"];
			updateText('height', heightText);
		}
	}
}

// Check that min & max are the right way round
function checkHeight (formElement) {
	var mHeightMin = formElement.form.mHeightMin.selectedIndex;
	var mHeightMax = formElement.form.mHeightMax.selectedIndex;
	if (mHeightMax < mHeightMin) {
		formElement.form.mHeightMin.options[mHeightMax].selected = true;
		formElement.form.mHeightMax.options[mHeightMin].selected = true;
		var tempHeight = mHeightMin;
		mHeightMin = mHeightMax;
		mHeightMax = tempHeight;
	}
	updateHeightText ();
	formChanged ();
	return true;
}

// If you click anything other than All, All must be unchecked
// unless you've just unchecked the last of the other checked items.
function uA (formElement) {
	var firstElement = 0;
	var gotAnother = false;
	var allChecked = true;
	for (var i = formElementIndex[formElement.name]; i < formElement.form.elements.length; i++) {
		if (formElement.form.elements[i].name == formElement.name) {
			if (firstElement) {
				gotAnother = (gotAnother || formElement.form.elements[i].checked);
				allChecked = (allChecked && formElement.form.elements[i].checked);
			} else {
				firstElement = i;
				formElement.form.elements[i].checked = false;
			}
		} else if (firstElement) {
			break;  // terminate the loop when we go on to another form element.
		}
	}
	if (!gotAnother || allChecked) {
		formElement.form.elements[firstElement].checked = true;
		if (allChecked) {
			resetCheckboxes(formElement.form, formElement.name, false, false);
			elementID = formElement.id.split("_")[0];
			textElement  = elementID.substr(1,1).toLowerCase() + elementID.substr(2);
			if (typeof selectedOptions != 'undefined') {
				selectedOptions [elementID] = new Array (copyItems["field_all"]);
			}
		}
	}
	formChanged();
}


// Reset a given set of checkboxes
// default action is to clear - if reset is true will reset to ideal match preferences
function resetCheckboxes (formObject, formElementName, reset, clear) {
	var gotFirstElement = false;
	for (var i = formElementIndex[formElementName]; i < formObject.elements.length; i++) {
		if (formObject.elements[i].name == formElementName) {
			if (gotFirstElement) {
				if (reset && formObject.elements[i].defaultChecked) {
					formObject.elements[i].checked = true;
				} else {
					formObject.elements[i].checked = false;
				}
			} else {
				if ((!reset && !clear) || (reset && formObject.elements[i].defaultChecked)) {
					formObject.elements[i].checked = true;
				} else {
					formObject.elements[i].checked = false;
				}
				gotFirstElement = true;
			}
		} else if (gotFirstElement) {
			break;  // terminate the loop when we go on to another form element.
		}
	}
}


// If you click All, we have to clear all the others,
// but ensure that later stays checked and reset the weighting.
// Originally checkAll - called often, so HTML is optimised by shortening
function cA (formElement) {
	resetCheckboxes (formElement.form, formElement.name, false, false);
	formChanged();
}


// Decide whether to submit the page when MCountryID changes in a search form
var oldCount = 0;
var singleCountry = "";
function checkMCountryID (formElement, templateVersion, updateSelect) {
	if (templateVersion == null) {
		templateVersion = 1;
	}
	
	if(!checkNumberCountries(formElement)) {
		return false;
	}
	
	continent = (formElement.options[last].value == "00" || (formElement.options[last].value.substr(0,1) == "x" && formElement.options[last].value != "xx"));
	if (count > 1 && singleCountry) {
		singleCountry = "";
		refreshGeography (formElement, templateVersion);
	} else if (count == 1 && !continent) {
		singleCountry = formElement.options[last].value;
		refreshGeography (formElement, templateVersion);
	} else if (count == 1 && singleCountry && continent) {
		singleCountry = "";
		refreshGeography (formElement, templateVersion);
	}
	if (updateSelect == true) {
		updateSelection ('mCountryID', 'locationSelected');
	}
	formChanged();
	return true;
}

// prevent misbehaving browsers from transmitting their submit button name & value pairs (IE is guilty of doing this)
// spec says: "only an activated submit button is successful"
function noSubmitIE (formElement, button) {
	if (formElement.form.elements[button]) {
		// If we have more than one button with the same name, we need to loop
		// for each otherwise the form will still do things we don't want it to.
		if (typeof formElement.form.elements[button].length != 'undefined') {
			var buttonElements = formElement.form.elements[button];
			for (i=0; i<buttonElements.length; i++) {
				buttonElements[i].disabled = true;
			}
		} else {
			formElement.form.elements[button].disabled = true;
		}
	}
}

// Submit the form to refresh details
function refreshGeography (formElement, templateVersion, noAnchor) {
	if (!noAnchor) {
		formElement.form.action += "#geographicLocation";
		changedElement = document.getElementById('changed');
		if (changedElement != null) {
			changedElement.value = '1';
		}
	}

	// prevent IE amd other misbehaving browsers from submitting <button> objects
	noSubmitIE (formElement, 'quickSearch');
	noSubmitIE (formElement, 'advancedSearch');
	noSubmitIE (formElement, 'resetSearch');
	noSubmitIE (formElement, 'clearSearch');
	// Apply the same for saved search buttons
	noSubmitIE (formElement, 'confirmDelete');
	noSubmitIE (formElement, 'confirmReplace');
	noSubmitIE (formElement, 'saveSearch');
	noSubmitIE (formElement, 'performSearch');
	noSubmitIE (formElement, 'editSearch');
	noSubmitIE (formElement, 'deleteSearch');
	
	// determine which activity indicator to use
	if (templateVersion != null) {
		switch (templateVersion) {
			case 1:
				overlib(INARRAY,0,CAPARRAY,0,STICKY,ABOVE,LEFT,OFFSETX,250);
				break;
			case 2:
				if (typeof Prototype != 'undefined') {
					// use prototype.js
					var notifyElement = $('notification');
					// update text to Refreshing geographic options
					notifyElement.down().update (copyItems['find_search_refreshActivity']);
					notifyElement.show ();
				} else {
					// fallback
					document.getElementById('notification').style.display = '';
				}
				break;
			default:
				;
		}
	}	
	formElement.form.submit();
}

function updateGeographyText () {
	updateSelection ('mCountryID', 'locationSelected');
	updateSelection ('mNationality', 'countrySelected');
	updateSelection ('mProvinceID', 'provinceSelected');
	updateSelection ('mCityID', 'citySelected');
	updatePostCodeText ();
}

// Reset Advanced Search Fields
function resetClearForm (formObject, gotProvinces, idealMatch) {
	// Handle multiple checkboxes
	selectedOptions = new Object();
	var checkBoxes = new Array;
	checkBoxes = ["mStarSign[]", "mHeight[]", "mBodyType[]", "mLooks[]", "mHair[]", "mEyes[]", "mEthnicity[]", "mHomeLanguage[]", "mLanguages[]", "mReligion[]", "mEducation[]", "mOccupation[]", "mIncome[]", "mDrinking[]", "mSmoking[]", "mEating[]", "mRelationship[]", "mRelationships[]", "mHaveKids[]", "mWantKids[]"]
	for (var i = 0; i < checkBoxes.length; i++) {
		resetCheckboxes (formObject, checkBoxes[i], idealMatch, false);
		if (typeof selectedOptions != "undefined") {
			var checkBoxID = checkBoxes[i].substr(0, checkBoxes[i].length-2);
			if (idealMatch) {
				if (typeof defaultOptions != "undefined") {
					selectedOptions[checkBoxID] = new Array;
					var defOptions = defaultOptions[checkBoxID];
					if (typeof defOptions != 'undefined') {
						for (var q = 0; q < defOptions.length; q++) {
							selectedOptions[checkBoxID][q] = defOptions[q];
						}
					}
				}
			} else {
				selectedOptions[checkBoxID] = new Array (copyItems["field_all"]);
			}
		}
	}

	// Handle single checkboxes
	if (idealMatch) {
		if (document.getElementById('mHasPhoto') != null) {
			document.getElementById('mHasPhoto').checked = document.getElementById('mHasPhoto').defaultChecked;
		}
		if (document.getElementById('mHasVoice') != null) {
			document.getElementById('mHasVoice').checked = document.getElementById('mHasVoice').defaultChecked;
		}
	} else {
		if (document.getElementById('mHasPhoto') != null) {
			document.getElementById('mHasPhoto').checked = false;
		}
		if (document.getElementById('mHasVoice') != null) {
			document.getElementById('mHasVoice').checked = false;
		}
	}

	// Handle selects
	var selects = new Array;
	selects = ["mAgeMin", "mAgeMax", "mNationality", "mCountryID", "mProvinceID", "mCityID", "mRangeID", "mPostCodeID", "mHeightMin", "mHeightMax"];
	for (var i = 0; i < selects.length; i++) {
		if (document.getElementById(selects[i]) != null) {
			var selectElement = document.getElementById(selects[i]);
			if (typeof selectElement.options != 'undefined' && selectElement.options != null)  {
				var selectOption = selectElement.options[0];
				if (idealMatch && typeof selectOption != 'undefined' && selectOption != null) {
					selectOption.selected = false;
				} else {
					selectOption.selected = true;
				}
			}
		}
		resetSelect (selects[i], idealMatch);
	}
	if (!idealMatch) {
		if (document.getElementById('mAgeMax') != null) {
			document.getElementById('mAgeMax').options[document.getElementById('mAgeMax').options.length-1].selected = true;
		}
		if (document.getElementById('mHeightMax') != null) {
			document.getElementById('mHeightMax').options[document.getElementById('mHeightMax').options.length-1].selected = true;
		}
	}

	// Handle resetting of provinces
	if (gotProvinces) {
		var elementID = formElementIndex["mProvinceID[]"];
		if (idealMatch) {
			formObject.elements[elementID].options[0].selected = false;
		}
		for (var i = 1; i < formObject.elements[elementID].options.length; i++) {
			if (idealMatch) {
				if (arrayIndex(formObject.elements[elementID].options[i].value, selectedItems['province']) >= 0) {
					formObject.elements[elementID].options[i].selected = true;
				}
			} else {
				formObject.elements[elementID].options[i].selected = false;
			}
		}
		// Handle resetting of cities
		if (idealMatch) {
			changeProvince(document.getElementById('mProvinceID'), true);
			var elementID = formElementIndex["mCityID[]"];
			formObject.elements[elementID].options[0].selected = false;
			for (var i = 1; i < formObject.elements[elementID].options.length; i++) {
				if (arrayIndex(formObject.elements[elementID].options[i].value, selectedItems['city']) >= 0) {
					formObject.elements[elementID].options[i].selected = true;
				}
			}
		} else {
			formObject.elements[elementID].options[0].selected = true;
			// maybe move outside of condition
			relate(formObject.elements[elementID], m, 1);
		}
	} else {
		var elementID = formElementIndex["mCityID[]"];
		if (elementID) {
			for (var i = 1; i < formObject.elements[elementID].options.length; i++) {
				formObject.elements[elementID].options[i].selected = false;
			}
			formObject.elements[elementID].options[0].selected = true;
		}
	}

	updateGeographyText ();
	updateHeightText ();

	// Reset the collapsable text
	if (typeof selectedOptions != "undefined") {
		for (testKey in selectedOptions) {
			textElement  = testKey.substr(1,1).toLowerCase() + testKey.substr(2);
			if (idealMatch) {
				if (typeof (selectedOptions[testKey]) == 'object') {
					updateText(textElement, selectedOptions[testKey].join("; "));
				}
			} else {
				updateText(textElement, copyItems["field_all"]);
			}
		}
	}
	collapseAll();
	return false; // Prevent submission
}

function selectDefault (item) {
	var textElementID  = item + 'Selected';
	if ($(textElementID) != null) {
		if ($(textElementID).innerHTML == '') {
			selectElementID = 'm' + item.substr(0,1).toUpperCase() + item.substr(1) + 'ID';
			$(selectElementID).options[0].selected = true;
			updateSelection (selectElementID, textElementID);
		}
	}
}

function resetForm (formObject, gotProvinces) {
	resetClearForm (formObject, gotProvinces, true);
	show ('provinces');
	show ('cities');
	selectDefault ('province');
	selectDefault ('city');
	return false;
}

function clearForm (formObject, gotProvinces) {
	resetClearForm (formObject, gotProvinces, false);
	updateSavedStatus (false);
	hide ('savedSearchModified');
	hide ('provinces');
	hide ('cities');
	return false;
}

function show (id) {
	if (typeof $ != 'undefined') {
		if ($(id) != null) {
			$(id).show();
		}
	} else {
		var element = document.getElementById (id);
		if (element != null) {
			element.style.display = '';
		}
	}
}

function hide (id) {
	if (typeof $ != 'undefined') {
		if ($(id) != null) {
			$(id).hide();
		}
	} else {
		var element = document.getElementById (id);
		if (element != null) {
			element.style.display = 'none';
		}
	}
}

// Update the display text for each characteristic type
function updateText (elementID, displayText, noSelected) {
	var textElementID = elementID;
	if (typeof noSelected == 'undefined') {
		textElementID = textElementID + 'Selected';
	}
	textElement = $(textElementID);
	if (textElement != null) {
		textElement.update(displayText);
		show(textElementID);
	}
}

// Get the arrayIndex for a value within an array
function arrayIndex (needle, haystack){
	for (var i=0; i < haystack.length; i++) {
		if (needle == haystack[i]){
			return i;
		}
	}
	return -1;
}

function updateCheckboxText (elementID, options) {
	selectedText = options.join("; ");
	divName  = elementID.substr(1,1).toLowerCase() + elementID.substr(2);
	updateText(divName, selectedText);
}

function traverse (element) {
	var any = copyItems["field_all"];
	var elementInfo = element.id.split("_");

	if (typeof(selectedOptions) != 'undefined') {
		var myOptions = selectedOptions[elementInfo[0]];
		if (typeof(myOptions) != 'undefined')	{
			checkbox = $(element);
			newText = checkbox.next().innerHTML;
			position = checkbox.value;

			if (checkbox.checked) {
				// Add the text into selectedArray
				// elementInfo[1] should always be the same as checkbox.value
				if ((position == 0) && (newText == any)) {
					myOptions = new Array (any);
				} else if (arrayIndex(any, myOptions) >= 0) {
					myOptions = new Array (newText);
				} else {
					myOptions.splice(position,0,newText);
				}
			} else {
				// Remove the text from selectedArray
				if (position != 0) {
					index = arrayIndex(newText, myOptions);
					myOptions.splice(index,1);
				}
			}

			if (myOptions.length == 0) {	
				myOptions = new Array (any);
			}

			myOptions.sort;
			selectedOptions[elementInfo[0]] = myOptions;
			updateCheckboxText (elementInfo[0], myOptions);
		}
	}
}

function showCollapsed (elementID, visible) {
	collapsedID = elementID + 'Less';
	collapsed = $(collapsedID);
	if (collapsed != null) {
		if (visible) {
			show(collapsedID);
		} else {
			hide(collapsedID);
		}
	}
	controlID = elementID + 'Control';
	control = $(controlID);
	if (control != null) {
		show(controlID);
	}
}

// Collapse the item, show the Show button, hide the Hide button
function collapse (elementIDs) {
	if (typeof selectedOptions != 'undefined') {
		for (var i=0; i<arguments.length; i++) {
			var elementID = arguments[i];
			divID = elementID + 'Options';
			check = $(divID);
			if (check != null) {
				hide(divID);
			}
			hide(elementID + 'More');
			show(elementID + 'Less');
			showCollapsed(elementID, true);
		}
	}
	if (arguments.length>1 && arguments[0] == 'province') {
		hide ('preferPostCodes');
	} else if (arguments.length>1 && arguments[0] == 'postCode') {
		hide ('preferRegions');
	}
	return false;
}

// Expand the item, show the Hide button, hide the Show button
function expand (elementIDs) {
	if (typeof selectedOptions != 'undefined') {
		for (var i=0; i<arguments.length; i++) {
			var elementID = arguments[i];
			divID = elementID + 'Options';
			check = $(divID);
			if (check != null) {
				show(divID);
			}
			hide(elementID + 'Less');
			show(elementID + 'More');
			showCollapsed(elementID, false);
		}
	}
	if (arguments.length>1 && arguments[0] == 'province') {
		show ('preferPostCodes');
	} else if (arguments.length>1 && arguments[0] == 'postCode') {
		expand ('preferRegions');
	}
	return false;
}

function expandCollapse (elementID) {
	var divID = elementID + 'Options';
	var check = $(divID);
	if (check != null) {
		var displ = check.style.display;
		if (displ == 'none') {
			expand(elementID);
		} else {
			collapse(elementID);
		}
	}
	// return false;
}

function expandCollapseGeography () {
	var check = $('provinceOptions');
	if (check != null) {
		var displ = check.style.display;
		if (displ == 'none') {
			expand('province', 'city');
			show('preferPostCodes');
		} else {
			collapse('province', 'city');
			hide('preferPostCodes');
		}
	}
	// return false;
}

function collapseItems () {
	var collapseArray = new Array;

	// Geographic
	collapseArray.push ('country');
	collapseArray.push ('location');
	collapseArray.push ('city');
	collapseArray.push ('province');
	collapseArray.push ('postCode');

	// Appearance
	collapseArray.push ('height');
	collapseArray.push ('bodyType');
	collapseArray.push ('looks');
	collapseArray.push ('hair');
	collapseArray.push ('eyes');
	collapseArray.push ('starSign');

	// Cultural Characteristics
	collapseArray.push ('ethnicity');
	collapseArray.push ('homeLanguage');
	collapseArray.push ('languages');
	collapseArray.push ('religion');

	// Education and Occupation
	collapseArray.push ('education');
	collapseArray.push ('occupation');
	collapseArray.push ('income');

	// Lifestyle
	collapseArray.push ('drinking');
	collapseArray.push ('smoking');
	collapseArray.push ('eating');

	// Relationships
	collapseArray.push ('relationship');
	collapseArray.push ('relationships');
	collapseArray.push ('haveKids');
	collapseArray.push ('wantKids');

	return collapseArray;
}

function expandCollapseAll (action) {
	var collapseArray = collapseItems ();

	for (var i = 0; i < collapseArray.length; i++) {
		if (action == 'expand') {
			expand ( collapseArray[i] );
		} else if (action == 'collapse') {
			collapse ( collapseArray[i] );
		}
	}
}

function expandAll () {
	expandCollapseAll ('expand');
	show ('preferPostCodes');
	show ('preferRegions');
	return false;
}

function collapseAll () {
	expandCollapseAll ('collapse');
	hide ('preferPostCodes');
	hide ('preferRegions');
	return false;
}

function selectFirstOption (selectElement, matchItem) {
	if (selectElement != null && selectElement != 'null') {
		if (typeof selectElement.options[0] != "undefined") {
			selectElement.options[0].selected = true;
		}
		if (selectElement.selectedIndex == 0) {
			var text = '';
			if (matchItems[matchItem]) {
				text = matchItems[matchItem].join("; ");
				updateText(matchItem, text);
			} else {
				text = selectElement.options[0].innerHTML;
				text = text.replace (/&gt;/g, '');
				text = text.replace (/&lt;/g, '');
				updateText(matchItem, text);
			}
		} else {
			var textElementID = matchItem + 'Selected';
			updateSelection(selectElementID, textElementID);
		}
	}
}

function updateTextFromMatchItems (matchItem) {
	if ($('locationSelected') != 'null' && typeof matchItems != "undefined") {
		var selectElementID = 'm' + matchItem.substr(0,1).toUpperCase() + matchItem.substr(1) + 'ID';
		var selectElement = $(selectElementID);
		if ($('locationSelected').innerHTML == matchItems['location']) {
			if (typeof matchItems[matchItem] != "undefined") {
				var text = matchItems[matchItem].join ("; ");
				if (matchItems[matchItem] == '') {
					if (selectElement != null) {
						text = selectElement.options[0].innerHTML;  
						text = text.replace (/&gt;/g, '');
						text = text.replace (/&lt;/g, '');
					}
				}
				updateText(matchItem, text);
			} else {
				selectFirstOption (selectElement, matchItem);
			}
		} else {
			selectFirstOption (selectElement, matchItem);
		}
	}
}

// Show the expand all and collapse all buttons
function showAll () {
	show ('toggleView');
	show ('resetSearchTop');
	show ('resetSearchBottom');
	show ('countrySelected');
	show ('locationSelected');
	show ('provinceSelected');
	show ('citySelected');
	show ('postCodeSelected');
	show ('heightSelected');
	updateSelection ('mCountryID', 'locationSelected');
	updateTextFromMatchItems ('province');
	updateTextFromMatchItems ('city');
}

function updateSelection (elementID, formElementID) {
	var element = document.getElementById(elementID);
	var formElement = document.getElementById(formElementID);
	if (element != null) {
		var array = new Array;
		for (var i = 0; i < element.options.length; i++) {
			if (element.options[i].selected) {
				var excludeRegex = /(&gt|>)/;
				if (i == 0 || ((element.options.length > 1 && (!element.options[i].innerHTML.match (excludeRegex))) || (element.options.length == 1))) {
					var selectedText = element.options[i].innerHTML;
					selectedText = selectedText.replace (/(&gt;|>)/g, '');
					selectedText = selectedText.replace (/(&lt;|<)/g, '');
					array.push (selectedText);
				}
			}
		}
	}
  	if (formElement != null) {
		formElement.innerHTML = array.join("; ");
	}
}

// Update the city collapsable when a different city is selected
function changeCity (formElement, updateSelect) {
	if (updateSelect == true) {
		updateSelection ('mCityID', 'citySelected');
	}
	formChanged();
	return true;
}

// Update the coutry collapsable when a different country is selected
function changeCountry (formElement, updateSelect) {
	
	if(!checkNumberCountries (formElement)) {
		return false;
	}
	
	if (updateSelect == true) {
		updateSelection ('mNationality', 'countrySelected');
	}
	formChanged();
	return true;
}

function resetSelect (elementID, idealMatch) {
	var element;
	if (typeof $ == 'undefined') {
		element = document.getElementById(elementID);
	} else {
		element = $(elementID);
	}
	if (element != null) {
		var defaultID = 0;
		if (typeof element.options != 'undefined' && element.options != null) {
			for (var i = 1; i < element.options.length; i++) {
				if (idealMatch) {
					element.options[i].selected = element.options[i].defaultSelected;
				} else {
					element.options[i].selected = false;
				}
			}
		}
		if (idealMatch && element.selectedIndex < 0) {
			element.selectedIndex = 0;
		}
	}
}

function buildRequestString (formElement) {
	var reqStr = "";

	for(i=0; i < formElement.elements.length; i++) {
		isformObject = false;

		switch (formElement.elements[i].tagName) {
			case "INPUT":

				switch (formElement.elements[i].type) {
					case "text":
					case "hidden":
						reqStr += formElement.elements[i].name + "=" + encodeURIComponent(formElement.elements[i].value);
						isformObject = true;
						break;

					case "checkbox":
						if (formElement.elements[i].checked) {
							reqStr += formElement.elements[i].name + "=" + formElement.elements[i].value;
						} else {
							reqStr += formElement.elements[i].name + "=";
						}
						isformObject = true;
						break;

					case "radio":
						if (formElement.elements[i].checked) {
							reqStr += formElement.elements[i].name + "=" + formElement.elements[i].value;
							isformObject = true;
						}
					}
					break;

			case "TEXTAREA":
				reqStr += formElement.elements[i].name + "=" + encodeURIComponent(formElement.elements[i].value);
				isformObject = true;
				break;

			case "SELECT":
				var sel = formElement.elements[i];
				if (sel.selectedIndex >= 0) {
					if (sel.name.substr(-2,2) == '[]') {
						// Handle multiple selects
						var multiVal = new Array;
						for (j=0; j<sel.options.length; j++) {
							if (sel.options[j].selected) {
								multiVal.push (sel.name + "=" + sel.options[j].value);
							}
						}
						reqStr += multiVal.join ('&');
					} else {
						// Handle single selects
						if (sel.options[sel.selectedIndex].value) {
							reqStr += sel.name + "=" + sel.options[sel.selectedIndex].value;
						} else {
							reqStr += sel.name + "=" + sel.options[sel.selectedIndex].innerHTML;
						}
					}
				}
				isformObject = true;
				break;
		}

		if ((isformObject) && ((i+1)!= formElement.elements.length)) {
			reqStr += "&";
		}
	}
	return reqStr;
}

// --- Saved Search Functions start here --- //

function enableButton (buttonID) {
	if (document.getElementById(buttonID) != null) {
		document.getElementById(buttonID).disabled = false;
	}
}

function disableButton (buttonID) {
	if (document.getElementById(buttonID) != null) {
		document.getElementById(buttonID).disabled = true;
	}
}

// Not needed at present but could be useful at some point on an 'onkeyup' event
function checkSaveName () {
	var saveSearchName = $('saveSearchName').value;
	if (saveSearchName.length > 0) {
		enableButton ('saveSearchButton');
	} else {
		disableButton ('saveSearchButton');
	}
}

function updateSavedStatus (value) {
	if (value) {
		value = 1;
	} else {
		value = 0;
	}
	var notSavedElement = document.getElementById('notSaved');
	if (notSavedElement != null) {
		notSavedElement.value = value;
	}
}

function formChanged () {
	enableButton ('saveSearchButton');
	if (typeof loadedSearch != 'undefined') {
		show ('saveSearchModified');
	}
	updateSavedStatus (true);
	return true;
}

function enableButtons (element) {
	hide ('saveSearchModified');
	if (typeof element == 'undefined' || element.selectedIndex > 0) {
		enableButton ('deleteSearchButton');
	} else {
		disableButton ('deleteSearchButton');
	}
	enableButton ('editSearchButton');
	enableButton ('performSearchButton');
	return false;
}

function disableButtons () {
	hide ('saveSearchModified');
	disableButton ('editSearchButton');
	disableButton ('deleteSearchButton');
	return false;
}

function checkSelectedSearch (selectElement) {
	var nameElement = document.getElementById('searchName');
	enableButtons (selectElement);
	if (nameElement != null && selectElement != null) {
		if (selectElement.options[selectElement.selectedIndex].innerHTML == nameElement.value) {
			disableButton ('performSearchButton');
		} else {
			enableButton ('performSearchButton');
		}
	}
}

function clearDiv (divID) {
	if (typeof $ !=  'undefined') {
		theDiv = $(divID);
		if (theDiv != null) {
			theDiv.hide();
			theDiv.update ('');
		}
	}
}

function clearDivs () {
	clearDiv ('savedSearchSuccess');
	clearDiv ('savedSearchInfo');
	clearDiv ('savedSearchErr');
}

function saveForm (formID, replace) {
	var result = false;
	clearDivs();
	if (!$('saveSearchButton').disabled) {
		var element = $('saveSearchName');
		var saveSearchName = element.value;
		if (saveSearchName.length == 0) {
			errorMsg (copyItems['find_headError'] + ': ' + copyItems['err_noNameEntered']);
			element.className = 'savedSearchErr';
			element.focus ();
		} else { 
			hide ('saveSearchModified');
			var formValues = buildRequestString($(formID));
			var valueArray = formValues.split("&");
			var newArray   = new Array;
			var elements = 0;
			// Exclude the items below from the Ajax request (NB! also ensure they are excluded in the non JS version)
			var exceptionRegex = /^(sub|searchType|saveSearchOption)$/;
			for (var i=0; i < valueArray.length; i++) {
				formValue = valueArray[i].split("=");
				if ((formValue[0] && formValue[1]) && !formValue[0].match(exceptionRegex)) {
					newArray[elements] = formValue[0] + "=" + formValue[1];
					elements++;
				}
			}
			var url = baseurl + '/s/find/search.php?action=save&f=' + fValue + '&' + newArray.join("&");
			if (replace) {
				url += '&c=1';
			}
			result = ajaxRequest(url);
			element.className = 'savedSearch';
			disableButton ('saveSearchButton');
		}
	}
	return false;
}

function getSearchListOptions (searchID) {
	if (typeof searchID == 'undefined') {
		searchID = '00';
	}
	var url = baseurl + '/s/find/search.php?action=refresh&f=' + fValue + '&s=' + searchID;
	result = ajaxRequest(url);
	return result;
}

function refreshSearchList (json) {
	var selectElement = $('saveSearchOption');
	if (selectElement != null) {
		var selected = selectElement.selectedIndex;
		selectElement.length = 0; // clear list
		for (i=1; i<=10; i++) {
			var sVar = eval ('json.s' + i);
			var vVar = eval ('json.v' + i);
			if (typeof sVar != 'undefined' && typeof vVar != 'undefined') {
				var optn = document.createElement ("OPTION");
				optn.text = vVar;
				optn.value = sVar;
				selectElement.options.add (optn);
			}
		}
		selectElement.selectedIndex = selected;
	}
}

// Determine whether something has been selected in the saved search dropdown
function getSearchID () {
	var selectElement = $('saveSearchOption');
	var result = 0;
	if (selectElement != null) {
		var selected = selectElement.selectedIndex;
		if (selected >= 0) {
			result = selectElement.options[selected].value;
		}
	}
	return result; // ideal match is 0
}

function loadSearch (searchID) {
	var url = baseurl + '/s/find/search.php?action=load&f=' + fValue + '&s=' + searchID;
	result = ajaxRequest (url);
}

function getSavedSearch (formID) {
	clearDivs();
	var searchID = getSearchID ();
	var gotProvinces = false;
	var formObject = $(formID);
	if ($('mProvinceID')) {
		gotProvinces = true;
	}
	loadSearch (searchID);
	return formObject;
}

function displayMsg (textDivID, msg) {
	var textDiv = $(textDivID);
	if (textDiv != null) {
		textDiv.update ('<p><br>' + msg + '</p>');
		textDiv.show ();
	}
}

function successMsg (msg) {
	displayMsg ('savedSearchSuccess', msg);
}

function statusMsg (msg) {
	displayMsg ('savedSearchInfo', msg);
}

function errorMsg (msg) {
	displayMsg ('savedSearchErr', msg);
}

function editSavedSearch (formID) {
	getSavedSearch (formID);
	statusMsg (copyItems['result_searchLoaded']);
	return false;
}

function deleteSavedSearch (formID) {
	clearDivs();
	var searchID = getSearchID ();
	var answer = confirm (copyItems['confirm_savedSearchDelete']);
	if (answer) {
		var url = baseurl + '/s/find/search.php?action=delete&f=' + fValue + '&s=' + searchID;
		result = ajaxRequest (url);
	} else {
		enableButton ('deleteSearchButton');
	}
	$('saveSearchName').value = '';
	return false;
}

function updateSelectElement (element, value) {
	for (var i = 0; i < element.options.length; i++) {
		var optVal = element.options[i].innerHTML;
		if (typeof element.options[i].value != 'undefined' && element.options[i].value != '') {
			optVal = element.options[i].value;
		}
		if (optVal == value) {
			element.options[i].selected = true;
		}
	}
}

function updateForm (json) {
	var formValues = new Object();
	var searchName = json.s1;
	var formFields = new Array;
	var spaceFields = new Array;

	formFields = ['mNationality', 'mCountryID', 'mProvinceID', 'mCityID', 'mRangeID', 'mPostCodeID', 'gender', 'mGender', 'mAgeMin',
				  'mAgeMax', 'mHasPhoto', 'mHasVoice', 'mRecency', 'mStarSign', 'mHeight', 'mHeightMin', 'mHeightMax', 'mBodyType',
				  'mLooks', 'mHair', 'mEyes', 'mHivpStatus', 'mAidsStatus', 'mEthnicity', 'mHomeLanguage', 'mLanguages', 'mReligion',
				  'mEducation', 'mOccupation', 'mIncome', 'mDrinking', 'mSmoking', 'mEating', 'mRelationship', 'mRelationships',
				  'mHaveKids', 'mWantKids'];

	spaceFields = ['mNationality', 'mCountryID', 'mProvinceID', 'mCityID', 'mHomeLanguage', 'mLanguages']; 

	if (json.s1 == null) {
		json.s1 = copyItems['find_search_idealMatch'];
	}
	$('saveSearchName').value = json.s1;

	// Nationality and Country need to be 00 not 0
	if (json.s2 == 0) {
		json.s2 = '00';
	}
	if (json.s3 == 0) {
		json.s3 = '00';
	}

	for (i=0; i<formFields.length; i++) {
		var sVar= eval('json.s' + (i + 2));
		if (sVar != '' && sVar != null) {
			formValues[formFields[i]] = sVar;
		}
	}

	var countriesSelected = new Array;
	for (var formKey in formValues) {
		var formElement = $(formKey);
		if (formElement != null) {
	        switch (formElement.tagName) {
				case "SELECT":
					// Unselect all options
					for (var i = 0; i < formElement.options.length; i++) {
						if (formKey == 'mCountryID' && formElement.options[i].selected == true) {
							countriesSelected.push (formElement.options[i].value);
						}
						formElement.options[i].selected = false;
					}
					// Provinces and cities come through as an array
					if (typeof formValues[formKey] == "object") {
						var alphaVals = formValues[formKey];
						for (var j = 0; j < alphaVals.length; j++) {
							updateSelectElement (formElement, alphaVals[j]);
						}
						// Reload the cities dropdown if province is changed
						if (formElement.name == 'mProvinceID[]') {
							changeProvince (formElement, true);
						}
					// Split space separated values into an array and update the select
					} else if ((arrayIndex (formKey, spaceFields) >= 0) && formValues[formKey].match(/ /)) {
						var alphaVals = formValues[formKey].split(' ');
						for (var j = 0; j < alphaVals.length; j++) {
							updateSelectElement (formElement, alphaVals[j]);
						}
					} else {
						updateSelectElement (formElement, formValues[formKey]);
					}
					break;
				case "INPUT":
					switch (formElement.type) {
						case "checkbox":
							if (formValues[formKey] > 0) {
								formElement.checked = true;
							} else {
								formElement.checked = false;
							}
							break;
					}
					break;
			}
		} else {
			// multiple checkboxes
			var numValue = formValues[formKey];
			var valArray = new Array;
			var selectedValues = new Array;
			var bit = 1;
			while (numValue) {
				if (numValue & 1) {
					valArray.push (bit);
				}
				numValue = numValue >> 1;
				bit++;
				if (bit == 33) { break; }
			}
			if (valArray.length == 0) {
				valArray.push (0);
			}
			var formObject = $('form1');
			var formElementName = formKey + '[]';
			resetCheckboxes (formObject, formElementName, false, true);
			checkedOptions  = new Array;
			for (var i = 0; i < valArray.length; i++) {
				formElement = $(formKey + '_' + valArray[i]);
				if (formElement != null) {
					switch (formElement.tagName) {
						case "INPUT":
							switch (formElement.type) {
								case "checkbox":
									if (formValues[formKey] >= 0) {
										// set numeric checkboxes
										formElement.checked = true;
										checkedOptions.push (formElement.next().innerHTML);
										updateCheckboxText (formKey, checkedOptions);
									} else {
										// set alpha checkboxes
										var alphaVals = formValues[formKey].split(' ');
										for (var k = 0; k < alphaVals.length; k++) {
											formElement = $(formKey + '_' + alphaVals[k]);
											if (formElement != null) {
												formElement.checked = true;
												checkedOptions.push (formElement.next().innerHTML);
												updateCheckboxText (formKey, checkedOptions);
											}
										}
									}
									break;
							}
							break;
					}
				}
			}
		}
	}
	updateHeightText ();
	updateGeographyText ();
	var countries = countriesSelected.join (' ');
	$('searchID').value = $('saveSearchOption').value;
	if (countries != json.s3) {
		refreshGeography (formElement, templateVer, true);
	}
}

// Initialise Saved Search
function ssInit () {
	var element = document.getElementById('searchName');
	if (element == null) {
		disableButton ('saveSearchButton');
	}
	disableButton ('deleteSearchButton');
}

function changeGeographicSearchMethod (targetMethod, targetCountryID, templateVersion, linkElement) {
	var useRegionList = document.frmMM.useRegionList;
	linkElement.href = "#";  // Don't follow the href that was included for non-JS users if we can submit the form instead.
	if (targetMethod == 'regions') {
		useRegionList.value = targetCountryID;
	} else {
		useRegionList.value = "";
	}
	refreshGeography(useRegionList, templateVersion);
	return false;
}

function updatePostCodeText () {
	if ($('mRangeID') != null && $('mPostCodeID') != null) {
		var range = $('mRangeID').selectedIndex;
		var postCode = $('mPostCodeID').selectedIndex;
		if (typeof range == 'undefined') {
			range = 0;
		}
		if ($('postCodeSelected') != null) {
			if ((typeof $('mRangeID').options != 'undefined' && $('mRangeID').options != null) &&
				(typeof $('mPostCodeID').options != 'undefined' && $('mPostCodeID').options != null)) {
				var rangeText = $('mRangeID').options[range].innerHTML;
				var postCodeText = $('mPostCodeID').options[postCode].innerHTML;
				var selectedText = copyItems["radius_within"] + ' ' + rangeText + ' ' + copyItems["radius_of"] + ' ' + copyItems["radius_UKpostCode"] + ' ' + postCodeText;
				updateText('postCode', selectedText);
			}
		}
	}
}
