PageSourceSearch

https://www.datingbuzzireland.com/js/find_search.r40242.js

js datingbuzzireland.com collected 2026-10-04 03:38:47 UTC 48,905 bytes, 1,530 lines download raw bytes

1// $Id: find_search.js 36029 2023-02-27 10:12:52Z brendon $
2// Functions to support validation of find_search
3
4// Variables to be populated in the HTML
5// requiredFields, fieldNames, valStrings should come from requiredFields.js
6if (typeof valStrings == "undefined") {
7	var valStrings = new Array;
8}
9
10// Global variables
11var count;
12var last;
13var maxOptions = 10;
14
15// Counts number of countries selected and does validation
16function checkNumberCountries (formElement) {
17	count = 0;
18	for (var i = 0; i < formElement.options.length; i++) {
19		if (formElement.options[i].selected) {
20			count++;
21			last = i;
22			if (count > maxOptions) {
23				formElement.options[i].selected = false;
24			}
25		}
26	}
27	if (count > maxOptions) {
28		alert (valStrings["maxCountriesExceeded"]);
29		return false;
30	}
31	
32	return true;
33}
34
35// Provide city list if there's only one province selected
36function changeProvince (formElement, updateSelect) {
37	if (updateSelect == true) {
38		updateSelection ('mProvinceID', 'provinceSelected');
39	}
40	var count = 0;
41	for (var i = 0; i < formElement.options.length; i++) {
42		if (formElement.options[i].selected) {
43			count++;
44		}
45	}
46	if (count > 1) {
47		update(get(formElement), formElement, m[0]);
48	} else {
49		if (typeof m != 'undefined') {	
50			relate(formElement, m, 1);
51		}
52	}
53	if (updateSelect == true) {
54		updateSelection ('mCityID', 'citySelected');
55	}
56	formChanged ();
57	return true;
58}
59
60// Manage the mGender value when mGender selection has been disallowed
61function autosetMGender(formElement) {
62	if (typeof formElement.form.elements["mGender[]"] != 'undefined') {
63		var mGenderElement = formElement.form.elements["mGender[]"];
64	} else {
65		var mGenderElement = formElement.form.mGender;
66	}
67
68	if (mGenderElement.value != 3) {
69		// when mGender is not set to Men & Women...
70		var gender = formElement.value;
71		var mGender = gender ^ 3;  // set mGender to the inverse of gender
72		if (mGenderElement.value != gender) {
73			mGender = gender;  // set mGender to match gender
74		}
75		//change the text label for mGender
76		$(mGenderElement).prev("span.gender").html(menWomen[mGender]);
77		//change the numeric value in the hidden input field
78		mGenderElement.value = mGender; 
79	}
80	return true;
81}
82
83// Check that min & max are the right way round
84function checkAge (formElement) {
85	var mAgeMin = formElement.form.mAgeMin.selectedIndex;
86	var mAgeMax = formElement.form.mAgeMax.selectedIndex;
87	if (mAgeMax < mAgeMin) {
88		formElement.form.mAgeMin.options[mAgeMax].selected = true;
89		formElement.form.mAgeMax.options[mAgeMin].selected = true;
90	}
91	formChanged ();
92	return true;
93}
94
95function updateHeightText () {
96	if (typeof selectedOptions != 'undefined') {
97		var mHeightMin = $('#mHeightMin').prop('selectedIndex');
98		var mHeightMax = $('#mHeightMax').prop('selectedIndex');
99		if ($('#heightSelected').length != 0) {
100			var minText = $('#mHeightMin').find(':selected').text();
101			var maxText = $('#mHeightMax').find(':selected').text();
102			var heightText = minText + ' ' + copyItems["field_to"] + ' ' + maxText + ' ' + copyItems["field_inclusive"];
103			updateText('height', heightText);
104		}
105	}
106}
107
108// Check that min & max are the right way round
109function checkHeight (formElement) {
110	var mHeightMin = formElement.form.mHeightMin.selectedIndex;
111	var mHeightMax = formElement.form.mHeightMax.selectedIndex;
112	if (mHeightMax < mHeightMin) {
113		formElement.form.mHeightMin.options[mHeightMax].selected = true;
114		formElement.form.mHeightMax.options[mHeightMin].selected = true;
115		var tempHeight = mHeightMin;
116		mHeightMin = mHeightMax;
117		mHeightMax = tempHeight;
118	}
119	updateHeightText ();
120	formChanged ();
121	return true;
122}
123
124// If you click anything other than All, All must be unchecked
125// unless you've just unchecked the last of the other checked items.
126function uA (formElement) {
127	var firstElement = 0;
128	var gotAnother = false;
129	var allChecked = true;
130	for (var i = formElementIndex[formElement.name]; i < formElement.form.elements.length; i++) {
131		if (formElement.form.elements[i].name == formElement.name) {
132			if (firstElement) {
133				gotAnother = (gotAnother || formElement.form.elements[i].checked);
134				allChecked = (allChecked && formElement.form.elements[i].checked);
135			} else {
136				firstElement = i;
137				formElement.form.elements[i].checked = false
138				$(formElement.form.elements[i]).closest("div.checkWrapper").removeClass("active");
139			}
140		} else if (firstElement) {
141			break;  // terminate the loop when we go on to another form element.
142		}
143	}
144	if (!gotAnother || allChecked) {
145		formElement.form.elements[firstElement].checked = true;
146		$(formElement.form.elements[firstElement]).closest("div.checkWrapper").addClass("active");
147		if (allChecked) {
148			resetCheckboxes(formElement.form, formElement.name, false, false);
149			if (!valStrings.rwd2015) {
150				elementID = formElement.id.split("_")[0];
151				textElement  = elementID.substr(1,1).toLowerCase() + elementID.substr(2);
152				if (typeof selectedOptions != 'undefined') {
153					selectedOptions [elementID] = new Array (copyItems["field_all"]);
154				}
155			}
156		}
157	}
158	formChanged();
159}
160
161
162// Reset a given set of checkboxes
163// default action is to clear - if reset is true will reset to ideal match preferences
164function resetCheckboxes (formObject, formElementName, reset, clear) {
165	var gotFirstElement = false;
166	for (var i = formElementIndex[formElementName]; i < formObject.elements.length; i++) {
167		if (formObject.elements[i].name == formElementName) {
168			if (gotFirstElement) {
169				if (reset && formObject.elements[i].defaultChecked) {
170					formObject.elements[i].checked = true;
171					$(formObject.elements[i]).closest("div.checkWrapper").addClass("active");
172				} else {
173					formObject.elements[i].checked = false;
174					$(formObject.elements[i]).closest("div.checkWrapper").removeClass("active");
175				}
176			} else {
177				if ((!reset && !clear) || (reset && formObject.elements[i].defaultChecked)) {
178					formObject.elements[i].checked = true;
179					$(formObject.elements[i]).closest("div.checkWrapper").addClass("active");
180				} else {
181					formObject.elements[i].checked = false;
182					$(formObject.elements[i]).closest("div.checkWrapper").removeClass("active");
183				}
184				gotFirstElement = true;
185			}
186		} else if (gotFirstElement) {
187			break;  // terminate the loop when we go on to another form element.
188		}
189	}
190}
191
192
193// If you click All, we have to clear all the others,
194// but ensure that later stays checked and reset the weighting.
195// Originally checkAll - called often, so HTML is optimised by shortening
196function cA (formElement) {
197	resetCheckboxes (formElement.form, formElement.name, false, false);
198	formChanged();
199}
200
201
202// Decide whether to submit the page when mCountryID changes in a search form
203var oldCount = 0;
204var singleCountry = "";
205function checkMCountryID (formElement, updateSelect) {
206	if (!checkNumberCountries(formElement)) {
207		return false;
208	}
209	
210	continent = (formElement.options[last].value == "00" || (formElement.options[last].value.substr(0,1) == "x" && formElement.options[last].value != "xx"));
211	if (count > 1 && singleCountry) {
212		singleCountry = "";
213		refreshGeography(formElement);
214	} else if (count == 1 && !continent) {
215		singleCountry = formElement.options[last].value;
216		refreshGeography(formElement);
217	} else if (count == 1 && singleCountry && continent) {
218		singleCountry = "";
219		refreshGeography(formElement);
220	}
221	if (updateSelect == true) {
222		updateSelection('mCountryID', 'locationSelected');
223	}
224	formChanged();
225	return true;
226}
227
228// prevent misbehaving browsers from transmitting their submit button name & value pairs (IE is guilty of doing this)
229// spec says: "only an activated submit button is successful"
230function noSubmitIE (formElement, button) {
231	if (formElement.form.elements[button]) {
232		// If we have more than one button with the same name, we need to loop
233		// for each otherwise the form will still do things we don't want it to.
234		if (typeof formElement.form.elements[button].length != 'undefined') {
235			var buttonElements = formElement.form.elements[button];
236			for (i=0; i<buttonElements.length; i++) {
237				buttonElements[i].disabled = true;
238			}
239		} else {
240			formElement.form.elements[button].disabled = true;
241		}
242	}
243}
244
245// Submit the form to refresh details
246function refreshGeography (formElement, noAnchor) {
247	if (!noAnchor) {
248		formElement.form.action += "#geographicLocation";
249		changedElement = document.getElementById('changed');
250		if (changedElement != null) {
251			changedElement.value = '1';
252		}
253	}
254
255	// prevent IE amd other misbehaving browsers from submitting <button> objects
256	noSubmitIE (formElement, 'quickSearch');
257	noSubmitIE (formElement, 'advancedSearch');
258	noSubmitIE (formElement, 'resetSearch');
259	noSubmitIE (formElement, 'clearSearch');
260	// Apply the same for saved search buttons
261	noSubmitIE (formElement, 'confirmDelete');
262	noSubmitIE (formElement, 'confirmReplace');
263	noSubmitIE (formElement, 'saveSearch');
264	noSubmitIE (formElement, 'performSearch');
265	noSubmitIE (formElement, 'editSearch');
266	noSubmitIE (formElement, 'deleteSearch');
267	
268	if (typeof jQuery != 'undefined') {
269
270		var notifyElement = $('#notification');
271		// update text to Refreshing geographic options
272		notifyElement.children().first().text(copyItems['find_search_refreshActivity']);
273		notifyElement.show();
274	} else {
275		// fallback
276		document.getElementById('notification').style.display = '';
277	}
278	formElement.form.submit();
279}
280
281function updateGeographyText () {
282	updateSelection ('mCountryID', 'locationSelected');
283	updateSelection ('mNationality', 'countrySelected');
284	updateSelection ('mProvinceID', 'provinceSelected');
285	updateSelection ('mCityID', 'citySelected');
286	updatePostCodeText ();
287}
288
289// Reset Advanced Search Fields
290function resetClearForm (formObject, gotProvinces, idealMatch) {
291	// Handle multiple checkboxes
292	selectedOptions = new Object();
293	var checkBoxes = new Array;
294	checkBoxes = ["mStarSign[]", "mHeight[]", "mBodyType[]", "mLooks[]", "mHair[]", "mEyes[]", "mEthnicity[]", "mHomeLanguage[]", "mLanguages[]", "mReligion[]", "mEducation[]", "mOccupation[]", "mIncome[]", "mDrinking[]", "mSmoking[]", "mEating[]", "mRelationship[]", "mRelationships[]", "mHaveKids[]", "mWantKids[]"]
295	for (var i = 0; i < checkBoxes.length; i++) {
296		resetCheckboxes (formObject, checkBoxes[i], idealMatch, false);
297		if (typeof selectedOptions != "undefined") {
298			var checkBoxID = checkBoxes[i].substr(0, checkBoxes[i].length-2);
299			if (idealMatch) {
300				if (typeof defaultOptions != "undefined") {
301					selectedOptions[checkBoxID] = new Array;
302					var defOptions = defaultOptions[checkBoxID];
303					if (typeof defOptions != 'undefined') {
304						for (var q = 0; q < defOptions.length; q++) {
305							selectedOptions[checkBoxID][q] = defOptions[q];
306						}
307					}
308				}
309			} else {
310				selectedOptions[checkBoxID] = new Array (copyItems["field_all"]);
311			}
312		}
313	}
314
315	// Handle single checkboxes
316	if (idealMatch) {
317		if (document.getElementById('mHasPhoto') != null) {
318			document.getElementById('mHasPhoto').checked = document.getElementById('mHasPhoto').defaultChecked;
319		}
320	} else {
321		if (document.getElementById('mHasPhoto') != null) {
322			document.getElementById('mHasPhoto').checked = false;
323		}
324	}
325
326	// Handle selects
327	var selects = new Array;
328	selects = ["mAgeMin", "mAgeMax", "mNationality", "mCountryID", "mProvinceID", "mCityID", "mRangeID", "mPostCodeID", "mHeightMin", "mHeightMax"];
329	for (var i = 0; i < selects.length; i++) {
330		if (document.getElementById(selects[i]) != null) {
331			var selectElement = document.getElementById(selects[i]);
332			if (typeof selectElement.options != 'undefined' && selectElement.options != null)  {
333				var selectOption = selectElement.options[0];
334				if (idealMatch && typeof selectOption != 'undefined' && selectOption != null) {
335					selectOption.selected = false;
336				} else {
337					selectOption.selected = true;
338				}
339			}
340		}
341		resetSelect (selects[i], idealMatch);
342	}
343	if (!idealMatch) {
344		if (document.getElementById('mAgeMax') != null) {
345			document.getElementById('mAgeMax').options[document.getElementById('mAgeMax').options.length-1].selected = true;
346		}
347		if (document.getElementById('mHeightMax') != null) {
348			document.getElementById('mHeightMax').options[document.getElementById('mHeightMax').options.length-1].selected = true;
349		}
350		if (document.getElementById('mHasPhoto') != null) {
351			document.getElementById('mHasPhoto').options[0].selected = true;
352		}
353	}
354
355	// Handle age and height sliders
356	var ageRangeSlider = $(".ageRange").children(".rangeslider").get(0);
357	if ($(ageRangeSlider).length) {
358		ageRangeSlider.noUiSlider.set([18, 100]);
359		var ageRangeLabel = $(".ageRange").children(".dynamicLabel").get(0);
360		var minAge = $('#mAgeMin option:first-child').html();
361		var maxAge = $('#mAgeMax option:last-child').html();
362		$(ageRangeLabel).html(minAge + " - " + maxAge);
363	}
364	
365	var heightRangeSlider = $(".heightRange").children(".rangeslider").get(0);
366	if ($(heightRangeSlider).length) {
367		heightRangeSlider.noUiSlider.set([140, 210]);
368		var heightRangeLabel = $(".heightRange").children(".dynamicLabel").get(0);
369		var minHeight = $('#mHeightMin option:first-child').html();
370		var maxHeight = $('#mHeightMax option:last-child').html();
371		$(heightRangeLabel).html(minHeight + " - " + maxHeight);
372	}
373
374	// Handle resetting of provinces
375	if (gotProvinces) {
376		var elementID = formElementIndex["mProvinceID[]"];
377		if (idealMatch) {
378			formObject.elements[elementID].options[0].selected = false;
379		}
380		for (var i = 1; i < formObject.elements[elementID].options.length; i++) {
381			if (idealMatch) {
382				if (arrayIndex(formObject.elements[elementID].options[i].value, selectedItems['province']) >= 0) {
383					formObject.elements[elementID].options[i].selected = true;
384				}
385			} else {
386				formObject.elements[elementID].options[i].selected = false;
387			}
388		}
389		// Handle resetting of cities
390		if (idealMatch) {
391			changeProvince(document.getElementById('mProvinceID'), true);
392			var elementID = formElementIndex["mCityID[]"];
393			formObject.elements[elementID].options[0].selected = false;
394			for (var i = 1; i < formObject.elements[elementID].options.length; i++) {
395				if (arrayIndex(formObject.elements[elementID].options[i].value, selectedItems['city']) >= 0) {
396					formObject.elements[elementID].options[i].selected = true;
397				}
398			}
399		} else {
400			formObject.elements[elementID].options[0].selected = true;
401			// maybe move outside of condition
402			relate(formObject.elements[elementID], m, 1);
403		}
404	} else {
405		var elementID = formElementIndex["mCityID[]"];
406		if (elementID) {
407			for (var i = 1; i < formObject.elements[elementID].options.length; i++) {
408				formObject.elements[elementID].options[i].selected = false;
409			}
410			formObject.elements[elementID].options[0].selected = true;
411		}
412	}
413
414	updateGeographyText ();
415	updateHeightText ();
416
417	// Reset the collapsable text
418	if (typeof selectedOptions != "undefined") {
419		for (testKey in selectedOptions) {
420			textElement  = testKey.substr(1,1).toLowerCase() + testKey.substr(2);
421			if (idealMatch) {
422				if (typeof (selectedOptions[testKey]) == 'object') {
423					updateText(textElement, selectedOptions[testKey].join("; "));
424				}
425			} else {
426				updateText(textElement, copyItems["field_all"]);
427			}
428		}
429	}
430	collapseAll();
431	return false; // Prevent submission
432}
433
434function selectDefault (item) {
435	var textElementID  = item + 'Selected';
436	if ($('#' + textElementID).length != 0) {
437		if ($('#' + textElementID).html() == '') {
438			selectElementID = 'm' + item.substr(0,1).toUpperCase() + item.substr(1) + 'ID';
439			$('#' + selectElementID).find('option:first').prop('selected', true);
440			updateSelection (selectElementID, textElementID);
441		}
442	}
443}
444
445function resetForm (formObject, gotProvinces) {
446	resetClearForm (formObject, gotProvinces, true);
447	show ('provinces');
448	show ('cities');
449	selectDefault ('province');
450	selectDefault ('city');
451	return false;
452}
453
454function clearForm (formObject, gotProvinces) {
455	resetClearForm (formObject, gotProvinces, false);
456	updateSavedStatus (false);
457	hide ('savedSearchModified');
458	hide ('provinces');
459	hide ('cities');
460	return false;
461}
462
463function show (id) {
464	if (typeof jQuery != 'undefined') {
465		if ($('#' + id).length != 0) {
466			$('#' + id).show();
467		}
468	} else {
469		var element = document.getElementById (id);
470		if (element != null) {
471			element.style.display = '';
472		}
473	}
474}
475
476function hide (id) {
477	if (typeof jQuery != 'undefined') {
478		if ($('#' + id).length != 0) {
479			$('#' + id).hide();
480		}
481	} else {
482		var element = document.getElementById (id);
483		if (element != null) {
484			element.style.display = 'none';
485		}
486	}
487}
488
489// Update the display text for each characteristic type
490function updateText (elementID, displayText, noSelected) {
491	var textElementID = elementID;
492	if (typeof noSelected == 'undefined') {
493		textElementID = textElementID + 'Selected';
494	}
495	textElement = $('#' + textElementID);
496	if (textElement.length != 0) {
497		textElement.text(displayText);
498		show(textElementID);
499	}
500}
501
502// Get the arrayIndex for a value within an array
503function arrayIndex (needle, haystack){
504	for (var i=0; i < haystack.length; i++) {
505		if (needle == haystack[i]){
506			return i;
507		}
508	}
509	return -1;
510}
511
512function updateCheckboxText (elementID, options) {
513	selectedText = options.join("; ");
514	divName  = elementID.substr(1,1).toLowerCase() + elementID.substr(2);
515	updateText(divName, selectedText);
516}
517
518function traverse (element) {
519	var any = copyItems["field_all"];
520	var elementInfo = element.id.split("_");
521
522	if (typeof(selectedOptions) != 'undefined') {
523		var myOptions = selectedOptions[elementInfo[0]];
524		if (typeof(myOptions) != 'undefined')	{
525			checkbox = $(element);
526			newText = checkbox.next().html();
527			position = checkbox.val();
528
529			if (checkbox.is(":checked")) {
530				// Add the text into selectedArray
531				// elementInfo[1] should always be the same as checkbox.value
532				if ((position == 0) && (newText == any)) {
533					myOptions = new Array (any);
534				} else if (arrayIndex(any, myOptions) >= 0) {
535					myOptions = new Array (newText);
536				} else {
537					myOptions.splice(position,0,newText);
538				}
539			} else {
540				// Remove the text from selectedArray
541				if (position != 0) {
542					index = arrayIndex(newText, myOptions);
543					myOptions.splice(index,1);
544				}
545			}
546
547			if (myOptions.length == 0) {	
548				myOptions = new Array (any);
549			}
550
551			myOptions.sort;
552			selectedOptions[elementInfo[0]] = myOptions;
553			updateCheckboxText (elementInfo[0], myOptions);
554		}
555	}
556}
557
558function showCollapsed (elementID, visible) {
559	collapsedID = elementID + 'Less';
560	collapsed = $('#' + collapsedID);
561	if (collapsed.length != 0) {
562		if (visible) {
563			show(collapsedID);
564		} else {
565			hide(collapsedID);
566		}
567	}
568	controlID = elementID + 'Control';
569	control = $('#' + controlID);
570	if (control.length != 0) {
571		show(controlID);
572	}
573}
574
575// Collapse the item, show the Show button, hide the Hide button
576function collapse (elementIDs) {
577	if (typeof selectedOptions != 'undefined') {
578		for (var i=0; i<arguments.length; i++) {
579			var elementID = arguments[i];
580			divID = elementID + 'Options';
581			check = $('#' + divID);
582			if (check.length != 0) {
583				hide(divID);
584			}
585			hide(elementID + 'More');
586			show(elementID + 'Less');
587			showCollapsed(elementID, true);
588		}
589	}
590	if (arguments.length>1 && arguments[0] == 'province') {
591		hide ('preferPostCodes');
592	} else if (arguments.length>1 && arguments[0] == 'postCode') {
593		hide ('preferRegions');
594	}
595	return false;
596}
597
598// Expand the item, show the Hide button, hide the Show button
599function expand (elementIDs) {
600	if (typeof selectedOptions != 'undefined') {
601		for (var i=0; i<arguments.length; i++) {
602			var elementID = arguments[i];
603			divID = elementID + 'Options';
604			check = $('#' + divID);
605			if (check.length != 0) {
606				show(divID);
607			}
608			hide(elementID + 'Less');
609			show(elementID + 'More');
610			showCollapsed(elementID, false);
611		}
612	}
613	if (arguments.length>1 && arguments[0] == 'province') {
614		show ('preferPostCodes');
615	} else if (arguments.length>1 && arguments[0] == 'postCode') {
616		expand ('preferRegions');
617	}
618	return false;
619}
620
621function expandCollapse (elementID) {
622	var divID = elementID + 'Options';
623	var check = $('#' + divID);
624	if (check.length != 0) {
625		var displ = check.css('display');
626		if (displ == 'none') {
627			expand(elementID);
628		} else {
629			collapse(elementID);
630		}
631	}
632	// return false;
633}
634
635function expandCollapseGeography () {
636	var check = $('#provinceOptions');
637	if (check.length != 0) {
638		var displ = check.css('display');
639		if (displ == 'none') {
640			expand('province', 'city');
641			show('preferPostCodes');
642		} else {
643			collapse('province', 'city');
644			hide('preferPostCodes');
645		}
646	}
647	// return false;
648}
649
650function collapseItems () {
651	var collapseArray = new Array;
652
653	// Geographic
654	collapseArray.push ('country');
655	collapseArray.push ('location');
656	collapseArray.push ('city');
657	collapseArray.push ('province');
658	collapseArray.push ('postCode');
659
660	// Appearance
661	collapseArray.push ('height');
662	collapseArray.push ('bodyType');
663	collapseArray.push ('looks');
664	collapseArray.push ('hair');
665	collapseArray.push ('eyes');
666	collapseArray.push ('starSign');
667
668	// Cultural Characteristics
669	collapseArray.push ('ethnicity');
670	collapseArray.push ('homeLanguage');
671	collapseArray.push ('languages');
672	collapseArray.push ('religion');
673
674	// Education and Occupation
675	collapseArray.push ('education');
676	collapseArray.push ('occupation');
677	collapseArray.push ('income');
678
679	// Lifestyle
680	collapseArray.push ('drinking');
681	collapseArray.push ('smoking');
682	collapseArray.push ('eating');
683
684	// Relationships
685	collapseArray.push ('relationship');
686	collapseArray.push ('relationships');
687	collapseArray.push ('haveKids');
688	collapseArray.push ('wantKids');
689
690	return collapseArray;
691}
692
693function expandCollapseAll (action) {
694	var collapseArray = collapseItems ();
695
696	for (var i = 0; i < collapseArray.length; i++) {
697		if (action == 'expand') {
698			expand ( collapseArray[i] );
699		} else if (action == 'collapse') {
700			collapse ( collapseArray[i] );
701		}
702	}
703}
704
705function expandAll () {
706	expandCollapseAll ('expand');
707	show ('preferPostCodes');
708	show ('preferRegions');
709	return false;
710}
711
712function collapseAll () {
713	expandCollapseAll ('collapse');
714	hide ('preferPostCodes');
715	hide ('preferRegions');
716	return false;
717}
718
719function selectFirstOption (selectElement, matchItem) {
720	if (selectElement != null && selectElement != 'null') {
721		if (typeof selectElement.options[0] != "undefined") {
722			selectElement.options[0].selected = true;
723		}
724		if (selectElement.selectedIndex == 0) {
725			var text = '';
726			if (matchItems[matchItem]) {
727				text = matchItems[matchItem].join("; ");
728				updateText(matchItem, text);
729			} else {
730				text = selectElement.options[0].innerHTML;
731				text = text.replace (/&gt;/g, '');
732				text = text.replace (/&lt;/g, '');
733				updateText(matchItem, text);
734			}
735		} else {
736			var textElementID = matchItem + 'Selected';
737			updateSelection(selectElementID, textElementID);
738		}
739	}
740}
741
742function updateTextFromMatchItems (matchItem) {
743	if ($('#locationSelected').length != 0 && typeof matchItems != "undefined") {
744		var selectElementID = 'm' + matchItem.substr(0,1).toUpperCase() + matchItem.substr(1) + 'ID';
745		var selectElement = $('#' + selectElementID);
746		if ($('#locationSelected').text() == matchItems['location']) {
747			if (typeof matchItems[matchItem] != "undefined") {
748				var text = matchItems[matchItem].join ("; ");
749				if (matchItems[matchItem] == '') {
750					if (selectElement.length != 0) {
751						text = selectElement.find('option:first').html();
752						text = text.replace (/&gt;/g, '');
753						text = text.replace (/&lt;/g, '');
754					}
755				}
756				updateText(matchItem, text);
757			} else {
758				selectFirstOption (selectElement[0], matchItem);
759			}
760		} else {
761			selectFirstOption (selectElement[0], matchItem);
762		}
763	}
764}
765
766// Show the expand all and collapse all buttons
767function showAll () {
768	show ('toggleView');
769	show ('resetSearchTop');
770	show ('resetSearchBottom');
771	show ('countrySelected');
772	show ('locationSelected');
773	show ('provinceSelected');
774	show ('citySelected');
775	show ('postCodeSelected');
776	show ('heightSelected');
777	updateSelection ('mCountryID', 'locationSelected');
778	updateSelection ('mNationality', 'countrySelected');
779	updateTextFromMatchItems ('province');
780	updateTextFromMatchItems ('city');
781}
782
783function updateSelection (elementID, formElementID) {
784	var element = document.getElementById(elementID);
785	var formElement = document.getElementById(formElementID);
786	if (element != null) {
787		var array = new Array;
788		var selectedCount = $("#" + elementID + " :selected").length;
789		for (var i = 0; i < element.options.length; i++) {
790			if (element.options[i].selected) {
791				var excludeRegex = /(&gt|>)/;
792				if (i == 0 || ((element.options.length > 1 && (!element.options[i].innerHTML.match (excludeRegex))) || (element.options.length == 1))) {
793					if (elementID == "mProvinceID") {
794						if ((i != 0) && element.options[0].selected) {
795							// More specific areas take precedence
796							element.options[0].selected = false;
797						}
798						// Cater for the UK: If the element selected does not start with "r",
799						// unselect everything following starting with "r", till the next country(non-r).
800						if ((i != 0) && element.options[i].value.substr(0,1) != "r") {
801							// Unselect all options within the sub-region
802							$(element.options[i]).nextUntil(":not(option[value^='r'])").attr("selected", false);
803						}
804					} else if (elementID == "mCityID") {
805						if ((typeof isAndroidOS !== "undefined" && isAndroidOS) || (typeof isSafariOS !== "undefined" && isSafariOS)) {
806							// Due to the native behaviour of multiple select elements on mobile browsers, requiring manual deselection of unwanted items, we treat it the same as provinces above, giving more specific areas precendence over the global area.
807							if (selectedCount > 1) {
808								if ((i != 0) && element.options[0].selected) {
809									// More specific areas take precedence
810									element.options[0].selected = false;
811								}
812								if (element.options[i].value.substr(0,1) == "r") {
813									// Unselect all options within the sub-region
814									$(element.options[i]).nextUntil("option[value^='r']").attr("selected", false);
815								}
816							}
817						} else {
818							// Desktop
819							if (i == 0) {
820								// For cities, the global area takes precedence over sub-areas, so unselect everything but 0.
821								$("#" + elementID + " option").not(':first').attr("selected", false);
822							} else {
823								if (element.options[i].value.substr(0,1) == "r") {
824									// Unselect all options within the sub-region
825									$(element.options[i]).nextUntil("option[value^='r']").attr("selected", false);
826								}
827							}
828						}
829					}
830				}
831				if (element.options[i].selected) {
832					// If still selected, populate the display string
833					var selectedText = element.options[i].innerHTML;
834					selectedText = selectedText.replace (/(&gt;|>)/g, '');
835					selectedText = selectedText.replace (/(&lt;|<)/g, '');
836					array.push (selectedText);
837				}
838			}
839		}
840	}
841  	if (formElement != null) {
842		formElement.innerHTML = array.join("; ");
843	}
844}
845
846// Update the city collapsable when a different city is selected
847function changeCity (formElement, updateSelect) {
848	if (updateSelect == true) {
849		updateSelection ('mCityID', 'citySelected');
850	}
851	formChanged();
852	return true;
853}
854
855// Update the coutry collapsable when a different country is selected
856function changeCountry (formElement, updateSelect) {
857	
858	if(!checkNumberCountries (formElement)) {
859		return false;
860	}
861	
862	if (updateSelect == true) {
863		updateSelection ('mNationality', 'countrySelected');
864	}
865	formChanged();
866	return true;
867}
868
869function resetSelect (elementID, idealMatch) {
870	var element;
871	if (typeof jQuery == 'undefined') {
872		element = document.getElementById(elementID);
873	} else {
874		element = $('#' + elementID)[0];
875	}
876	if (element != null || element != undefined) {
877		var defaultID = 0;
878		if (typeof element.options != 'undefined' && element.options != null) {
879			for (var i = 1; i < element.options.length; i++) {
880				if (idealMatch) {
881					element.options[i].selected = element.options[i].defaultSelected;
882				} else {
883					element.options[i].selected = false;
884				}
885			}
886		}
887		if (idealMatch && element.selectedIndex < 0) {
888			element.selectedIndex = 0;
889		}
890	}
891}
892
893function buildRequestString (formElement) {
894	var reqStr = "";
895
896	for(i=0; i < formElement.elements.length; i++) {
897		isformObject = false;
898
899		switch (formElement.elements[i].tagName) {
900			case "INPUT":
901
902				switch (formElement.elements[i].type) {
903					case "text":
904					case "hidden":
905						reqStr += formElement.elements[i].name + "=" + encodeURIComponent(formElement.elements[i].value);
906						isformObject = true;
907						break;
908
909					case "checkbox":
910						if (formElement.elements[i].checked) {
911							reqStr += formElement.elements[i].name + "=" + formElement.elements[i].value;
912						} else {
913							reqStr += formElement.elements[i].name + "=";
914						}
915						isformObject = true;
916						break;
917
918					case "radio":
919						if (formElement.elements[i].checked) {
920							reqStr += formElement.elements[i].name + "=" + formElement.elements[i].value;
921							isformObject = true;
922						}
923					}
924					break;
925
926			case "TEXTAREA":
927				reqStr += formElement.elements[i].name + "=" + encodeURIComponent(formElement.elements[i].value);
928				isformObject = true;
929				break;
930
931			case "SELECT":
932				var sel = formElement.elements[i];
933				if (sel.selectedIndex >= 0) {
934					if (sel.name.substr(-2,2) == '[]') {
935						// Handle multiple selects
936						var multiVal = new Array;
937						for (j=0; j<sel.options.length; j++) {
938							if (sel.options[j].selected) {
939								multiVal.push (sel.name + "=" + sel.options[j].value);
940							}
941						}
942						reqStr += multiVal.join ('&');
943					} else {
944						// Handle single selects
945						if (sel.options[sel.selectedIndex].value) {
946							reqStr += sel.name + "=" + sel.options[sel.selectedIndex].value;
947						} else {
948							reqStr += sel.name + "=" + sel.options[sel.selectedIndex].innerHTML;
949						}
950					}
951				}
952				isformObject = true;
953				break;
954		}
955
956		if ((isformObject) && ((i+1)!= formElement.elements.length)) {
957			reqStr += "&";
958		}
959	}
960	return reqStr;
961}
962
963// --- Saved Search Functions start here --- //
964
965function enableButton (buttonID, deleteSearchButton) {
966	if (document.getElementById(buttonID) != null) {
967		if (typeof deleteSearchButton != 'undefined') {
968			document.getElementById(buttonID).style.display = 'block';
969		} else {
970			document.getElementById(buttonID).disabled = false;
971		}
972	}
973}
974
975function disableButton (buttonID, deleteSearchButton) {
976	if (document.getElementById(buttonID) != null) {
977		if (typeof deleteSearchButton != 'undefined') {
978			document.getElementById(buttonID).style.display = 'none';
979		} else {
980			document.getElementById(buttonID).disabled = true;
981		}
982	}
983}
984
985// Not needed at present but could be useful at some point on an 'onkeyup' event
986function checkSaveName () {
987	var saveSearchName = $('#saveSearchName').val();
988	if (saveSearchName.length > 0) {
989		enableButton ('saveSearchButton');
990	} else {
991		disableButton ('saveSearchButton');
992	}
993}
994
995function updateSavedStatus (value) {
996	if (value) {
997		value = 1;
998	} else {
999		value = 0;
1000	}
1001	var notSavedElement = document.getElementById('notSaved');
1002	if (notSavedElement != null) {
1003		notSavedElement.value = value;
1004	}
1005}
1006
1007function formChanged () {
1008	enableButton ('saveSearchButton');
1009	if (typeof loadedSearch != 'undefined') {
1010		show ('saveSearchModified');
1011	}
1012	updateSavedStatus (true);
1013	return true;
1014}
1015
1016function enableButtons (element) {
1017	hide ('saveSearchModified');
1018	if (typeof element == 'undefined' || element.selectedIndex > 0) {
1019		enableButton ('deleteSearchButton', true);
1020	} else {
1021		disableButton ('deleteSearchButton', true);
1022	}
1023	enableButton ('editSearchButton');
1024	enableButton ('performSearchButton');
1025	return false;
1026}
1027
1028function disableButtons () {
1029	hide ('saveSearchModified');
1030	disableButton ('editSearchButton');
1031	disableButton ('deleteSearchButton', true);
1032	return false;
1033}
1034
1035function checkSelectedSearch (selectElement) {
1036	var nameElement = document.getElementById('searchName');
1037	enableButtons (selectElement);
1038	if (nameElement != null && selectElement != null) {
1039		if (selectElement.options[selectElement.selectedIndex].innerHTML == nameElement.value) {
1040			disableButton ('performSearchButton');
1041		} else {
1042			enableButton ('performSearchButton');
1043		}
1044	}
1045}
1046
1047function clearDiv (divID) {
1048	if (typeof jQuery !=  'undefined') {
1049		theDiv = $('#' + divID);
1050		if (theDiv.length != 0) {
1051			theDiv.hide();
1052			alertMsg = theDiv.find('p');
1053			if (alertMsg.length != 0) {
1054				alertMsg.text('');
1055			}
1056		}
1057	}
1058}
1059
1060function clearDivs () {
1061	clearDiv ('savedSearchSuccess');
1062	clearDiv ('savedSearchInfo');
1063	clearDiv ('savedSearchErr');
1064}
1065
1066function saveForm (formID, replace) {
1067	var result = false;
1068	clearDivs();
1069	if (!$('#saveSearchButton').prop('disabled')) {
1070		var element = $('#saveSearchName');
1071		var saveSearchName = element.val();
1072		if (saveSearchName.length == 0) {
1073			errorMsg (copyItems['find_headError'] + ': ' + copyItems['err_noNameEntered']);
1074			element.className = 'savedSearchErr';
1075			element.focus ();
1076		} else { 
1077			hide ('saveSearchModified');
1078			var formValues = buildRequestString(document.getElementById(formID));
1079			var valueArray = formValues.split("&");
1080			var newArray   = new Array;
1081			var elements = 0;
1082			// Exclude the items below from the Ajax request (NB! also ensure they are excluded in the non JS version)
1083			var exceptionRegex = /^(sub|searchType|saveSearchOption)$/;
1084			for (var i=0; i < valueArray.length; i++) {
1085				formValue = valueArray[i].split("=");
1086				if ((formValue[0] && formValue[1]) && !formValue[0].match(exceptionRegex)) {
1087					newArray[elements] = formValue[0] + "=" + formValue[1];
1088					elements++;
1089				}
1090			}
1091			var url = baseurl + '/s/find/search.php?action=save&f=' + fValue + '&' + newArray.join("&");
1092			if (replace) {
1093				url += '&c=1';
1094			}
1095			result = ajaxRequest(url);
1096			element.className = 'savedSearch';
1097			disableButton ('saveSearchButton');
1098		}
1099	}
1100	return false;
1101}
1102
1103function getSearchListOptions (searchID) {
1104	if (typeof searchID == 'undefined') {
1105		searchID = '00';
1106	}
1107	var url = baseurl + '/s/find/search.php?action=refresh&f=' + fValue + '&s=' + searchID;
1108	var ajaxSettings = {method:'get'};
1109	result = ajaxRequest(url, null, ajaxSettings);
1110	return result;
1111}
1112
1113function refreshSearchList (json) {
1114	var selectElement = $('#saveSearchOption');
1115	if (selectElement.length != 0) {
1116		var selected = selectElement.prop('selectedIndex');
1117		selectElement[0].length = 0; // clear list
1118		for (i=1; i<=10; i++) {
1119			var sVar = eval ('json.s' + i);
1120			var vVar = eval ('json.v' + i);
1121			if (typeof sVar != 'undefined' && typeof vVar != 'undefined') {
1122				var optn = document.createElement ("OPTION");
1123				optn.text = vVar;
1124				optn.value = sVar;
1125				selectElement.append (optn);
1126			}
1127		}
1128		selectElement.prop('selectedIndex', selected);
1129	}
1130}
1131
1132// Determine whether something has been selected in the saved search dropdown
1133function getSearchID () {
1134	var selectElement = $('#saveSearchOption');
1135	var result = 0;
1136	if (selectElement.length != 0) {
1137		var selected = selectElement.prop('selectedIndex');
1138		if (selected >= 0) {
1139			result = selectElement.find(':selected').val();
1140		}
1141	}
1142	return result; // ideal match is 0
1143}
1144
1145function loadSearch (searchID) {
1146	var url = baseurl + '/s/find/search.php?action=load&f=' + fValue + '&s=' + searchID;
1147	var ajaxSettings = {method:'get'};
1148	result = ajaxRequest(url, null, ajaxSettings);
1149}
1150
1151function getSavedSearch (formID) {
1152	clearDivs();
1153	var searchID = getSearchID ();
1154	var gotProvinces = false;
1155	var formObject = $('#' + formID);
1156	if ($('#mProvinceID').length != 0) {
1157		gotProvinces = true;
1158	}
1159	loadSearch (searchID);
1160	return formObject[0];
1161}
1162
1163function displayMsg (textDivID, msg, alertBanner) {
1164	var textDiv = $('#' + textDivID);
1165	var textDivAlertMsg = textDiv.find('p');
1166	if (textDivAlertMsg.length != 0) {
1167		textDivAlertMsg.html(msg);
1168		if (typeof alertBanner != 'undefined') {
1169			textDiv.removeClass().addClass('alert ' + alertBanner);
1170			toggleSVG = "<svg><use xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"#icon_alert_"+ alertBanner +"\"></use></svg>";
1171			textDiv.find("span.icon").html(toggleSVG);
1172		}
1173		textDiv.show();
1174	}
1175}
1176
1177function successMsg (msg) {
1178	displayMsg ('savedSearchSuccess', msg);
1179}
1180
1181function statusMsg (msg) {
1182	displayMsg ('savedSearchInfo', msg);
1183}
1184
1185function errorMsg (msg) {
1186	displayMsg ('savedSearchErr', msg);
1187}
1188
1189function editSavedSearch (formID) {
1190	getSavedSearch (formID);
1191	return false;
1192}
1193
1194function deleteSavedSearch (formID) {
1195	clearDivs();
1196	var searchID = getSearchID ();
1197	var answer = confirm (copyItems['confirm_savedSearchDelete']);
1198	if (answer) {
1199		var url = baseurl + '/s/find/search.php?action=delete&f=' + fValue + '&s=' + searchID;
1200		result = ajaxRequest (url);
1201	} else {
1202		enableButton ('deleteSearchButton', true);
1203	}
1204	$('#saveSearchName').val('');
1205	return false;
1206}
1207
1208function updateSelectElement (element, value) {
1209	for (var i = 0; i < element.options.length; i++) {
1210		var optVal = element.options[i].innerHTML;
1211		if (typeof element.options[i].value != 'undefined' && element.options[i].value != '') {
1212			optVal = element.options[i].value;
1213		}
1214		if (optVal == value) {
1215			element.options[i].selected = true;
1216		}
1217	}
1218}
1219
1220function updateForm (json) {
1221	var formValues = new Object();
1222	var searchName = json.s1;
1223	var formFields = new Array;
1224	var spaceFields = new Array;
1225
1226	formFields = ['mNationality', 'mCountryID', 'mProvinceID', 'mCityID', 'mRangeID', 'mPostCodeID', 'gender', 'mGender', 'mAgeMin',
1227				  'mAgeMax', 'mHasPhoto', 'mRecency', 'mStarSign', 'mHeight', 'mHeightMin', 'mHeightMax', 'mBodyType',
1228				  'mLooks', 'mHair', 'mEyes', 'mHivpStatus', 'mAidsStatus', 'mEthnicity', 'mHomeLanguage', 'mLanguages', 'mReligion',
1229				  'mEducation', 'mOccupation', 'mIncome', 'mDrinking', 'mSmoking', 'mEating', 'mRelationship', 'mRelationships',
1230				  'mHaveKids', 'mWantKids'];
1231
1232	spaceFields = ['mNationality', 'mCountryID', 'mProvinceID', 'mCityID', 'mHomeLanguage', 'mLanguages']; 
1233
1234	if (json.s1 == null) {
1235		json.s1 = copyItems['find_search_idealMatch'];
1236	}
1237	$('#saveSearchName').val(json.s1);
1238
1239	// Nationality and Country need to be 00 not 0
1240	if (json.s2 == 0) {
1241		json.s2 = '00';
1242	}
1243	if (json.s3 == 0) {
1244		json.s3 = '00';
1245	}
1246
1247	for (i=0; i<formFields.length; i++) {
1248		var sVar= eval('json.s' + (i + 2));
1249		if (sVar != '' && sVar != null) {
1250			formValues[formFields[i]] = sVar;
1251		}
1252	}
1253
1254	var countriesSelected = new Array;
1255	var ageRangeVals = new Array;
1256	var heightRangeVals = new Array;
1257	var refreshLocation = 0;
1258	for (var formKey in formValues) {
1259		var formElement = $('#' + formKey);
1260		if (formElement.length != 0) {
1261	        switch (formElement.prop('tagName')) {
1262				case "SELECT":
1263					// Unselect all options
1264					formElement.children('option').each(function(index, element){
1265				        if (formKey == 'mCountryID' && element.selected == true) {
1266							countriesSelected.push (element.value);
1267						}
1268						element.selected = false;
1269				    });
1270					// Provinces and cities come through as an array
1271					if (typeof formValues[formKey] == "object") {
1272						var alphaVals = formValues[formKey];
1273						for (var j = 0; j < alphaVals.length; j++) {
1274							updateSelectElement (formElement[0], alphaVals[j]);
1275						}
1276						// preserve these values in hidden form variables
1277						if (formKey == 'mProvinceID') {
1278							refreshLocation = 2; // 2 = call the refreshGeography function and set the useRegionList hidden variable
1279							document.frmMM.provinceID.value = formValues[formKey];
1280						} else if (formKey == 'mCityID') {
1281							refreshLocation = 2;
1282							document.frmMM.cityID.value = formValues[formKey];
1283						}
1284						// Reload the cities dropdown if province is changed
1285						if (formElement.prop('name') == 'mProvinceID[]') {
1286							changeProvince (formElement[0], true);
1287						}
1288					// Split space separated values into an array and update the select
1289					} else if ((arrayIndex (formKey, spaceFields) >= 0) && formValues[formKey].match(/ /)) {
1290						var alphaVals = formValues[formKey].split(' ');
1291						for (var j = 0; j < alphaVals.length; j++) {
1292							updateSelectElement (formElement[0], alphaVals[j]);
1293						}
1294					} else {
1295						// cos we inside a loop we store the 'min' and 'max' values in an array, and reference that array further down
1296						// also set the dynamic label for both range sliders
1297						ageRangeSlider = formElement.closest("div.ageRange").children(".rangeslider").get(0);
1298						if ($(ageRangeSlider).length) {
1299							ageRangeVals.push (formValues[formKey]);
1300							var ageRangeLabel = $(".ageRange").children(".dynamicLabel").get(0);
1301							$(ageRangeLabel).html(formValues["mAgeMin"] + " - " + formValues["mAgeMax"]);
1302						}
1303						heightRangeSlider = formElement.closest("div.heightRange").children(".rangeslider").get(0);
1304						if ($(heightRangeSlider).length) {
1305							heightRangeVals.push (formValues[formKey]);
1306							var heightRangeLabel = $(".heightRange").children(".dynamicLabel").get(0);
1307							$(heightRangeLabel).html($('#mHeightMin option[value=' + formValues["mHeightMin"] + ']').text() + " - " + $('#mHeightMax option[value=' + formValues["mHeightMax"] + ']').text());
1308						}
1309						updateSelectElement (formElement[0], formValues[formKey]);
1310					}
1311					break;
1312				case "INPUT":
1313					switch (formElement.type) {
1314						case "checkbox":
1315							if (formValues[formKey] > 0) {
1316								formElement.checked = true;
1317							} else {
1318								formElement.checked = false;
1319							}
1320							break;
1321					}
1322					break;
1323			}
1324		} else {
1325			// these elements are not avaiable when switching between locations (eg. uk)
1326			// preserve these values in hidden form variables
1327			if (formKey == 'mProvinceID') {
1328				refreshLocation = 2; // 2 = call the refreshGeography function and set the useRegionList hidden variable
1329				document.frmMM.provinceID.value = formValues[formKey];
1330			} else if (formKey == 'mCityID') {
1331				refreshLocation = 2;
1332				document.frmMM.cityID.value = formValues[formKey];
1333			} else if (formKey == 'mRangeID' && formValues[formKey] > 0) {
1334				// specify location using a list of counties and towns instead of post code. 
1335				if (document.frmMM.useRegionList.value.length > 0) {
1336					refreshLocation = 1; // 1 = only call the refreshGeography function
1337				}
1338				document.frmMM.rangeID.value = formValues[formKey];
1339			} else if (formKey == 'mPostCodeID' && formValues[formKey] > 0) {
1340				// specify location using a list of counties and towns instead of post code. 
1341				if (document.frmMM.useRegionList.value.length > 0) {
1342					refreshLocation = 1;
1343				}
1344				document.frmMM.postCodeID.value = formValues[formKey];
1345			} else {
1346				// multiple checkboxes
1347				var numValue = formValues[formKey];
1348				var valArray = new Array;
1349				var selectedValues = new Array;
1350				var bit = 1;
1351				while (numValue) {
1352					if (numValue & 1) {
1353						valArray.push (bit);
1354					}
1355					numValue = numValue >> 1;
1356					bit++;
1357					if (bit == 33) { break; }
1358				}
1359				if (valArray.length == 0) {
1360					valArray.push (0);
1361				}
1362				var formObject = $('#form1');
1363				var formElementName = formKey + '[]';
1364				resetCheckboxes (formObject[0], formElementName, false, true);
1365				checkedOptions  = new Array;
1366				for (var i = 0; i < valArray.length; i++) {
1367					formElement = $('#' + formKey + '_' + valArray[i]);
1368					if (formElement.length != 0) {
1369						switch (formElement.prop('tagName')) {
1370							case "INPUT":
1371								switch (formElement.prop('type')) {
1372									case "checkbox":
1373										if (formValues[formKey] >= 0) {
1374											// set numeric checkboxes
1375											formElement.prop('checked', true);
1376											checkedOptions.push (formElement.next().html());
1377											updateCheckboxText (formKey, checkedOptions);
1378										} else {
1379											// set alpha checkboxes
1380											var alphaVals = formValues[formKey].split(' ');
1381											for (var k = 0; k < alphaVals.length; k++) {
1382												formElement = $('#' + formKey + '_' + alphaVals[k]);
1383												if (formElement.length != 0) {
1384													formElement.prop('checked', true);
1385													checkedOptions.push (formElement.next().html());
1386													updateCheckboxText (formKey, checkedOptions);
1387												}
1388											}
1389										}
1390										break;
1391								}
1392								break;
1393						}
1394					}
1395				}
1396			}
1397		}
1398	}
1399
1400	// set the range sliders values
1401	var ageRangeSlider = $(".ageRange").children(".rangeslider").get(0);
1402	if ($(ageRangeSlider).length) {
1403		ageRangeSlider.noUiSlider.set([parseInt(ageRangeVals[0]), parseInt(ageRangeVals[1])]);
1404	}
1405	var heightRangeSlider = $(".heightRange").children(".rangeslider").get(0);
1406	if ($(heightRangeSlider).length) {
1407		heightRangeSlider.noUiSlider.set([parseInt(heightRangeVals[0]), parseInt(heightRangeVals[1])]);
1408	}
1409
1410	updateHeightText ();
1411	updateGeographyText ();
1412	var countries = countriesSelected.join (' ');
1413	var useRegionList = "";
1414	$('#searchID').val($('#saveSearchOption').val());
1415	// only refresh the page when the countries do not match or when switching between counties/towns and range/postcode.
1416	// when switching between counties/towns and range/psotcode, will need to set the useRegionList variable
1417	if (countries != json.s3) {
1418		if (json.s3 == "uk" && refreshLocation > 1) {
1419			useRegionList = json.s3;
1420		}
1421		document.frmMM.useRegionList.value = useRegionList;
1422		if (typeof formElement != 'undefined') {
1423			refreshGeography (formElement[0], true);
1424		}
1425	} else {
1426		if (json.s3 == "uk" && refreshLocation > 0) {
1427			if (document.frmMM.useRegionList.value.length > 0 && refreshLocation > 1) {
1428				useRegionList = json.s3;
1429			} else {
1430				if (refreshLocation > 1) {
1431					useRegionList = json.s3;
1432				} else  {
1433					useRegionList = "";
1434				}
1435				document.frmMM.useRegionList.value = useRegionList;
1436				if (typeof formElement != 'undefined') {
1437					refreshGeography (formElement[0], true);
1438				}
1439			}
1440		}
1441	}
1442}
1443
1444// Initialise Saved Search
1445function ssInit () {
1446	var element = document.getElementById('searchName');
1447	if (element == null) {
1448		disableButton ('saveSearchButton');
1449	}
1450	disableButton ('deleteSearchButton', true);
1451}
1452
1453function changeGeographicSearchMethod (targetMethod, targetCountryID, templateVar, linkElement) {
1454	var useRegionList = document.frmMM.useRegionList;
1455	linkElement.href = "#";  // Don't follow the href that was included for non-JS users if we can submit the form instead.
1456	if (targetMethod == 'regions') {
1457		useRegionList.value = targetCountryID;
1458	} else {
1459		useRegionList.value = "";
1460	}
1461	refreshGeography(useRegionList);
1462	return false;
1463}
1464
1465function updatePostCodeText () {
1466	if ($('#mRangeID').length != 0 && $('#mPostCodeID').length != 0) {
1467		var range = $('#mRangeID').prop('selectedIndex');
1468		var postCode = $('#mPostCodeID').prop('selectedIndex');
1469		if (typeof range == 'undefined') {
1470			range = 0;
1471		}
1472		if ($('#postCodeSelected').length != 0) {
1473			if ((typeof $('#mRangeID').find('option').length != 0 && $('#mRangeID').find('option').length != 0) &&
1474				(typeof $('#mPostCodeID').find('option').length != 0 && $('#mPostCodeID').find('option').length != 0)) {
1475				var rangeText = $('#mRangeID').find(':selected').text();
1476				var postCodeText = $('#mPostCodeID').find(':selected').text();
1477				var selectedText = copyItems["radius_within"] + ' ' + rangeText + ' ' + copyItems["radius_of"] + ' ' + copyItems["radius_UKpostCode"] + ' ' + postCodeText;
1478				updateText('postCode', selectedText);
1479			}
1480		}
1481	}
1482}
1483
1484// Update the dynamic labelString for the field
1485function updateFieldLabel (element, action) {
1486	var container = $(element).closest('.multiCheckWrapper');
1487	var labelString = container.children('.dynamicLabel').text();
1488	var anyText = container.find('.any').children('label').text();
1489
1490	if (action == "reset"
1491		|| (action == "remove" && ($('#' + container.attr('id') + ' input[type=checkbox]:checked').length === 0))
1492		|| ($('#' + container.attr('id') + ' input[type=checkbox]:checked').length === $('#' + container.attr('id') + ' input[type=checkbox]').length-1)) {
1493		labelString = anyText;
1494	} else if (action == "add") {
1495		if (anyText !== "") {
1496			if (labelString.indexOf(anyText + ';') !== -1) {
1497				labelString = labelString.replace(anyText + ';', '');
1498			} else {
1499				labelString = labelString.replace(anyText, '');
1500			}
1501		}
1502		if (labelString != '') {
1503			labelString += '; ';
1504		}
1505		labelString += $(element).parent().find("label").text() + ';';
1506	} else if (action == "remove") {
1507		labelText = $(element).parent().find("label").text();
1508		if (labelString.slice(-1 * labelText.length) == labelText) {
1509			labelString = labelString.replace(labelText, '').trim();
1510		} else {
1511			labelString = labelString.replace(labelText + ';', '').trim();
1512		}
1513	}
1514	if (labelString.slice(-1) == ";") {
1515		labelString = labelString.slice(0, -1);
1516	}
1517	container.children('.dynamicLabel').html('<span>'+labelString+'</span>');
1518}
1519
1520// Toggle between the edit label and svg icon on the multi-select boxes
1521function toggleDynamicLabelSVG (obj) {
1522	var toggleText = "<span>" + valStrings.field_edit + "</span>";
1523	var toggleSVG = "<svg class=\"close\"><use xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href=\"#icon_close\"></use></svg>";
1524
1525	if (obj.parent().hasClass("open")) {
1526		obj.html(toggleSVG);
1527	} else {
1528		obj.html(toggleText);
1529	}
1530}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.