﻿(function($) {

    // name spaces -> reflect file name jQuery.as24.
    $.as24 = $.as24 || {};

    // --- closure variables
    var pasQParam, curQParam, qsearch, srchObj, rchBtn, cntry, ajaxUrl, carSing, carPlu, onClckHand, qSearchBody, speechBalloon;
    var mkSel, mdSel, priceSel, regSel, kmSel, fuelSel, zipInp, radSel, zipc, wSiegl, cntLab, cntLabNr, cntLabTxt, defCarNr, key, zipIsSel;


    $.as24.homesearch = function(opts) {
        sett = $.extend(sett, opts);
        if ($.as24.defSearchParams) {
            sett = $.extend(sett, $.as24.defSearchParams);        
            initVars();
            bindEvents();
            speechBalloon = $(sett.speechBallSel);
            update();
        }
    };

    // --- default settings
    var sett = {
        ctry: '',
        ctryKey: 'cy',
        zipCKey: 'zipc',
        qKey: 'qKey',
        defUrlParams: [],
        speechBallSel: '#speechBalloonCounter'
    };


    // --- Initialize closure variables
    var initVars = function() {
        pasQParam = parseQuery(); // passed parameters
        cntry = sett.ctry ? sett.ctry : (pasQParam[sett.ctryKey] ? pasQParam[sett.ctryKey] : '');
        zipc = pasQParam[sett.zipCKey] ? pasQParam[sett.zipCKey] : cntry;
        ajaxUrl = sett.tCountUrl ? sett.tCountUrl : ajaxSett.url;
        carSing = _totalcountsingular ? _totalcountsingular : 'car';
        carPlu = _totalcountplural ? _totalcountplural : 'cars';
        key = sett.qKey;
        zipIsSel = false;
        // set references to the serch elemnts
        qsearch = $('#q-searchmask .q-search');
        qSearchBody = $('#q-searchmask .q-search-body-new');
        srchObj = {};
        srchObj['make'] = qsearch.find('#make-select select');
        srchObj['model'] = qsearch.find('#model-select select');
        srchObj['priceto'] = qsearch.find('#price-select select');

        var frReg = qsearch.find('#admission-select select');
        if (frReg.length > 0) srchObj['fregfrom'] = frReg;
        var milage = qsearch.find('#mileage-select select');
        if (milage.length > 0) srchObj['kmto'] = milage;

        srchObj['fuel'] = qsearch.find('#fuel-select select');
        srchObj['zip'] = qsearch.find('#zip-input input');
        srchObj['zipr'] = qsearch.find('#radius-select select');
        srchObj['sealc'] = qsearch.find('input:checkbox');

        cntLab = qsearch.find('.q-search-car-count');
        cntLabNr = cntLab.find('span:first-child');
        defCarNr = cntLabNr.html();
        cntLabTxt = cntLab.find('span:last-child');
        srchBtn = qsearch.find('div .herobtn');
        // get reference to the onclick handler 
        onClckHand = srchBtn.attr('onclick');
        // remove handlers
        srchBtn.attr('onclick', '');
        qSearchBody.attr('onkeypress', '');
    }

    // --- Binds events to the search control elements
    var bindEvents = function() {
        srchBtn.bind('click', function() {
            if (srchBtn.hasClass('herobtn-gray')) {
                offset = $(".herobtn-gray").width();
                offset = 196 + ((170 - offset) / 2) + offset;
                $("#speechBalloonCounter")[0].style.left = offset + "px";
                speechBalloon.show();
                $(".b-body-top-l")[0].style.height = $(".b-body-top-r").height() + "px";
            } else {
                onClckHand();
            }
        });
        qSearchBody.bind('keypress', function(e) {
            if (e.keyCode == 13) { srchBtn.triggerHandler('click'); e.preventDefault(); }
        });
        qsearch.find('select').bind('change', onChanged);
        srchObj['sealc'].bind('click', onChanged);
        srchObj['zip'].bind('keyup', function(e) {
            if (!srchObj['zipr'].is(':disabled') || zipIsSel) onChanged();
        })
    };

    // --- update the control with passed params
    var update = function() {
        $.each(pasQParam, function(key, arrVal) {
            if (arrVal.length > 0) {
                if (key == 'make') {
                    srchObj[key].val(arrVal[0])
                    srchObj[key].keyup();
                }
                else {
                    if (typeof srchObj[key] != 'undefined')
                        (key == 'sealc') ? srchObj[key].attr('checked', true) : srchObj[key].val(arrVal[0]);
                };
            }
        });
        onChanged();
    };

    // --- Utility functions


    // updates the counter label, manages the buton click event
    var updateTot = function(tCnt) {
        tCnt = tCnt ? tCnt : defCarNr;
        cntLabNr.html(tCnt);
        cntLabTxt.html(tCnt == '1' ? carSing : carPlu);
        $('.q-search-car-count').css('color', '#999999')
        window.setTimeout("$('.q-search-car-count').css('color', '')", 250);
        if (tCnt != '0') {
            srchBtn.removeClass('herobtn-gray').addClass('herobtn');
            speechBalloon.hide();
        }
        else {
            srchBtn.addClass('herobtn-gray').removeClass('herobtn');
        };
    };

    // handles the change of a query parameter
    var onChanged = function() {
        curQParam = setCurrQParam();
        if (serParams(curQParam).length > 0) {
            var defQParam = setDefQParam();
            curQParam = $.extend(defQParam, curQParam); // add default param
            if ((curQParam['priceto'] && parseInt(curQParam['priceto']) < 2000)) curQParam['priceFrom'] = [];
            ajaxSett.url = ajaxUrl + '?' + serParams(curQParam); // update ajax settings
            $.ajax(ajaxSett);
        }
        else {
            updateTot(defCarNr); // set default car number
        }
    };

    // converts the url serch query string to json object
    var parseQuery = function() {
        var ret = {}, searchQ = (window.location.search) ? $.parseQuery(window.location.search) : {};
        $.each(searchQ, function(par, val) {
            if (val) {
                var arr = $.isArray(val) ? val : val.split(',');
                ret[par] = arr.sort();
            }
        });
        return ret;
    };

    // sets query params according current selection
    var setCurrQParam = function() {
        curQParam = null;
        curQParam = {};
        zipIsSel = false;
        $.each(srchObj, function(k, obj) {
            switch (k) {
                case 'zip':
                    break;
                case 'zipr':
                    if (!obj.is(':disabled')) {
                        obj.val() != '0' ? curQParam[k] = [obj.val()] : '';
                        curQParam['zip'] = [srchObj['zip'].val()];
                        curQParam[sett.zipCKey] = [zipc];
                        zipIsSel = true;
                    }
                    break;
                case 'sealc':
                    obj.is(':checked') ? curQParam[k] = ['1'] : '';
                    break;
                default:
                    obj.val() != '0' ? curQParam[k] = [obj.val()] : '';
            }
        });
        return curQParam;
    }
    // sets default params
    var setDefQParam = function() {
        var defQP = {};
        $.each(sett.defUrlParams, function() {
            if (this.key) defQP[this.key] = [this.val];
        });
        defQP[sett.ctryKey] = [cntry];
        return defQP;
    }

    // converts a json object to a url search query 
    var serParams = function(param) {
        var ret = [];
        $.each(param, function(k, arrVal) {
            if (arrVal.length > 0) ret.push(k + '=' + $.map(arrVal, urlEncode).join(','));
        });
        return ret.join('&');
    };

    // url escapes the argument string and replaces escaped spaces with '+'
    var urlEncode = function(v) {
        if (typeof v === 'string') return encodeURIComponent(v).replace(/%20/g, '+');
    };

    // default ajax settings
    var ajaxSett = {
        type: "GET",
        dataType: "json",
        url: 'GN/TCount.ashx',
        cache: true,
        ifModified: true,
        success: function(tCnt) { updateTot(tCnt.tc) },
        error: function() { updateTot(defCarNr); }
    };

    // creates a tip which is displayed when on serch results
    var setSpeechBalloon = function(sel) {
        speechBalloon = jQuery('#' + sel);
        return speechBalloon;
    };
})(jQuery);