(function() {

var EStore = window.__EStore = function() {
    this.basketBlockDOM = document.getElementById('eStore-basket-block');
    this.basketDOM = document.getElementById('eStore-basket');
    this.form = null;
    if (document.getElementById('eStore-form')) this.form = new EStoreForm(document.getElementById('eStore-form'));
    if (this.basketDOM) this.setupInputsChanging();
    if (window.location.toString().match(/SESS_ID=(\d+)/)) {
        this.sessID = RegExp.$1;
    }
}

EStore.prototype = {
    addToBasket: function(baseId, link) {
        var self = this;
        $canvas.disableLayer();
        $canvas.showLoaderLogo($(link));
        var options = {
            '_action': 'estore',
            '_method': 'add_to_basket',
            'object_id': baseId
        }
        if (this.sessID) options['SESS_ID'] = this.sessID;
        $.post('/ajax/', options, function(data) { self.updateBasket(data); return false; }, 'xml');
        return false;
    },
    deleteFromBasket: function(baseId, caller) {
        var self = this;
        $canvas.showLoaderLogo($(caller));
        var options = {
            '_action': 'estore',
            '_method': 'delete_from_basket',
            'object_id': baseId
        }
        if (this.sessID) options['SESS_ID'] = this.sessID;
        $.post('/ajax/', options, function(data) { self.updateBasket(data); }, 'xml');
        return false;
    },
    changeQuantity: function(baseId, input) {
        $canvas.showLoaderLogo($(input));
        var self = this;
        var count = parseInt(input.value, 10);
        if ((count != NaN) && (count > 0)) {
            if (count == 0) return this.deleteFromBasket(baseId, input);
            input.value = count;
            input.defaultValue = input.value;
            var options = {
                '_action': 'estore',
                '_method': 'change_quantity',
                'object_id': baseId,
                'value': count
            }
            if (this.sessID) options['SESS_ID'] = this.sessID;
            $.post('/ajax/', options, function(data) { self.updateBasket(data); }, 'xml');
            return true;
        } else {
            input.value = input.defaultValue;
            return false;
        }
    },
    useBonus: function(input) {
        var self = this;
        var value = parseInt(input.value, 10);
        if (value != NaN) {
            input.defaultValue = input.value;
            $canvas.showLoaderLogo($(input));
            var options = {
                '_action': 'estore',
                '_method': 'use_bonus',
                'value': value
            }
            if (this.sessID) options['SESS_ID'] = this.sessID;
            $.post('/ajax/', options, function(data) { self.updateBonusChange(data); }, 'xml');
        } else {
            input.value = input.defaultValue;
        }
    },
    updateBonusChange: function(data) {
        $canvas.hideLoaderLogo();
        if (document.getElementById('eStore-bonus-row')) {
            $('#eStore-bonus-row input').get(0).value = _getTextContent(data.getElementsByTagName('use_bonus')[0]);
            $('#eStore-basket-full-summ').html(_getTextContent(data.getElementsByTagName('full_summ')[0]));
        }
    },
    updateBasketBlock: function(data) {
        var basketBlock = data.getElementsByTagName('basket')[0];
        if ((this.basketBlockDOM) && (basketBlock)) {
            var count = _getTextContent(basketBlock.getElementsByTagName('count')[0]);
            if (count == 0) {
                window.location.reload();
                return;
            }
            $('#eStore-basket-count').html(count);
            $('#eStore-basket-cost').html(_getTextContent(basketBlock.getElementsByTagName('summ')[0]));
        }
    },
    updateBasket: function(data) {
        $canvas.hideLoaderLogo();
        $canvas.enableLayer();
        this.updateBasketBlock(data);
        if (this.basketDOM) {
            var deleted = data.getElementsByTagName('deleted')[0];
            if (deleted) {
                var baseId = deleted.getAttribute('object_id');
                $('#eStore-basket-row-'+baseId).remove();
            }
            var changed = data.getElementsByTagName('changed')[0];
            if (changed) {
                var baseId = changed.getAttribute('object_id');
                $('#eStore-basket-row-'+baseId+' td').eq(3).html(_getTextContent(changed));
            }
            this.updateBonuses(data.getElementsByTagName('bonus'));
            var basket = data.getElementsByTagName('basket')[0];
            if (basket) {
                $('#eStore-basket-summ').html(_getTextContent(basket.getElementsByTagName('summ')[0]));
                $('#eStore-basket-full-summ').html(_getTextContent(basket.getElementsByTagName('full_summ')[0]));
                $('#eStore-basket-shipment-cost').html(_getTextContent(basket.getElementsByTagName('shipment_cost')[0]));
                if (document.getElementById('eStore-discount-row')) {
                    var discountCoef = parseInt(_getTextContent(basket.getElementsByTagName('discount_c')[0]));
                    if (discountCoef) {
                        $('#eStore-discount-row').show();
                        $('#eStore-basket-discount').html(_getTextContent(basket.getElementsByTagName('discount')[0])+' (' + discountCoef + '%)');
                    } else {
                        $('#eStore-discount-row').hide();
                        $('#eStore-basket-discount').html('');
                    }
                }
                if (document.getElementById('eStore-bonus-row')) {
                    var availBonus = basket.getElementsByTagName('avail_bonus')[0];
                    if (availBonus) {
                        $('#eStore-bonus-row').show();
                        $('#eStore-avail-bonus').html(_getTextContent(basket.getElementsByTagName('avail_bonus')[0]));
                        $('#eStore-bonus-row input').get(0).value = _getTextContent(basket.getElementsByTagName('use_bonus')[0]);
                    } else {
                        $('#eStore-bonus-row').hide();
                    }
                }
                var message = basket.getElementsByTagName('message')[0];
                if (message) {
                    $('#eStore-basket-message').html(_getTextContent(message));
                } else {
                    $('#eStore-basket-message').empty();
                }
            }
        }
        var popup = data.getElementsByTagName('popup')[0];
        if (popup) __page.showPopupMessage(_getTextContent(popup));
    },
    updateBonuses: function(data) {
        var hash = {};
        for (var i=0; i<data.length; i++)
            hash[data[i].getAttribute('id')] = data[i].getAttribute('count');
        $(this.basketDOM).find('tr.bonus').each(function() {
            if (this.id.match(/eStore\-basket\-row-(\d+)\-bonus/)) {
                var id = RegExp.$1;
                if (!hash[id]) $(this).remove();
                else $(this).find('input').get(0).value = hash[id];
            }
        });
    },
    setupInputsChanging: function() {
        var keyDownEventListener = function() {
            var input = this;
            window.setTimeout(function() {
                if ((input.value != '') && (input.value != input.defaultValue)) {
                    input.onchange.apply(input);
                }
            },
            500
            );
        };
        $(this.basketDOM).find('input:text').each(function() {
            if (this.onchange) {
                $(this).keydown(keyDownEventListener);
            }
        });
    }
}

var EStoreForm = function(formDOM) {
    this.form = formDOM;
    this.setupFields();
    if (document.getElementById('basket-master-question-block')) this.__quetions = new EStoreQuestions(document.getElementById('basket-master-question-block'));
}

EStoreForm.prototype = {
    setupFields: function() {
        var self = this;
        for (var i=0; i<this.form.elements.length; i++) {
            switch (this.form.elements[i].name) {
                case 'country' :
                    this.defineCountry();
                    $(this.form.elements[i]).change(function() { self.defineCountry(); });
                    break;
                case 'zip_code' :
                    $(this.form.elements[i]).change(
                        function() {
                            if (this.form['region'].value == '') self.zipCodeRes('auto');
                        }
                    );
                    break;
                case 'city':
                case 'region':
                    this.form.elements[i].resValue = this.form.elements[i].value;
                    this.form.elements[i].setAttribute('autocomplete', 'off');
                    $(this.form.elements[i]).keydown(
                        function(eventObject) {
                            self.startAutoSuggest(eventObject, this);
                        }
                    );
                    break
            }
        }
    },
    defineCountry: function() {
        if (this.form['country'].value != 'Россия') {
            this.formClass = 'foreign';
            $(this.form).addClass('set-foreign')
        } else {
            this.formClass = 'russia';
            $(this.form).removeClass('set-foreign')
        }
    },
    zipCodeRes: function(type) {
        var self = this;
        var zip = this.form['zip_code'].value;
        var region = this.form['region'].value;
        var city = this.form['city'].value;
        zip = zip.replace(/\D/,'');
        if ((!this.zipDecription) && (this.formClass != 'foreign')
            && (((zip) && (!type)) || ((type) && (region) && (city)))
           ) {
            this.zipDecription = true;
            var params = { '_action': 'zip_decrypt' };
            if (type) {
                params['region'] = region;
                params['city'] = city;
            } else {
                params['zip'] = zip;
            }
            $.post( '/ajax/',
                    params,
                    function(data) {
                        var error = data.getElementsByTagName('error')[0];
                        if (error) {
                            if (self.zipDecriptionType != 'auto') __page.showPopupMessage(_getTextContent(error));
                        } else {
                            var vals = data.getElementsByTagName('ajax_template')[0].childNodes;
                            for (var i=0; i<vals.length; i++)
                                if ((vals[i].tagName) && (self.form[vals[i].tagName]))
                                    self.form[vals[i].tagName].value = _getTextContent(vals[i]);
                        }
                        self.zipDecription = false;
                    },
                    'xml');
        }
        return false;
    },
    startAutoSuggest: function(eventObject, element) {
        var self = this;
        if (this.formClass != 'foreign') {
            switch (eventObject.keyCode) {
                case 38:
                    if (element.__variants) {
                        if (element.__variantsSelected) {
                            element.__variantsSelected.className = '';
                            element.__variantsSelected = element.__variantsSelected.previousSibling;
                        }
                        if (!element.__variantsSelected) element.__variantsSelected = element.__variants.get(0).lastChild;
                        element.__variantsSelected.className = 'selected';
                        element.value = element.__variantsSelected.innerHTML;
                    }
                    break;
                case 40:
                    if (element.__variants) {
                        if (element.__variantsSelected) {
                            element.__variantsSelected.className = '';
                            element.__variantsSelected = element.__variantsSelected.nextSibling;
                        }
                        if (!element.__variantsSelected) element.__variantsSelected = element.__variants.get(0).firstChild;
                        element.__variantsSelected.className = 'selected';
                        element.value = element.__variantsSelected.innerHTML;
                    }
                    break;
                case 9:
                case 13:
                case 27:
                    this.closeSuggestVariants(element);
                    break
                default:
                    if (element.watingTimeout) window.clearTimeout(element.watingTimeout);
                    element.watingTimeout = window.setTimeout(function() {  self.autoSuggest(element); }, 100);
                    return false;
/*                    if (element.value != element.resValue) {
                        element.resValue = element.value;
                    }*/
            }
        }
    },
    autoSuggest: function(element) {
        var self = this;
        if (element.value == '') {
            if (element.watingTimeout) window.clearTimeout(element.watingTimeout);
            if (element.__variants) {
                element.__variants.remove();
                element.__variants = null;
            }
        } else if (element.value != element.resValue) {
            element.resValue = element.value;
            var options = { _action: 'auto_suggest', field: element.name, str: element.value };
            if (element.name == 'city') options['region'] = this.form['region'].value;
            $.post( '/ajax/',
                    options,
                    function(data) {
                        self.drawSuggestVariants(element, data);
                    },
                    'xml');
        }
    },
    drawSuggestVariants: function(element, data) {
        var self = this;
        var items = data.getElementsByTagName('item');
        if (items.length > 0) {
            if (!element.__variants) {
                var offset = $(element).offset();
                element.__variants = $('<div class="form-suggest-list">')
                                        .css( { top: offset.top+element.offsetHeight,
                                                left: offset.left,
                                                width: element.offsetWidth }
                                            )
                $canvas.append(element.__variants);
            } else {
                element.__variants.empty();
            }
            element.__variantsSelected = null;
            for (var i=0; i<items.length; i++) {
                element.__variants.append(
                    $('<div>')
                        .html(str = _getTextContent(items[i]))
                );
            }
            var ovf = function() { this.className = 'selected'; element.__variantsSelected = this; }
            var ovu = function() { this.className = ''; element.__variantsSelected = null; }
            element.__variants.find('div').hover(ovf, ovu);
            $(element).blur(function() { self.closeSuggestVariants(this); });
            //$(document).keydown
        } else {
            this.closeSuggestVariants(element);
        }
    },
    closeSuggestVariants: function(element) {
        if (element.__variants) {
            if (element.__variantsSelected) element.value = element.__variantsSelected.innerHTML;
            element.__variants.remove();
            element.__variants = null;
        }
    }
}

var EStoreQuestions = function(rootElement) {
    this.rootElement = rootElement;
    this.qContext = 'root';
    this.allQuestions = 0;
    this.DOMcontext = this.rootElement;
    this._valCache = {};
    this.get();
}
EStoreQuestions.prototype = {
    get: function() {
        var self = this;
        var params = {
            '_interface': 'questions',
            'q_context': this.qContext
        };
        this.DOMcontext.innerHTML = 'Загрузка ...';
        $.post('/ajax/', params, function(data) { self.parseResponse(data) }, 'xml');
    },
    parseResponse: function(data) {
        var self = this;
        this.DOMcontext.innerHTML = '';
        var questions  = data.getElementsByTagName('question');
        var qLength = questions.length;
        if (qLength > 0) {
            if (this.qContext == 'root') this.allQuestions = parseInt(questions[0].getAttribute('all'));
            for (var i=0; i<questions.length; i++) {
                var qHtml = questions[i].getElementsByTagName('html')[0];
                if (qHtml) {
                    var $cntEl = $el('div').addClass('question-block').html(_getTextContent(qHtml)).appendTo(this.DOMcontext);
                    if ((!this.allQuestions) && (questions[i].getAttribute('class') == 'eb_question') && (questions[i].getAttribute('type') == 'radio')) {
                        var $chCnt = $el('div').addClass('question-block').appendTo($cntEl);
                        $('input[type=radio]', $cntEl).click(function() { self.checkRadioClick(this); }).each(function() { self._valCache[this.name] = 0; this.__cntEl = $chCnt.get(0); });
                    }
                }
            }
        }
    },
    checkRadioClick: function(element) {
        if ((!this._valCache[element.name]) || (this._valCache[element.name] != element.value)) {
            this._valCache[element.name] = element.value;
            if (element.__cntEl) {
                this.qContext = element.value;
                this.DOMcontext = element.__cntEl;
                this.get();
            }
        }
    }
}


})();
