var Validator = {
    checkDate : function(sDate) {
        var re = /^\d{1,2}\.\d{1,2}\.\d{4}$/;
        if (re.test(sDate)) {
            var dArr = sDate.split('.');
            var d = new Date(dArr[1] + '/' + dArr[0] + '/' + dArr[2]);
            return d.getMonth() + 1 == dArr[1] && d.getDate() == dArr[0] && d.getFullYear() == dArr[2];
        }
        else {
            return false;
        }
    },

    checkNumber : function(number) {
        return /^\d{0,6}$/.test(number);
    },

    checkAge : function(name) {
        if ($(name).disabled)
        {
            return true;
        }
        var number = $(name).value;
        var age = parseInt(number);
        if (isNaN(age)) {
            return false;
        }
        return (age >= 0 && age < 18);
    }
};

var SearchForm = {
    ajaxUrl: 'ajax.html',
    elName : 'searchForm',
    messages : [],

    onChange : function(el_name) {
        switch (el_name) {
            case 'depCountryId':
                this.resetIndex('depCityId');
                this.loadEntities('depCity', 'depCountryId', 'getDepCityList');
                this.clearResults();
                break;
            case 'depCityId':
                break;
            case 'destCountryId':
                this.resetIndex('regionId');
                this.resetIndex('destCityId');
                this.resetIndex('hotelId');
                if ($F('destCountryId') == '-1') {
                    $('regionId').update('');
                    $('destCityId').update('');
                    $('hotelId').update('');
                } else {
                    this.loadEntities('region', 'destCountryId', 'getRegionList');
                    this.loadEntities('destCity', 'destCountryId', 'getDestCityList');
                    this.loadEntities('hotel', 'destCountryId', 'getHotelList');
                }
                this.clearResults();
                break;
            case 'regionId':
                this.resetIndex('destCityId');
                if ($F('regionId') == '-1') {
                    this.onChange('destCountryId');
                    return;
                }
                this.loadEntities('destCity', 'regionId', 'getDestCityList');
                this.loadEntities('hotel', 'regionId', 'getHotelList');
                break;
            case 'destCityId':
                if ($F('destCityId') == '-1') {
                    this.onChange('regionId');
                    return;
                }
                this.loadEntities('hotel', 'destCityId', 'getHotelList');
                break;
            case 'hotelId':
                if ($F('hotelId') != '-1') {
                    this.selectRegionAndCity();
                    this.resetIndex('hotelCategoryId');
                }
                break;
            case 'childsCount':
                this.setAgeFieldsEnabled($('childsCount').value);
                break;
            case 'hotelCategoryId':
                this.resetIndex('hotelId');
                break;
            case 'pageSize':
                break;
            default:
        }
        $('pageNum').value = '1';
    },

    selectRegionAndCity: function() {
        new Ajax.Request(this.ajaxUrl, {
            method:'get',
            encoding:'UTF-8',
            evalJSON: 'force',
            parameters: {
                'action': 'getRegionAndCityByHotelId',
                'userKey': $F('userKey'),
                'hotelId': $F('hotelId')
            },

            onSuccess: function(transport) {
                $('regionId').value = transport.responseJSON['regionId'];
                $('destCityId').value = transport.responseJSON['destCityId'];
            }
        });
    },

    loadEntities: function(dest_el, source_el, action) {

        var params ={
            'action': action,
            'userKey': $F('userKey')
        };
        params[$(source_el).id] = $F(source_el);

        new Ajax.Updater({success: dest_el}, this.ajaxUrl, {
            method:'get',
            encoding:'UTF-8',
            parameters: params,

            onSuccess: function(transport) {
                $('submitButton').enable();
            }
        });
    },

    resetIndex : function (el_id) {
        var list = $(el_id);
        if (list != null) {
            list.selectedIndex = 0;
        }
    },

    setAgeFieldsEnabled : function(value) {
        if (value == 1) {
            $('childAge1').disabled = false;
            $('childAge2').disabled = true;
            $('childAge2').value = '';
            $('childAge3').disabled = true;
            $('childAge3').value = '';
        } else if (value == 2) {
            $('childAge1').disabled = false;
            $('childAge2').disabled = false;
            $('childAge3').disabled = true;
            $('childAge3').value = '';
        } else if (value == 3) {
            $('childAge1').disabled = false;
            $('childAge2').disabled = false;
            $('childAge3').disabled = false;
        } else {
            $('childAge1').disabled = true;
            $('childAge1').value = '';
            $('childAge2').disabled = true;
            $('childAge2').value = '';
            $('childAge3').disabled = true;
            $('childAge3').value = '';
        }
    },

    validate : function(action) {
        this.messages = [];
        if (action == 'search_form.html') {
            return true;
        }

        if ($F('depCityId') == '' || $('depCityId').selectedIndex < 0) {
            this.addMessage('<div> - Не указан город отправления<\/div>');
        }
        if ($F('destCountryId') == '-1') {
            this.addMessage('<div> - Не указана страна назначения<\/div>');
        }
        if (!Validator.checkDate($F('startDateFrom')) ||
            !Validator.checkDate($F('startDateTo'))) {
            this.addMessage('<div> - Неправильно указана дата начала тура<\/div>');
        }
        if (!Validator.checkNumber($F('minPrice')))  {
            this.addMessage('<div> - Неправильно указана минимальная цена тура<\/div>');
        }
        if (!Validator.checkNumber($F('maxPrice')))  {
            this.addMessage('<div> - Неправильно указана максимальная цена тура<\/div>');
        }
        if (!Validator.checkAge('childAge1') || !Validator.checkAge('childAge2') || !Validator.checkAge('childAge3')) {
            this.addMessage('<div> - Неправильно указан возраст детей<\/div>');
        }
        return this.messages.length <= 0;
    },

    submit : function(action, page) {
        if (this.validate(action)) {
            $('errorDiv').style.display = 'none';
            $('submitButton').disable();
            $('pageNum').value = page;
            $('tourList').update('<div>Пожалуйста, подождите - запрос обрабатывается...</div>');
            new Ajax.Updater('tourList', this.ajaxUrl, {
                parameters: $('searchForm').serialize(),                
                onComplete: function() {
                    $('submitButton').enable();
                }
            });
            //$(this.elName).submit();
            return false;
        } else {
            this.showMessages();
            return false;
        }
    },

    gotoPage : function(page) {
        this.submit('results.html', page);
    },

    sortByColumn : function(colName) {
        var sortColName = $('sortColumn').value;
        if (sortColName == colName) {
            $('sortType').value = ($('sortType').value == 'desc') ? 'asc' : 'desc';
        } else {
            $('sortColumn').value = colName;
            $('sortType').value = 'asc';
        }
        this.submit('results.html', 1);
    },

    showMessages : function() {
        var messages = this.messages;
        var alertMessage = '<div>Форма заполнена неверно:<\/div>\n';
        for (var i = 0; i < messages.length; i++) {
            alertMessage += messages[i] + '\n';
        }
        $('errorDiv').innerHTML = alertMessage;
        $('errorDiv').style.display = 'block';
    },

    addMessage : function(text) {
        this.messages.push(text);
    },

    clearResults: function() {
        $("tourList").update("");
    }
};
