
			
		jQuery(function() {
			jQuery('ol.moneyOL li.button').hide();
			jQuery('ol.moneyOL').each(function(i,ol) {
				jQuery('input:text', ol).keyup(function(e) {
					var c = jQuery('input:checkbox', ol)[0];
				  if (!c.altered) {
						var fromto = jQuery('input:text', ol);
						c.checked = !(fromto[0].value == '' && fromto[1].value == '');
					}
					jQuery('li.button', ol).show();
				});
				jQuery('input:checkbox', ol).click(function(e) {
					this.altered = true;
					jQuery('li.button', ol).show();
				});
			});
			
			new displayAwayPanel('showCategoryLinks', 'categoryLinksTab', 'location');
			new displayAwayPanel('showRegionLinks', 'regionLinksTab', 'location');
		});
		
		request = function(hash) {
			var r = {};
			var q = window.location.search;
			if (q.length > 1) q = q.substring(1, q.length);
			var queryValues = q.split("&");
			for (var i=0; i < queryValues.length; i++) {
				value = queryValues[i].split("=");
				r[value[0]] = unescape(value[1]);
			}
			var hashValues = hash.split("&");
			for (var i=0; i < hashValues.length; i++) {
				value = hashValues[i].split("=");
				r[value[0]] = value[1];
			}
			return r;
		};
		
		historyChange = function(hash) {
			var sort = request(hash)['sort'];
			if (sort) {
				jQuery('#sort option[value=' + sort + ']').attr('selected', 'selected');
			} else {
				jQuery('#sort option:first').attr('selected', 'selected');
			}
			searchResultsPanel.update();
		};
		
		overlayPanel = function(f, imagePath, overlayClassName, centreImage) {
			var overlay = document.createElement("div");
			overlay.id = f.id + '_overlay';
			overlay.className = overlayClassName;
			
			var width = f.offsetWidth;
			var height = f.offsetHeight;
			
			var image = document.createElement("img");
			image.src = imagePath;
			
			var pos = jQuery(f).position();
			overlay.style.top = pos.top + "px";
			overlay.style.left = pos.left + "px";
			overlay.style.width = width + "px";
			overlay.style.height = height + "px";
			
			if (centreImage)
			{
				image.style.top = Math.round(height / 4) + "px";
				//image.style.left = Math.round(width / 2) + "px";
			}
			
			f.parentNode.appendChild(overlay);
			overlay.style.zIndex = 201;
			overlay.appendChild(image);
		};
		
		LivePanel_onUpdate = function(p) {
			if (p.panel.id == 'searchResultsDiv') {
				overlayPanel(p.panel, 'http://secure.businessesforsale.com/BFSv2Static/global/images/ajax-loaderLarge.gif', 'overlay', true);
			}
		};
		
		LivePanel_onUpdateComplete = function(p) {
			if (p.panel.id == 'searchResultsDiv') {
				removeElement(p.panel.id + '_overlay');
			}
		};
		
		LiveForm_onToggleShow = function(c, show) {
			if (show) {
				c.style.display='';
			} else {
				c.style.display='none';
			}
		};
		
		LazyFilter_onSeeMore = function(f) {
			overlayPanel(f.suggestionsDiv, 'http://secure.businessesforsale.com/BFSv2Static/global/images/ajax-loaderLarge.gif', 'lazyFilterLoading', true);		
		};
		
		LazyFilter_onFocus = function(f) {
			var query = 'updateControl=' + f.id + '&query=' + f.lastRequestString;
			if (f.showAll) {
				query += '&showAll=1';
			}
			
			overlayPanel(f.trigger, 'http://secure.businessesforsale.com/BFSv2Static/global/images/ajax-loader.gif', 'triggerLoading', false);
			
			liveSearch.update(query, function() { removeElement(f.triggerID + '_overlay'); removeElement(f.id + '_suggestions_overlay'); f.update(); });
		};
		
		LazyFilter_onClick = function(f) {
			var tier = resolveTier(f);
			
			// iterate through tiers higher than current tier and deselect
			for (i=tier+1; i<=4; i++)
			{
					document.searchFilterForm.elements['axis2IDtier' + i].selectedIndex = -1;
			}
			
			document.searchFilterForm.submit();
		};
		
		removeElement = function(elID) {
			var el = document.getElementById(elID);
			if (el) {
				var parent = el.parentNode;
				parent.removeChild(el);
			}
		};

		toggle = function(toggleElID, concertinaElID, lessInnerHTML, moreInnerHTML) {
			var tog = document.getElementById(toggleElID);
			if (tog.innerHTML == moreInnerHTML) {
				expand(concertinaElID);
				tog.innerHTML = lessInnerHTML;
			} else {
				contract(concertinaElID);
				tog.innerHTML = moreInnerHTML;
			}
		};
		
		LazySelect_onChange = function(f) {
			liveSearch.update(buildCategoryPickersQuery(f.id));					
			updateInterimCrumbtrail();
    };
	        
    LazySelect_onFocus = function(f) {
			//deselect functionality
      var i;
    	if(f.select.selectedIndex >= 0)
			{	
				var tier = resolveTier(f) - 1;
				controls = buildCategoryPickersArray();    //todo: genericise
				
				// iterate through tiers higher than current tier and deselect
				for (i=tier+1; i<controls.length; i++)
				{
						controls[i].selectedIndex = -1;
				}
			}
			updateInterimCrumbtrail()
    };
    
    var categoryOverlayMouseout=true;
    categoryPickersOverlayOnBlur = function() {
			if (categoryOverlayMouseout==true){
				hideOverlay('categoryPickersOverlay');
				restoreCatControlState();
			}
		};
		
		getInterimCrumbtrail = function() {
    	var s='';
    	var t;
    	var controls = buildCategoryPickersArray();    //todo: genericise
				
			for (i=controls.length-1; i>=0; i--) {
				var control = controls[i];
				
				if (control.selectedIndex > -1) {
					t = control.options[control.selectedIndex].text

					s = jQuery.trim(t.replace(/>/, '')) + s;
					
					if (i > 0) {
						s = ' > ' + s;
					}
				}
			}
			
			return s;
		};
		   
    updateInterimCrumbtrail = function() {        
    	var interimCrumbtrailDiv = document.getElementById('interimCrumbtrail');
    	interimCrumbtrailDiv.innerHTML = getInterimCrumbtrail();
    };
					
		resolveTier = function(f) {
			var rx = /axis\d+IDtier(\d+).*/
			
			var tier = -1 // Number(f.id.match(rx));
	
			var re = new RegExp(rx);
			var m = re.exec(f.id);
			if (!(m == null)) {
				tier=Number(m[1]);
			}
			return tier;
		};

		var catControlVals = new Array();							
		var catControlInnerText = new Array();
		
		backupCatControls = function() {
			var controls = buildCategoryPickersArray();
			
				for (i=0; i<controls.length; i++)
				{						
						var control = controls[i];
						if(control.selectedIndex>-1)
						{
							catControlVals[i] = control.options[control.selectedIndex].value;
							catControlInnerText[i] = control.options[control.selectedIndex].text;														
						}
				}		
		};
		
		restoreCatControlState = function() {
			var controls = buildCategoryPickersArray();
			
			for (i=0; i<controls.length; i++)
			{
				var control = controls[i];

				//check options to see if option still exists
				if(!(checkIfOptionExists(control, catControlVals[i])))
				{
					//remove other options cos probably things have changed around a lot - let lazySelect code handle rebuilding options
					
					removeOptions(control);
					addOption(control, catControlVals[i], catControlInnerText[i]);
				}
				
				for(j=0; j<control.options.length; j++)
				{
					if(control.options[j].value==catControlVals[i])
					{
						controls[i].selectedIndex = j;
						controls[i].value = catControlVals[i];
						control.options[j].selected=true;
					}
				}
			}		
		};
		
		addOption = function(control, value, innerText) {				
			var option = document.createElement("option");
			option.text = innerText;
			option.value = value;
			control.options.add(option);
		};
		
		removeOptions = function(control) {
			var i;
			for(i=control.options.length-1;i>=0;i--)
			{
				if(control.options[i].selected)
					control.remove(i);
			}
		};
		
		checkIfOptionExists = function(control, v) {
			var found = false;
			for(j=0; j<control.options.length;j++)
			{
				if(control.options[j].value==v)
				{
					found = true;
					break;
				}
			}
			return found;
		};
					
		buildCategoryPickersArray = function() {
				var catControls = new Array();
				catControls[0] = document.searchFilterForm.elements['axis1IDtier1'];
				catControls[1] = document.searchFilterForm.elements['axis1IDtier2'];
				catControls[2] = document.searchFilterForm.elements['axis1IDtier3'];
				return catControls;
		};
	
		removeLowerTierControlState = function(currentTier) {
			var controls = buildCategoryPickersArray();
			
			for (i=currentTier; i<controls.length; i++)
			{
				var control = controls[i];
				removeOptions(control);
				control.selectedIndex = -1;
			}
		};
		
		populateCategoryPickers = function(trigger)	{
			var overlay = document.getElementById('categoryPickersOverlay');
			
			if (overlay.style.display == 'none') {
				backupCatControls();
				updateInterimCrumbtrail();
		
				var catControls = new Array();
				catControls[0]='axis1IDtier1';
				
				var currentTier = resolveTier(trigger);
				// remove control state for lower tiers than current
				removeLowerTierControlState(currentTier);
				
				overlayPanel(trigger, 'http://secure.businessesforsale.com/BFSv2Static/global/images/ajax-loader.gif', 'triggerLoading')
				
				liveSearch.update(buildCategoryPickersQuery('axis1IDtier1'), showCategoryPickers);
			} else {
				overlay.style.display = 'none';
			}		
		};
		
		buildCategoryPickersQuery = function(updateControl) {			
			return '&showAll=1&updateControl=' + updateControl;
		};
		
		showCategoryPickers = function() {
			var controls = buildCategoryPickersArray();
			
			for (i=0; i<controls.length; i++)	{
				removeElement(controls[i].id + '_trigger_overlay');
			}
			
			showOverlay('categoryLink1', 'categoryPickersOverlay');
		};
		
		showOverlay = function(triggerId, overlayId) {
			var overlay = document.getElementById(overlayId);
			var trigger = document.getElementById(triggerId);
			
			if (overlay.style.display == 'none') {
				
				var overlayParent = overlay.parentNode;
				
				var overlayParentPos = jQuery(overlayParent).offset();
				var triggerPos = jQuery(trigger).offset();
				
				overlay.style.left = triggerPos.left - overlayParentPos.left + (overlay.offsetWidth/2) + 'px';
				overlay.style.top  = triggerPos.top - overlayParentPos.top + trigger.offsetHeight + 'px';
				overlay.style.display = '';
				
				overlay.focus();
				
			} else {
				
				overlay.style.display = 'none';
				
			}
		};
		
		hideOverlay = function(overlayId) {
			document.getElementById(overlayId).style.display = 'none';
		};
		
		var submitting = false;
		submitForm = function() {
			if (!submitting) {
				submitting = true;
				document.searchFilterForm.submit();
				for (var k=0; k < document.forms.length; k++) {
					for (var i=0; i < document.forms[k].elements.length; i++) {
						element = document.forms[k].elements[i];
						if (element.type == 'checkbox' || element.type == 'radio') {
							element.disabled = true;
						}
					}
				}
			}
		};
		
		//-------------------- displayAwayPanel

		displayAwayPanel = function(triggerId, panelId, dockId) {
			this.trigger = document.getElementById(triggerId);
			this.panel = document.getElementById(panelId);
			
			if (this.trigger && this.panel) {
				this.dock = dockId ? document.getElementById(dockId) : this.trigger;
				this.mouseOut = true;
		    
				// this is so that Firefox fires onblur on the panel div
				this.panel.tabIndex = 0;

				// define event handers
				var thisObj = this;
				var mouseoutHandler = function(e) {
						thisObj.mouseOut = true;
				};
				var mouseoverHandler = function(e) {
						thisObj.mouseOut = false;
				};
				var clickHandler = function(e) {
						if (thisObj.panel.style.top == '-9999px') {
								thisObj.positionPanel();
								thisObj.panel.focus();
						} else {
								thisObj.panel.style.top = '-9999px';
						}
				};
				var blurHandler = function(e) {
						if (thisObj.mouseOut) {
								thisObj.panel.style.top = '-9999px';
						}
				};

				// attach event handlers
				jQuery(this.trigger).mouseout(mouseoutHandler).mouseover(mouseoverHandler).click(clickHandler);
				jQuery(this.panel).mouseout(mouseoutHandler).mouseover(mouseoverHandler).blur(blurHandler).find(":input, a").blur(blurHandler);
			}
		};

		displayAwayPanel.prototype = {

				positionPanel: function() {
						// position panel directly below trigger
						var parent = this.panel.parentNode;

						parentPos = jQuery(parent).offset();
						dockPos = jQuery(this.dock).offset();

						//this.panel.style.left = dockPos.left - parentPos.left + (this.panel.offsetWidth / 2) + 'px';
						this.panel.style.top = dockPos.top - parentPos.top + this.dock.offsetHeight + 'px';
				}

		};

	