var check_order_data_request = false;
var fields_values = {};
var new_price = false;
var Cart = new Class({
    
    Implements: [Options, Events],
    
    initialize: function(options) {
        this.setOptions(options);
        this.addRequest         = new Request.JSON({'url': base_url+'cart/add.json',             'onComplete': this.fillInfo});
        this.quantityRequest    = new Request.JSON({'url': base_url+'cart/set_quantity.json',    'onComplete': this.fillInfo});
        this.priceRequest       = new Request.JSON({'url': base_url+'cart/set_price.json',       'onComplete': this.fillInfo});
        this.removeRequest      = new Request.JSON({'url': base_url+'cart/remove.json',          'onComplete': function(){$('cart-form').submit()}});
        this.infoRequest        = new Request.JSON({'url':base_url+'cart/load_cart.json',       'onComplete': this.fillInfo});
    },
    
    add: function(id, quantity, params) {
        this.addRequest.post({
            'id': id,
            'quantity': quantity || 1
        });
    },
    
    remove: function(id) {
        this.removeRequest.post({'id': id});
//        if ($('cart-line-'+id)) $('cart-line-'+id).destroy();
    },
    
    setQuantity: function(id, quantity) {
        if (quantity.toInt() == 0 || isNaN(quantity.toInt())) {
            if (confirm('Вы хотите удалить товар из корзины ?')) {
                $('quantity-'+id).set('value', 0);
                app.Cart.remove(id);
                return true;
            } else {
                $('quantity-'+id).set('value', 1);
                return false;
            }
        }
        this.quantityRequest.post({
            'id': id,
            'quantity': quantity
        });
        if ($('cart-'+id+'-sum')) {
            $('cart-'+id+'-sum').set('text', quantity * parseInt($('price-'+id).get('value') || $('price-'+id).get('text')));
        }

    },

    setPrice: function(id, price) {
        this.priceRequest.post({
            'id': id,
            'price': price
        })
        if ($('cart-'+id+'-sum')) {
            $('cart-'+id+'-sum').set('text', parseInt($('quantity-'+id).get('value')) * price);
        }
    },
    
    fillInfo: function(info) {
        $('cart-sum').set('text', info.cart.sum);
        $('cart-quantity').set('text', info.cart.quantity);


        if ($('total-price')) {
            $('total-price').set('text', info.cart.sum);
        }
        if ($('ems_total-price')) {
            $('ems_total-price').value =  info.cart.sum;
        }

        if ($('total-price-old')) {
            $('total-price-old').set('text', info.cart.old_sum);
            if ( (info.cart.old_sum != null) && (info.cart.old_sum != info.cart.sum) ) {
                $('total-price-old-span').removeClass('none');
            } else {
                $('total-price-old-span').addClass('none');
            }
        }

        if (info.cart_info) {
            $('cart-block').store('tip:text', info.cart_info);
            $('cart-block').removeClass('cart_empty');
            $('cart-block').addClass('cart_full');
        } else {
            $('cart-block').removeClass('cart_full');
            $('cart-block').addClass('cart_empty');
        }

        if(info.notify) {
            window.Notify.addMessage({'title': 'Добавление в корзину', 'description': info.notify});
        }

        updateAllPrices(info.cart.products);
//update bonus info
        new Request.JSON({
            'url': base_url+'cart/get_bonus_info.json',
            'onComplete': function (res) {
//                console.log(res, res == 'false');
                if (res) {
                    if (res.disc) {
                        if (document.getElementById('discount-amount') && res.disc.discounted) {
                            $('discount-amount').set('text', Math.floor(res.disc.discounted));
                        }
                        if (document.getElementById('discount-percent') && res.disc.percent) {
                            $('discount-percent').set('text', Math.round(res.disc.percent));
                        }
                        if (res.users) {
                            if (document.getElementById('left-bonus') && (res.users && res.disc.discounted)) {
                                $('left-bonus').set('text', Math.floor(res.users - res.disc.discounted));
                            }
                        }
                    }
                    if (res.bon) {
                        if (document.getElementById('bonus-amount') && res.bon.bonused) {
                            $('bonus-amount').set('text', Math.floor(res.bon.bonused));
                        }
                    }
                }
            }
        }).post();
//update weight & category_fluent info
        if ($('ems_total-weight') && !$('tab-delivery-russia'))
        new Request.JSON({
            'url': base_url+'cart/get_ems_info.json',
            'onComplete': function (res) {
                $('ems_total-weight').value = res.weight;
                $('ems-weight-txt').set('text', res.weight);
                EmsCalculate();

                for(var i in res.products) {
                    if (document.getElementById('ems-weight-txt-'+res.products[i].id_product)) {
                        document.getElementById('ems-weight-txt-'+res.products[i].id_product).innerHTML = res.products[i].weight;
                    }
                }
            }
        }).post();
//---
    },
    
    loadInfo: function() {
        this.infoRequest.post();
    },

    refreshOrder: function(evt, obj) {
        var e = new Event(evt);
        if (e.code != 13) return false;

        var target = obj;
        var id = target.get('id').split('-');
        if (id[0] == 'quantity') {
            app.Cart.setQuantity(id[1], target.get('value'));
        } else {
            app.Cart.setPrice(id[1], target.get('value'));
        }

        var totalPrice    = 0, amount = 0, price = 0;
        return true;
        $$('.product_line_item').each(function(el) {
            if (!isNaN(amount = el.getElement('.cart_product_amount').get('value').toInt()) &&
                !isNaN(price = el.getElement('.cart_product_price').get('text').toFloat())) {
                el.getElement('.cart_product_sum').set('text', totalPrice += amount*price);
            } else {
                el.getElement('.cart_product_sum').set('text', 0);
            }
        });

        $('total-price').set('text', totalPrice);
        $('old-total-price').set('text', totalPrice);
    },

    stopRefresh: function(evt, obj) {
        var e = new Event(evt);
        if (e.code == 13) {
            e.stop();
        }
    }
});

function selectShipping(id_item) {
    var item    = $(id_item);
    if (!item) return false;
    if (item.getElement('.shipping_choice').get('text') == 'выбрать') {
        $$('.shipping_type').each(function(el) {
            if (el != item) {
                el.addClass('none');
            }
        });
        item.getElement('.shipping_choice').set('text', 'изменить');
        $$('.payment_choice').set('text', 'выбрать');

        $('payment-def').addClass('none');
        $('payments-' + id_item.split('-').getLast()).removeClass('none');

        $('shipping-type').set('value', id_item.split('-').getLast());
        if(new_price == false) {
            new_price = true;    
        } else {
            if(document.getElementById('delivery-field-cost')){
                var cost = ($('shipping-var-'+id_item.split('-').getLast()).getElementsByClassName('shipping_price')[0].innerHTML);
                $('delivery-field-cost').set('value', cost.substring(0, cost.length-3));
            }
        }
        loadOrderFields();
    } else {
        $$('.shipping_type').each(function(el) {
            el.removeClass('none');
        });
        item.getElement('.shipping_choice').set('text', 'выбрать');

        $('payment-def').removeClass('none');
        $('payment-source').getElements('.shipping_payments').each(function(el) {
            el.addClass('none');
            el.getElements('shipping_payment').each(function(el) {
                el.removeClass('none');
                el.getElement('.shipping_choice').set('text', 'выбрать');
            });
        });

        $('delivery-def').removeClass('none');
        $('button-post').addClass('none');
        $('delivery-def').getNext('fieldset').addClass('none');

        fields_values = {};
        $$('.delivery_field').each(function(item) {
            fields_values[item.get('id')] = item.get('value');
        });
        if (document.getElementById('delivery-req')) {
            $('delivery-req').destroy();
        }
        if (document.getElementById('delivery-wish')) {
            $('delivery-wish').destroy();
        }
        if (document.getElementById('delivery-add')) {
            $('delivery-add').destroy();
        }

        $('shipping-type').set('value', '');
        $('payment-type').set('value', '');
    }

    item    = null;
}

function selectPayment(id_item) {
    if($(id_item) != null) {
    var item    = $(id_item);

    if (item.getElement('.shipping_choice').get('text') == 'выбрать') {
        item.getParent().getElements('.shipping_payment').each(function(el) {
            if (el != item) {
                el.addClass('none');
            }
        });
        item.getElement('.shipping_choice').set('text', 'изменить');

        $('delivery-def').addClass('none');
        $('delivery-source').getElements('fieldset').each(function(el) { el.removeClass('none'); });
        $('button-post').removeClass('none');
        if ($('services')) { $('services').removeClass('none'); }

        $('payment-type').set('value', id_item.split('-').getLast());
    } else {
        item.getParent().getElements('.shipping_payment').each(function(el) {
            el.removeClass('none');
        });
        item.getElement('.shipping_choice').set('text', 'выбрать');

        $('delivery-def').removeClass('none');
        $('button-post').addClass('none');
        $('delivery-def').getNext('fieldset').addClass('none');
        if (document.getElementById('delivery-wish')) {
            $('delivery-wish').addClass('none');
        }
        if (document.getElementById('delivery-add')) {
            $('delivery-add').addClass('none');
        }

        $('payment-type').set('value', '');
    }
    }
    item    = null;
}

function rollbackStep(id_step) {
    if (id_step == 'payment') {
        $(id_step+'-source-'+$('shipping-type').get('value')).removeClass('none');
        $('payment-source-def').removeClass('none');
    } else {
        $(id_step+'-source').removeClass('none');
    }
    $(id_step+'-result').addClass('none');

    $$('.' + id_step+'_depend').each(function(item) { item.addClass('none');});
}

function loadOrderFields() {

    new Request.JSON({
        'url': base_url + 'cart/load_fields.json',
        'onComplete': function(res) {
            if (!res || !res.fields) return false;
            if (res.fields[1]) {
                var reqDiv = new Element('div', {
                    'id':    'delivery-req'
                });

                var reqFields = [];
                for (var i in res.fields[1]) {
                    if (res.fields[1][i].id_field == '21') {
                        //phone field
                        reqFields.push(new Element('span', {
                            'class' : 'order_phone_text',
                            'html'  : 'Пожалуйста, обязательно укажите корректный номер мобильного телефона'
                        }));
                        reqFields.push(new Element('label', {
                            'text':    res.fields[1][i].title
                        }));
                        
                        reqFields.push(new Element('div',{
                            'class' : 'phone_number',
                            'html' : '<div class="phone_separator order_phone_separator">+7 (</div><input type="text" id="delivery-field-phone-prefix" value="'+res.fields.phone.prefix+'" maxlength="3" name="phone[prefix]" class="prefix_phone_input delivery_field" /><div class="phone_separator order_phone_separator">)  </div><input type="text" id="delivery-field-phone-number" value="'+res.fields.phone.number+'" name="phone[number]" maxlength="7" class="number_phone_input  delivery_field"/><div class="clear"></div></div>'
                        }));
                        
                    } else {
                        //other fields
                        reqFields.push(new Element('label', {
                            'for':    'delivery-field-' + res.fields[1][i].id_field,
                            'text':    res.fields[1][i].title
                        }));
                        reqFields.push(new Element('input', {
                            'id':        'delivery-field-' + res.fields[1][i].id_field,
                            'type':        'text',
                            'name':        'fields[' + res.fields[1][i].id_field + ']',
                            'value':    res.fields[1][i].value,
                            'class':    'delivery_field'
                        }));
                        reqFields.push(new Element('div', {
                            'class':    'clear'
                        }));
                    }
                }

                reqDiv.adopt(reqFields);

                $('delivery-source').getFirst('fieldset').grab(reqDiv);

                reqDiv        = null;
                reqFields    = null;

                /*for (var i in res.fields[1]) {
                    html_req += '<label for="field-'+res.fields[1][i].id_field+'">'+res.fields[1][i].title+'</label>'+
                    '<input id="field-'+res.fields[1][i].id_field+'" type="text" value="" name="fields['+res.fields[1][i].id_field+']"/>'+
                    '<div class="clear"></div>'+
                    '<div class="mb5 red" style="margin-left:140px;" id="error-'+res.fields[1][i].id_field+'"></div>';
                }
                $('form-container-req').set('html', html_req);*/
            }
            if (res.fields[0]) {
                var wishFieldset = new Element('fieldset', {
                    'id':        'delivery-wish',
                    'class':    'none'
                }).grab(new Element('legend', {
                    'text':        'Также, желательно укажите'
                }));

                var wishFields = [];
                for (var i in res.fields[0]) {
                    wishFields.push(new Element('label', {
                        'for':    'delivery-field-' + res.fields[0][i].id_field,
                        'text':    res.fields[0][i].title
                    }));
                    wishFields.push(new Element('input', {
                        'id':        'delivery-field-' + res.fields[0][i].id_field,
                        'type':        'text',
                        'name':        'fields[' + res.fields[0][i].id_field + ']',
                        'value':    res.fields[0][i].value,
                        'class':    'delivery_field'
                    }));
                    wishFields.push(new Element('div', {
                        'class':    'clear'
                    }));
                }

                wishFieldset.adopt(wishFields);

                $('delivery-source').grab(wishFieldset);

                wishFieldset    = null;
                wishFields        = null;
            }
            if (res.fields[2]) {
                var addFieldset = new Element('fieldset', {
                    'id':        'delivery-add',
                    'class':    'none'
                }).adopt([
                    new Element('legend', {
                        'class':        'cp',
                        'events': {
                            'click':    function(evt) {
                                evt.target    = $(evt.target);
                                if (evt.target.get('tag') != 'span') {
                                    evt.target    = evt.target.getElement('span');
                                }

                                if (evt.target.get('text') == 'показать') {
                                    evt.target.getParent().getNext().removeClass('none');
                                    evt.target.set('text', 'скрыть');
                                } else {
                                    evt.target.getParent().getNext().addClass('none');
                                    evt.target.set('text', 'показать');
                                }
                            }
                        },
                        'html':            'Дополнительные данные (<span class="tdu">показать</span>)'
                    }),
                    new Element('div', {
                        'class':        'none'
                    })
                ]);

                var addFields = [];
                for (var i in res.fields[2]) {
                    if ( res.fields[2][i].id_field == ORDER_IP_FIELD) { continue; }
                    addFields.push(new Element('label', {
                        'for':    'delivery-field-' + res.fields[2][i].id_field,
                        'text':    res.fields[2][i].title
                    }));
                    addFields.push(new Element('input', {
                        'id':        'delivery-field-' + res.fields[2][i].id_field,
                        'type':        'text',
                        'name':        'fields[' + res.fields[2][i].id_field + ']',
                        'value':    res.fields[2][i].value,
                        'class':    'delivery_field'
                    }));
                    addFields.push(new Element('div', {
                        'class':    'clear'
                    }));
                }

                addFieldset.getLast().adopt(addFields);

                $('delivery-source').grab(addFieldset);

                addFieldset    = null;
                addFields    = null;
                /*for(var i in res.fields[2]) {
                    html_add += '<label for="field-'+res.fields[2][i].id_field+'">'+res.fields[2][i].title+'</label>'+
                    '<input id="field-'+res.fields[2][i].id_field+'" type="text" value="" name="fields['+res.fields[2][i].id_field+']"/>'+
                    '<div class="clear"></div>'+
                    '<div class="mb5 red" style="margin-left:140px;" id="error-'+res.fields[2][i].id_field+'"></div>';
                }
                $('form-container-addon').set('html', html_add);*/
            }
            for(var i in fields_values) {
                if ($(i)) $(i).set('value', fields_values[i]);
            }
        }
    }).post({'id_shipping':$('shipping-type').get('value')});
}

function checkOrderData() {

    if (check_order_data_request) return;

    check_order_data_request = true;

    var dr = document.getElementById('delivery-req');
    if (dr) {
        $(dr).getElements('input').each(function(el) {
            $(el).setStyle('border-color', '#CCC'); 
        });
        dr.getElements('.error').each(function(el) { $(el).destroy(); });
    }
    $('delivery-field-email').setStyle('border-color', '#CCC');
    if ($('delivery-field-email-error')) {
        $('delivery-field-email-error').destroy();
    }
    $('form-order').set('send', {
        'onComplete': function(res) {
            var request_result = false;
            if (res) {
                res = JSON.decode(res, true);
            }
            if (res && res.errors) {
                if (res.errors.length === 0) {
                    Modal.show('order-process-msg');
                    request_result = true;
                    $('form-order').submit();
                    /*$('form-order').set('send', {
                        'onComplete': function(res) {
                            $('form-order').submit();
                            return true;
                        }
                    });
                    $('form-order').send(base_url + 'cart/save_click_handler.json');*/
                }

                for (var i in res.errors) {
                    if ($('delivery-field-' + i)) {
                        if(i=='phone-number') {
                             $('delivery-field-' + i).setStyle('border-color', 'red');
                             $('delivery-field-' + i).getPrevious('input').setStyle('border-color', 'red');
                        } else {
                             $('delivery-field-' + i).setStyle('border-color', 'red');
                        }
                        new Element('div', {
                            'id':        'delivery-field-' + i + '-error',
                            'class':    'error',
                            'text':        res.errors[i]
                        }).inject($('delivery-field-' + i).getNext(), 'after');
                    }
                }
            }
            check_order_data_request = request_result;
        }
    });
    $('form-order').send(base_url + 'cart/check_order_data.json');
}

function showUsersSearchResult(users) {
    res = '<table>' 
        +'<tr><td>email</td><td>ФИО</td><td>действия</td></tr>'
    ;
    var l = users.length;
    for(var i=0; i<l; i++) {
        res += '<tr>'
            + '<td>' + users[i]['email'] + '</td>'
            + '<td>' + users[i]['fio'] + '</td>'
            + '<td><span class="htdn" onclick="setOrderUser('
            + (users[i]['id_user'])
            + ');">подставить</span></td> '
            + '</tr>';
    }
    $('manager-user-search-result').set('html', res + '</table>');
}

function setOrderUser(id_user) {
    var info = '';
    if (id_user) {
        new Request.JSON({
            'url':    'service/user_info.json',
            'onComplete': function(res) {
                if (res) {
                    $$('.delivery_field').each(function(item) {
                        item.set('value', '');
                    });
                    res.each(function(item) {
                        if ($('delivery-field-'+item['id_field'])) {
                            $('delivery-field-'+item['id_field']).set('value', item['value']);
                        }
                    });
                    $('delivery-field-id_managed_user').set('value', id_user);
                }
            }
        }).post({
            'id_user': id_user
        });
    }

}

app.Cart = new Cart();

window.addEvent('domready', function(evt) {
    if (document.getElementById('cart-ems-block-handler')) {
        $('cart-ems-block-handler').addEvent('click', function() {
            if ($('cart-ems-block').hasClass('none') )  {
                $('cart-ems-block-handler').addClass('none');
                $('cart-ems-block').removeClass('none');
            } else {
                $('cart-ems-block-handler').removeClass('none');
                $('cart-ems-block').addClass('none');
            }
        });
        $('cart-ems-block-close').addEvent('click', function() {
            $('cart-ems-block-handler').removeClass('none');
            $('cart-ems-block').addClass('none');
        });
    }
    if (document.getElementById('form-order')) {
        if (document.getElementById('shipping-source')) {
            $('shipping-source').getElements('.shipping_choice').each(function(el) {
                el.addEvent('click', function(evt) { selectShipping(evt.target.getParent().get('id')); });
            });

            if (document.getElementById('payment-source')) {
                $('payment-source').getElements('.shipping_choice').each(function(el) {
                    el.addEvent('click', function(evt) { selectPayment(evt.target.getParent().get('id')); });
                });
            }
        }

        $('form-order').addEvent('submit', function(evt) {
            evt.stop();
            checkOrderData();
        });
    }
    if (document.getElementById('manager-user-search')) {
        window.searchRequest = new Request.JSON({'url':base_url + 'service/users_search.json', 'onComplete': showUsersSearchResult});
        
        $(document.getElementById('manager-user-search')).addEvent('click', function() {
            window.searchRequest.post({
                'type':    $('user-search-type').get('value'),
                'text': $('user-search-text').get('value')
            });
        });
    }
});

function updateAllPrices(prods){
    if (prods) {
        for(var i in prods) {
            if (document.getElementById('price-'+prods[i].id_product)) {
                if ( $('price-'+prods[i].id_product).match('input') ) {
                    $('price-'+prods[i].id_product).set('value', prods[i].price);
                } else {
                    $('price-'+prods[i].id_product).set('text', prods[i].price);
                }
                $('cart-'+prods[i].id_product+'-sum').set('text', (prods[i].price * prods[i].quantity) );
                if ( (prods[i].modifiers != null) && (prods[i].modifiers.bundled != null) && (prods[i].modifiers.bundled = 1) ) {
                    $('bundle-disc-'+prods[i].id_product).removeClass('none');
                } else {
                    $('bundle-disc-'+prods[i].id_product).addClass('none');
                }
            }
            if (document.getElementById('quantity-'+prods[i].id_product)) {
                if ( $('quantity-'+prods[i].id_product).match('input') ) {
                    $('quantity-'+prods[i].id_product).set('value', prods[i].quantity);
                } else {
                    $('quantity-'+prods[i].id_product).set('text', prods[i].quantity);
                }
            }
        }
    }
}

