﻿/// <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,

    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;

        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);

            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 = $('review').down('input[id$=btnBilling]');
        btn.observe('click', function(e) { e.stop(); context.validateOrder(); });
    },

    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);
    },


    GetShippingMethods: function(countryId, e) {

        ShoppingCartHandler.GetShippingCartAndMethodsByCountry(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 methods = shippingInfo.down('tbody').immediateDescendants();

                            methods.each(
                                                   function(method) {

                                                       //alert(method.inspect());
                                                       var shippingMethodInfo = method.down('input');

                                                       if (shippingMethodInfo != null) {
                                                           //alert(shippingMethodInfo.inspect());
                                                           //alert("hide");
                                                           if (GetMethods.indexOf(parseInt(shippingMethodInfo.value)) < 0) {
                                                               // alert(shippingMethodInfo.value);
                                                               shippingMethodInfo.up('tr').hide();
                                                               shippingMethodInfo.checked = false;
                                                           }
                                                           else {
                                                               // alert("show");
                                                               shippingMethodInfo.up('tr').show();
                                                               if (shippingMethodId == shippingMethodInfo.value) {
                                                                   shippingMethodInfo.checked = true;
                                                               }
                                                               else {
                                                                   shippingMethodInfo.checked = false;
                                                               }
                                                           }
                                                       }
                                                   }
                                                    );

                        }
                        else {
                            alert("erro");
                        }

                        orderbot.cart.checkout.updateAddress(rec.RecipientId, e);

                    });
            }
        });
    },

    initShipping: function() {

        ShoppingCartHandler.GetShippingCartAndMethods(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);
                        //alert('Shipping Method Id: ' + rec.ShippingMethodId);
                        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());

                        if (shippingInfo != null) {

                            var methods = shippingInfo.down('tbody').immediateDescendants();

                            methods.each(
                            function(method) {

                                //alert(method.inspect());
                                var shippingMethodInfo = method.down('input');

                                if (shippingMethodInfo != null) {
                                    //alert(shippingMethodInfo.inspect());
                                    //alert("hide");
                                    if (GetMethods.indexOf(parseInt(shippingMethodInfo.value)) < 0) {
                                        // alert(shippingMethodInfo.value);
                                        shippingMethodInfo.up('tr').hide();
                                        shippingMethodInfo.checked = false;
                                    }
                                    else {
                                        // alert("show");
                                        shippingMethodInfo.up('tr').show();
                                        if (shippingMethodId == shippingMethodInfo.value) {
                                            shippingMethodInfo.checked = true;
                                        }
                                    }
                                }
                            }
                            );

                        }
                        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');

        //if (editor) div = editor;

        //alert(div.down('input[id$=txtCouponCode]').value);

        //var divorder = this.getOrderDiv(recipientId);
        //var div = divorder.down('div[id$=_coupons]');
        //var text = div.down('input[id$=txtCouponCode]').value.strip().escapeHTML();
        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);
            //lblProductsCouponTotal.Text = string.Format("{0:C}", ItemsCouponDiscountTotal);

            //div.down('span#cDesc').update(rec.CouponDescription);
            //            if (data.isValid) {
            //                context.showSuccess(div, 'Coupon Code Applied.');
            //            }
        });
    },

    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() {
        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;
    },

    //    populateStates: function(countryId) {
    //        StatesHandler.GetStatesByCountry(countryId, this.populateStatesResponse.bind(this));
    //    },
    //    populateStatesResponse: function(response) {
    //        if (response.error) { alert(response.error.Message); return; }

    //        var ddl = $('dialog-content').down('SELECT[id$=ddlStates]');

    //        var length = ddl.options.length;
    //        for (var i = 0; i < length; i++) { ddl.remove(0); }
    //        var result = eval(response.value);
    //        $(result).each(function(state) {
    //            var opt = $.OPTION({ text: state.Name, value: state.StateId });
    //            try {
    //                ddl.add(opt, null); // standards compliant; doesn't work in IE
    //            }
    //            catch (ex) {
    //                ddl.add(opt); // IE only
    //            }
    //        } .bind(this));

    //    },


    //    zipLookedUp: function(zip) {
    //        var result = false;
    //        this.recipients.each(function(r) {
    //            if (r.id == this.currentRecipientId && r.lastZip == zip) {
    //                result = true;
    //                throw $break;
    //            }
    //        } .bind(this));

    //        return result;
    //    },

    //    cityStateLookup: function(value) {
    //        var zip = parseInt(value, 10);
    //        if (Object.isNumber(zip) && zip.toString().length == 5) {
    //            var msg = String.format('looking up for city & state on zip {0} ...', zip);
    //            this.showMessage(msg, this.messageType.info);
    //            USPSHandler.CityStateLookup(zip, this.cityStateLookupResponse.bind(this));
    //        }
    //    },

    //    cityStateLookupResponse: function(response) {
    //        if (response.error) {
    //            this.showMessage(response.error.Message, this.messageType.error);
    //            return;
    //        }

    //        var result = JSON.parse(response.value);

    //        this.recipients.each(function(r) {
    //            if (r.id == this.currentRecipientId) {
    //                r.lastZip = result.Zip;
    //                throw $break;
    //            }
    //        } .bind(this));

    //        this.dialog = $('dialog-content');
    //        var txtCity = this.dialog.down('input[id$=txtCity]');
    //        txtCity.value = result.City;
    //        var ddlStates = this.dialog.down('SELECT[id$=ddlStates]');
    //        ddlStates.down('OPTION[value=' + result.StateId + ']').selected = true;
    //        this.showMessage('City & state updated.', this.messageType.success);
    //    },


    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 = 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();
                //                var msg = 'Quantities updated. ';
                //                if (data.RecipientShippingSubTotal === 0) msg += ' Update the shipping address to calculate S&H.';
                //                this.showMessage(msg, this.messageType.success);
            })
        }
    },






    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(); }
	    );


    },

    //    removeItemResponse: 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 = this.content.down(selector);
    //        if (row) {
    //            var table = row.up('table.recipient-summary');
    //            row.remove();
    //            if (table.select('tr.item-row').size() === 0) { table.remove(); }
    //        }
    //        this.updateRecipientTotals(recipient);
    //        this.updateOrderTotal(data);
    //    },

    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]');
    },

    //    GetCustomerAddressResponse: function(response) {
    //        if (!response.error) {
    //            var data = JSON.parse(response.value);
    //            this.updateRecipientAddressEditorValues(data);
    //        }
    //    },

    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;

        //alert("come in 1");

        var values = this.getAddressEditorValues(div);
        //  orderbot.toogleAjaxButton(event.element(), true);
        //this.showMessage('Validating shipping address...');
        // this.info.up('table').down('input[id$=btnUseThisAddress]').hide();

        //        if (this.validateAddress) {
        //            var address = {
        //                ID: 0,
        //                Address: values.address,
        //                Address2: values.address2,
        //                Zip: values.zip,
        //                City: values.city,
        //                StateId: values.stateId
        //            };

        //            USPSHandler.ValidateAddress(address, this.AddressValidateResponse.bindAsEventListener(this, recipientId, div));
        //        } else {

        if (values != "") {
            //alert("come in update");
            this.updateRecipientAddress(recipientId, div, false);
        }
        //        }
        // ShoppingCartHandler.UpdateRecipientAddress(args, this.updateAddressResponse.bind(this));
    },

    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);


                // context.resetDialog(modal);
                // this.updateRecipientAddress(recipientId, div, true);
            };
        }
        else {
            this.updateRecipientAddress(recipientId, div, true);
        }
    },

    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: '' });
            var context = this;
            ShoppingCartHandler.SaveShippingInfo(args, function(response) {

                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'));
    },

    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");

        //        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'));
    },
    //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 btn = contentClone.down('input[id$=btnUpdate]');


        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();
        })
    }

    //,
    //set className to info span
    //    setClass: function(element, className) {
    //        element.removeClassName('msg').removeClassName('msg-success').removeClassName('msg-error');
    //        element.addClassName(className);
    //        return element;
    //    }
});

