﻿// <reference path="scripts.htm" />

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Copyright (c) 2008-2009 OrderBot Software, Inc. All rights reserved.
// orderbot.cart.checkout.js
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Object.createNamespace('orderbot.cart.checkout');

Object.extend(orderbot.cart.checkout, {

    loadingImg: { name: 'ajax-loading-2.gif', w: 16, h: 16 },
    content: null,
    dialog: null,
    recipients: [],
    messageType: { info: 'msg', success: 'msg-success', error: 'msg-error', usps_error: 'usps-error' },
    validateAddress: true,
    accDialog: null,

    resetDialog: function (modal) {
        modal.opt.close.esc = true;
        modal.opt.close.link = true;
        modal.the_editor.show();
        modal.the_address.hide();
        modal.setDimensions.bind(modal).defer();
    },

    init: function () {
        this.content = $('cart-content');
        if (!this.content) return;


        accDialog = new Dialog({
            content: 'temporal content',
            padding: 0,
            title: 'temporal title',
            close: {
                overlay: false,
                link: true
            }
        });

        var context = this;

        var recipients = this.content.select('table.recipient-summary');

        recipients.each(function (r) {
            context.recipients.push({ id: r.id, lastZip: null, address: null });

            context.initCombos(r);
            context.initRbMShippingMethods(r);

            var div = r.down('div.shipping-address');
            var radio = div.down('input[id$=rbCustomerAsRecipient]');
            radio.observe('click', function (e) {
                var id = r.id;
                ShoppingCartHandler.GetCustomerAddress(id, function (response) {
                    if (response.error) { alert(response.error.Message); return; }
                    var data = orderbot.parseJSON(response.value);
                    context.updateRecipientAddressEditorValues(data);
                });
            });

            div = r.down('table.rptItems');
            var btnUpdateQty = div.down('input[id$=btnUpdateQty]');

            var txts = div.select('input[id$=txtQty]');
            txts.each(function (txt) {
                txt.observe('keypress', function (e) {
                    if ((e.which || e.keyCode) == Event.KEY_RETURN) {
                        e.stop(); orderbot.fireClickEvent(btnUpdateQty);
                    }
                });
            });

        });



        var btn = $('wrapper').down('input[id*=btnBilling]');

        btn.observe('click', function (e) { e.stop(); context.validateOrder(); });

        var divValidateShippingAddress = $('DivValidateShippingAddress');

        if (divValidateShippingAddress) {
            var btnCurrent = divValidateShippingAddress.down('input[id*=btnUseCurrent]');
            btnCurrent.observe('click', function (e) {
                e.stop();
                Dialogs.close();
            });

            var btSubmit = divValidateShippingAddress.down('input[id*=btSubmit]');
            btSubmit.observe('click', function (e) {
                e.stop();
                var DivValidateShippingAddress = $('DivValidateShippingAddress');
                var divRecipientId = DivValidateShippingAddress.down('div.RecipientId');

                var trSelectHeader = DivValidateShippingAddress.down('table.CandidateAddress').down('tr.SelectHeader');
                var selecttdStreetLine = trSelectHeader.down('td.StreetLine').down('input');
                var selecttdStreetLine2 = trSelectHeader.down('td.StreetLine2').down('input');
                var selecttdCity = trSelectHeader.down('td.City');
                var selecttdState = trSelectHeader.down('td.State');
                var selecttdCountry = trSelectHeader.down('td.Country');
                var selecttdZip = trSelectHeader.down('td.Zip');

                var values = {
                    Address: selecttdStreetLine.value,
                    Address2: selecttdStreetLine2.value,
                    Zip: selecttdZip.innerHTML,
                    City: selecttdCity.innerHTML,
                    CountryName: selecttdCountry.innerHTML,
                    StateName: selecttdState.innerHTML,
                    RecipientId: divRecipientId.innerHTML
                };

                orderbot.cart.checkout.updateRecipientValidatedAddress(values, true)

                // Dialogs.close();
            });

            var btCancel = divValidateShippingAddress.down('input[id*=btCancel]');

            btCancel.observe('click', function (e) {
                e.stop();
                Dialogs.close();
            });
        }
    },

    initCombos: function (container) {
        var id = container.id;
        var div = container.down('div.shipping-address');
        var ddl = div.down('SELECT[id$=ddlCountries]');
        var context = this;
        ddl.observe('change', function (e) {


            if (!orderbot.countryHasStates(ddl.value)) {
                context.togglePhoneState(false, id);
            } else {
                context.togglePhoneState(true, id);
                //orderbot.populateStates($('dialog-content'), ddl.value);
                orderbot.populateStates($('cart-content'), ddl.value);
            }

            orderbot.cart.checkout.GetShippingMethods(ddl.value, e);
        });

        this.togglePhoneState(this.hasStates, id);
    },

    initRbMShippingMethods: function (container) {
        var id = container.id;
        var div = container.down('div.shipping-address');
        var rbs = div.select('input[id*=RadioButtonList1]');
        var context = this;
        context.updateRecipientAddress(id, div, true);

        rbs.each(
            function (rb) {
                rb.observe('change', function (e) {
                    context.updateRecipientAddress(id, div, true);
                });
            }
        );

    },

    GetShippingMethods: function (countryId, e) {

        ShoppingCartHandler.GetShippingCartAndMethodsByCountryFrontend(countryId, function (response) {
            if (response.error) { alert(response.error.Message); return; }
            // alert(response.value);
            var cart = orderbot.parseJSON(response.value);
            if (cart == "") {
                alert('No Carts found.');
            }
            else {
                cart.Recipients.each(
                    function (rec) {

                        //alert(rec.RecipientId);
                        var shippingMethodId = rec.ShippingMethodId.toString();
                        var GetMethods = rec.AvaliableMethods;
                        //'order_f71db0f9-9643-4c2b-87d0-958560d47dca'
                        var content1 = $("cart-content"); // Page Content div
                        var selector = String.format('table#{0}', rec.RecipientId);
                        var recipient = content1.down(selector);
                        var shippingInfo = recipient.down('table[id$=RadioButtonList1]');

                        //alert(GetMethods.size());
                        orderbot.cart.checkout.updateOrderTotal(rec);
                        orderbot.cart.checkout.updateRecipientTotals(rec);

                        if (shippingInfo != null) {

                            var tbody = shippingInfo.down('tbody');
                            tbody.update();

                            GetMethods.each(
                                function (method) {
                                    var tr = orderbot.cart.checkout.getShippingMethodTR(method, shippingMethodId);
                                    tbody.appendChild(tr);
                                }
                            );

                        }
                        else {
                            alert("erro");
                        }

                        orderbot.cart.checkout.updateAddress(rec.RecipientId, e);

                    });
            }
        });

    },

    getShippingMethodTR: function (ShippingMethod, defaultId) {
        var rbShippingMethod;
        var tr = $.TR({}, $.TD({},
             rbShippingMethod = $.INPUT({ id: 'RadioButtonList1_' + ShippingMethod.ShippingMethodID,
                 value: ShippingMethod.ShippingMethodID, name: 'RadioButtonList1', type: 'radio'
             }),
                $.SPAN({ id: 'RadioButtonList1_' + ShippingMethod.ShippingMethodID }, ShippingMethod.Name)
        ));

        if (defaultId == ShippingMethod.ShippingMethodID) {
            rbShippingMethod.checked = true;
        }

        return tr;
    },

    initShipping: function () {

        ShoppingCartHandler.GetShippingCartAndMethodsFrontend(function (response) {
            if (response.error) { alert(response.error.Message); return; }
            // alert(response.value);
            var cart = orderbot.parseJSON(response.value);
            if (cart == "") {
                alert('No Carts found.');
            }
            else {
                cart.Recipients.each(
                    function (rec) {

                        var shippingMethodId = rec.ShippingMethodId.toString();
                        var GetMethods = rec.AvaliableMethods;
                        //'order_f71db0f9-9643-4c2b-87d0-958560d47dca'
                        var content1 = $("cart-content"); // Page Content div
                        var selector = String.format('table#{0}', rec.RecipientId);
                        var recipient = content1.down(selector);
                        var shippingInfo = recipient.down('table[id$=RadioButtonList1]');


                        if (shippingInfo != null) {

                            var tbody = shippingInfo.down('tbody');
                            tbody.update();

                            GetMethods.each(
                                function (method) {
                                    var tr = orderbot.cart.checkout.getShippingMethodTR(method, shippingMethodId);
                                    tbody.appendChild(tr);
                                }
                            );

                        }
                        else {
                            alert("erro");
                        }

                    });
            }
        });

    },

    // use local - not from orderbot.commom.js
    togglePhoneState: function (withValidations, recipientId) {
        //sa_f7f927ae-c051-43af-9e5d-0dfe5e9c90d3
        var table = this.content.down('table[id=' + recipientId + ']');
        var div = table.down('div.shipping-address');
        if (!div) { div = $('dialog-content').down('div.shipping-address'); }
        if (!withValidations) {
            if (/Safari/.test(navigator.userAgent)) {
                new PeriodicalExecuter(function (pe) {
                    div.down('div[id=state-dd]').hide();
                    div.down('div[id=state-txt]').show();
                    pe.stop();
                }, 0.1);
            } else {
                div.down('div[id=state-dd]').hide();
                div.down('div[id=state-txt]').show();
            }
            div.down('div[id=phoneWithValidation]').hide();
            div.down('div[id=phoneFree]').show();
            $('zip-req').hide();
        }
        else {
            div.down('div[id=state-dd]').show();
            div.down('div[id=state-txt]').hide();
            div.down('div[id$=phoneWithValidation]').show();
            div.down('div[id$=phoneFree]').hide();
            $('zip-req').show();
        }
    },

    applyCouponCode: function (recipientId, event) {
        if (event) Event.stop(event);

        var div = $('summary');

        var text = div.down('input[id$=txtCouponCode]').value;
        //alert (text);

        var args = { couponCode: text, recipientId: recipientId };

        if (text.empty()) return;

        var btn = div.down('input[id$=btnApplyCouponCode]');
        orderbot.toogleAjaxButton(btn, true);
        var context = this;
        ShoppingCartHandler.ApplyCouponCode(args, function (response) {
            if (response.error) { orderbot.toogleAjaxButton(btn); alert(response.error.Message); return; }
            var data = orderbot.parseJSON(response.value);
            var rec = data.Recipients[0];

            orderbot.toogleAjaxButton(btn);

            // div = context.getOrderCouponTab(rec.RecipientId);
            var text = (rec.CouponIsValid) ? div.down('input[id$=txtCouponCode]').value + ' is a VALID Code' : div.down('input[id$=txtCouponCode]').value + ' is an INVALID Code';

            //alert(text);
            div.down('span#cInfo').update(text);
            context.updateOrderTotal(data);
        });
    },

    clearMessage: function () {
        try {
            this.info.update();
            //Dialogs.current.setDimensions.bind(Dialogs.current).defer();
        }
        catch (e) { }
    },

    showMessage: function (msg, msgType, neverExpire) {
        if (!msg) msg = '';
        if (!msgType) msgType = this.messageType.info;

        if (this.info) {
            this.info.removeClassName('msg').removeClassName('msg-success').removeClassName('msg-error').removeClassName('usps-error');
            this.info.up("td").setStyle({ backgroundColor: msgType == 'usps-error' ? '#FF9900' : '' });
            this.info.addClassName(msgType).update(msg);
            if (Dialogs.current) Dialogs.current.setDimensions.bind(Dialogs.current).defer();
            if (msg != '' && !neverExpire) {
                this.lastTimeout = window.setTimeout('orderbot.cart.checkout.clearMessage()', 3000);
            } else {
                window.clearTimeout(this.lastTimeout || null);
            }
        }
    },

    validateOrder: function () {

        var cartContent = $('cart-content');
        var cartTables = cartContent.select('table.recipient-summary');

        if (cartTables && cartTables.size() == 1) {
            var cartTable = cartTables[0];

            var recipientId = cartTable.id;
            var div = cartTable.down('div.editaddress');

            var values = this.getAddressEditorValues(div);

            if (values != "") {
                var args = Object.extend(values, { RecipientId: recipientId, validAddress:true, PurchaseOrder: '', manualAmount: '0', shippingDate: '', CancelDate: '', IsUpdateShippingAmount: true });
                var context = this;

                ShoppingCartHandler.SaveShippingInfoFrontEnd(args, function (response) {

                    var table_t = $('content');
                    var btnBilling = table_t.down('input[id$=btnBilling]');
                    //alert(btnBilling.inspect());

                    if (response.error) {
                        alert(response.error.Message);
                        //btnBilling.hide();
                        return false;
                    }

                    ShoppingCartHandler.ValidateOrder(function (response) {
                        if (response.error) { alert(response.error.Message); return; }

                        var data = orderbot.parseJSON(response.value);

                        if (data.isValid) {
                            //TODO ..change to orderbot.redirect()
                            window.location.href = 'Payment.aspx';
                        } else {
                            //TODO display wich recipients need info
                            alert('please complete shipping address information for all recipients.');
                        }
                    })

                });
            }

        }

    },

    validateShippingAddress: function (div) {
        var result = false;

        var hasStates = orderbot.countryHasStates(div.down('SELECT[id$=ddlCountries]').value);

        //alert("come inside 1");
        if (div.down('input[id$=txtName]').value.strip().empty() ||
        //div.down('input[id$=txtCompany]').value.strip().empty() || //not mandatory
        div.down('input[id$=txtAddress]').value.strip().empty() ||
        div.down('input[id$=txtCity]').value.strip().empty() ||
        (hasStates && div.down('input[id$=txtZip]').value.strip().empty()) ||
        (hasStates && div.down('input[id$=txtPhone1]').value.strip().empty()) ||
        (hasStates && div.down('input[id$=txtPhone2]').value.strip().empty()) ||
        (hasStates && div.down('input[id$=txtPhone3]').value.strip().empty()) ||
        (!hasStates && div.down('input[id$=txtPhone]').value.strip().empty())) {
            result = false;
            //this.showMessage('please complete all the required fields', this.messageType.error);
            alert('please complete all the required fields');
        }
        else { result = true; }
        //alert("come inside 2");
        return result;
    },

    updateQuantity: function (recipientId, event) {
        Event.stop(event);
        var selector = String.format('table[id$={0}]', recipientId);
        var table = this.content.down(selector);
        var txts = table.select('input[type=text][id$=txtQty]');
        this.info = table.down('span[id=qtyinfo]');
        var values = [];
        txts.each(function (txt) {
            var row = txt.up('tr');
            //row.id="rid_2c0fbe89-9596-4fef-97e5-9723e05c0721_pid_85"
            var rid = row.id.substring(4, row.id.indexOf('_', 4));
            var pid = row.id.substring(row.id.indexOf('pid_') + 4);
            var sqty = txt.value.strip().escapeHTML();
            pid = parseInt(pid, 10);
            //qty = parseInt(sqty, 10);
            qty = parseFloat(sqty);

            if (Object.isNumber(qty) && qty > 0) {
                values.push({ productId: pid, quantity: qty });
            }
            else {
                this.showMessage('Invalid number [' + sqty + '] please re-enter quantity.', this.messageType.error);
            }
        } .bind(this));

        if (values.size() > 0) {
            var btn = event.element();
            orderbot.toogleAjaxButton(btn, true, this.loadingImg);
            //            this.showMessage('Updating product quantities...');
            var args = { recipientId: recipientId, products: values };
            var context = this;

            ShoppingCartHandler.UpdateQuantity(args, function (response) {

                //                var selector = String.format('table[id$={0}]', args.recipientId);
                //                var table = context.content.down(selector);
                orderbot.toogleAjaxButton(btn);

                if (response.error) { alert(response.error.Message); return; }

                var data = orderbot.parseJSON(response.value);

                var recipient = data.Recipients.first();

                recipient.Products.each(function (item) {
                    //rid_f0f963ef-34d0-4daa-8bb7-bb4d8a66e055_pid_195
                    var selector = String.format('tr[id$=rid_{0}_pid_{1}]', recipient.RecipientId, item.ProductId);
                    var row = table.down('table.rptItems').down(selector);

                    row.down('span[id$=lblTax]').update(item.TaxRate > 0 ? 'Y' : 'N');
                    row.down('span[id$=lblPrice]').update(item.Price.numberFormat('$###,###,##0.00'));
                    row.down('span[id$=lblItemTotal]').update(item.SubTotal.numberFormat('$###,###,##0.00'));
                    //                new Effect.Highlight(row, { startcolor: '#666666', endcolor: '#121212', restorecolor: '#121212' });

                });

                context.updateRecipientTotals(recipient);
                context.updateOrderTotal(data);

                orderbot.cart.checkout.initShipping();

            })
        }
    },






    removeItem: function (event) {
        Event.stop(event);
        var element = event.element();
        var tr = element.up('tr.item-row');
        var name = tr.down('td', 1).down('h3').innerHTML;
        var data = tr.id.split('_');
        var args = { recipientId: data[1], productId: data[3] };

        var context = this;

        Dialogs.confirm(
		    String.format('Do you want to remove the item "{0}"?', name),
		    function () {

		        ShoppingCartHandler.RemoveItemFromCart(args, function (response) {
		            if (response.error) { alert(response.error.Message); return; }

		            var data = orderbot.parseJSON(response.value);
		            var recipient = data.Recipients.first();
		            var selector = String.format('tr[id$=rid_{0}_pid_{1}]', recipient.RecipientId, args.productId);
		            var row = context.content.down(selector);
		            if (row) {
		                var table = row.up('table.recipient-summary');
		                row.remove();
		                if (table.select('tr.item-row').size() === 0) { table.remove(); }
		            }
		            context.updateRecipientTotals(recipient);
		            context.updateOrderTotal(data);

		            orderbot.cart.checkout.initShipping();

		        });
		        Dialogs.close();
		    },
		    function () { Dialogs.close(); }
	    );


    },

    updateRecipientTotals: function (recipient) {

        var selector = String.format("table[id={0}]", recipient.RecipientId);
        var table = this.content.down(selector);

        if (table) {
            table = this.content.down(selector).down('table.recipient-total');
            var lbl = table.down('span[id$=lblRecipientSubTotal]');
            lbl.update(recipient.SubTotal.numberFormat('$###,###,##0.00'));
            var lbl = table.down('span[id$=lblRecipientTaxTotal]');
            lbl.update(recipient.TaxTotal.numberFormat('$###,###,##0.00'));
            lbl = table.down('span[id$=lblShippingSubTotal]');
            lbl.update(recipient.ShippingTotal.numberFormat('$###,###,##0.00'));
            lbl = table.down('span[id$=lblRecipientTotal]');
            lbl.update(recipient.Total.numberFormat('$###,###,##0.00'));
        }
    },

    updateOrderTotal: function (data) {

        var div = $('review');
        if (data.Total == 0) {
            div.innerHTML = '';

            var dom = $.DIV({ style: 'text-align:center;' },
                        $.H2({ style: 'margin:100px 210px 100px 0px' },
                            'Your Cart is Empty.'));
            div.insert(dom);
        } else {
            div = div.down('div#summary');
            var lbl = div.down('span[id$=lblOrderSubTotal]');
            lbl.update(data.SubTotal.numberFormat('$###,###,##0.00'));
            lbl = div.down('span[id$=lblOrderTax]');
            lbl.update(data.TaxTotal.numberFormat('$###,###,##0.00'));
            lbl = div.down('span[id$=lblOrderShippingTotal]');
            lbl.update(data.ShippingTotal.numberFormat('$###,###,##0.00'));
            lbl = div.down('span[id$=lblCouponByProductTotal]');
            lbl.update(data.ItemsCouponDiscountTotal.numberFormat('$###,###,##0.00'));
            lbl = div.down('span[id$=lblOrderTotal]');
            lbl.update(data.Total.numberFormat('$###,###,##0.00'));
            lbl = div.down('span[id$=lblCouponByProductTotal]');
            lbl.update(data.CouponDiscountTotal.numberFormat('$###,###,##0.00'));
        }
    }

});

//-----------------------------------------------------------------------
//  Address
//-----------------------------------------------------------------------
Object.extend(orderbot.cart.checkout, {

    editAddress: function (event) {
        if (event) { Event.stop(event); }
        container = event.element().up('table.recipient-summary');
        var recipientId = container.id;
        var editor = container.down('div.editaddress').down();
        var address = container.down('div.editaddress').down('.verified-address-panel');

        var ddlCountries = editor.down('SELECT[id$=ddlCountries]');

        if (!orderbot.countryHasStates($F(ddlCountries))) {
            this.togglePhoneState(false, recipientId);
        } else {
            this.togglePhoneState(true, recipientId);
        }



        var modal = new Dialog({
            content: [editor, address],
            title: '<h3>Shipping Address</h3>',
            close: { link: true, overlay: false, esc: true },
            afterOpen: function () { editor.down('input').activate(); orderbot.cart.checkout.currentRecipientId = recipientId; },
            afterClose: function () { }
        });

        this.validateAddress = true;
        modal.the_editor = editor;
        modal.the_address = address;
        modal.open();
        //this.info = $('dialog-content').down('span[id=info]');
        this.info = $('cart-content').down('span[id=info]');
    },

    updateAddress: function (recipientId, event) {

        //alert("Comes here");

        this.validateAddress = false; //hack..to avoid USPS
        Event.stop(event);
        var element = event.element();
        var div = element.up('table');

        if (!this.validateShippingAddress(div)) return;

        var values = this.getAddressEditorValues(div);

        if (values != "") {
            //alert("come in update");
            this.updateRecipientAddress(recipientId, div, false);
        }
    },

    showValidateShippingAddressDialogElement: function (oldData, data, recipientId, event) {
        Event.stop(event);

        var content = $('DivValidateShippingAddress')
        var divRecipientId = content.down('div.RecipientId');
        divRecipientId.update(recipientId);

        var MainInfo = content.down('div#MainInfo');
        var loading = content.down('div.loading');
        var Result = content.down('div#DivResult');

        MainInfo.show();
        Result.hide();

        var cartcontent = $('cart-content');
        var div = cartcontent.down('div.editaddress');

        var address = div.down('input[id$=txtAddress]').value;
        var address2 = div.down('input[id$=txtAddress2]').value;
        var zip = div.down('input[id$=txtZip]').value;
        var city = div.down('input[id$=txtCity]').value;
        var country = div.down('SELECT[id$=ddlCountries]').down('OPTION:selected');
        var state = div.down('select[id$=ddlStates]').down('OPTION:selected');

        var oldTable = MainInfo.down('table.OldAddress');
        var oldTr = oldTable.down('tr.trHeader');
        var tdStreetLine = oldTr.down('td.StreetLine');
        var tdStreetLine2 = oldTr.down('td.StreetLine2');
        var tdCity = oldTr.down('td.City');
        var tdState = oldTr.down('td.State');
        var tdCountry = oldTr.down('td.Country');
        var tdZip = oldTr.down('td.Zip');
        tdStreetLine.update(address);
        tdStreetLine2.update(address2);
        tdCity.update(city);
        tdState.update(state.innerHTML);
        tdCountry.update(country.innerHTML);
        tdZip.update(zip);

        var trSelectHeader = MainInfo.down('table.CandidateAddress').down('tr.SelectHeader');

        var selecttdStreetLine = trSelectHeader.down('td.StreetLine').down('input');
        var selecttdStreetLine2 = trSelectHeader.down('td.StreetLine2').down('input');
        var selecttdCity = trSelectHeader.down('td.City');
        var selecttdState = trSelectHeader.down('td.State');
        var selecttdCountry = trSelectHeader.down('td.Country');
        var selecttdZip = trSelectHeader.down('td.Zip');

        var newTable = MainInfo.down('table.CandidateAddress');
        var tbody = newTable.down('tbody');
        data.each(
        function (dt) {
            var address2 = ""
            if (dt.address.size() > 2) {
                address2 = dt.address[1];
            }

            var tr = $.TR({ className: 'trHeader' },
                $.TD({ className: 'StreetLine' }, dt.address[0]),
                $.TD({ className: 'StreetLine2' }, address2),
                $.TD({ className: 'City' }, dt.City),
                $.TD({ className: 'State' }, dt.StateName),
                $.TD({ className: 'Country' }, dt.CountryName),
                $.TD({ className: 'Zip' }, dt.Zip)
            );

            tbody.appendChild(tr);

            tr.observe('click', function (e) {
                var ele = e.element();
                var upTr = ele.up('tr');
                var newtdStreetLine = upTr.down('td.StreetLine');
                var newtdStreetLine2 = upTr.down('td.StreetLine2');
                var newtdCity = upTr.down('td.City');
                var newtdState = upTr.down('td.State');
                var newtdCountry = upTr.down('td.Country');
                var newtdZip = upTr.down('td.Zip');

                selecttdStreetLine.value = newtdStreetLine.innerHTML;
                selecttdStreetLine2.value = newtdStreetLine2.innerHTML;
                selecttdCity.update(newtdCity.innerHTML);
                selecttdState.update(newtdState.innerHTML);
                selecttdCountry.update(newtdCountry.innerHTML);
                selecttdZip.update(newtdZip.innerHTML);
            });
        }
        );


        content.down('div.loading').hide();

        accDialog.opt.title = '<strong>ADDRESS VERIFICATION</strong>';
        accDialog.opt.content = content.remove();
        accDialog.opt.beforeClose = function () {
            $('acc-dialogs').insert(content.remove());
        };

        accDialog.open();

        Dialogs.current.setDimensions.bind(Dialogs.current).defer();
    },

    getNumberPeriod: function (data) {

    },

    LeaveAddressAsIt: function () {
        this.validateAddress = false;
        this.info.toggleClassName('msg').update();
        orderbot.fireClickEvent(this.info.up('table').down('input[id$=btnSave]'));
        //Dialogs.current.setDimensions.bind(Dialogs.current).defer();
    },

    AddressValidateResponse: function (response, recipientId, div) {
        var leaveAddress = " (<a href=\"javascript:orderbot.cart.checkout.LeaveAddressAsIt();\">I want to use that address</a>)";
        var btnUseThisAddress = this.info.up('table').down('input[id$=btnUseThisAddress]');

        //
        if (response.error) {
            var msg = " Click \"I want to use this address\" if you feel the above address is correct.</strong>";
            btnUseThisAddress.show();
            orderbot.toogleAjaxButton(this.info.up('table').down('input[id$=btnSave]'));
            this.showMessage("<strong>" + response.error.Message + msg, this.messageType.usps_error, true);
            return;
        }

        var result = JSON.parse(response.value);
        if (result.Error || result.ReturnText) {
            var msg = "<strong>The Address entered was found but an <span class=\"white\">ADDRESS, SUITE or BOX NUMBER is required</span> to complete it." +
                      " Please add this information and lick \"UPDATE\", or click \"I want to use this address\" if you feel the above address is correct.</strong>";
            btnUseThisAddress.show();
            orderbot.toogleAjaxButton(this.info.up('table').down('input[id$=btnSave]'));
            this.showMessage(msg, this.messageType.usps_error, true);
            return;
        }

        var txtAddress = div.down('input[id$=txtAddress]');
        var txtAddress2 = div.down('input[id$=txtAddress2]');
        var txtZip = div.down('input[id$=txtZip]');
        var txtCity = div.down('input[id$=txtCity]');
        var ddlStates = div.down('SELECT[id$=ddlStates]');

        if (txtAddress.value != result.Address ||
             txtAddress2.value != result.Address2 ||
             txtZip.value != result.Zip ||
             txtCity.value != result.City ||
             $F(ddlStates) != result.StateId) {

            var modal = Dialogs.current;
            modal.the_address.down('.verified-address').update(
                result.Address + "<br/>" +
                (result.Address2 ? result.Address2 + "<br/>" : "") +
            //(result.Zip4 ? result.Zip4 + "-" : "") +
                result.Zip + "<br/>" +
                result.City + ", " +
                result.State + "<br/>");

            modal.opt.close.esc = false;
            modal.opt.close.link = false;
            modal.the_editor.hide();
            modal.the_address.show();
            modal.setDimensions.bind(modal).defer();

            var context = this;
            this.onUseThisAddress = function () {
                txtAddress.value = result.Address;
                txtAddress2.value = result.Address2;
                txtZip.value = result.Zip;
                txtCity.value = result.City;
                ddlStates.down('OPTION[value=' + result.StateId + ']').selected = true;
                context.resetDialog(modal);
                this.updateRecipientAddress(recipientId, div, true);
            };

            this.onUseThisAddresss = function () {
                var container = $('cart-content').down('table[id=' + data.RecipientId + ']');
                var div = container.down('div.recipient-info');
                // div.down('span[id$=lblRecipientName]').update(data.Name);

                div = container.down('div.recipient-address');
                div.down('span[id$=lblCompany]').update("my company");

            };

            this.onLeaveMyAddress = function () {
                context.resetDialog(modal);
                this.updateRecipientAddress(recipientId, div, true);
            };
            this.onLeaveMyAddresss = function () {
                alert(window.opener.document.getElementById("lblCompany").innerHTML);
            };
        }
        else {
            this.updateRecipientAddress(recipientId, div, true);
        }
    },

    updateRecipientValidatedAddress: function (args, validAddress) {

        if (args != "") {
            var context = this;
            // ShoppingCartHandler.SaveShippingInfo(args, function(response) {
            ShoppingCartHandler.UpdateValidateAddressShippingInfoFrontEnd(args, function (response) {

                var table_t = $('content');
                var btnBilling = table_t.down('input[id$=btnBilling]');
                //alert(btnBilling.inspect());

                if (response.error) {
                    alert(response.error.Message);
                    btnBilling.hide();
                    return;
                }

                btnBilling.show();
                var data = orderbot.parseJSON(response.value);
                var recipient = data.Recipients.first();

                //context.updateShippingAddressValues(recipient);
                context.updateRecipientAddressEditorValuesNew(recipient);

                var selector = String.format('table[id$={0}]', recipient.RecipientId); ;
                var table = context.content.down(selector);

                recipient.Products.each(function (item) {
                    //rid_f0f963ef-34d0-4daa-8bb7-bb4d8a66e055_pid_195
                    var selector = String.format('tr[id$=rid_{0}_pid_{1}]', item.RecipientId, item.ProductId);
                    var row = table.down('table.rptItems').down(selector);
                    row.down('span[id$=lblTax]').update(item.TaxRate > 0 ? 'Y' : 'N');
                    row.down('span[id$=lblPrice]').update(item.Price.numberFormat('$###,###,##0.00'));
                    row.down('span[id$=lblItemTotal]').update(item.SubTotal.numberFormat('$###,###,##0.00'));
                    //new Effect.Highlight(row, { endcolor: '#F3F3F3' });
                });

                context.updateRecipientTotals(recipient);
                context.updateOrderTotal(data);

                //alert("come in init");
                orderbot.cart.checkout.initShipping();
                Dialogs.close();
            })
        }
    },

    updateRecipientAddress: function (recipientId, div, validAddress) {
        var values = this.getAddressEditorValues(div);

        if (values != "") {
            var args = Object.extend(values, { RecipientId: recipientId, validAddress: validAddress, PurchaseOrder: '', manualAmount: '0', shippingDate: '', CancelDate: '', IsUpdateShippingAmount: true });
            var context = this;
            // ShoppingCartHandler.SaveShippingInfo(args, function(response) {
            ShoppingCartHandler.SaveShippingInfoFrontEnd(args, function (response) {

                var table_t = $('content');
                var btnBilling = table_t.down('input[id$=btnBilling]');
                //alert(btnBilling.inspect());

                if (response.error) {
                    alert(response.error.Message);
                    btnBilling.hide();
                    return;
                }

                btnBilling.show();
                var data = orderbot.parseJSON(response.value);
                var recipient = data.Recipients.first();

                context.updateShippingAddressValues(recipient);

                var selector = String.format('table[id$={0}]', recipient.RecipientId); ;
                var table = context.content.down(selector);

                recipient.Products.each(function (item) {
                    //rid_f0f963ef-34d0-4daa-8bb7-bb4d8a66e055_pid_195
                    var selector = String.format('tr[id$=rid_{0}_pid_{1}]', item.RecipientId, item.ProductId);
                    var row = table.down('table.rptItems').down(selector);
                    row.down('span[id$=lblTax]').update(item.TaxRate > 0 ? 'Y' : 'N');
                    row.down('span[id$=lblPrice]').update(item.Price.numberFormat('$###,###,##0.00'));
                    row.down('span[id$=lblItemTotal]').update(item.SubTotal.numberFormat('$###,###,##0.00'));
                    //new Effect.Highlight(row, { endcolor: '#F3F3F3' });
                });

                context.updateRecipientTotals(recipient);
                context.updateOrderTotal(data);

                //alert("come in init");
               // orderbot.cart.checkout.initShipping();
                Dialogs.close();

            });
        }

    },

    updateShippingAddressValues: function (data) {

        var container = $('cart-content').down('table[id=' + data.RecipientId + ']');
        var div = container.down('div.recipient-info');
        div.down('span[id$=lblRecipientName]').update(data.Name);

        div = container.down('div.recipient-address');
        div.down('span[id$=lblCompany]').update(data.Company);
        div.down('span[id$=lblAddress]').update(String.format("{0} {1}", data.Address, data.Address2));
        div.down('span[id$=lblLocation]').update(data.Location);
        div.down('span[id$=lblPhone]').update(data.PhoneFormatted);

        div = container.down('div.shipping-info');
        div.down('span[id$=lblShippingMethod]').update(data.ShippingMethodName.replace(/_/, ' '));
        if (data.DeliveryDate !== null)
            div.down('span[id$=lblArrivalDate]').update(data.DeliveryDate.toString('MM/dd/yyyy'));
    },

    updateRecipientAddressEditorValuesNew: function (data) {

        var container = $('cart-content').down('table[id=' + data.RecipientId + ']');
        var div = container.down('div.editaddress');

        div.down('input[id$=txtName]').value = data.Name;
        div.down('input[id$=txtCompany]').value = data.Company;
        div.down('input[id$=txtAddress]').value = data.Address;
        div.down('input[id$=txtAddress2]').value = data.Address2;
        div.down('input[id$=txtZip]').value = data.Zip;
        div.down('input[id$=txtCity]').value = data.City;
        div.down('SELECT[id$=ddlCountries]').value = data.CountryId;

        if (data.StateId != null) {
            var p1, p2, p3;
            p1 = data.PhoneNumber.substring(0, 3);
            p2 = data.PhoneNumber.substring(3, 6);
            p3 = data.PhoneNumber.substring(6, 10);
            div.down('input[id$=txtPhone1]').value = p1;
            div.down('input[id$=txtPhone2]').value = p2;
            div.down('input[id$=txtPhone3]').value = p3;
            div.down('input[id$=txtExt]').value = data.PhoneNumberExt;
            orderbot.populateStates(div, data.CountryId, data.StateId);
            this.togglePhoneState(true, data.RecipientId);
            //            div.down('SELECT[id$=ddlStates]').down('OPTION[value=' + data.StateId + ']').selected = true;
        }
        else {
            div.down('input[id$=txtPhone]').value = data.PhoneNumber;
            div.down('input[id$=txtState]').value = data.StateName;
            this.togglePhoneState(false, data.RecipientId);
        }
    },

    updateShippingAddressVals: function () {

        var container = $('cart-content').down('table[id=' + data.RecipientId + ']');
        var div = container.down('div.recipient-info');
        div.down('span[id$=lblRecipientName]').update(data.Name);

        div = container.down('div.recipient-address');
        div.down('span[id$=lblCompany]').update("my company");

    },
    //update dialog form values
    updateRecipientAddressEditorValues: function (data, editor) {

        var div = $('editaddress');

        //if (editor) div = editor;

        div.down('input[id$=txtName]').value = data.Name;
        div.down('input[id$=txtCompany]').value = data.Company;
        div.down('input[id$=txtAddress]').value = data.Address;
        div.down('input[id$=txtAddress2]').value = data.Address2;
        div.down('input[id$=txtZip]').value = data.Zip;
        div.down('input[id$=txtCity]').value = data.City;
        div.down('SELECT[id$=ddlCountries]').value = data.CountryId;

        if (data.StateId != null) {
            var p1, p2, p3;
            p1 = data.PhoneNumber.substring(0, 3);
            p2 = data.PhoneNumber.substring(3, 6);
            p3 = data.PhoneNumber.substring(6, 10);
            div.down('input[id$=txtPhone1]').value = p1;
            div.down('input[id$=txtPhone2]').value = p2;
            div.down('input[id$=txtPhone3]').value = p3;
            div.down('input[id$=txtExt]').value = data.PhoneNumberExt;
            orderbot.populateStates(div, data.CountryId, data.StateId);
            this.togglePhoneState(true, data.RecipientId);
            //            div.down('SELECT[id$=ddlStates]').down('OPTION[value=' + data.StateId + ']').selected = true;
        }
        else {
            div.down('input[id$=txtPhone]').value = data.PhoneNumber;
            div.down('input[id$=txtState]').value = data.StateName;
            this.togglePhoneState(false, data.RecipientId);
        }
    },

    getAddressEditorValues: function (div) {
        var values
        var name, company, address, address2, zip, city, stateId, phone, phoneExt, groupId, notes, shippingMethod, countryId, stateName;
        var p1, p2, p3;

        //alert("come here");
        name = div.down('input[id$=txtName]').value.strip();
        company = div.down('input[id$=txtCompany]').value.strip();
        address = div.down('input[id$=txtAddress]').value.strip();
        address2 = div.down('input[id$=txtAddress2]').value.strip();
        zip = div.down('input[id$=txtZip]').value.strip();
        city = div.down('input[id$=txtCity]').value.strip();
        countryId = $F(div.down('select[id$=ddlCountries]'));

        if (orderbot.countryHasStates(countryId)) {
            stateId = $F(div.down('select[id$=ddlStates]'));
            p1 = div.down('input[id$=txtPhone1]').value.strip();
            p2 = div.down('input[id$=txtPhone2]').value.strip();
            p3 = div.down('input[id$=txtPhone3]').value.strip();
            phoneExt = div.down('input[id$=txtExt]').value.strip();
            phone = String.format('{0}{1}{2}', p1, p2, p3);
        } else {
            phone = div.down('input[id$=txtPhone]').value.strip();
            stateName = div.down('input[id$=txtState]').value.strip();
        }
        groupId = $F(div.down('select[id$=ddlGroups]'));
        notes = div.down('textarea[id$=txtNotes]').value.strip();
        if (div.down('input[name$=RadioButtonList1]:checked')) {
            shippingMethod = div.down('input[name$=RadioButtonList1]:checked').value;
        }
        else {
            alert("Please choose shipping method");
            return "";
        }
        //        addToAB = div.down('input[id$=chkAddToAddressBook]').checked;

        values = {
            Name: name,
            Company: company,
            Address: address,
            Address2: address2,
            Zip: zip,
            City: city,
            CountryId: countryId,
            StateId: stateId,
            StateName: stateName,
            PhoneNumber: phone,
            PhoneExt: phoneExt,
            groupId: groupId,
            Notes: notes,
            ShipId: shippingMethod
        };

        return values;
    },

    editShipping: function (event) {
        Event.stop(event);
        var table = event.element().up('table.recipient-summary');
        var recipientId = table.id;
        var editor = table.down('div.editshipping');

        var contentClone = editor.cloneNode(true);
        this.replaceEditorIds(editor);

        var context = this;

        var modal = new Dialog({
            content: contentClone.setStyle({ display: 'text-align: center' }),
            close: {
                link: false,
                overlay: true,
                esc: true
            },
            width: 'max',
            height: 'max',
            padding: 25,
            margin: 50,
            center: yes,
            afterOpen: function () { contentClone.down('input').activate(); },
            afterClose: context.restoreEditorIds(editor)
        });
        modal.open();

    }
});

//-----------------------------------------------------------------------
// Gift Messages
//-----------------------------------------------------------------------
Object.extend(orderbot.cart.checkout, {

    editGiftMsg: function (event) {
        if (event) { Event.stop(event) };
        var wrapper = event.element().up('table').up('div');
        var editor = wrapper.down('div.editmsg').down('table');
        var current = wrapper.down('div.gift-message');
        var msg = current.down('span').innerHTML.replace(/&nbsp;/, '');
        editor.down('textarea').value = msg;
        this.info = editor.down('span[id=info]');
        this.showMessage();

        var modal = new Dialog({
            content: editor,
            title: '<h3>Gift Message</h3>',

            close: {
                link: true,
                overlay: false,
                esc: true
            },
            afterOpen: function () { editor.down('textarea').activate(); }
        });
        modal.open("center:yes");
        this.info = $('dialog-content').down('span[id=info]');
    },

    updateGiftMsg: function (recipientId, e) {
        Event.stop(e);
        var div = $('dialog-content').down('table');
        var chk = div.down('input[type=checkbox]');
        var text = div.down('textarea').value.strip().escapeHTML();
        var args = { message: text, recipient: recipientId, isForAll: chk.checked };
        this.showMessage('updating gift message...');
        var btnEdit = div.down('input[id$=bntEditGiftMsg]');
        orderbot.toogleAjaxButton(btnEdit, true);
        var context = this;

        ShoppingCartHandler.SaveGiftMessage(args, function (response) {
            orderbot.toogleAjaxButton(btnEdit);
            if (response.error) {
                //var div = $('dialog-content').down('table');
                context.showMessage(response.error.Message, context.messageType.error);
                return;
            }
            if (!response.value.empty()) {
                var data = orderbot.parseJSON(response.value);
                if (data.message.empty()) { data.message = $.NBSP; }
                if (data.isForAll) {
                    var divs = context.content.select('div.gift-message');
                    divs.each(function (d) { d.down('span').update(data.message); });
                } else {
                    context.content.down('table[id$=' + data.RecipientId + ']').down('div.gift-message').down('span').update(data.message);
                }
            }
            //            var div = $('dialog-content').down('table');
            context.showMessage();
            Dialogs.close();
        })
    }
});

