(function(){
    var $ = jQuery, current_c;
	

	SearchEngine = function() {
    	var oFunction = {},
            oHolder = {},
            oDiapasonItem = {};

        // Extra
    	oHolder['extra'] = $('.extra');
    	// Diapasons
    	oHolder['diapason'] = {};
    	oHolder['diapason']['input'] = {};
    	$('.diapason').each(function(){
            var diapason = $(this);
            var aId = diapason.attr('id').split('-');

            var name = aId.pop();
            var type = aId.pop();
            if (!oHolder['diapason']['input'][name]) {
                    oHolder['diapason']['input'][name] = {};
            }

            oHolder['diapason']['input'][name][type] = diapason;
    	});
        oHolder['diapason']['ul'] = {};
        oHolder['diapason']['ul']['price'] = $('.search-diapason-price');
        oHolder['diapason']['ul']['square_full'] = $('.search-diapason-square_full');
        oHolder['diapason']['ul']['square_live'] = $('.search-diapason-square_live');
        oHolder['diapason']['ul']['square_kitchen'] = $('.search-diapason-square_kitchen');
        oHolder['diapason']['ul']['square_lot'] = $('.search-diapason-square_lot');
        oHolder['diapason']['ul']['square_cottage'] = $('.search-diapason-square_cottage');
        oHolder['diapason']['ul']['room'] = $('.search-diapason-room');
        oHolder['diapason']['ul']['mkad'] = $('.search-diapason-mkad');
        oHolder['diapason']['select'] = {};
        oHolder['diapason']['select']['price'] = $('#price_type');
        
        oFunction['price'] = {}; // Price item function

        this.sendRequest = function(options){
            if (options) {
                if (typeof options['beforeSend'] != 'undefined') {
                    options.beforeSend.call();
                }
            }

            this.get('searchFormController').update(this.get('xForm'), true);
        };

        function castFloat(value) {
            value = parseFloat(value);
            return !isNaN(value) ? value : 0;
        }

        // Registry
        var oRegistry = {};
        this.set = function(name, value){
            oRegistry[name] = value;
        };
        this.get = function(name){
            if (!oRegistry[name]) {
                throw "Wrong registry name: " + name;
            }
            return oRegistry[name];
        };

        this.setFunction = function(name, foo){
            oFunction[name] = foo;
        };
        this.getFunction = function(name){
            if (!oFunction[name]) {
                throw "Wrong function: " + name;
            }
            return oFunction[name];
        };

        this.isFromEditbox = function(name){
            var aInput = oHolder['diapason']['input'][name],
                ret = '0';
            if ((aInput['from'].val() != '') || (aInput['to'].val() != '')) {
                ret = '1';
            }
            return ret;
        };

        this.selectPriceDiapason = function(oData){
            var aPriceFrom = [],
                aPriceTo = [],
                from = unescape(oData['from']).replace('+', ''),
                to = unescape(oData['to']).replace('+', '');
            if (! oData['isEditbox']) {
                from = from.split(',');
                to = to.split(',');
                for (var k in from) {
                    aPriceFrom.push(castFloat(from[k]));
                    aPriceTo.push(castFloat(to[k]));
                }
            }

            oHolder['diapason']['select']['price'].val(oData['type']);
            oHolder['diapason']['select']['price'].change();

            if (! oData['isEditbox']) {
                var oLi = oHolder['diapason']['ul']['price'].find('li[price=\'' + oData['type'] + '\']'),
                        a;
                for (var k in aPriceTo) {
                    oLi.each(function(){
                        var li = $(this);
                        a = li.find('a:first');
                        if (castFloat(a.attr('from')) == aPriceFrom[k] && castFloat(a.attr('to')) == aPriceTo[k]) {
                            li.click();
                        }
                    });
                }
            } else {
                if (from != '0') {
                    oHolder['diapason']['input']['price']['from'].val(from);
                }
                if (to != '0') {
                    oHolder['diapason']['input']['price']['to'].val(to);
                    
                }
                oHolder['diapason']['input']['price']['to'].change();
            }
        };

        this.selectRoomDiapason = function(oData){
            var aFrom = [],
                aTo = [],
                from = unescape(oData['from']).replace('+', ''),
                to = unescape(oData['to']).replace('+', '');
            if (! oData['isEditbox']) {
                from = from.split(',');
                to = to.split(',');
                for (var k in from) {
                    aFrom.push(castFloat(from[k]));
                    aTo.push(castFloat(to[k]));
                }
            }

            if (! oData['isEditbox']) {
                var oLi = oHolder['diapason']['ul']['room'].find('li'), a;
                for (var k in aTo) {
                    oLi.each(function(){
                        var li = $(this);
                        a = li.find('a:first');
                        if (castFloat(a.attr('from')) == aFrom[k] && castFloat(a.attr('to')) == aTo[k]) {
                            li.click();
                        }
                    });
                }
            } else {
                if (from != '0') {
                    oHolder['diapason']['input']['room']['from'].val(from);
                }
                if (to != '0') {
                    oHolder['diapason']['input']['room']['to'].val(to);
                }
                oHolder['diapason']['input']['room']['to'].change();
            }
        };

        this.selectMkadDiapason = function(oData){
            var aFrom = [],
                aTo = [],
                from = unescape(oData['from']).replace('+', ''),
                to = unescape(oData['to']).replace('+', '');
            if (! oData['isEditbox']) {
                from = from.split(',');
                to = to.split(',');
                for (var k in from) {
                    aFrom.push(castFloat(from[k]));
                    aTo.push(castFloat(to[k]));
                }
            }

            if (! oData['isEditbox']) {
                var oLi = oHolder['diapason']['ul']['mkad'].find('li'), a;
                for (var k in aTo) {
                    oLi.each(function(){
                        var li = $(this);
                        a = li.find('a:first');
                        if (castFloat(a.attr('from')) == aFrom[k] && castFloat(a.attr('to')) == aTo[k]) {
                            li.click();
                        }
                    });
                }
            } else {
                if (from != '0') {
                    oHolder['diapason']['input']['mkad']['from'].val(from);
                }
                if (to != '0') {
                    oHolder['diapason']['input']['mkad']['to'].val(to);
                }
                oHolder['diapason']['input']['mkad']['to'].change();
            }
        };
		
    this.selectSquareDiapason = function(oData, type){
            var aFrom = [],
                    aTo = [],
                    from = unescape(oData['from']).replace('+', ''),
                    to = unescape(oData['to']).replace('+', '');
            if (! oData['isEditbox']) {
                from = from.split(',');
                to = to.split(',');
                for (var k in from) {
                    aFrom.push(castFloat(from[k]));
                    aTo.push(castFloat(to[k]));
                }
            }

            if (! oData['isEditbox']) {
                var oLi = oHolder['diapason']['ul']['square_' + type].find('li'), a;
                for (var k in aTo) {
                    oLi.each(function(){
                        var li = $(this);
                        a = li.find('a:first');
                        if (castFloat(a.attr('from')) == aFrom[k] && castFloat(a.attr('to')) == aTo[k]) {
                                li.click();
                        }
                    });
                }
            } else {
                if (from != '0') {
                    oHolder['diapason']['input']['square_' + type]['from'].val(from);
                }
                if (to != '0') {
                    oHolder['diapason']['input']['square_' + type]['to'].val(to);
                }
                oHolder['diapason']['input']['square_' + type]['to'].change();
            }
    };
		
    this.fetchDiapasonData = function(){
        var aData = {};

        aData = this.updatePriceData(aData);
        aData = this.updateRoomData(aData);
        aData = this.updateMkadData(aData);
        aData = this.updateSquareData(aData, 'full');
        aData = this.updateSquareData(aData, 'live');
        aData = this.updateSquareData(aData, 'kitchen');
        aData = this.updateSquareData(aData, 'lot');
        aData = this.updateSquareData(aData, 'cottage');

        return aData
    };

    this.updatePriceData = function(aResult){
        var aUrl,
                attr,
                aAttribute,
                sPrice_From = oHolder['diapason']['input']['price']['from'].val(),
                sPrice_To = oHolder['diapason']['input']['price']['to'].val();

        if (!sPrice_From && !sPrice_To) {
            aUrl = this.getUrlByDiapasonName('price');
            sPrice_From = "";
            sPrice_To = "";

            aUrl.foreach(function(sKey, mData){
                if (typeof mData == 'string') {
                    aAttribute = mData.split('&');

                    for (var k in aAttribute) {
                        if (typeof aAttribute[k] == 'string') {
                            attr = aAttribute[k].split('=');

                            if (attr[0] == 'price_from') {
                                sPrice_From += (sPrice_From ? ', ' + attr[1] : attr[1]);
                            } else if (attr[0] == 'price_to') {
                                sPrice_To += (sPrice_To ? ', ' + attr[1] : attr[1]);
                            }
                        }
                    }
                }
            });
        }

        aResult['Price_From'] = sPrice_From;
        aResult['Price_To'] = sPrice_To;
        aResult['Price_Type'] = oHolder['diapason']['select']['price'].val();
        aResult['Price_Editbox'] = this.isFromEditbox('price');

        return aResult;
    };

    this.updateRoomData = function(aResult){
        if (oHolder['diapason']['input']['room'] != undefined) {
            var aUrl,
                    attr,
                    aAttribute,
                    sRoom_From = oHolder['diapason']['input']['room']['from'].val(),
                    sRoom_To = oHolder['diapason']['input']['room']['to'].val();

            if (!sRoom_From && !sRoom_To) {
                    aUrl = this.getUrlByDiapasonName('room');
                    sRoom_From = "";
                    sRoom_To = "";

                    aUrl.foreach(function(sKey, mData){
                            if (typeof mData == 'string') {
                                    aAttribute = mData.split('&');

                                    for (var k in aAttribute) {
                                            if (typeof aAttribute[k] == 'string') {
                                                    attr = aAttribute[k].split('=');

                                                    if (attr[0] == 'room_from') {
                                                            sRoom_From += (sRoom_From ? ', ' + attr[1] : attr[1]);
                                                    } else if (attr[0] == 'room_to') {
                                                            sRoom_To += (sRoom_To ? ', ' + attr[1] : attr[1]);
                                                    }
                                            }
                                    }
                            }
                    });
            }

            aResult['Rooms_From'] = sRoom_From;
            aResult['Rooms_To'] = sRoom_To;
            aResult['Rooms_Editbox'] = this.isFromEditbox('room');
        }

        return aResult;
    };

    this.updateMkadData = function(aResult){
        if (oHolder['diapason']['input']['mkad'] != undefined) {
            var aUrl,
                attr,
                aAttribute,
                sMkad_From = oHolder['diapason']['input']['mkad']['from'].val(),
                sMkad_To = oHolder['diapason']['input']['mkad']['to'].val();

            if (!sMkad_From && !sMkad_To) {
                aUrl = this.getUrlByDiapasonName('mkad');
                sMkad_From = "";
                sMkad_To = "";

                aUrl.foreach(function(sKey, mData){
                    if (typeof mData == 'string') {
                        aAttribute = mData.split('&');

                        for (var k in aAttribute) {
                            if (typeof aAttribute[k] == 'string') {
                                attr = aAttribute[k].split('=');

                                if (attr[0] == 'mkad_from') {
                                    sMkad_From += (sMkad_From ? ', ' + attr[1] : attr[1]);
                                } else if (attr[0] == 'mkad_to') {
                                    sMkad_To += (sMkad_To ? ', ' + attr[1] : attr[1]);
                                }
                            }
                        }
                    }
                });
            }

            aResult['Mkad_From'] = sMkad_From;
            aResult['Mkad_To'] = sMkad_To;
            aResult['Mkad_Editbox'] = this.isFromEditbox('mkad');
        }

        return aResult;
    };
		
        this.updateSquareData = function(aResult, type){
            if (oHolder['diapason']['input']['square_' + type] != undefined) {
                var aUrl,
                    attr,
                    aAttribute
                    sSquare_From = oHolder['diapason']['input']['square_' + type]['from'].val(),
                    sSquare_To = oHolder['diapason']['input']['square_' + type]['to'].val();

                if (!sSquare_From && !sSquare_To) {
                    aUrl = this.getUrlByDiapasonName('square_' + type);
                    sSquare_From = "";
                    sSquare_To = "";

                    aUrl.foreach(function(sKey, mData){
                        if (typeof mData == 'string') {
                            aAttribute = mData.split('&');

                            for (var k in aAttribute) {
                                if (typeof aAttribute[k] == 'string') {
                                    attr = aAttribute[k].split('=');

                                    if (attr[0] == 'square_' + type +'_from') {
                                        sSquare_From += (sSquare_From ? ', ' + attr[1] : attr[1]);
                                    } else if (attr[0] == 'square_' + type + '_to') {
                                        sSquare_To += (sSquare_To ? ', ' + attr[1] : attr[1]);
                                    }
                                }
                            }
                        }
                    });
                }

                var sType = type.substring(0, 1).toUpperCase() + type.substring(1, type.length);
                aResult['Square' + sType + '_From'] = sSquare_From;
                aResult['Square' + sType + '_To'] = sSquare_To;
                aResult['Square' + sType + '_Editbox'] = this.isFromEditbox('square_' + type);
            }

            return aResult;
        };

        this.getUrlByDiapasonName = function(name){
            var aUrl = [], sUrl, a, li, iPriceType;
            if (name == 'price') {
                iPriceType = oHolder['diapason']['select'][name].val();
            }

            oHolder['diapason']['ul'][name].find('li').each(function(){
                li = $(this);
                if (typeof iPriceType == 'undefined' || iPriceType == li.attr('price')) {
                    a = li.find('a:first');
                    if (!a.attr('href')) {
                        sUrl = a.attr('url');
                        aUrl.push(sUrl.substr(1, sUrl.length));
                    }
                }
            });
            return aUrl;
        };
		
        this.setupSearchPageEvent = function(){
            var oThis = this;
            $('#r_search_type_i0').click(function(){
                oThis.sendRequest();
            });
        };


        // Toggle item
        this.toogleSelectedItem = function(name, send){
            var oData, aFrom, aTo, sPrefix, oContainer, mResult,
                oThis = this,
                fClick,
                sEmptyText = 'любая';

            function buildItem(sFrom, sTo, sPrefix) {
                if (!sPrefix) {
                    sPrefix = "\n";
                }

                var aFrom = sFrom.split(','),
                    aTo = sTo.split(','),
                    aNode = [];
                aFrom.foreach(function(sKey, mData){
                    var sResult,
                        from = parseFloat(aFrom[sKey]),
                        to = parseFloat(aTo[sKey]);
                    if (!from) {
                        sResult = 'до ' + to + sPrefix;
                    } else if (!to) {
                        sResult = 'от ' + from + sPrefix;
                    } else {
                        sResult = aFrom[sKey] + ' - ' + aTo[sKey] + sPrefix;
                    }
                    aNode.push(oFunction.buildPriceItem(sResult));
                });

                return aNode;
            }

            function buildEditboxItem(from, to, sPrefix) {
                if (!sPrefix) {
                    sPrefix = "\n";
                }

                if (!from) {
                    mResult = oFunction.buildPriceItem('до ' + to + sPrefix);
                } else if (!to) {
                    mResult = oFunction.buildPriceItem('от ' + from + sPrefix);
                } else {
                    mResult = oFunction.buildPriceItem(from + ' - ' + to + sPrefix);
                }
                return mResult;
            }

            if (name == 'price') {
                oContainer = $('p#selected_price');
                oData = this.updatePriceData({});

                sPrefix = " " + oHolder['diapason']['select'][name].children('option[selected]').text() + "\n";
                if (oData['Price_From'] != "" || oData['Price_To'] != "") {
                    if (oData['Price_Editbox'] != "1") {
                        mResult = buildItem(
                            oData['Price_From'],
                            oData['Price_To'],
                            sPrefix
                        );
                    } else {
                        mResult = buildEditboxItem(oData['Price_From'], oData['Price_To'], sPrefix);
                    }
                }
            } else if (name == 'room') {
                oContainer = $('p#selected_room');
                sEmptyText = 'любое';
                oData = this.updateRoomData({});

                sPrefix = " \n";
                if (oData['Rooms_From'] != "" || oData['Rooms_To'] != "") {
                    if (oData['Rooms_Editbox'] != "1") {
                        mResult = buildItem(
                            oData['Rooms_From'],
                            oData['Rooms_To'],
                            sPrefix
                        );
                    } else {
                        mResult = buildEditboxItem(oData['Rooms_From'],
                            oData['Rooms_To'], sPrefix);
                    }
                }
            } else if (name == 'mkad') {
                oContainer = $('p#selected_mkad');
                sEmptyText = 'любое';
                oData = this.updateMkadData({});

                sPrefix = " \n";
                if (oData['Mkad_From'] != "" || oData['Mkad_To'] != "") {
                    if (oData['Rooms_Editbox'] != "1") {
                        mResult = buildItem(
                            oData['Mkad_From'],
                            oData['Mkad_To'],
                            sPrefix
                        );
                    } else {
                        mResult = buildEditboxItem(oData['Mkad_From'],
                            oData['Mkad_To'], sPrefix);
                    }
                }
            } else if (name == 'square_full') {
                oContainer = $('p#selected_square_full');
                oData = this.updateSquareData({}, 'full');

                sPrefix = " \n";
                if (oData['SquareFull_From'] != "" || oData['SquareFull_To'] != "") {
                    if (oData['SquareFull_Editbox'] != "1") {
                        mResult = buildItem(
                            oData['SquareFull_From'],
                            oData['SquareFull_To'],
                            sPrefix
                        );
                    } else {
                        mResult = buildEditboxItem(oData['SquareFull_From'],
                            oData['SquareFull_To'], sPrefix);
                    }
                }
            } else if (name == 'square_kitchen') {
                oContainer = $('p#selected_square_kitchen');
                oData = this.updateSquareData({}, 'kitchen');

                sPrefix = " \n";
                if (oData['SquareKitchen_From'] != "" || oData['SquareKitchen_To'] != "") {
                    if (oData['SquareKitchen_Editbox'] != "1") {
                        mResult = buildItem(
                            oData['SquareKitchen_From'],
                            oData['SquareKitchen_To'],
                            sPrefix
                        );
                    } else {
                        mResult = buildEditboxItem(oData['SquareKitchen_From'],
                            oData['SquareKitchen_To'], sPrefix);
                    }
                }
            } else if (name == 'square_live') {
                oContainer = $('p#selected_square_live');
                oData = this.updateSquareData({}, 'live');

                sPrefix = " \n";
                if (oData['SquareLive_From'] != "" || oData['SquareLive_To'] != "") {
                    if (oData['SquareLive_Editbox'] != "1") {
                        mResult = buildItem(
                            oData['SquareLive_From'],
                            oData['SquareLive_To'],
                            sPrefix
                        );
                    } else {
                        mResult = buildEditboxItem(oData['SquareLive_From'],
                            oData['SquareLive_To'], sPrefix);
                    }
                }
            } else if (name == 'square_lot') {
                oContainer = $('p#selected_square_lot');
                oData = this.updateSquareData({}, 'lot');

                sPrefix = " \n";
                if (oData['SquareLot_From'] != "" || oData['SquareLot_To'] != "") {
                    if (oData['SquareLot_Editbox'] != "1") {
                        mResult = buildItem(
                            oData['SquareLot_From'],
                            oData['SquareLot_To'],
                            sPrefix
                        );
                    } else {
                        mResult = buildEditboxItem(oData['SquareLot_From'],
                            oData['SquareLot_To'], sPrefix);
                    }
                }
            } else if (name == 'square_cottage') {
                oContainer = $('p#selected_square_cottage');
                oData = this.updateSquareData({}, 'cottage');

                sPrefix = " \n";
                if (oData['SquareCottage_From'] != "" || oData['SquareCottage_To'] != "") {
                    if (oData['SquareCottage_Editbox'] != "1") {
                        mResult = buildItem(
                            oData['SquareCottage_From'],
                            oData['SquareCottage_To'],
                            sPrefix
                        );
                    } else {
                        mResult = buildEditboxItem(oData['SquareCottage_From'],
                            oData['SquareCottage_To'], sPrefix);
                    }
                }
            } else {
                throw "No behavior for diapason `" + name + "`";
            }

            if (!fClick) {
                fClick = (function(oContainer){
                    return function(){
                        oContainer.empty();
                        oThis.disableDiapasonsForContainer(
                            oHolder['diapason']['ul'][name]
                        );
                        oHolder['diapason']['input'][name]['from'].val('');
                        oHolder['diapason']['input'][name]['to'].val('');

                        changeH6('<b>: ' + sEmptyText + '</b>')
                        if (send) {
                            oThis.sendRequest();
                        }
                    };
                })(oContainer);
            }

            function changeH6(sText){
                var h6 = oContainer.parent().parent().children('h6');
                var b = h6.children('b');
                if (typeof sText == 'string') {
                    b.remove();
                    h6.append(sText);
                } else {
                    b.remove();
                }
            }

            oContainer.empty();
            if (mResult) {
                if (mResult.constructor == Array) {
                    mResult.foreach(function(sKey, mData){
                        var mData = $(mData);
                        mData.click(fClick);
                        oContainer.append(mData);
                    });
                } else {
                    mResult = $(mResult);
                    mResult.click(fClick);
                    oContainer.append(mResult);
                }
                changeH6();
            } else {
                changeH6('<b>: ' + sEmptyText + '</b>');
            }
        }

    this.setupDiapasons = function(send){
        var oThis = this;

        //
        function changeValue() {
            var name = $(this).attr('diapason');
            oThis.disableDiapasonsForContainer(oHolder['diapason']['ul'][name]);

            /* type casting */
            if(parseInt($('#search-diapason-from-price').val()) > parseInt($('#search-diapason-to-price').val()) &&$('#search-diapason-to-price').val() != ''){
                $('#search-diapason-to-price').val($('#search-diapason-from-price').val());
            }

            if(parseInt($('#search-diapason-from-room').val()) > parseInt($('#search-diapason-to-room').val()) &&$('#search-diapason-to-room').val() != ''){
                $('#search-diapason-to-room').val($('#search-diapason-from-room').val());
            }

            if(parseInt($('#search-diapason-from-square_full').val()) > parseInt($('#search-diapason-to-square_full').val()) && $('#search-diapason-to-square_full').val() != ''){

                $('#search-diapason-to-square_full').val($('#search-diapason-from-square_full').val());
            }

            if(parseInt($('#search-diapason-from-square_live').val()) > parseInt($('#search-diapason-to-square_live').val()) && $('#search-diapason-to-square_live').val() != ''){
                $('#search-diapason-to-square_live').val($('#search-diapason-from-square_live').val());
            }

            if(parseInt($('#search-diapason-from-square_kitchen').val()) > parseInt($('#search-diapason-to-square_kitchen').val()) && $('#search-diapason-to-square_kitchen').val() != ''){
                $('#search-diapason-to-square_kitchen').val($('#search-diapason-from-square_kitchen').val());
            }

            if(parseInt($('#search-diapason-from-square_lot').val()) > parseInt($('#search-diapason-to-square_lot').val()) && $('#search-diapason-to-square_lot').val() != ''){
                $('#search-diapason-to-square_lot').val($('#search-diapason-from-square_lot').val());
            }

            if(parseInt($('#search-diapason-from-square_cottage').val()) > parseInt($('#search-diapason-to-square_cottage').val()) && $('#search-diapason-to-square_cottage').val() != ''){
                $('#search-diapason-to-square_cottage').val($('#search-diapason-from-square_cottage').val());
            }

            if(parseInt(jQuery('#search-diapason-from-mkad').val()) > parseInt(jQuery('#search-diapason-to-mkad').val()) && jQuery('#search-diapason-to-mkad').val() != ''){
		jQuery('#search-diapason-to-mkad').attr('value',jQuery('#search-diapason-from-mkad').val());
	}
            /* end type casting */

            oThis.toogleSelectedItem(name, send);

            if (send) {
                oThis.sendRequest();
            }
        }

        for (var k in oHolder['diapason']['input']) {
            oHolder['diapason']['input'][k]['from'].change(changeValue);
            oHolder['diapason']['input'][k]['to'].change(changeValue);
        }

        // Setting up price list
        this.setupPriceDiapason(oHolder['diapason']['ul']['price'], oHolder['diapason']['select']['price'], send);

        // Setting up toogling
        this.setupToogleForDiapason(oHolder['diapason']['ul']['price'], send);
        this.setupToogleForDiapason(oHolder['diapason']['ul']['square_full'], send);
        this.setupToogleForDiapason(oHolder['diapason']['ul']['square_live'], send);
        this.setupToogleForDiapason(oHolder['diapason']['ul']['square_kitchen'], send);
        this.setupToogleForDiapason(oHolder['diapason']['ul']['square_lot'], send);
        this.setupToogleForDiapason(oHolder['diapason']['ul']['square_cottage'], send);
        this.setupToogleForDiapason(oHolder['diapason']['ul']['room'], send);
        this.setupToogleForDiapason(oHolder['diapason']['ul']['mkad'], send);
    };
		
    this.setupPriceDiapason = function(ul, select, send){
        var oThis = this;

        // Change <li>
        select.change(function(){
            oThis.disableDiapasonsForContainer(ul);
            ul.find('li[price="' + select.val() + '"]').show();
            ul.find('li[price!="' + select.val() + '"]').hide();

            oThis.toogleSelectedItem('price', send);

            if (send) {
                oThis.sendRequest();
            }
        });
        ul.find('li[price!=\'' + select.val() + '\']').hide();
    };

    //
    this.setupToogleForDiapason = function(diapason, send){
        var oThis = this;

        function getName(li) {
            return li.parent().attr('class').split('-').pop();
        }

        function append(li) {
            var a = li.find('a:first');
            a.removeAttr('href');
            li.append('&nbsp;<img src="/media/remove.gif"/>'.link('javascript:void(0);'));
        }

        function remove(li) {
            var a = li.find('a:first').attr('href', 'javascript:void(0);');
            li.empty().append(a);
        }

        function select(event) {
            // Removing 'href' attribute and append <img/> (cross)
            var li = $(this),
                name = getName(li);

            oThis.disableDiapasonsForContainer(oHolder['diapason']['ul'][name]);
            append(li);

            //
            oHolder['diapason']['input'][name]['from'].val('');
            oHolder['diapason']['input'][name]['to'].val('');

            oThis.toogleSelectedItem(name, send);

            close_popup();

            // Send XHR ?
            if (send) {
                oThis.sendRequest();
            }
        }

        function unselect(event){
            var li = $(this);
            remove(li);

            oThis.toogleSelectedItem(getName(li), send);

            close_popup();

            if (send) {
                oThis.sendRequest();
            }
        }

        diapason.find('li').toggle(select, unselect);
    }
        
    this.setupFocusHandler = function(){
        var curEl = $("#price_type");
        curEl.focus(function () {
            current_c = curEl.val();
        });
    }
			
    this.setupChangeHandler = function(){
        var curEl = $("#price_type");
        var from   = $('#search-diapason-from-price');
        var to     = $('#search-diapason-to-price');
        var l,l2;

        curEl.change(function (e) {
            switch(current_c){
                case '1': l = 0.001;  break;
                case '2': l = 0.001;  break;
                case '3': l = 1 ;     break;
            }

            switch(curEl.val()){
                case '1': l2 = 0.001;  break;
                case '2': l2 = 0.001;  break;
                case '3': l2 = 1 ;     break;
            }

            convfrom = parseFloat((curr[current_c]/curr[curEl.val()]) *from.val() * (l/l2)).toFixed(2);;
            convto   = parseFloat((curr[current_c]/curr[curEl.val()])*to.val()*(l/l2)).toFixed(2);;

            if(from.val()!='')	from.val(convfrom);
            if(to.val()!='')    to.val(convto);
            from.focus();
        });

    }
		
    this.setupKeypressHandler = function(){
            var regInt    = /^[0-9]+$/i,
                        regCount  = /^[0-9]{1,3}$/i,
                    maxLenght = 3,
                    fields = ['search-diapason-from-price','search-diapason-to-price',
                                      'search-diapason-from-room','search-diapason-to-room',
                                      'search-diapason-from-square_full','search-diapason-to-square_full',
                                      'search-diapason-from-square_live','search-diapason-to-square_live',
                                      'search-diapason-from-square_kitchen','search-diapason-to-square_kitchen',
                                      'Floor_From','Floor_To'],
                    oThis = this;

            $.each(fields,function(i){
                $('#' + this).keypress(function(e){
                    c = String.fromCharCode(e.which);
                    if ((!regInt.test(c) && e.which!=8 && e.which!=0
                            && e.which!=46 && e.which!=39 && e.which!=37
                            && e.which != 13)) {
                            return false;
                    }

                    // Submit...
                    if (e.which == 13) {
                        oThis.sendRequest();
                    }
                });
            });
    };

        //
        this.disableDiapasonsForContainer = function(container) {
            container.find('li').each(function(){
                var li = $(this);
                if (!li.find('a:first').attr('href')) {
                    li.trigger('click', {force: true});
                }
            });
        };
    };
    
})();