var oComplaint = {
    
    type : 'tv',
    lockRequest : false,
    plainSubmit : false,
    lockSubmit : true,
    cityId : 0,
    streetId : 0,
    requestDomain : 'http://order.eltv.ru/',
    sid : '',
    
    /**
     * Извлечь JSONP
     * @param string url
     * @param string callback
     */
    getJsonp : function(url, callback)
    {
        var params = {
            url: url,
            type: 'get',
            dataType: 'jsonp',
            jsonpCallback: callback
        };
        $.ajax(params);
    },
    
    /**
     * Инициализация приложения
     */
    init : function()
    {
        this.lockSubmit = true;
        
        var oThis = this;
        $('#complaint-form').submit(function(e) {
            if (oThis.plainSubmit)
                return true;
            
            oThis.submitHandler.call(oThis, e);
            return false;
        });
    
        $('#complaint-form').validationEngine({
            scroll: false,
            promptPosition: 'topLeft'
        });
        
        this.type = $('.complaint-form-type-row input:checked').val();
        this.getCities();
        
        
        $('#complaint-close').click(function(e) {
            if (e.target == e.currentTarget) {
                $('#complaint-form').validationEngine('hideAll');
                $('#complaint-wrapper').hide();
                return false;
            }
        });
        
        var url = this.requestDomain + '/' + this.type + '/getSid/';                
        this.getJsonp(url, 'oComplaint.getSid');

        if ($.browser.msie && parseInt($.browser.version) < 9)
            $('#complaint').corner('20px, cc:#585858');
    },
    
    getSid : function(sid)
    {
        this.sid = sid;
        this._setCaptcha();
        
        this._initGrewform();
        this._initEvents();
        
        this.lockSubmit = false;
        
        var sidinp = document.createElement('input');
        sidinp.type = 'hidden';
        sidinp.value = this.sid;
        sidinp.name = 'PHPSESSID';
        $('complaint-form').append(sidinp);
    },
    
    _initGrewform : function()
    {
        var oThis = this;
        var params = {
            '#complaint-type-tv:checked': {
                custom: {
                    match: function() {
                        oThis.type = 'tv';
                        $('#complaint-type').val(oThis.type);
                        oThis.getCities.call(oThis);
                    },
                    unmatch: function() {}
                }
            },
            '#complaint-type-inet:checked': {
                custom: {
                    match: function() {
                        oThis.type = 'inet';
                        $('#complaint-type').val(oThis.type);
                        oThis.getCities.call(oThis);
                    },
                    unmatch: function() {}
                }
            },
            '#complaint-type-phone:checked': {
                custom: {
                    match: function() {
                        oThis.type = 'phone';
                        $('#complaint-type').val(oThis.type);
                        oThis.getCities.call(oThis);
                    },
                    unmatch: function() {}
                }
            }
        };
        $('#complaint-form').grewform(params);
    },
    
    _initEvents : function() 
    {
        var oThis = this;
        $('#complaint-form-cities-select').live('change', function() {
            oThis.cityId = $(this).val();
            oThis.getStreets.call(oThis);
        });
        
        $('#complaint-form-streets-select').live('change', function() {
            oThis.streetId = $(this).val();
            oThis.getHouses.call(oThis);
        });        
    },
                
    /**
     * Извлечь улицы
     */
    getCities : function()
    {
        if (this.lockRequest)
            return;
                    
        this.lockRequest = true;
        this._setPreloader('#complaint-form-cities, #complaint-form-streets, #complaint-form-houses');
        
        var url = this.requestDomain+this.type+'/getCities/?PHPSESSID='+this.sid;
        this.getJsonp(url, 'oComplaint.drawCities');
    },
                
    _setPreloader : function(selector)
    {
        var img = new Image();
        img.src = '/static/site/images/ajax-loader.gif'
        $(selector).html(img);
    },
                
    drawCities : function(jData)
    {
        if (jData.length == 0)
            throw 'There is no cities';
                                        
        if (jData.length == 1)
            this._drawOneCity(jData);
        else
            this._drawManyCities(jData);
                    
        this.cityId = jData[0]['city_id'];
        this.lockRequest = false;
                    
        this.getStreets();
    },
                
    _drawOneCity : function(jData)
    {
        var oHidden = document.createElement('input');
        oHidden.type = 'hidden';
        oHidden.name = 'complaint[city_id]';
        oHidden.value = jData[0]['city_id'];
        $('#complaint-form-cities').html(oHidden);
        $('#complaint-form-cities').addClass('empty');
    },
                
    _drawManyCities : function(jData)
    {
        var oLabel = document.createElement('label');
        $(oLabel).attr('for', 'complaint-form-cities-select');
        oLabel.innerHTML = 'Город';
                    
        var oSelect = document.createElement('select');
        oSelect.id = 'complaint-form-cities-select';
        oSelect.name = 'complaint[city_id]';
                    
        $('#complaint-form-cities').html(oLabel);
        $('#complaint-form-cities').append(oSelect);
                    
        var oOption;
        for (var i in jData)
        {
            oOption = document.createElement('option');
            oOption.value = jData[i]['city_id'];
            oOption.innerHTML = jData[i]['name'];
            oSelect.appendChild(oOption);
        }
                    
        $('#complaint-form-cities').removeClass('empty');
    },
                
    /**
     * Извлечь улицы
     */
    getStreets : function()
    {
        if (this.lockRequest)
            return;
                    
        this.lockRequest = true;
        this._setPreloader('#complaint-form-streets, #complaint-form-houses');
        var url = this.requestDomain+this.type+'/getStreets/?city_id='+this.cityId+'&PHPSESSID='+this.sid;
        this.getJsonp(url, 'oComplaint.drawStreets');
    },
    
    drawStreets : function(jData)
    {
        if (jData.length == 0)
            throw 'There is no streets';

        var oLabel = document.createElement('label');
        $(oLabel).attr('for', 'complaint-form-streets-select');
        oLabel.innerHTML = 'Улица';
                    
        var oSelect = document.createElement('select');
        oSelect.id = 'complaint-form-streets-select';
        oSelect.name = 'complaint[street_id]';
                    
        $('#complaint-form-streets').html(oLabel);
        $('#complaint-form-streets').append(oSelect);
                    
        var oOption;
        for (var i in jData)
        {
            oOption = document.createElement('option');
            oOption.value = jData[i]['street_id'];
            oOption.innerHTML = jData[i]['name'];
            oSelect.appendChild(oOption);
        }
                    
        this.streetId = jData[0]['street_id'];
        this.lockRequest = false;
                    
        this.getHouses();
    },
    
    /**
     * Извлечь дома
     */
    getHouses : function()
    {
        if (this.lockRequest)
            return;
                    
        this.lockRequest = true;
        this._setPreloader('#complaint-form-houses');
        var url = this.requestDomain+this.type+'/getHouses/?street_id='+this.streetId+'&PHPSESSID='+this.sid;
        this.getJsonp(url, 'oComplaint.drawHouses');
    },
    
    drawHouses : function(jData)
    {
        if (jData.length == 0)
            throw 'There is no houses';

        var oLabel = document.createElement('label');
        $(oLabel).attr('for', 'complaint-form-houses-select');
        oLabel.innerHTML = 'Дом';
                    
        var oSelect = document.createElement('select');
        oSelect.id = 'complaint-form-houses-select';
        oSelect.name = 'complaint[house_id]';
                    
        $('#complaint-form-houses').html(oLabel);
        $('#complaint-form-houses').append(oSelect);
                    
        var oOption;
        for (var i in jData)
        {
            oOption = document.createElement('option');
            oOption.value = jData[i]['house_id'];
            oOption.innerHTML = jData[i]['number'] + (jData[i]['building'] ? (' корп. '+jData[i]['building']) : '');
            oSelect.appendChild(oOption);
        }
                    
        this.lockRequest = false;
    },
    
    /**
     * Обработчик сабмита формы
     */
    submitHandler : function(e)
    {
        if (this.lockSubmit ||  !$('#complaint-form').validationEngine('validate'))
            return;
        
        this.lockSubmit = true;
        $('#complaint-form-preloader').show();
        
        var captchaCode = $('#complaint-form-captcha-input').val();
        var url = this.requestDomain+this.type+'/validateCaptcha/?code='+captchaCode+'&PHPSESSID='+this.sid;
        this.getJsonp(url, 'oComplaint.makeSubmit');
    },
    
    makeSubmit : function(captchaValid)
    {
        this.lockSubmit = false;
        $('#complaint-form-preloader').hide();
        
        if (captchaValid) {
            this.plainSubmit = true;
            $('#complaint-form').submit();
        }
        else {
            alert('Неверный проверочный код!');
            this._setCaptcha();
        }
    },
    
    _setCaptcha : function()
    {
        var date2url = '?_='+(new Date()).getTime();
        var sid2url = '&PHPSESSID='+this.sid;
        var src = this.requestDomain+'/captcha/default/'+date2url+sid2url;
        
        var captcha = new Image();
        captcha.width = 150;
        captcha.height = 50;
        captcha.id = 'complaint-form-captcha-image';
        captcha.src = src;
        $('#complaint-form-captcha-label').html(captcha);
    }

};

$(function() {
    oComplaint.init.call(oComplaint);
});

