        /**
         * @var searchFormSettings
         * Настройки поисковой формы, по которой строится запрос
         * */
        var searchFormSettings = {
            "city" : "1498",
            "country" : "12",
            "room_size" : "14",
            "resort" : "0",
            "durationMin" : "7",
            "durationMax" : "14",
            "fromDate" : "00.00.00",
            "toDate" : "00.00.00",
            "alloccat" : "0",
            "meal": "0",
            "allocation" : "",
            "price" : "",
            "children1" : "7",
            "children2" : "0"
        };

    (function($){
        $(document).ready(function(){


            Search.init({
                'afterChange' : function(changeType, field, value){

                    //если изменили тип размещения
                    if(field == 'room_size')
                    {
                        $('.search_children').css('display', this.withChildrens() ? 'block' : 'none');
                    }

                }
            });


            //hide list items for body click
            $("body").click(function(){
                Search.hideLists();
            });


            //drop down list items
            $("a.arrow_orange").bind('click', function(e){
                Search.hideLists();

                var list = $(this).next(),
                    offset = $(this).position();

                list.css('top', offset.top + 20);

                list.toggle();
                e.preventDefault();
                e.stopPropagation();
            });

            //concrete hotel choose
            $(".search_choose_hotel").bind('click', function(e){
                $(this).parent().next().toggle();

                Search.rebind();

                e.preventDefault();
                e.stopPropagation();
            });


            //date To select
            $("#to").bind('click', function(e){
                $("#toDate").datepicker("show");
                e.preventDefault();
            });

            //date from select
            $("#from").bind('click', function(e){
                $("#fromDate").datepicker("show");
                e.preventDefault();
            });

            //price change
            $(".search_price").bind('change', function(){
                window.searchFormSettings.price = $(this).val();
            });


            Search.rebind();



            //submit form
            $(".search_submit").bind('click', function(){
                var queryString = '';

                if(document.location.pathname.match(/^[\/]+$/))
                     queryString = '/searchtour/result?';
                else
                    queryString = document.location.pathname + '?';

                queryString += buildQueryString();


                document.location.href = queryString;
            });


            /**
             * @function buidQueryString
             * Собирает строку поискового запроса
             * */
            function buildQueryString()
            {
                var q = '', current = '';

                //opera 11.6 fix
                for(var i in searchFormSettings)
                {
                    current = searchFormSettings[i].toString();

                    if(current.search(/http/) == 0)
                        searchFormSettings[i] = current.match(/\d+$/)[0];
                }

                

                q += 'co=' + searchFormSettings.country;
                q += '&ct=' + searchFormSettings.city;
                q += '&rs=' + searchFormSettings.room_size;

                if(searchFormSettings.resort != "0")
                    q += '&re=' + searchFormSettings.resort;

                q += '&nf=' + searchFormSettings.durationMin;
                q += '&nt=' + searchFormSettings.durationMax;

                q += '&df=' + searchFormSettings.fromDate;
                q += '&dt=' + searchFormSettings.toDate;

                if(searchFormSettings.alloccat != "0")
                    q += '&ac=' + searchFormSettings.alloccat;

                if(searchFormSettings.meal != "0")
                    q += '&me=' + searchFormSettings.meal;

                if(searchFormSettings.allocation != "")
                    q += '&al=' + searchFormSettings.allocation;

                if(searchFormSettings.price != "")
                    q += '&pt=' + searchFormSettings.price;


                //с детьми
                if(Search.withChildrens() )
                {
                    q += '&ch1=' + searchFormSettings.children1;
                    q += '&ch2=' + searchFormSettings.children2;
                }


                //только предложения с билетом
                q += '&ti=yes';

                q += '&_ps=' + Search.searchItemsPerPage;


                return q;
            }


        });
    })(jQuery);













/**
 * MODULE SEARCH FORM
 **/

var Search = (function($){

    /**
     * @function setItemsPerPage
     * @param value
     * */
    function setItemsPerPage(value) {
        Search.searchItemsPerPage = value;
    }

    
        //MAIN OBJECT
        var SF = {

            /**
             * @function init
             * Инициализация модуля поиска
             * Установка параметров по умолчанию
             * */
            init : function(options){
                options = options || {};
                
                //field mapper
                this.settings = $.extend({
                    'city' : '#sf_from',
                    'room_size' : '#sf_who',
                    'country' : '#sf_where',
                    'resort' : '#sf_resort',
                    'durationMin' : '#sf_duration_min',
                    'durationMax' : '#sf_duration_max',
                    'fromDate' : '#sf_date_from',
                    'toDate' : '#sf_date_to',
                    'alloccat' : '#sf_hotel_class',
                    'allocation' : '#sf_hotel_name',
                    'meal' : '#sf_meal',
                    'price' : '#sf_price',
                    'children1' : '#sf_children1',
                    'children2' : '#sf_children2',
                    'afterChange' : null
                }, options);

                this.dependElements = {};
            },

            /**
             * @function change
             * смена значения в некоторых полях формы
             * @param field поле  (city, room_size и т.д.)
             * @param value значение
             * */
            change : function(field, value){
                var elId = undefined;

                //ищем ид поля
                $(this.settings[field]).nextAll('.list').children().each(function(){

                    if($(this).text().toLowerCase() == value.toLowerCase())
                    {
                        elId = $(this).attr('itemid');
                        return false;
                    }
                });

                if(elId !== undefined)
                {
                    this.searchFormSettings[field] = elId;

                    $(this.settings[field]).text(value);

                    //depend click
                    if(this.dependElements.hasOwnProperty(field))
                    {
                        $(this.settings[field]).nextAll(".list").eq(0).children("a[itemid='" + elId + "']").click();
                    }

                }


                if(typeof this.settings.afterChange == 'function')
                {
                    this.settings.afterChange.call(this, 'change', field, value);
                }

            },

            /**
             * @function changeById изменяет состояние поля,
             * производит поиск  по идентификатору элемента
             * (можно получить из адресной строки при поиске)
             * @param field название поля
             * @param id идентификатор элемента
             * */
            changeById : function(field, id){
                var text = $(this.settings[field]).nextAll(".list").eq(0).children("[itemid='"+id+"']").text();

                if(text != "")
                {
                    this.searchFormSettings[field] = id;

                    $(this.settings[field]).text(text);
                }


                //depend click
                if(this.dependElements.hasOwnProperty(field))
                {
                    $(this.settings[field]).nextAll(".list").eq(0).children("a[itemid='" + id + "']").click();
                }


                //исключения
                //price
                if(field == 'price')
                {
                    $(this.settings[field]).val(id);
                    this.searchFormSettings[field] = id;
                }
                else if(field == 'allocation')
                {
                    var textAl = $("#al_container>a[itemid='" + id + "']").text();

                    if(textAl != '')
                    {
                        $(".search_choose_hotel").text(textAl);
                        this.searchFormSettings[field] = id;
                    }
                    else
                    {
                        //todo
                        this.searchFormSettings[field] = id;
                    }
                }
                else if(field == 'country')
                {
                    this.searchFormSettings[field] = id;
                }


                if(typeof this.settings.afterChange == 'function')
                {
                    this.settings.afterChange.call(this, 'changeById', field, id);
                }

            },

            /**
             * @function changeDate инициализация полей с датой
             * @param field название поля (dateTo, dateFrom)
             * @param value значение
             * */
            changeDate : function(field, value) {
                this.searchFormSettings[field] = value;
                $(this.settings[field]).text(value);

                $(this.settings[field]).nextAll("input").eq(0).val(value);
            },


            /**
             * @function depend организует зависимость между элементами формы
             * @param master имя элемента формы, который инициализирует событие
             * @param slave имя элемента формы, в который помещать результаты
             * @param params дополнительные параметры (first - первая строчка, itemtype - тип данных, slave - ид зависимого елемента )
             * @param callback
             * */
            depend : function(master, slave, params, callback) {
                params = params || {};

                this.dependElements[master] = slave;

                var that = this;

                $(this.settings[master]).nextAll(".list").eq(0).children("a").bind('click', function() {

                    $.ajax({
                        "url" : "/countries/countries/depend",
                        "type" : "POST",
                        "dataType" : "HTML",
                        "data" : {
                            /*"itemtype" : $(this).attr("itemtype"),*/
                            "itemtype" : params['itemtype'],
                            "itemid" : $(this).attr("itemid"),
                            "params" : params
                        },

                        "success" : function(data) {
                            //data fill
                            $(that.settings[slave]).nextAll(".list").eq(0).empty().html(data);

                            //first line text
                            $(that.settings[slave]).text(params.first);
                            //clear global form state
                            that.searchFormSettings[slave] = 0;
                            //re bind events
                            SF.rebind();
                            //callback
                            if(typeof(callback) == "function")
                                callback.call(this, data);
                        }

                    });


                });

            },

            /**
             * @function rebind инициализация элементов списков
             * */
            rebind : function(){
                var that = this;


                $(".list_item").unbind('click').bind('click', function(e){
                    var type = $(this).attr("itemType");
                    var value = $(this).attr("itemId");
                    var text = $(this).text();

                    window.searchFormSettings[type] = value;

                    if(type == 'allocation')
                    {
                        $(".search_choose_hotel").text(text);
                    }
                                        

                    if(!$(this).hasClass('nochange'))
                        $(this).parent().prev().prev().text(text);

                    $(this).parent().hide();


                    if(typeof Search.settings.afterChange == 'function')
                    {
                        Search.settings.afterChange.call(that, 'rebind', type, value);
                    }

                    e.preventDefault();
                });

            },


            fromDateSelect : function(el, dateText,inst){
                var from = $.datepicker.formatDate( "dd.mm.y", $("#fromDate").datepicker("getDate"), {} );
                var to = window.searchFormSettings.toDate.split('.');
                var nFrom = new Date();
                var nTo = new Date();
                var formatTo = '';

                window.searchFormSettings.fromDate = from;
                el.prev().prev().text(from);

                //create to date
                nTo.setYear('20' + to[2]);
                nTo.setMonth(to[1] - 1);
                nTo.setDate(to[0]);
                //create from date
                nFrom.setYear(inst.selectedYear);
                nFrom.setMonth(inst.selectedMonth);
                nFrom.setDate(inst.selectedDay);


                /**
                 * Если дата "с" больше чем дата "по"
                 * прибавляем 7 дней
                 * */
                if(nFrom.getTime() > nTo.getTime())
                {
                    nFrom.setDate(nFrom.getDate() + 7);
                    $("#toDate").datepicker("setDate", nFrom);

                    formatTo = $.datepicker.formatDate( "dd.mm.y", $("#toDate").datepicker("getDate"), {});

                    $("#sf_date_to").text(formatTo);

                    window.searchFormSettings.toDate = formatTo;
                }

            },

            toDateSelect : function(el, dateText, inst){
                var to = $.datepicker.formatDate( "dd.mm.y", $("#toDate").datepicker("getDate"), {} );
                var from = window.searchFormSettings.fromDate.split('.');
                var nFrom = new Date();
                var nTo = new Date();
                var formatFrom = '';

                window.searchFormSettings.toDate = to;
                el.prev().prev().text(to);

                //create to date
                nFrom.setYear('20' + from[2]);
                nFrom.setMonth(from[1] - 1);
                nFrom.setDate(from[0]);
                //create from date
                nTo.setYear(inst.selectedYear);
                nTo.setMonth(inst.selectedMonth);
                nTo.setDate(inst.selectedDay);

                /**
                 * Если дата "по" меньше чем дата "с"
                 * отнимаем 7 дней из даты "с"
                 * */
                if(nTo.getTime() < nFrom.getTime())
                {
                    nFrom.setDate(nTo.getDate() - 7);
                    $("#fromDate").datepicker("setDate", nFrom);

                    formatFrom = $.datepicker.formatDate( "dd.mm.y", $("#fromDate").datepicker("getDate"), {});

                    $("#sf_date_from").text(formatFrom);

                    window.searchFormSettings.fromDate = formatFrom;
                }




            },

            /**
             * @method withChildren
             * Проверяет выбран ли тип размещения с деньми
             * */
            withChildrens : function(){
                return $('#sf_who').text().match(/\+\s*\d/i);
            },

            /**
             * @method hideLists
             * Скрывает все всплывающие списки
             * */
            hideLists : function(){
                $(".list").hide();
            }



        };


    /**
     * MODULE EXPORT
     * */
    return {
        'setItemsPerPage' : setItemsPerPage,
        'searchFormSettings' : window.searchFormSettings,
        'init' : SF.init,
        'settings' : SF.settings,
        'change' : SF.change,
        'changeById' : SF.changeById,
        'changeDate' : SF.changeDate,
        'depend' : SF.depend,
        'rebind' : SF.rebind,
        'fromDateSelect' : SF.fromDateSelect,
        'toDateSelect' : SF.toDateSelect,
        'withChildrens' : SF.withChildrens,
        'hideLists' : SF.hideLists
    };

})(jQuery);
