﻿/*************************/
/* Auto-Complete Scripts */
/*************************/
var CitiesXhr = {
    oACDS: null,
    oAutoComp: null,
    res: null,
    getCities: function() {
        return CitiesXhr.res.Utility.Cities;
    },
    handleSuccess: function(o) {
        // Instantiate JS Function DataSource
        CitiesXhr.res = YAHOO.lang.JSON.parse(o.responseText);
        // add recent searches
        var recentSearches = YAHOO.util.Cookie.get("RS");
        if (recentSearches) {
            var rs = recentSearches.split('|');
            CitiesXhr.res.Utility.Cities = CitiesXhr.res.Utility.Cities.concat(rs);
        }
        CitiesXhr.buildAutoComplete();
    },
    buildAutoComplete: function() {
        CitiesXhr.oACDS = new YAHOO.widget.DS_JSArray(CitiesXhr.res.Utility.Cities);
        CitiesXhr.oACDS.queryMatchContains = true;
        CitiesXhr.oACDS.queryMatchSubset = true;
        // Instantiate AutoComplete
        CitiesXhr.oAutoComp = new YAHOO.widget.AutoComplete('search-main', 'searchListingQueryContainer', CitiesXhr.oACDS);
        CitiesXhr.oAutoComp.minQueryLength = 1;
        CitiesXhr.oAutoComp.typeAhead = false;
        CitiesXhr.oAutoComp.formatResult = function(aResultItem, sQuery) {
            var sKey = aResultItem[0]; // the entire result key
            var mKey = aResultItem[0].toLowerCase();
            var mQuery = sQuery.toLowerCase();
            var begin = mKey.indexOf(mQuery) + 0;
            var end = mKey.indexOf(mQuery) + mQuery.length;
            var sKeyPre = (begin == 0) ? "" : sKey.substring(0, begin);
            var sKeyQuery = sKey.substring(begin, (end)); // the query itself
            var sKeyPost = sKey.substr(end); // the rest of the result
            var aMarkup = ["<div>",
              sKeyPre,
              "<span style='font-weight:bold'>",
              sKeyQuery,
              "</span>",
              sKeyPost,
              "</div>"];
            return (aMarkup.join(""));
        };
    },
    handleFailure: function(o) {
        //alert("No Xhr Response");
    },
    startRequest: function() {
        YAHOO.util.Connect.asyncRequest('POST', CONST_XHR_PATH + "cities.utility", citiesAsync, "");
    },
    rebuildCities: function(newVal) {
        CitiesXhr.res.Utility.Cities = CitiesXhr.res.Utility.Cities.concat(newVal);
        CitiesXhr.buildAutoComplete();
    }
};
var citiesAsync = {
    success: CitiesXhr.handleSuccess,
    failure: CitiesXhr.handleFailure,
    scope: CitiesXhr
};

/****************************/
/* Search Options Scripts   */
/****************************/
var optionsOpen = null;
var optionsClose = null;
var errorOpen = null;
var errorClose = null;
YAHOO.util.Event.onContentReady("search-options", function() {
    optionsOpen = new YAHOO.util.Anim('search-options');
    optionsOpen.attributes.height = { to: 149 };
    optionsOpen.duration = 0.5;
    optionsOpen.method = YAHOO.util.Easing.easeOut;

    optionsClose = new YAHOO.util.Anim('search-options');
    optionsClose.attributes.height = { to: 1 };
    optionsClose.duration = 0.5;
    optionsClose.method = YAHOO.util.Easing.easeOut;
}, this);

YAHOO.util.Event.onContentReady("search-error", function() {
    errorOpen = new YAHOO.util.Anim('search-error');
    errorOpen.attributes.height = { to: 66 };
    errorOpen.duration = 0.5;
    errorOpen.method = YAHOO.util.Easing.easeOut;

    errorClose = new YAHOO.util.Anim('search-error');
    errorClose.attributes.height = { to: 1 };
    errorClose.duration = 0.5;
    errorClose.method = YAHOO.util.Easing.easeOut;
}, this);

var isHomePage;
var isSearchPage;
var mlsChecked;
var searchObj;

/*
Main function for submit on home page
*/
function validateSearchListingQuery() {
    isHomePage = (location.pathname == '/' || location.pathname.toLowerCase() == '/default.aspx') ? true : false;
    isSearchPage = (location.pathname.toLowerCase() == '/views/listings/' || location.pathname.toLowerCase() == '/views/listings/default.aspx') ? true : false;
    mlsChecked = (jQuery('#options-mls-checkbox').val() == '1') ? true : false;

    var v = jQuery('#search-main').val();
    if (!isHomePage) jQuery('#search-listings-btn').removeClass('btn-search').addClass('btn-search-loading');

    if (v == defaultSearchText)
        return false;
    else if (mlsChecked)
        MLSCall(v);
    else {
        searchObj = (isHomePage) ? BuildSearchFromHome(v) : BuildSearchFromOther(v);
        if (isSearchPage) IDXCall(searchObj, function() { RedoSearch(v); });
        else IDXCall(searchObj, function() { ListingRedirect(v); });
    }
}

function BuildSearchFromHome(inputField) {
    var address = processAddressInput(inputField);
    var SearchParms = {
        City: address.city,
        Zipcode: address.postalCode,
        State: address.state,
        MinPrice: getNum('input-price-from'),
        MaxPrice: getNum('input-price-to'),
        MinBedrooms: getSel('input-button-beds-button'),
        MinBathrooms: getSel('input-button-baths-button')
    }
    switch (jQuery('#input-button-property-type-button').text()) {
        case 'Single-Family': SearchParms.SingleFamily = true; break;
        case 'Multi-Family': SearchParms.MultiFamily = true; break;
        case 'Townhouse': SearchParms.TownHouse = true; break;
        case 'Condo': SearchParms.Condo = true; break;
        case 'Co-op': SearchParms.Coop = true; break;
        case 'Farm': SearchParms.Farm = true; break;
        case 'Land': SearchParms.Land = true; break;
    }
    return SearchParms;

    function getNum(id) {
        val = Number(jQuery('#' + id).val().replace(/\D/g, ''));

        if (!isNaN(val) && val != 0) return String(val);
        else return null;
    }

    function getSel(id) {
        val = jQuery('#' + id).text();

        if (val == 'Any') return null;
        else return val.charAt(0);
    }
}

function BuildSearchFromOther(inputField) {
    var address = processAddressInput(inputField);
    var SearchParms = {
        City: address.city,
        Zipcode: address.postalCode,
        State: address.state
    }
    jQuery('#searchListingForm input:hidden').each(function() {
        var obj = jQuery(this);
        if (obj.val() != null && obj.val() != '')
            switch (obj.attr('id')) {
                case 'type-single': SearchParms.SingleFamily = true; break;
                case 'type-multi': SearchParms.MultiFamily = true; break;
                case 'type-townhouse': SearchParms.TownHouse = true; break;
                case 'type-condo': SearchParms.Condo = true; break;
                case 'type-coop': SearchParms.Coop = true; break;
                case 'type-farm': SearchParms.Farm = true; break;
                case 'type-land': SearchParms.Land = true; break;
                case 'bed-count': SearchParms.MinBedrooms = obj.val(); break;
                case 'bath-count': SearchParms.MinBathrooms = obj.val(); break;
                case 'options-open': SearchParms.OpenHousesOnly = true; break;
                case 'options-just': SearchParms.JustListedOnly = true; break;
                case 'form-home-age-max': SearchParms.MaxAge = obj.val(); break;
                case 'form-home-age-min': SearchParms.MinAge = obj.val(); break;
                case 'search-min-price': SearchParms.MinPrice = obj.val(); break;
                case 'search-max-price': SearchParms.MaxPrice = obj.val(); break;
                case 'search-min-lot': SearchParms.MinFootage = obj.val(); break;
                case 'search-max-lot': SearchParms.MaxFootage = obj.val(); break;
            }
    });
    return SearchParms;
}

function ListingRedirect(inputField) {
    var loc = CONST_BASE_PATH + 'Views/Listings/Default.aspx#s=';
    loc += "search-main=" + inputField;
    if (searchObj.MinPrice != null) loc += '|search-min-price=' + searchObj.MinPrice;
    if (searchObj.MaxPrice != null) loc += '|search-max-price=' + searchObj.MaxPrice;
    if (searchObj.MinBedrooms != null) loc += '|bed-count=' + searchObj.MinBedrooms;
    if (searchObj.MinBathrooms != null) loc += '|bath-count=' + searchObj.MinBathrooms;
    if (searchObj.SingleFamily) loc += '|type-single=1';
    if (searchObj.MultiFamily) loc += '|type-multi=1';
    if (searchObj.TownHouse) loc += '|type-townhouse=1';
    if (searchObj.Condo) loc += '|type-condo=1';
    if (searchObj.Coop) loc += '|type-coop=1';
    if (searchObj.Farm) loc += '|type-farm=1';
    if (searchObj.Land) loc += '|type-land=1';
    if (searchObj.OpenHousesOnly) loc += '|options-open=1';
    if (searchObj.JustListedOnly) loc += '|options-just=1';
    if (searchObj.MaxAge) loc += '|form-home-age-max=' + searchObj.MaxAge;
    if (searchObj.MinAge) loc += '|form-home-age-min=' + searchObj.MinAge;
    if (searchObj.MinFootage) loc += '|search-min-lot=' + searchObj.MinFootage;
    if (searchObj.MaxFootage) loc += '|search-max-lot=' + searchObj.MaxFootage;
  
    window.location = loc;
}

function DetailRedirect(listingID) {
    window.location = CONST_BASE_PATH + 'Views/Listings/Detail.aspx?listingId=' + listingID;
}

function MLSCall(mlsID) {
    var jParms = jQuery.toJSON({ 'MlsId': mlsID });
    jQuery.getJSON(CONST_XHR_PATH + "search.mls", { 'mls_json': jParms }, function(jsonBack) {
        if (jsonBack.Results.length == 0) {
            if (isSearchPage) badMLS();
            else window.location = CONST_BASE_PATH + "Views/Listings/Default.aspx#s=search-main=" + String(mlsID) + "|mls-error=1";
        }
        else if (jsonBack.Results.length > 1) {
            var modalBody = [];
            modalBody[0] = '<div class="mls-message">The MLS # provided is shared with multiple listings. Please select the listing you are searching for below.</div>';
            modalBody[modalBody.length] = '<ul class="bhg-dotted-border-list">';

            for (var i = 0; i < jsonBack.Results.length; i++) {
                var listing = jsonBack.Results[i];
                var addy = listing.City + ', ' + listing.State + ' ' + listing.PostalCode;
                var buildMLS = '<li><div class="mls-list-item container">';
                buildMLS += '<a href="#" id="mlsLink' + String(i) + '">';
                if (listing.DoNotDisplayAddress != true) buildMLS += listing.Street1 + ', ';
                buildMLS += addy + '</a></div></li>';
                modalBody[modalBody.length] = buildMLS;
            }
            modalBody[modalBody.length] = '</ul>';

            var modalSettings =
            {
                header: 'Multiple Listings Found',
                body: modalBody.join(''),
                createHandler: function(modal) {
                    for (var i = 0; i < jsonBack.Results.length; i++) {
                        var listing = jsonBack.Results[i];
                        var idxParms = {
                            MlsId: listing.MLSId,
                            ListingOfficeID: listing.ListingOfficeID
                        }
                        jQuery('#mlsLink' + String(i)).bind('click', { id: listing.ListingId, parms: idxParms }, function(e) {
                            IDXCall(e.data.parms, function() { DetailRedirect(e.data.id); });
                        });
                    }
                }
            };
            BHG.ModalFactory.create(modalSettings);
        }
        else {
            var listing = jsonBack.Results[0];
            var idxParms = {
                MlsId: listing.MLSId,
                ListingOfficeID: listing.ListingOfficeID
            }
            IDXCall(idxParms, function() { DetailRedirect(listing.ListingId); });
        }
    });
}

function IDXCall(idxParms, callBack) {
    if (idxParms.City != null) idxParms.City = idxParms.City.toLowerCase(); 
    var jParms = jQuery.toJSON(idxParms);
    jQuery.getJSON(CONST_XHR_PATH + "search.idx", { 'idx_json': jParms }, function(jsonBack) {
        if (jsonBack.IdxUrl != null) {
            jQuery('#conv-frame').attr('src', '/Views/Listings/Tracking.htm');
            pageTracker._trackPageview('search_redirect.html');
            showGoogleAdwords();
            window.location = jsonBack.IdxUrl;
        }
        else
            callBack();
    });
}

function showGoogleAdwords() {
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1036314621/?label=c9CNCOmdigEQ_c-T7gM&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1036623118/?label=n0UXCKzqfRCOuqbuAw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1050073483/?label=52BZCNeNbRCLs9v0Aw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1033998639/?label=Qr02CK-7dhCvoobtAw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1036963444/?label=8hOnCMyOfxD0nLvuAw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1035735903/?label=fGyWCIfOgQEQ36bw7QM&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1037263978/?label=8zjLCKqoggEQ6sjN7gM&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1038151687/?label=YCOmCJXaexCH4IPvAw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1049147956/?label=WQIwCPLmfhC09KL0Aw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1036354921/?label=KQewCMWXdxDpipbuAw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1036314261/?label=ra3fCI-digEQlc2T7gM&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1051541295/?label=WAZgCMuMeRCv_rT1Aw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1037246464/?label=H31dCND5axCAwMzuAw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1036627730/?label=GuMRCM7QhQEQkt6m7gM&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1051541205/?label=XbN1CKWNeRDV_bT1Aw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1035746237/?label=jER1CLHvfBC99_DtAw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1052679278/?label=6hLgCPzLcBDuuPr1Aw&amp;script=0";
    var googleImage = new Image(1, 1);
    googleImage.src = "http://www.googleadservices.com/pagead/conversion/1039544930/?label=1eyXCKagdxDi5NjvAw&amp;script=0";
}

jQuery(function() {
    CitiesXhr.startRequest();
    if (jQuery('#options-mls-checkbox').val() == '1')
        jQuery('#check-mls-checkbox').removeClass('unchecked').addClass('checked'); ;
});