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;
    }

    var nbWrap = document.getElementById('new-style-basket');
    if (nbWrap)
        EStore.OrderForm.init(nbWrap);
}

EStore.prototype = {
    addToBasket: function(baseId, link, extParams) {
        var self = this;
        Umnitsa.Overlay.show();
        Umnitsa.Loader.show(link);
        var options = {
            '_action': 'estore',
            '_method': 'add_to_basket',
            'object_id': baseId
        }
        if (extParams) {
            $.extend(options, extParams);
        }
        if (this.sessID) options['SESS_ID'] = this.sessID;
        $.post('/ajax/', options, function(data) { self.updateBasket(data); }, 'xml');
        return false;
    },
    deleteFromBasket: function(baseId, caller) {
        var self = this;
        Umnitsa.Loader.show(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) {
        var self = this;
        var count = parseInt(input.value, 10);
        if ((count != NaN) && (count > 0) && (input.value != input.defaultValue)) {
            Umnitsa.Loader.show(input);
            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;
        }
    },
    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) {
        Umnitsa.Loader.hide();
        Umnitsa.Overlay.hide();
        this.updateBasketBlock(data);
        if (this.basketDOM) {
            var deleted = data.getElementsByTagName('deleted')[0];
            if (deleted) {
                var baseId = deleted.getAttribute('object_id');
                $(document.getElementById('eStore-basket-row-'+baseId)).remove();
            }
            var changed = data.getElementsByTagName('changed')[0];
            if (changed) {
                var baseId = changed.getAttribute('object_id');
                $(document.getElementById('eStore-basket-row-'+baseId)).find('td').eq(3).html(_getTextContent(changed));
            }
            this.updateBonuses(data.getElementsByTagName('bonus'));
            var basket = data.getElementsByTagName('basket')[0];
            if (basket) {
                var count = _getTextContent(basket.getElementsByTagName('count')[0]) * 1;
                $('#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('');
                    }
                }
                var availBonus = basket.getElementsByTagName('avail_bonus')[0];
                if (availBonus) {
                    var availBonus = parseInt(_getTextContent(availBonus)),
                        useBonus = parseInt(_getTextContent(basket.getElementsByTagName('use_bonus')[0]));
                    $('#eStore-basket-avail-bonuses').html(availBonus.toPrice());
                    $('#eStore-basket-use-bonus').html(useBonus.toPrice());
                    if (useBonus > 0) {
                        $('#eStore-bonus-row').show();
                    } else {
                        $('#eStore-bonus-row').hide();
                    }
                } else {
                    $('#eStore-bonus-row').hide();
                }
                var bonusAdd = basket.getElementsByTagName('bonus_add')[0];
                if (bonusAdd) {
                    $('#eStore-basket-bonus-add').html(parseInt(_getTextContent(bonusAdd)).toPrice());
                }
                var message = basket.getElementsByTagName('message')[0];
                if (message) {
                    $('#eStore-basket-message').html(_getTextContent(message));
                } else {
                    $('#eStore-basket-message').empty();
                }
                if ((EStore.OrderForm) && (count > 0)) {
                    if (EStore.OrderForm.currentStep() == 'shipment') {
                        EStore.OrderForm.reloadShipmentTypes();
                    } else if (EStore.OrderForm.currentStep() == 'verify') {
                        $('#eStore-basket-verify-full-summ').html(_getTextContent(basket.getElementsByTagName('full_summ')[0]));
                        $('#eStore-basket-verify-shipment-cost').html(_getTextContent(basket.getElementsByTagName('shipment_cost')[0]));
                    }
                }
            }
        }
        var popup = data.getElementsByTagName('popup')[0];
        if (popup) {
            Umnitsa.Popup.showHTML({
                html : _getTextContent(popup),
                width : 400,
                css : 'ball'
            });
        }

    },
    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;
            if (this._timeout) {
                window.clearTimeout(this._timeout);
            }
            this._timeout = 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 _getTextContent = window._getTextContent = function(xmlElement) {
    if (xmlElement.text != undefined) return xmlElement.text;
    else if (xmlElement.textContent != undefined) return xmlElement.textContent;
    else if (xmlElement.firstChild != undefined) return xmlElement.firstChild.nodeValue;
}

