var pendingEvent;
var allFieldsDefault;
var searchType; //="region" or "gmap"
var _loader; //covers results while serch is performed.
var linksTransformed=false;


var searching={};
searching.forms={};
searching.common={};
searching.quikSearch={};
searching.browse={};
searching.results={};
searching.gmap = {};
searching.shortlist = {};
searching.featuredSearch = {};

searching.forms.allFieldsDefault=false;

searching.forms.s$=function(controlId){
    //Use in place of getElementById to ensure controls still work if rendered within the ctlQuickSearch .net userControl.
    return document.getElementById(searching.forms.actualControlId(controlId));
}

searching.forms.actualControlId=function(controlId){
    if (document.getElementById(controlId)){
		return controlId;
	}else{
		return 'CtlquickSearch1_' + controlId;
	}
}
searching.forms.searchMode=function(){
    return jQuery('#hdnSearchMode').val();
}

searching.forms.bindEvents = function () {
    jQuery('#' + searching.forms.actualControlId('ddlArrivalDay')).change(function () {
        searching.forms.ensureArrivalDateInMonth();
    });
    jQuery('#' + searching.forms.actualControlId('ddlArrivalMonth')).change(function () {
        searching.forms.ensureArrivalDateInMonth();
    });

    jQuery('#' + searching.forms.actualControlId('ddlFromDate')).change(function () {
        searching.forms.fromDate_Change()
    });
    jQuery('#' + searching.forms.actualControlId('ddlToDate')).change(function () {
        searching.forms.toDate_Change();
    });
    jQuery('#' + searching.forms.actualControlId('ddlDays')).change(function () {
        searching.forms.days_Change();
    });
    jQuery("select").change(function () {
        searching.forms.controlChange(this);
    });
    
    searching.forms.onContractSection(jQuery('.collapse'));

}

searching.forms.controlChange = function (ctl) {
    if (searching.forms.searchMode() == 'results') {
        searching.results.controlChange(ctl);
    }
    if (searching.forms.searchMode() == 'browse') {
        searching.browse.controlChange();
    }
    if (searching.forms.searchMode() == 'quik') {
        searching.quikSearch.controlChange();
    }
}
    


searching.forms.ensureArrivalDateInMonth=function(){
    var monthMax=31;
	switch (searching.forms.s$('ddlArrivalMonth').value.substring(0,3)){
		case 'Sep':
			 monthMax=30;break;
		case 'Apr':
			 monthMax=30;break;
		case 'Jun':
			 monthMax=30;break;
		case 'Nov':
			 monthMax=30;break;
		case 'feb':
			monthMax=28;break;
	}
	if (searching.forms.s$('ddlArrivalDay').value>monthMax){
		searching.forms.s$('ddlArrivalDay').value=monthMax;
    }
}

searching.forms.fromDate_Change=function(){
    if (searching.forms.s$('ddlDays').value=='0' && isInteger(searching.forms.s$('ddlFromDate').value)!=true){
		searching.forms.s$('ddlDays').value='7';
	}
    searching.forms.setToDate()
}

searching.forms.toDate_Change=function(){
   if (searching.forms.s$('ddlDays').value=='0' && isInteger(searching.forms.s$('ddlToDate').value)!=true){
		searching.forms.s$('ddlDays').value='7';
	}
	var intFromSel = searching.forms.s$('ddlFromDate').selectedIndex;
	var intToSel = searching.forms.s$('ddlToDate').selectedIndex;
	var intWks = searching.forms.s$('ddlDays').value / 7;
	if (intToSel<intFromSel){
		searching.forms.s$('ddlFromDate').selectedIndex = (intToSel - intWks + 1);
	}else if (intToSel<(intFromSel+intWks)){
		searching.forms.s$('ddlDays').value = (intToSel - intFromSel + 1) * 7;
    }
}
	
searching.forms.setToDate=function(){
	var intFromSel = searching.forms.s$('ddlFromDate').selectedIndex;
	var intToSel = searching.forms.s$('ddlToDate').selectedIndex;
	if (intFromSel!=0){
		var intWks = searching.forms.s$('ddlDays').value / 7;
		if (intToSel<(intFromSel+intWks)){
			newToIndex=(intFromSel + intWks - 1);
			if (newToIndex<=searching.forms.s$('ddlToDate').options.length-1){
				searching.forms.s$('ddlToDate').selectedIndex = (intFromSel + intWks - 1);
			}else{
				searching.forms.s$('ddlToDate').selectedIndex = searching.forms.s$('ddlToDate').options.length-1;
			}
		}
	}
}

searching.forms.days_Change=function(){
	if (searching.forms.s$('ddlDays').value==0){
		if (isInteger(searching.forms.s$('ddlFromDate').value)!=true){
			searching.forms.s$('ddlFromDate').selectedIndex=0;
			searching.forms.s$('ddlToDate').selectedIndex=0;
		}
	}
    searching.forms.setToDate();
}

searching.forms.showRelevantDateSelectors = function () {
    var shortBreakSelected = (searching.forms.s$('ddlDays').value == 0 || searching.forms.s$('ddlDays').value > 6);
    searching.forms.s$('pnlFullWeeks').style.display = (shortBreakSelected ? 'block' : 'none');
    searching.forms.s$('pnlShortBreaks').style.display = (shortBreakSelected ? 'none' : 'block');
}

searching.forms.userControls=["ddlDays","ddlFromDate","ddlToDate","ddlArrivalDay","ddlArrivalMonth","ddlParty","ddlCots","ddlPets","ddlBedrooms","ddlBathrooms","ddlSea","ddlBeach","ddlSandyBeach","ddlLocation","ddlGarden","ddlProperty","ddlPool","ddlCODay","ddlParking","ddlNoPets","ddlNoSmokers","ddlSeaViews","ddlOpenFire","ddlWorkingFarm","ddlClassicGreen","ddlBroadband","ddlHotTub","ddlGFOnly","ddlTown","ddlMiles","ddlChildMin","ddlChildMax","ddlBabyFriendly"];

searching.forms.highlightNonDefaultControls = function(){
    for (var i in searching.forms.userControls) {
        var ctlId = searching.forms.userControls[i];
        if (jQuery(searching.forms.actualControlId(ctlId))) {
            var ctl = jQuery('#' + searching.forms.actualControlId(ctlId));
            if(ctl.val()!=ctl.attr('data-defaultControlValue')){
                 ctl.toggleClass('nonDefault', true);
            }else{
                ctl.toggleClass('nonDefault', false);
            }
        }
    }
}

searching.forms.controlsNotDefault = function () {
    for (var i in searching.forms.userControls) {
        var ctlId = searching.forms.userControls[i];
        if (jQuery(searching.forms.actualControlId(ctlId))) {
            var ctl = jQuery('#' + searching.forms.actualControlId(ctlId));
            if (ctl.val() != ctl.attr('data-defaultControlValue')) {
                return true;
            }
        }
    }
    return false;
}

searching.forms.controlsModifiedSinceLoad = function () {
    for (var i in searching.forms.userControls) {
        var ctlId = searching.forms.userControls[i];
        if (jQuery(searching.forms.actualControlId(ctlId))) {
            var ctl = jQuery('#' + searching.forms.actualControlId(ctlId));
            if (ctl.val() != ctl.attr('data-initialControlValue')) {
                return true;
            }
        }
    }
    return false;
}

searching.forms.onExpandSection = function (section) {
    //Return any controls in the MCC to their prior location.
    section.siblings('.modifiedControlContainer').children().each(function (index) {
        var tempControlContainer = jQuery(this);
        var originalControlContainer = jQuery('#' + tempControlContainer.attr('data-ccid'));
        originalControlContainer.append(tempControlContainer.contents());
        tempControlContainer.remove();
    })

}

searching.forms.onContractSection = function (section) {

    //Each child div of the collapse element contains one or more related controls.
    section.children().each(function (index) {
        var controlContainer = jQuery(this);
        var ccId = controlContainer.attr('id')
        var collapse = controlContainer.parent();
        var mCC = collapse.siblings('.modifiedControlContainer');

        var controlContainerNotDefault = false;
        controlContainer.find("select").each(function (index) {
            var control = jQuery(this);
            var controlNotDefault;
            if (control.attr('id') == 'ddlMiles') {
                controlNotDefault = false;
            } else {
                controlNotDefault = (control.val() != 0);
            }
            if (controlNotDefault) {
                controlContainerNotDefault = true;
            }
        })

        if (controlContainerNotDefault) {
            var tempControlContainer = jQuery("<div>");
            tempControlContainer.attr('id', 'tc_' + ccId);
            tempControlContainer.attr('data-ccid', ccId);
            tempControlContainer.append(controlContainer.contents());
            controlContainer.empty
            tempControlContainer.appendTo(mCC);
        }

    })

}

//Common scripts (results,browse,quik)
searching.common.mode = '';
searching.common.asyncMode = false;

searching.common.cottageListHidden=function(value) {
    jQuery('#hideCottageList').toggle(value);
    jQuery('#showCottagelist').toggle(!value);
}

searching.common.justCottageListHidden = function (value) {
    jQuery('#hideJustCottageList').toggle(value);
    jQuery('#showJustCottagelist').toggle(!value);
}

searching.common.resultsHidden = function (value) {
    jQuery('#Results').toggle(!value);
}

searching.common.regionListHidden=function(value) {
    jQuery('#hideResList').toggle(value);
    jQuery('#showResList').toggle(!value);
}

searching.common.selectedCountyCode=function() {
    return jQuery('#hdnArea').val();
}

searching.common.htmlDecode=function(value){
    return jQuery('<div/>').html(value).text();
}


searching.common.getRegionCount = function (region) {
    return document.getElementById('rc_' + region).innerHTML;
    /*var spansInsideLink = document.getElementById(region + 'a').getElementsByTagName('span');
    for (var i = 0; i < spansInsideLink.length; i++) {
    var node = spansInsideLink[i];
    if (count == 0) {
    node.className = node.className + ' regionZero';
    } else {
    node.className = node.className.replace(' regionZero', '');
    }
    }*/
}
searching.common.setRegionCount=function(region,count){
    document.getElementById('rc_' + region).innerHTML = count;
    /*var spansInsideLink = document.getElementById(region + 'a').getElementsByTagName('span');
    for (var i = 0; i < spansInsideLink.length; i++) {
        var node = spansInsideLink[i];
        if (count == 0) {
            node.className = node.className + ' regionZero';
        } else {
            node.className = node.className.replace(' regionZero', '');
        }
    }*/
}


searching.common.getApplicationState = function () {
    var htParams = [];

    htParams["search"] = "Y";
    htParams["method"] = 'js';
    htParams["rpp"] = 10;

    if (searching.forms.s$('ddlFromDate')) {
        var fromDate = searching.forms.s$('ddlFromDate').value;
        if (!isNaN(fromDate)) {
            htParams["yss"] = fromDate;
        } else {
            htParams["dss"] = fromDate;
        }
    }

    if (searching.forms.s$('ddlToDate')) {
        var toDate = searching.forms.s$('ddlToDate').value;
        if (!isNaN(toDate)) {
            htParams["yes"] = toDate;
        } else {
            htParams["des"] = toDate;
        }
    }

    if (searching.forms.s$('ddlArrivalDay')) {
        htParams["aday"] = searching.forms.s$('ddlArrivalDay').value;
        htParams["amon"] = searching.forms.s$('ddlArrivalMonth').value;
    }

    if (searching.forms.s$('hdnArea')) {
        htParams["rgn"] = searching.forms.s$('hdnArea').value;
    }
    if (searching.forms.s$('hdnPageNumMin')) {
        htParams["pMin"] = searching.forms.s$('hdnPageNumMin').value;
    }
    if (searching.forms.s$('hdnPageNumMax')) {
        htParams["pMax"] = searching.forms.s$('hdnPageNumMax').value;
    }


    htParams["nday"] = searching.forms.s$('ddlDays').value;
    htParams["minA"] = searching.forms.s$('ddlParty').value;
    htParams["minB"] = searching.forms.s$('ddlCots').value;
    htParams["pet"] = searching.forms.s$('ddlPets').value;
    htParams["bed"] = searching.forms.s$('ddlBedrooms').value;

    if (searching.browse.exists() || searching.results.exists()) {

        htParams["nlc"] = document.getElementById('ddlTown').value;
        htParams["nlm"] = document.getElementById('ddlMiles').value;
        htParams["mfs"] = document.getElementById('ddlSea').value;
        htParams["mfb"] = document.getElementById('ddlBeach').value;
        htParams["mfsb"] = document.getElementById('ddlSandyBeach').value;
        htParams["ltyp"] = document.getElementById('ddlLocation').value;
        htParams["gtyp"] = document.getElementById('ddlGarden').value;
        htParams["ptyp"] = document.getElementById('ddlProperty').value;
        htParams["styp"] = document.getElementById('ddlPool').value;


        htParams["bath"] = document.getElementById('ddlBathrooms').value;
        htParams["cod"] = document.getElementById('ddlCODay').value;
        htParams["park"] = (document.getElementById('ddlParking').value == 1) ? "true" : "false";

        htParams["nPet"] = (document.getElementById('ddlNoPets').value == 1) ? "true" : "false";
        htParams["nSmo"] = (document.getElementById('ddlNoSmokers').value == 1) ? "true" : "false";

        htParams["svw"] = (document.getElementById('ddlSeaViews').value == 1) ? "true" : "false";
        htParams["fire"] = (document.getElementById('ddlOpenFire').value == 1) ? "true" : "false";
        htParams["gfo"] = (document.getElementById('ddlGFOnly').value == 1) ? "true" : "false";
        htParams["cFrom"] = document.getElementById('ddlChildMin').value;
        htParams["cTo"] = document.getElementById('ddlChildMax').value;
        htParams["baby"] = document.getElementById('ddlBabyFriendly').value;
        if (document.getElementById('hdnFSI')) {
            htParams["fsi"] = document.getElementById('hdnFSI').value;
        }
        if (document.getElementById('chkThatched')) {
            htParams["tht"] = document.getElementById('chkThatched').checked;
        }
        if (document.getElementById('ddlBroadband')) {
            htParams["bbi"] = (document.getElementById('ddlBroadband').value == 1) ? "true" : "false";
        }
        if (document.getElementById('ddlHotTub')) {
            htParams["tub"] = (document.getElementById('ddlHotTub').value == 1) ? "true" : "false";
        }
        if ($('ddlWorkingFarm')) {
            htParams["farm"] = (document.getElementById('ddlWorkingFarm').value == 1) ? "true" : "false";
        }
        if ($('ddlClassicGreen')) {
            htParams["green"] = (document.getElementById('ddlClassicGreen').value == 1) ? "true" : "false";
        }
    };

    if (searching.gmap.mapExists()) {
        htParams["type"] = "withCottages";
        htParams["mapState"] = searching.gmap.getMapState();
        htParams["rgn"] = 'west';
    }

    var strQS = '/' + searching.common.arrayToQueryString(htParams);
    return strQS;
}

searching.common.queryStringToArray=function(value){
	var htParams=[];
	var kvPairs=value.split('&');
	for (var i=0;i<kvPairs.length;i++){
		var kvPair=kvPairs[i].split('=');
		kvPairs[kvPair[0]]=unescape(kvPair[1]);
	}
	return kvPairs;
}

searching.common.arrayToQueryString=function(paramArray){
	var strQS='';
    for (var keyName in paramArray){
		if (typeof(paramArray[keyName])!='function'){
			var keyValue=paramArray[keyName];
			strQS+='&' + keyName + '=' + escape(keyValue);
		}
	}
	return strQS;
}

searching.common.setApplicationState = function (applicationState) {
    if (applicationState) {
        var htParams = searching.common.queryStringToArray(applicationState);

        if (htParams["dss"]) {
            searching.forms.s$('ddlFromDate').value = htParams["dss"];
        } else {
            searching.forms.s$('ddlFromDate').value = htParams["yss"];
        }

        if (htParams["des"]) {
            searching.forms.s$('ddlToDate').value = htParams["des"];
        } else {
            searching.forms.s$('ddlToDate').value = htParams["yes"];
        }

        if (htParams["aday"]) {
            searching.forms.s$('ddlArrivalDay').value = htParams["aday"];
            searching.forms.s$('ddlArrivalMonth').value = htParams["amon"];
        }

        searching.forms.s$('ddlDays').value = htParams["nday"];
        searching.forms.s$('ddlParty').value = htParams["minA"];
        searching.forms.s$('ddlCots').value = htParams["minB"];
        searching.forms.s$('ddlPets').value = htParams["pet"];

        if (htParams["rgn"]) {
            var regionCode = htParams["rgn"];
            jQuery("ul#cottagesByRegion li span").removeClass('regionSel');
            jQuery("ul#cottagesByRegion li#li_" + regionCode).find('span').addClass('regionSel');
        }

        if (document.getElementById('ddlTown')) {
            document.getElementById('ddlTown').value = htParams["nlc"];
            document.getElementById('ddlMiles').value = htParams["nlm"];
            document.getElementById('ddlSea').value = htParams["mfs"];
            document.getElementById('ddlBeach').value = htParams["mfb"];
            document.getElementById('ddlSandyBeach').value = htParams["mfsb"];
            document.getElementById('ddlLocation').value = htParams["ltyp"];
            document.getElementById('ddlGarden').value = htParams["gtyp"];
            document.getElementById('ddlProperty').value = htParams["ptyp"];
            document.getElementById('ddlPool').value = htParams["styp"];
            document.getElementById('ddlBedrooms').value = htParams["bed"];
            document.getElementById('ddlBathrooms').value = htParams["bath"];
            document.getElementById('ddlCODay').value = htParams["cod"];

            document.getElementById('ddlNoPets').value = (htParams["nPet"] == 'true') ? 1 : 0;
            document.getElementById('ddlNoSmokers').value = (htParams["nSmo"] == 'true') ? 1 : 0;

            document.getElementById('ddlSeaViews').value = (htParams["svw"] == "true") ? 1 : 0;
            document.getElementById('ddlParking').value = (htParams["park"] == "true") ? 1 : 0;

            document.getElementById('ddlOpenFire').value = (htParams["fire"] == 'true') ? 1 : 0;
            document.getElementById('ddlGFOnly').value = (htParams["gfo"] == 'true') ? 1 : 0;
            document.getElementById('ddlChildMin').value = htParams["cFrom"];
            document.getElementById('ddlChildMax').value = htParams["cTo"];
            document.getElementById('ddlBabyFriendly').value = htParams["baby"];
            if (document.getElementById('chkThatched')) {
                document.getElementById('chkThatched').checked = (htParams["tht"] == 'true');
            }
            if (document.getElementById('ddlBroadband')) {
                document.getElementById('ddlBroadband').value = (htParams["bbi"] == 'true') ? 1 : 0;
            }
            if (document.getElementById('ddlHotTub')) {
                document.getElementById('ddlHotTub').value = (htParams["tub"] == 'true') ? 1 : 0;
            }

            if (document.getElementById('ddlWorkingFarm')) {
                document.getElementById('ddlWorkingFarm').value = (htParams["farm"] == 'true') ? 1 : 0;
            }
            if (document.getElementById('ddlClassicGreen')) {
                document.getElementById('ddlClassicGreen').value = (htParams["green"] == 'true') ? 1 : 0;
            }
        }

        if (searching.gmap.mapExists()) {
           searching.gmap.setMapState(htParams["mapState"]);  
        }

    }
}


searching.common.updateResultsByRegion = function (xmlDoc) {
    var results = xmlDoc.getElementsByTagName('regions')[0];
    var error = xmlDoc.getElementsByTagName('error')[0];

    if (error || !results) {
        jQuery('#cottagesByRegion_Results').toggle(false);
        jQuery('#cottagesByRegion_Error').toggle(true);

        if (error) {
            jQuery('#cottagesByRegion_Error').html(error.getAttribute('message'));
        } else {
            jQuery('#cottagesByRegion_Error').html('Problem searching, please try again...');
        }
        if (jQuery('#sProgress')) {
            jQuery('#sProgress').html('Sorry, we could not perform your search. Please refer to the message above.');
            jQuery('#sNote').toggle(false);
        }
    } else {
        if (results.getAttribute('west') == 0) {
            var longNoCottagesMessage = 'Unfortunately no holiday cottages are available that fulfill your search requirements. You can try widening your search options or you can <a target="_parent" href="/my-classic/myclassic2.aspx">register here</a> to be notified when new cottages matching your requirements are added to our portfolio.';
            var shortNoCottagesMessage = 'We\'ve got no holiday cottages match your search criteria, try widening your options.';
            jQuery('#cottagesByRegion_Results').toggle(false);
            jQuery('#cottagesByRegion_Error').toggle(true);
            jQuery('#cottagesByRegion_Error').html(longNoCottagesMessage);
            if (jQuery('#sProgress')) {
                jQuery('#sProgress').html(shortNoCottagesMessage);
                jQuery('#sNote').toggle(false);
            }
            if (jQuery('#noResultsWindow')) {
                jQuery('#noResultsWindow').toggle(true);
                jQuery('#noResultsWindow').html(shortNoCottagesMessage);
            }
        } else {
            if (jQuery('#sProgress')) {

                jQuery('#sNote').toggle(true);
            }
            jQuery('#cottagesByRegion_Results').toggle(true);
            jQuery('#cottagesByRegion_Error').toggle(false);

            searching.common.setRegionCount('west', results.getAttribute('west'))
            searching.common.setRegionCount('co', results.getAttribute('co'))
            searching.common.setRegionCount('cofw', results.getAttribute('cofw'))
            searching.common.setRegionCount('cosw', results.getAttribute('cosw'))
            searching.common.setRegionCount('conc', results.getAttribute('conc'))
            searching.common.setRegionCount('cobm', results.getAttribute('cobm'))
            searching.common.setRegionCount('cosc', results.getAttribute('cosc'))
            searching.common.setRegionCount('de', results.getAttribute('de'))
            searching.common.setRegionCount('deno', results.getAttribute('deno'))
            searching.common.setRegionCount('deda', results.getAttribute('deda'))
            searching.common.setRegionCount('deso', results.getAttribute('deso'))
            searching.common.setRegionCount('so', results.getAttribute('so'))
            searching.common.setRegionCount('do', results.getAttribute('do'))
        }
    }
}


searching.browse.regionHover = function (regionCode) {
    var ttl, dsc, map;
    if (regionCode == 'out') {
        jQuery('#wcmap').attr('src', jQuery('#hdnmapbase').val());
        jQuery('ul#cottagesByRegion li').removeClass("hover");
        ttl = 'The West Country'; dsc = 'Discard your worries and let the stress flake off you with every mile you travel west. This is a place to take your time, eat, drink, swim and recharge the batteries.';
        map = jQuery('#hdnmapbase').val();
        pic = '/webpics/regions/thumbnails/' + 'west' + '.jpg'
    } else {
        jQuery('#li_' + regionCode).addClass("hover");

        switch (regionCode) {
            case 'west':
                { ttl = 'The West Country'; dsc = 'Discard your worries and let the stress flake off you with every mile you travel west. This is a place to take your time, eat, drink, swim and recharge the batteries.'; break; }
            case 'co':
                { ttl = 'Cornwall'; dsc = 'Cornwall is not a county but almost an island, at least that is what its inhabitants like to think, but they are all the more welcoming for it.'; break; }
            case 'cofw':
                { ttl = 'Cornwall | Far West'; dsc = 'The ancient landscape and special quality of light on this peninsula have inspired artists and storytellers for hundreds of years.'; break; }
            case 'cosw':
                { ttl = 'Cornwall | South West'; dsc = 'Linked by lighthouses and lackadaisical lanes, from the radiant north coast to the other land\'s end at Lizard point.'; break; }
            case 'conc':
                { ttl = 'Cornwall | North Coast'; dsc = 'Cornwall\'s backbone, a 50 mile stretch of coast with some of the world\'s finest beaches whether you are a surfer or a beachcomber.'; break; }
            case 'cobm':
                { ttl = 'Cornwall | The Moor to River Tamar'; dsc = 'Here is a land shamelessly driven through and rarely stopped at; a spiritual wilderness teeming with beauty and legends.'; break; }
            case 'cosc':
                { ttl = 'Cornwall | South Coast'; dsc = 'Softer, calmer, more Mediterranean than its north coast sister, the south cajoles Cornish rivers into a warmer sea.'; break; }
            case 'de':
                { ttl = 'Devon'; dsc = 'Rural idyll in all its many varieties from the sheep crossing the road on Dartmoor to the cricketers on the village green. The coast is good too.'; break; }
            case 'deno':
                { ttl = 'North Devon'; dsc = 'The Taw and Torridge rivers pincer in on Bideford. Surfers escape to Croyde whilst ramblers share The Valley of the Rocks with the resident goats.'; break; }
            case 'deda':
                { ttl = 'Devon | Dartmoor'; dsc = 'A square mile for every day of the year. Granite, bogs, heather, huge skies and ponies; 3,000 of the little cherubs, never wild, just unbroken.'; break; }
            case 'deso':
                { ttl = 'South Devon'; dsc = 'The soft, seductive lowlands chaperone 60 miles of Heritage Coast. So snooze off lunch under the oak on the village green or lolling on your beach of choice.'; break; }
            case 'so':
                { ttl = 'Somerset'; dsc = 'Somerset cossets you into the West Country from the lowlands of Sedgemoor, through the Quantocks and on to its tussle with Devon over Exmoor in the north.'; break; }
            case 'do':
                { ttl = 'Dorset'; dsc = 'A land steeped in history from the fossils of the Jurassic coast to the pier at Lyme Regis, famed by the French Lieutenant and that famous kiss.'; break; }
        }
        map = '/media/map/big/' + regionCode + '.gif';
        pic = '/webpics/regions/thumbnails/' + regionCode + '.jpg'
    }
    jQuery('#rtitle').text(ttl);
    jQuery('#rdesc').text(dsc);
    jQuery('#rimg').attr('src', pic);
    jQuery('#wcmap').attr('src', map);
}

searching.browse.regionClick = function (regionCode) {
    if (searching.common.getRegionCount(regionCode) != 0) {
        jQuery('#hdnArea').val(regionCode);
        document.getElementById('Form1').submit();
    }
}


searching.browse.pendingUpdate = false;
searching.browse.noHashChange = false;

searching.browse.exists = function () {
    return (searching.forms.searchMode() == 'browse');
}

searching.browse.pageLoad = function () {
    console.log('searching.browse.pageLoad');

    //If theres a google map, initialize it.
    if (searching.gmap.mapExists()) {
        searching.gmap.loadTheMap();
        searching.gmap.linkToCottagesByRegion();
    }

    if (location.hash) {
        console.log('reading state from hash');
        var requestedState = location.hash.replace('#/', '');
        searching.browse.update(requestedState);
    } else if (searching.forms.controlsModifiedSinceLoad()) {
        console.log('reading state from control values');
        searching.browse.controlChange();
    } else if (searching.forms.controlsNotDefault()) {
        console.log('switching to Async mode but not requesting new results.');
        searching.browse.switchToAsyncMode();
    }

    //Highlight any non-default controls.
    searching.forms.highlightNonDefaultControls();

    //Bind the hover event to region names.
    jQuery("ul#cottagesByRegion > li").hover(function () {
        var regionCode = jQuery(this).attr('id').replace('li_', '');
        searching.browse.regionHover(regionCode);
    },
    function () {
        searching.browse.regionHover('out');
    })

    //Bind the hover event to regions of the image map.
    jQuery("map#regionMap > area").hover(function () {
        var regionCode = jQuery(this).attr('id').replace('map_', '');
        searching.browse.regionHover(regionCode);
    },
    function () {
        searching.browse.regionHover('out');
    })


}

searching.browse.controlChange = function () {
    console.log('searching.browse.controlChange');
    
    searching.forms.showRelevantDateSelectors();
    searching.common.regionListHidden(true);

    jQuery('#sProgress').text('Searching...');

    var requestedState = searching.common.getApplicationState();
    searching.browse.update(requestedState);

}

searching.browse.update = function (requestedState) {
    console.log('searching.browse.update');
    searching.browse.switchToAsyncMode();
    
    searching.browse.pendingUpdate = true;
    jQuery.History.go(requestedState);
    /*
    In general History.go causes the function specified in History.bind to fire which in turn fires showSearch().
    However on navigating back from another page this does not appear to work, so we use pendingUpdate to track if it has run and if not, we run it here!
    */
    setTimeout(function () {
        if (searching.browse.pendingUpdate) {
            searching.browse.showSearch(requestedState);
        }
    }, 500);
}

searching.browse.switchToAsyncMode = function () {

    if (searching.common.asyncMode != true) {

        jQuery.History.bind(function (state) {
            if (searching.browse.noHashChange) {
                console.log('searching.browse.showSearch: hashChange event is disabled.');
                searching.browse.noHashChange = false;
            } else {
                searching.browse.showSearch(state);
                searching.common.setApplicationState(state);
            }
        });

        jQuery("ul#cottagesByRegion li a").click(function (e) {
            e.preventDefault();
            var regionCode = jQuery(this).attr('id').replace('a_', '');
            searching.browse.regionClick(regionCode);
        });

        jQuery("map#regionMap > area").click(function (e) {
            e.preventDefault();
            var regionCode = jQuery(this).attr('id').replace('map_', '');
            searching.browse.regionClick(regionCode);
        });
        searching.common.asyncMode = true;
    }
}

searching.browse.showSearch = function (requestedState) {
    console.log('searching.browse.showSearch');
    searching.browse.pendingUpdate = false;
    jQuery.ajax({

        url: "/feeds/resultsFeed.aspx?" + requestedState,
        success: function (xmlDoc) {

            var description = xmlDoc.getElementsByTagName('description')[0];

            //Update the regional results counters.
            searching.common.updateResultsByRegion(xmlDoc);

            //Update the title.
            jQuery("#sProgress").html(description.getAttribute('resultsTitle'))

            //If there's a Google map, Sync it...
            if (searching.gmap.mapExists()) {
                var cottages = xmlDoc.getElementsByTagName('cottage');
                var complexes = xmlDoc.getElementsByTagName('complex');
                searching.gmap.showMarkers(cottages, complexes);
            }

            searching.common.regionListHidden(false);
            searching.forms.highlightNonDefaultControls();
        }
    });

};

searching.shortlist.exists = function () {
    return (searching.forms.searchMode() == 'shortlist');
}

searching.shortlist.pageLoad = function () {
    //If theres a google map, initialize it.
    if (searching.gmap.mapExists()) {
        searching.gmap.loadTheMap();
    };

    var currentTime = new Date();

    jQuery.ajax({
        url: "/feeds/shortlist.aspx?t=" + currentTime.toUTCString(),
        success: function (xmlDoc) {
            jQuery('#frmShortlist').html(xmlDoc);
            searching.gmap.displayCGItems();
        }
    });


}


searching.gmap.cottages;        //Array of cottages in current result set
searching.gmap.complexes;       //Array of complexes in current result set
searching.gmap.cottagesByCode;      //Array of Markers representing ALL cottages.
searching.gmap.clusterer;
searching.gmap.markerCluster;   //alternative clusterer.
searching.gmap.map;
searching.gmap.baseIcon;
searching.gmap.vMarkers;
searching.gmap.infoWindow;
searching.gmap.infoWindowCottageCode;
searching.gmap.mapHasChanged = false;
searching.gmap.mapReady = false;
searching.gmap.minCottagesToCluster = 100;

searching.gmap.mapExists = function () {
    if (document.getElementById('gmap')) {
        return true;
    }
    return false;
};

searching.gmap.displayCGItems = function () {
    var listOfCGItems = jQuery('ul#Results li')
    listOfCGItems.each(function (index) {
        var CGItem = jQuery(this);
        if (CGItem.hasClass('CGItem')) {
            var thisLat = CGItem.find('.CGLat')[0].innerHTML;
            var thisLon = CGItem.find('.CGLng')[0].innerHTML;
            var CGName = CGItem.find('.CGName')[0].innerHTML;
            var CGIcon = CGItem.find('.CGIcon')[0].innerHTML;
            var CGDetails = CGItem.find('.CGDetails')[0].innerHTML;

            var icon = searching.gmap.baseIcon;
            icon.image = CGIcon;

            var myLatLng = new google.maps.LatLng(thisLat, thisLon);
            var marker = new google.maps.Marker({
                position: myLatLng
             , map: searching.gmap.map
             , title: CGName
             , icon: icon
            });

            var html = '<div class="gmpopup"><table><tr><td valign="top"><img class="pngHck" src="' + CGIcon.replace('/symbols/', '/symbols/key/') + '"></td>';
            html += '<td>' + CGDetails + '</td></tr></table></div>';
            marker.jh_html = html;

            google.maps.event.addListener(marker, 'click', function () {
                searching.gmap.infoWindow.setContent(this.jh_html);
                searching.gmap.infoWindow.open(searching.gmap.map, this);
            });

            /*
            map.addOverlay(createMarker(point, icon, CGName, itm));
            if (itm == 0) {
            if (getElementsByClassName(CGItems[itm], 'CGNoPopup')[0]) {
            } else {
            var html = '<table><tr><td valign="top"><img class="pngHck" src="' + getElementsByClassName(CGItems[itm], 'CGIcon')[0].innerHTML.replace('/symbols/', '/symbols/key/') + '"></td>';
            html += '<td>' + getElementsByClassName(CGItems[itm], 'CGDetails')[0].innerHTML + '</td></tr></table>';
            map.openInfoWindowHtml(point, '<div class="gmpExplore">' + html + '<\/div>');
            }
            */
        }
    });

}

searching.gmap.getMapState = function () {
    if (searching.gmap.map) {
        var iniType='C';
        var iniCode = searching.gmap.infoWindowCottageCode;
        var thisLat = searching.gmap.map.getCenter().lat();
        var thisLon = searching.gmap.map.getCenter().lng();
        var thisZoom = searching.gmap.map.getZoom();
        return iniType + ',' + iniCode + ',' + thisLat + ',' + thisLon + ',' + thisZoom;
    } else {
        return '';
    }
}
searching.gmap.setMapState = function (state) {
    if (searching.gmap.map) {
        
        var S_mapState = state.split(',');
        iniType = S_mapState[0];
        iniCode = S_mapState[1];
        thisLat = parseFloat(S_mapState[2]);
        thisLon = parseFloat(S_mapState[3]);
        thisZoom = parseInt(S_mapState[4]);
        var latlng = new google.maps.LatLng(thisLat, thisLon);
        searching.gmap.map.setCenter(latlng);
        searching.gmap.map.setZoom(thisZoom);
        searching.gmap.infoWindowCottageCode = iniCode;

    }
}


searching.gmap.loadTheMap = function () {

    var thisLat, thisLon, thisZoom;
    iniType = '';
    iniCode = '';
    thisLat = iniLat();
    thisLon = iniLng();
    thisZoom = iniZoom();

    //initialize the map
    var mapElement = document.getElementById('gmap');
    var latlng = new google.maps.LatLng(thisLat, thisLon);
    var myOptions = { zoom: thisZoom, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP, scrollwheel: false };
    searching.gmap.map = new google.maps.Map(mapElement, myOptions);

    //initialize the icon
    searching.gmap.baseIcon = new google.maps.MarkerImage('http://www.classic.co.uk/media/symbols/cottage.png', new google.maps.Size(23, 31), new google.maps.Point(0, 0), new google.maps.Point(2, 31));

    //initialise the info window.
    searching.gmap.infoWindow = new google.maps.InfoWindow({ content: "holding..." });

    /*searching.gmap.baseIcon = new google.maps.MarkerImage();
    searching.gmap.baseIcon.image = 'http://www.classic.co.uk/media/symbols/cottage.png';
    searching.gmap.baseIcon.shadow = 'http://www.classic.co.uk/media/symbols/shadow.png';
    searching.gmap.baseIcon.iconSize = new google.maps.Size(23, 31);
    searching.gmap.baseIcon.shadowSize = new google.maps.Size(30, 31);
    searching.gmap.baseIcon.iconAnchor = new google.maps.Point(2, 31);
    searching.gmap.baseIcon.infoWindowAnchor = new google.maps.Point(2, 31);*/

   

}

searching.gmap.linkToCottagesByRegion = function () {
    /*Create the switch to region view control*/
    var ctlDiv = document.createElement('DIV');
    var ctl = new searching.gmap.switchViewControl(ctlDiv, searching.gmap.map);
    ctlDiv.index = 1;
    searching.gmap.map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(ctlDiv); 
}

searching.gmap.recordChangeInMapState = function () {
    console.log('recordChangeInMapState');
    var requestedState = searching.common.getApplicationState();
    searching.browse.noHashChange = true;
    jQuery.History.go(requestedState);
}

searching.gmap.cottageMarker = function (cottage) {
    var myLatLng = new google.maps.LatLng(parseFloat(cottage.getAttribute('lat')), parseFloat(cottage.getAttribute('lon')));
    var marker = new google.maps.Marker({
        position: myLatLng
             , map: searching.gmap.map
             , title: cottage.getAttribute('name') + ' - ' + cottage.getAttribute('towndis')
             , icon: searching.gmap.baseIcon
    });
    var cottageURL = '/cottage.aspx?code=' + cottage.getAttribute('code');
    marker.jh_html = '<div class=gmpopup>' + '<img class="thmb" src="' + cottage.getAttribute('picURL') + '"><div class="poText"><a class="cName" href="' + cottageURL + '">' + cottage.getAttribute('name') + '</a><br/>' + cottage.getAttribute('accom') + '<br/><br/><a class="more" href="' + cottageURL + '">More information</a>' + '</div></div>';
    marker.jh_type = cottage.getAttribute('type');
    marker.jh_code = cottage.getAttribute('code');
    marker.jh_town = cottage.getAttribute('town');
    marker.disableEvents = false;

    google.maps.event.addListener(marker, 'click', function () {
        searching.gmap.infoWindow.setContent(this.jh_html);
        searching.gmap.infoWindow.open(searching.gmap.map, this);
        searching.gmap.infoWindowCottageCode = marker.jh_code;
        if (!marker.disableEvents) {
            console.log('marker clicked by user');
            searching.gmap.recordChangeInMapState();
        } else {
            console.log('marker click instigated by system');
        }
    });
    return marker;
}

searching.gmap.showMarkers = function (cottages, complexes) {

    if (searching.gmap.markerCluster) {
        searching.gmap.markerCluster.clearMarkers();
    }

    searching.gmap.vMarkers = new Array();

    for (var i = 0; i < cottages.length; i++) {
        var marker = searching.gmap.cottageMarker(cottages[i]);
        searching.gmap.vMarkers.push(marker);
    }

    for (var i = 0; i < complexes.length; i++) {
        var marker = searching.gmap.cottageMarker(complexes[i]);
        searching.gmap.vMarkers.push(marker);
    }

    if (searching.gmap.vMarkers.length > searching.gmap.minCottagesToCluster) {
        searching.gmap.markerCluster = new MarkerClusterer(searching.gmap.map, searching.gmap.vMarkers, {
            maxZoom: 9,
            gridSize: 25
        });
    }

    if (searching.gmap.infoWindowCottageCode != 0) {
        for (var i = 0; i < searching.gmap.vMarkers.length; i++) {
            var marker = searching.gmap.vMarkers[i];
            if (marker.jh_code == searching.gmap.infoWindowCottageCode) {
                marker.disableEvents = true;
                google.maps.event.trigger(marker, 'click');
                marker.disableEvents = false;
            }
        }
    }

}

searching.gmap.switchViewControl = function (controlDiv, map) {
    controlDiv.style.padding = '5px';
    var controlUI = document.createElement('DIV');
    controlUI.style.backgroundColor = 'white';
    controlUI.style.borderStyle = 'none';
    controlUI.style.borderWidth = '2px';
    controlUI.style.cursor = 'pointer';
    controlUI.style.textAlign = 'center';
    controlUI.title = 'Click to set the map to Home';
    controlDiv.appendChild(controlUI);
    var controlText = document.createElement('DIV');
    controlText.style.fontSize = '12px';
    controlText.style.paddingLeft = '4px';
    controlText.style.paddingBottom = '2px';
    controlText.style.paddingRight = '4px';
    controlText.style.textDecoration = 'underline';
    controlText.innerHTML = 'View cottages by region &gt;';
    controlUI.appendChild(controlText);
    google.maps.event.addDomListener(controlUI, 'click', function () {
        document.getElementById('hdnView').value = '';
        document.forms[0].submit();
    });
}


/*Quick Search*/
searching.quikSearch.pageLoad = function () {
    searching.quikSearch.showSearch(searching.common.getApplicationState());
}

searching.quikSearch.exists = function () {
    return (document.getElementById('cottageCount') != null);
}

searching.quikSearch.showSearch = function (requestedState) {

    jQuery.ajax({
        url: "/feeds/resultsFeed.aspx?type=noCottages&" + requestedState,
        success: function (xmlDoc) {
            var results = xmlDoc.getElementsByTagName('regions')[0];
            var error = xmlDoc.getElementsByTagName('error')[0];
            if (error || !results) {
                /*ToDo: Error handling
                if (error){
                $('cottagesByRegion_Error').innerHTML=error.getAttribute('message');
                }else{
                $('cottagesByRegion_Error').innerHTML='Problem searching, please try again...';
                }
                if($('sProgress')){
                $('sProgress').innerHTML='Sorry, we could not perform your search. Please refer to the message above.';
                $('sNote').style.display='none';
                }*/
            } else {
                if (results.getAttribute('west') == 0) {
                    /*ToDo: Zero result handling
                    $('cottagesByRegion_Results').style.display='none';
                    $('cottagesByRegion_Error').style.display='block';
                    $('cottagesByRegion_Error').innerHTML='Unfortunately no holiday cottages are available that fulfill your search requirements. You can try widening your search options or you can <a target="_parent" href="/my-classic/myclassic2.aspx">register here</a> to be notified when new cottages matching your requirements are added to our portfolio.';
                    if($('sProgress')){
                    $('sProgress').innerHTML='We\'ve got no holiday cottages match your search criteria, try widening your options.';
                    $('sNote').style.display='none';
                    }*/
                } else {
                    jQuery('#cottageCount').text(results.getAttribute('west'));
                }
            }
        }
    })

}

searching.quikSearch.controlChange = function () {
    searching.forms.showRelevantDateSelectors();
    searching.quikSearch.showSearch(searching.common.getApplicationState());
}
/*End Quick Search*/

searching.results.pendingUpdate = false;
searching.results.noHashChange = false;
searching.results.numberOfPages = 0;

searching.results.exists = function () {
    return (searching.forms.searchMode() == 'results');
}

searching.results.pageLoad = function () {
    console.log('searching.results.pageLoad');
    if (location.hash) {
        var requestedState = location.hash.replace('#/', ''); ;
        searching.results.update(requestedState);
    } else if (searching.forms.controlsModifiedSinceLoad()) {
        searching.results.controlChange();
    } else if (searching.forms.controlsNotDefault()) {
        searching.browse.switchToAsyncMode();
    }

    jQuery(".listNavigation .showMore").click(function (e) {
        e.preventDefault();
        if (!jQuery(this).hasClass('inActive')) {
            searching.results.loadMoreResults();
        }
    });

    jQuery("fieldset.extendedSearch div.collapse").each(function (index) {
        searching.forms.onContractSection(jQuery(this));
    });

    searching.forms.highlightNonDefaultControls();

}

searching.results.regionChange = function () {
    console.log('searching.results.regionChange');
    searching.common.cottageListHidden(true);
    jQuery('#hdnPageNumMin').val(1);
    jQuery('#hdnPageNumMax').val(1);
    var requestedState = searching.common.getApplicationState();
    searching.results.update(requestedState);
}

searching.results.pageNumChange = function () {
    console.log('searching.results.pageNumChange');
    searching.common.justCottageListHidden(true);
    var requestedState = searching.common.getApplicationState();
    searching.results.update(requestedState);
}

searching.results.loadMoreResults = function () {
    console.log('searching.results.loadMoreResults');
    searching.results.switchToAsyncMode();

    var newPageNum = parseInt(jQuery('#hdnPageNumMax').val()) + 1;
    jQuery('#hdnPageNumMax').val(newPageNum);

    var requestedState = searching.common.getApplicationState();

    //Save the resultant state in the hash without raising the hashChangeEvent.
    searching.results.noHashChange = true;
    jQuery.History.go(requestedState);
    
    //Load in the next list of cottages
    //The current state of the applciation is reflected by requestedState, but all we want from the results server is the next n cottages.
    //-->We manipulate pMin and pMax in requested state.
    var htParams = searching.common.queryStringToArray(requestedState);
    var pageMinDisplayed = htParams["pMin"];
    var pageMaxDisplayed = htParams["pMax"];
    htParams["pMin"] = (htParams["pMax"]);
    requestedState = searching.common.arrayToQueryString(htParams);
    jQuery.ajax({
        url: "/feeds/resultsFeedHTML.aspx?" + requestedState,
        success: function (xmlDoc) {
            var parent = document.getElementById('Results');

            var listItems = xmlDoc.getElementsByTagName('listItem');
            for (var i = 0; i < listItems.length; i++) {
                var listItem = listItems[i];

                var liNew = document.createElement('li');
                liNew.innerHTML = searching.common.htmlDecode(listItem.getAttribute('html'));

                parent.appendChild(liNew);
            }
            var description = xmlDoc.getElementsByTagName('description')[0];
            searching.results.updatePagingToolbars(pageMinDisplayed, pageMaxDisplayed, parseInt(description.getAttribute('maxPages')));
            searching.results.noHashChange = false;
        }
    });

}

searching.results.controlChange = function (ctl) {
    console.log('searching.results.controlChange: ' + jQuery(ctl).attr('id'));
    searching.forms.showRelevantDateSelectors();
    searching.common.cottageListHidden(true);
    searching.common.regionListHidden(true);
    jQuery('#hdnPageNumMin').val(1);
    jQuery('#hdnPageNumMax').val(1);

    var requestedState = searching.common.getApplicationState();
    searching.results.update(requestedState);
}


searching.results.update = function (requestedState) {
    
    searching.results.switchToAsyncMode();

    console.log('State sent to history.go, state:' + requestedState);
    searching.results.pendingUpdate = true;
    
    searching.results.noHashChange = false;
    jQuery.History.go(requestedState);

    /*
        In general History.go causes the function specified in History.bind to fire which in turn fires showSearch().
        However on navigating back from another page this does not appear to work, so we use pendingUpdate to track if it has run and if not, we run it here!
    */
    setTimeout(function () {
        if (searching.results.pendingUpdate) {
            searching.results.showSearch(requestedState);
        }
    }, 500);

    
}


searching.results.showSearch = function (requestedState) {

    searching.results.pendingUpdate = false;
    console.log('searching.results.showSearch');
    searching.common.resultsHidden(true);

    jQuery.ajax({
        url: "/feeds/resultsFeedHTML.aspx?" + requestedState,
        success: function (xmlDoc) {

            var description = xmlDoc.getElementsByTagName('description')[0];
            var results = xmlDoc.getElementsByTagName('regions')[0];

            //Update the regional results counters.
            searching.common.updateResultsByRegion(xmlDoc);

            //Show expansion options from 0 results..
            if (description.getAttribute('zeroExpansion')) {
                jQuery(".zeroExpansion").html(description.getAttribute('zeroExpansion'));
            } else {
                jQuery(".zeroExpansion").empty();
            }

            //Highlight the selected region.
            var regionCode = description.getAttribute('regionCode').toLowerCase();
            jQuery("ul#cottagesByRegion li span").removeClass('regionSel');
            jQuery("ul#cottagesByRegion li#li_" + regionCode).find('span').addClass('regionSel');

            //Update the title.
            jQuery(".resultsTitle").html(description.getAttribute('resultsTitle'))

            //Update paging toolbars.
            var pageMin = parseInt(description.getAttribute('pageNumberMin'));
            var pageMax = parseInt(description.getAttribute('pageNumberMax'));
            searching.results.numberOfPages = parseInt(description.getAttribute('maxPages'));
            searching.results.updatePagingToolbars(
                pageMin
                , pageMax
                , searching.results.numberOfPages
            );

            //Update breadcrumb lists and rebind event handlers.
            jQuery('.breadcrumbTrail').html(description.getAttribute('breadcrumbTrail'));
            jQuery(".crmbRegion").click(function (e) {
                e.preventDefault();
                var regionCode = jQuery(this).attr('id').replace('crmbRegion_', '');
                searching.results.regionClick(regionCode);
            });

            jQuery('#pnlFeaturedSearch').toggle(false);
            jQuery('#pnlFeaturedSearch2').toggle(false);
            jQuery('#customFeaturedSearch').toggle(true);
           
            //Update the list of cottages.
            jQuery("ul#Results").empty();
            var parent = document.getElementById('Results');

            var listItems = xmlDoc.getElementsByTagName('listItem');
            for (var i = 0; i < listItems.length; i++) {
                var listItem = listItems[i];

                var liNew = document.createElement('li');
                liNew.innerHTML = searching.common.htmlDecode(listItem.getAttribute('html'));

                parent.appendChild(liNew);
            }

            //Make results visible.
            searching.common.regionListHidden(false);
            searching.common.cottageListHidden(false);
            searching.common.resultsHidden(false);
            searching.common.justCottageListHidden(false);

            //Always show the footer.
            searching.results.alwaysShowFooter();

            //Highlight non-default values in the UI
            searching.forms.highlightNonDefaultControls();
        }
    });
}

searching.results.updatePagingToolbars = function (pageNumberMin, pageNumberMax, maxPages) {
    //Update the paging toolbar.
    var nextEnabled = false;
    var prevEnabled = false;
    var showAllEnabled = false;
    var showMoreEnabled = false;
    if (maxPages == 0) {
        jQuery(".listNavigation .nowShowing").text("Page 0 of 0");
    } else {
        if (pageNumberMin == 0) {
            jQuery(".listNavigation .nowShowing").text("All results");
            jQuery(".listNavigation .showAll").text("Show in pages");
            showAllEnabled = true;
        } else {
            if (pageNumberMin != pageNumberMax) {
                jQuery(".listNavigation .nowShowing").text("Pages " + pageNumberMin + " to " + pageNumberMax + " of " + maxPages);
            } else {
                jQuery(".listNavigation .nowShowing").text("Page " + pageNumberMin + " of " + maxPages);
            }
            jQuery(".listNavigation .showAll").text("Show all");
            nextEnabled = (pageNumberMin < maxPages);
            prevEnabled = (pageNumberMin > 1);
            showAllEnabled = (maxPages > 1);
            showMoreEnabled = (maxPages > pageNumberMax);
        }
    }
    jQuery(".listNavigation .next").toggleClass('inActive', !nextEnabled);
    jQuery(".listNavigation .prev").toggleClass('inActive', !prevEnabled);
    jQuery(".listNavigation .showAll").toggleClass('inActive', !showAllEnabled);
    jQuery(".listNavigation .showMore").toggleClass('inActive', !showMoreEnabled);
}


searching.results.alwaysShowFooter = function () {
    var ScrollingDiv = jQuery("#alwaysVisible");
    var endOfCottageListOffset = jQuery("#endOfCottageList").offset();
    if (jQuery(window).scrollTop() > endOfCottageListOffset.top) {
        ScrollingDiv.css("top", "0");
        ScrollingDiv.css("position", "fixed");
    }
    if (jQuery(window).scrollTop() <= endOfCottageListOffset.top) {
        ScrollingDiv.css("top", "");
        ScrollingDiv.css("position", "");
        ScrollingDiv.css("margin-top", "20px");
    }
}

searching.results.switchToAsyncMode = function () {

    console.log('searching.results.switchToAsyncMode');

    if (searching.common.asyncMode != true) {

        jQuery.History.bind(function (state) {
            if (searching.results.noHashChange) {
                console.log('searching.results.showSearch: hashChange event is disabled.');
            } else {
                console.log('Event raised from history, state:' + state);
                if (state.length == 0) {
                    //fixes "back" bug past start of history, think of as an exit from the applciation / transition back into paging behaviour.
                    location.reload(true);
                }
                searching.results.showSearch(state);
                searching.common.setApplicationState(state);
            }

        });

        jQuery('#pnlRegionAbout').empty();
        

        jQuery("ul#cottagesByRegion li a").click(function (e) {
            e.preventDefault();
            var regionCode = jQuery(this).attr('id').replace('a_', '');
            searching.results.regionClick(regionCode);
        });

        jQuery(".crmbRegion").click(function (e) {
            e.preventDefault();
            var regionCode = jQuery(this).attr('id').replace('crmbRegion_', '');
            searching.results.regionClick(regionCode);
        });

        jQuery(".listNavigation .next").click(function (e) {
            e.preventDefault();
            if (!jQuery(this).hasClass('inActive')) {
                var newPageNum = parseInt(jQuery('#hdnPageNumMax').val()) + 1;
                if (newPageNum <= searching.results.numberOfPages) {
                    jQuery('#hdnPageNumMin').val(newPageNum);
                    jQuery('#hdnPageNumMax').val(newPageNum);
                    searching.results.pageNumChange();
                }
            }
        });
        jQuery(".listNavigation .prev").click(function (e) {
            e.preventDefault();
            if (!jQuery(this).hasClass('inActive')) {
                var newPageNum = parseInt(jQuery('#hdnPageNumMin').val()) - 1;
                jQuery('#hdnPageNumMin').val(newPageNum);
                jQuery('#hdnPageNumMax').val(newPageNum);
                searching.results.pageNumChange();
            }
        });
        jQuery(".listNavigation .showAll").click(function (e) {
            e.preventDefault();
            if (!jQuery(this).hasClass('inActive')) {
                var newPageNum = jQuery('#hdnPageNumMin').val() == 0 ? 1 : 0;
                jQuery('#hdnPageNumMin').val(newPageNum);
                jQuery('#hdnPageNumMax').val(newPageNum);
                searching.results.pageNumChange();
            }
        });

        searching.common.asyncMode = true;
    }
}

searching.results.regionClick = function (regionCode) {
    if (searching.common.getRegionCount(regionCode) != 0) {
        jQuery('#hdnArea').val(regionCode);
        searching.results.regionChange();
    }
}


searching.featuredSearch.slideDuration = 800;

searching.featuredSearch.exists = function () {
    return (jQuery('#fsSidebar').length > 0);
}

searching.featuredSearch.pageLoad = function () {
    jQuery("#fsSidebar").click(function () {
        searching.featuredSearch.expandSidebar();
    });
    jQuery("#fsClose").click(function (event) {
        searching.featuredSearch.contractSidebar();
        event.stopPropagation();
    });
}
searching.featuredSearch.expandSidebar = function () {
    jQuery("#fsShowReadMore").toggle(false);
    jQuery("#fsImage").animate(
                        { width: '0px' }
                        , searching.featuredSearch.slideDuration
                    );
    jQuery("#fsSidebar").animate(
		                { width: '680px' }
                        , searching.featuredSearch.slideDuration
                        , function () {
                            jQuery("#fsClose").toggle(true);
                        }
                    );
};
searching.featuredSearch.contractSidebar = function () {
    jQuery("#fsClose").toggle(false);
    jQuery("#fsImage").animate(
                        { width: '500px' }
                        , searching.featuredSearch.slideDuration
                    );
    jQuery("#fsSidebar").animate(
                        { width: '205px' }
                        , searching.featuredSearch.slideDuration
                        , function () {
                            jQuery("#fsShowReadMore").toggle(true);
                        }
                    );
};


//Stuff to do on load:
searching.forms.bindEvents();
if (searching.quikSearch.exists()) {
    searching.quikSearch.pageLoad();
}
if (searching.browse.exists()) {
    searching.browse.pageLoad();
}
if (searching.results.exists()) {
    searching.results.pageLoad();
}

if (searching.shortlist.exists()) {
    searching.shortlist.pageLoad();
}
if (searching.featuredSearch.exists()) {
    searching.featuredSearch.pageLoad();
}

function isInteger(s) {
		return (s.toString().search(/^-?[0-9]+$/) == 0);
}

function describeSearchOptions(minParty,minPets,suitChildrenAgedFrom,suitChildrenAgedTo,locations,datFrom,datTo){
	var searchDescription='';
	var isDefault=true;
	
	//Party and Pets.
	if (minParty>0){
		isDefault=false;
		searchDescription+='For a party of ' + minParty;
		searchDescription += (minParty>1)?' people':' person';
		if (minPets>0){
			searchDescription+= ' and ' + minPets + ' pet';
			searchDescription+= (minPets>1)?'s':''
		}	
		searchDescription+='. '
	}else{
		if (minPets>0){
			isDefault=false;
			searchDescription+='Suitable for ' + minPets + ' pet' + ((minPets>1)?'s':'') + '. ';
		}
	}
	
	//Children Age restrictions.
	if (suitChildrenAgedFrom != 0 || suitChildrenAgedTo != 0){
		isDefault=false;
		if (suitChildrenAgedFrom != 0 && suitChildrenAgedTo != 0 && suitChildrenAgedFrom != suitChildrenAgedTo){
			searchDescription+='For children aged from ' + suitChildrenAgedFrom + ' to ' + suitChildrenAgedTo;
		}else if(suitChildrenAgedFrom == suitChildrenAgedTo){
			searchDescription+='For children aged ' + suitChildrenAgedFrom;
		}else if(suitChildrenAgedFrom != 0){
			searchDescription+='For children aged ' + suitChildrenAgedFrom;
		}else if(suitChildrenAgedTo != 0 ){
			searchDescription+='For children aged ' + suitChildrenAgedTo;			
		}
		searchDescription+='. '
     }

     //Locations: passed in as array of strings.
	 if (locations.length>0 && locations.length<4){
		isDefault=false;
		searchDescription+='In ' + locations[0];
		for (var i=1;i<locations.length-1;i++){
			searchDescription+= ', ' + locations[i];
		}
		if (locations.length>1){
			searchDescription += ' or ' + locations[locations.length-1];
		}
		searchDescription += '. '
	 }
	
	 //Date range.
	 if(datFrom && datTo){
		if (datFrom!=0 && datTo!=0){
			if (!isNaN(datFrom) && !isNaN(datTo)){
				searchDescription += 'Available in ' + datFrom + '.';
			}else{
				isDefault=false;
				if (!isNaN(datFrom)){
					datFrom='1 Jan ' + datFrom;
				}
				if (!isNaN(datTo)){
					datTo='31 Dec ' + datTo;
				}
				searchDescription += 'Available between ' + datFrom + ' and ' + datTo + '.';
			}
		}
	 }
     if (isDefault){
		searchDescription='How many people are going? Where do you want to go? When do you want to come? Give us your requirements and we will only alert you about properties that suit you.'
		$('expandRequirements').innerHTML='Tell us your requirements &gt;';
     }else{
		$('expandRequirements').innerHTML='Amend requirements &gt;';
     }
     return searchDescription;
}

//Sync holiday inspiration.
function sync(srcControl, dstControl, raiseOnChange) {
    if (srcControl && dstControl) {
        dstControl.value = srcControl.value;
        if (raiseOnChange) {
            dstControl.onchange();
        }
    }
}



if(typeof scriptLoaded == 'function'){scriptLoaded('/searching.js')};
