﻿function get_current_cart_total() {
    var retval = -1.00;
    try {
        var targetTD = document.getElementById("td_amount_to_charge");
        if (targetTD) {
            var amt2chg = targetTD.innerHTML; // e.g. $25.75
            var re = /[^0-9\.]*/g; 			// looking to remove all but decimal and digits
            retval = parseFloat(amt2chg.replace(re, ""));
        }
    }
    catch (err) { }
    return retval;
}

function purchase_steps() 
{
    var current_cart_total = get_current_cart_total();

    if (!customer_logged_in)
        toggle_login();
    else if (!customer_info_set)
        toggle_customer_panel();
    else if (!delivery_info_set)
        toggle_delivery_panel();
    else if (!payment_info_set && (current_cart_total == -1.0 || current_cart_total > 0))
        toggle_payment_panel(); 
    else 
    {
        in_submit_order_process = false;
        $("#btn_checkout").attr("value", "Submit Order");
    }
}

function toggle_checkout_wait(oCallback) {
    panel_holder_height = 200;
    panel_holder_width = 320;
    var loc = getxy(document.getElementById("btn_checkout"));
    var notification_panel_holder = document.getElementById("notification_panel_holder");

    if (notification_visible)
        animate.close("notification_panel_holder", function() { $("#notification_panel_holder").hide(); notification_visible = false; document.body.style.cursor = "default"; in_submit_order_process = false; if (oCallback && in_submit_order_process) { oCallback(); } }, null, panel_holder_mousepos, panel_holder_zoomrect);
    else {
        if (notification_panel_holder) {
            var ww = getwindowsize();
            $("#sp_close").click(function() { toggle_checkout_wait(); });
            $("#notification_panel_form").html("<img src='" + srvr + ROOT + "/lib/images/wait_spinner16x16.gif' align='absmiddle' /> <i>Please wait while we process your order...</i>");
            $("#notification_panel_holder").css("left", "" + (ww.x / 2) - (panel_holder_width / 2) + "px");
            $("#notification_panel_holder").css("top", "" + (ww.y / 2) - (panel_holder_height / 2) + "px");
            panel_holder_zoomrect = { left: (ww.x / 2), top: (ww.y / 2), width: panel_holder_width, height: panel_holder_height };
            panel_holder_mousepos = { x: loc.x, y: loc.y };
            animate.open("notification_panel_holder", function() { $("#notification_panel_holder").show(); notification_visible = true; addShadow("notification_panel"); }, null, panel_holder_mousepos, panel_holder_zoomrect);
        }
    }
}

function submit_current_order() {
    var req = getreq();

    this.handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (Error) { /* ignore */ }
                if (rslt.Success)
                    window.location.href = srvr + ROOT + "/cart/receipt.aspx";
                else {
                    $("#notification_panel_form").html(Error_Opening_Placeholder + rslt.ErrorMessage + Error_Closing_Placeholder);
                    positionShadow("notification_panel");
                }
            }
        }
    }

    this.validate = function() {
        var retval = { AmountToCharge: 0.00, AllowUnderpayment: false };
        retval.AmountToCharge = get_current_cart_total();
        return retval;
    }

    var sendObj = this.validate();

    if (req && sendObj) 
    {
        req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "Checkout"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        toggle_checkout_wait();
    }
}

function do_checkout() {

    if (in_submit_order_process)
        return;

    in_submit_order_process = true;
    var current_cart_total = get_current_cart_total();
    if (!customer_logged_in || !customer_info_set || !delivery_info_set || (!payment_info_set && (current_cart_total == -1.0 || current_cart_total > 0))) 
    {
        purchase_steps();
    }
    else
        submit_current_order();
}

function login_callback() {
    if (is_cart_page && in_submit_order_process)
        build_customer_account_form(acct_info);
}

function customer_callback() {
    get_shipping_methods_and_addresses();
    handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (E) { }

                if (rslt.Success) {
                    delivery_info_set = true;
                    if (rslt.FormattedHTML.length > 0)
                        $("#formatted_cart").html(rslt.FormattedHTML);
                    $("#shipping_details").html(rslt.Message);
                    document.getElementById("progress_tracker_3").className = "done";
                    toggle_payment_panel();
                }
            }
        }
    }

    if (standalone_contribution) 
    {
        var req = getreq();
        if (req) 
        {
            var sendObj = {};
            sendObj.method = -1;
            sendObj.address_no = acct_info.Addresses[0].address_no;
            sendObj.newaddress_street = null;
            sendObj.newaddress_city = null;
            sendObj.newaddress_state = null;
            sendObj.newaddress_postalcode = null;

            req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "SetShipping"), true);
            req.setRequestHeader(CONTENT_TYPE, APP_JSON);
            req.onreadystatechange = this.handler;
            req.send(JSON.serialize(sendObj));
            document.body.style.cursor = "wait";
        }
    }
    else 
    {
        if (!delivery_info_set)
            toggle_delivery_panel();
    }
}

function delivery_callback() {
    if (!payment_info_set)
        toggle_payment_panel();
}

/* account related functionalities ---------------------------------------------------------------------------------------------------------------------------------------- */

var panel_holder_zoomrect;
var panel_holder_mousepos;
var panel_holder_width = 400;
var panel_holder_height = 200;

var customer_panel_visible = false;
function toggle_customer_panel(oCallback) 
{
    panel_holder_width = 609;
    panel_holder_height = 392;
    var loc = getxy(document.getElementById("th_customer"));
    var customer_panel_holder = document.getElementById("customer_panel_holder");
    if (customer_panel_visible) 
    {
        animate.close("customer_panel_holder", 
        function() 
        {
            $("#customer_panel_holder").hide();
            customer_panel_visible = false;
            if (oCallback && in_submit_order_process)
                oCallback();
            else
                in_submit_order_process = false;

        }, null, panel_holder_mousepos, panel_holder_zoomrect);
    } else {
        if (customer_panel_holder) {
            $("#customer_panel_holder").css("left", "" + (loc.x + 129) + "px");
            $("#customer_panel_holder").css("top", "" + (loc.y + 1) + "px");
            panel_holder_zoomrect = { left: (loc.x + 129), top: (loc.y + 1), width: panel_holder_width, height: panel_holder_height };
            panel_holder_mousepos = { x: (loc.x + 129), y: (loc.y + 1) };
            animate.open("customer_panel_holder",
                function() 
                {
                    $("#customer_panel_holder").show();
                    customer_panel_visible = true; 
                    addShadow("customer_panel") 
                }, null, panel_holder_mousepos, panel_holder_zoomrect);
        }
    }
}

function submit_customer_info() {
    var login_source_no = -1;
    var req = null;

    handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (E) { }
                if (rslt.Success) {
                    if (is_cart_page) {
                        customer_info_set = true;
                        document.getElementById("progress_tracker_2").className = "done";
                        toggle_customer_panel(customer_callback);
                        build_customer_account_form(rslt.AccountInfo);
                        $("#edit_account_link").show();
                    }
                    else 
                    {
                        build_customer_account_details(rslt.AccountInfo);
                        customer_status();
                        toggle_account_panel();
                    }
                }
                else
                    alert(rslt.ErrorMessage);
            }
        }
    }

    form_validate = function() {
        var errmsg = "";
        var userinputs = [];

        var customer_panel_form = document.getElementById("customer_panel_form");   //used in /cart

        if (customer_panel_form == null)
            customer_panel_form = document.getElementById("customer_info_panel");   //used in /account

        if (customer_panel_form) {
            userinputs = getObjectChildrenInput(customer_panel_form);
            var PhoneDay = "";
            var PhoneEve = "";
            for (var x = 0; x < userinputs.length; x++) {
                var K = userinputs[x].K;
                var V = userinputs[x].V;

                if (K == "Email" && V.length == 0)
                    errmsg += "Email Address required.\r\n";

                if (K == "NameFirst" && V.length == 0)
                    errmsg += "First Name required.\r\n";

                if (K == "NameLast" && V.length == 0)
                    errmsg += "Last Name required.\r\n";

                if (K == "Street1" && V.length == 0)
                    errmsg += "Street Address Required.\r\n"

                if (K == "City" && V.length == 0)
                    errmsg += "City Required.\r\n"

                if (K == "PhoneDay")
                    PhoneDay = V;

                if (K == "PhoneEve")
                    PhoneEve = V;

                if (K == "PostalCode" && V.length == 0)
                    errmsg += "Postal Code is required.\r\n";
            }
            if (PhoneDay.length == 0 && PhoneEve.length == 0)
                errmsg += "Day Phone or Evening Phone is required.";
        }
        if (errmsg.length == 0) 
            return { userinfo: userinputs };
        else
            alert(errmsg);
    }

    var sendObj = form_validate();
    //alert(JSON.serialize(sendObj));
    if (sendObj) 
    {
        req = getreq();
        req.open("POST", (srvr + ROOT + WEBSERVICE + "SubmitUserInfo"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        document.body.style.cursor = "wait";
    }
}

function customer_nochanges() {

    handler = function() 
    {
        if (in_submit_order_process) 
        {
            customer_info_set = true;
            document.getElementById("progress_tracker_2").className = "done";
            toggle_customer_panel(customer_callback);
            $("#edit_account_link").show();
        }
    }
    
    var req = getreq();
    req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "AccountInformationVerify"), true); // void call: sets AccountInformationVerified in UserSessionItems
    req.onreadystatechange = this.handler;
    req.setRequestHeader(CONTENT_TYPE, APP_JSON);
    req.send("");   
}

function build_customer_account_details(acct_info) {
    var col_one = "";
    var col_two = "";

    try 
    {
        col_one += get_menu_val(document.getElementById("ddl_polite")) + " ";
        col_one += document.getElementById("tbx_fname").value + " ";
        col_one += document.getElementById("tbx_lname").value + "<br/>";
        col_one += document.getElementById("tbx_street1").value + ", ";
        if (("" + document.getElementById("tbx_street2").value) != "")
            col_one += document.getElementById("tbx_street2").value + "<br/>";
        col_one += document.getElementById("tbx_city").value + ", ";
        col_one += get_menu_val(document.getElementById("ddl_state")) + " ";
        col_one += document.getElementById("tbx_zip").value + "<br/>";

        col_two += "Email: " + document.getElementById("tbx_emailaddr").value + "<br/>";
        col_two += "Day Phone: " + document.getElementById("tbx_dayphone").value + "<br/>";
        col_two += "Evening Phone: " + document.getElementById("tbx_evephone").value;

        $("#customer_info_details_one").html(col_one);
        $("#customer_info_details_two").html(col_two);
        $("#edit_account_link").show();

        if (is_cart_page && !customer_info_set && in_submit_order_process)
            toggle_customer_panel();
        else {
            $("#customer_details").html(col_one + col_two);
        }    
    }
    catch (err) {
        alert(err.description ? err.description : err);
    }
}

function build_customer_account_form(acct_info) {
    
    try 
    {
        document.getElementById("tbx_emailaddr").value = acct_info.Email;
        document.getElementById("tbx_fname").value = acct_info.NameFirst;
        document.getElementById("tbx_lname").value = acct_info.NameLast;
        var menu = document.getElementById("ddl_polite");
        if (menu && (acct_info.Prefix.length > 0))
            set_selected_value(menu, acct_info.Prefix);
        document.getElementById("tbx_street1").value = acct_info.Street1;
        document.getElementById("tbx_street2").value = acct_info.Street2;
        document.getElementById("tbx_city").value = acct_info.City;
        menu = document.getElementById("ddl_state");
        if (menu && (acct_info.State.length > 0))
            set_selected_value(menu, acct_info.State);
        document.getElementById("tbx_zip").value = acct_info.PostalCode;
        
        Phones = acct_info.Phones;
        if (Phones) 
        {
            //alert(Phones[i].DayIndicator);
            for (var i = 0; i < Phones.length; i++) {
                if (Phones[i].DayIndicator == "D")
                    document.getElementById("tbx_dayphone").value = Phones[i].PhoneNumberString;

                if (Phones[i].DayIndicator == "E")
                    document.getElementById("tbx_evephone").value = Phones[i].PhoneNumberString;
            }
        }
        else {
            document.getElementById("tbx_dayphone").value = acct_info.PhoneDay;
            document.getElementById("tbx_evephone").value = acct_info.PhoneEve;
        }
        if (acct_contact_choices) {
            document.getElementById("chk_email_ind").checked = AllowEmarket(acct_info.EmarketInd);
            document.getElementById("chk_mail_ind").checked = AllowMail(acct_info.MailInd);
            document.getElementById("chk_phone_ind").checked = AllowPhone(acct_info.PhoneInd);
        }

        build_customer_account_details();
    }
    catch (err) 
    {
        alert(err.description ? err.description : err);
    }
}

/* shipping related functionalities --------------------------------------------------------------------------------------------------------------------------------------- */

var shipping_panel_visible = false;
function toggle_delivery_panel(oCallback) {
    panel_holder_width = 609;
    panel_holder_height = 375;
    var loc = getxy(document.getElementById("th_shipping"));
    var shipping_panel_holder = document.getElementById("shipping_panel_holder");
    if (shipping_panel_visible) 
    {
        animate.close("shipping_panel_holder",
        function() 
        {
            $("#shipping_panel_holder").hide();
            shipping_panel_visible = false;
            if (oCallback && in_submit_order_process)
                oCallback();
            else
                in_submit_order_process = false;
        }, null, panel_holder_mousepos, panel_holder_zoomrect);
    }
    else 
    {
        if (shipping_panel_holder) {
            get_shipping_methods_and_addresses();
            $("#shipping_panel_holder").css("left", "" + (loc.x + 129) + "px");
            $("#shipping_panel_holder").css("top", "" + (loc.y + 1) + "px");
            panel_holder_zoomrect = { left: (loc.x + 129), top: (loc.y + 1), width: panel_holder_width, height: panel_holder_height };
            panel_holder_mousepos = { x: (loc.x + 129), y: (loc.y + 1) };
            animate.open("shipping_panel_holder", function() { $("#shipping_panel_holder").show(); shipping_panel_visible = true; addShadow("shipping_panel"); }, null, panel_holder_mousepos, panel_holder_zoomrect);
        }
    }
}

function get_shipping_methods_and_addresses() {
    var req = getreq();

    this.handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (E) { }
                if (rslt.Success) {
                    $("#shipping_panel_form").html(rslt.FormattedHTML);
                    positionShadow("shipping_panel");
                }
                else
                    alert(rslt.ErrorMessage)
            }
        }
    }

    var sendObj = { formatterTypeName: "WPAS2009N35.lib.common.WPASAddressAndShippingFormatter", styles: [] };
    if (req) {
        req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "GetShippingMethodsAndAddresses"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        document.body.style.cursor = "wait";
    }
}

function select_shipping_method(iMethodNo, sDescription) {
    if (sDescription == "Mail" && selected_shipping_method < 1)
        $('#shipping_addresss_holder').slideDown(function() { positionShadow("shipping_panel");  });
    if (iMethodNo < 0 && selected_shipping_method > 0)
        $('#shipping_addresss_holder').slideUp(function() { positionShadow("shipping_panel"); });
    selected_shipping_method = iMethodNo;
    document.getElementById("btn_set_shipping").disabled = false;
}

function select_shipping_address(iAddressNo) {
    if (selected_shipping_address != 0 && iAddressNo == 0)
        $('#new_address_holder').slideDown(function() { positionShadow("shipping_panel"); });

    if (selected_shipping_address == 0 && iAddressNo > 0)
        $('#new_address_holder').slideUp(function() { positionShadow("shipping_panel"); });

    positionShadow("shipping_panel");
    selected_shipping_address = iAddressNo;
}

function do_set_shipping() {
    var req = getreq();

    this.handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (Error) { /* ignore */ }
                if (rslt.Success) {
                    delivery_info_set = true;
                    document.getElementById("progress_tracker_3").className = "done";
                    if (rslt.FormattedHTML.length > 0)
                        $("#cartholder").html(rslt.FormattedHTML);
                    $("#shipping_details").html(rslt.Message);
                    $("#edit_shipping_link").show();

                    var currentAmt = get_current_cart_total();
                    if (!payment_info_set && currentAmt == -1.0 || currentAmt > 0)
                        toggle_delivery_panel(delivery_callback);
                    else 
                    {
                        toggle_delivery_panel();
                        payment_info_set = true;
                        in_submit_order_process = false;
                        document.getElementById("progress_tracker_4").className = "done";
                    }
                }
                else
                    alert(rslt.Message + rslt.ErrorMessage);
            }
        }
    }

    form_validate = function() {
        var errmsg = "";
        var retval = {};

        if (selected_shipping_method == 0) {
            errmsg += "- Please select a shipping method.\r\n";
        }
        retval.method = selected_shipping_method;
        retval.address_no = (retval.method < 0) ? acct_info.Addresses[0].address_no : selected_shipping_address;

        if (retval.address_no == 0) {
            retval.newaddress_street = document.getElementById("newaddress_street").value.trim();
            if (retval.newaddress_street.length == 0)
                errmsg += "- Please enter the new address Street\r\n";

            retval.newaddress_city = document.getElementById("newaddress_city").value.trim();
            if (retval.newaddress_city.length == 0)
                errmsg += "- Please enter the new address City\r\n";

            retval.newaddress_state = document.getElementById("newaddress_state").value.trim();
            if (retval.newaddress_state.length == 0)
                errmsg += "- Please enter the new address State\r\n";

            retval.newaddress_postalcode = document.getElementById("newaddress_postalcode").value.trim();
            if (retval.newaddress_postalcode.length == 0)
                errmsg += "- Please enter the new address ZIP/Postal Code\r\n";
        }
        else 
        {
            retval.newaddress_street = null;
            retval.newaddress_city = null;
            retval.newaddress_state = null;
            retval.newaddress_postalcode = null;
        }
        if (errmsg.length > 0) {
            alert(errmsg);
            return;
        }
        return retval;
    }

    var sendObj = this.form_validate();

    if (sendObj && req) {
        req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "SetShipping"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        document.body.style.cursor = "wait";
        try {
            pageTracker._trackPageview("/checkout/delivery_method ");
        }
        catch (E) { }
    }
}

/* payment related functionalities ---------------------------------------------------------------------------------------------------------------------------------------- */

var payment_panel_visible = false;
function toggle_payment_panel(oCallback) {
    panel_holder_width = 609;
    panel_holder_height = 300;
    var loc = getxy(document.getElementById("th_payment"));
    var payment_panel_holder = document.getElementById("payment_panel_holder");
    if (payment_panel_visible) 
    {
        animate.close("payment_panel_holder",
        function() 
        {
            $("#payment_panel_holder").hide();
            payment_panel_visible = false;
            if (oCallback && in_submit_order_process)
                oCallback();
            else
                in_submit_order_process = false;
        }, null, panel_holder_mousepos, panel_holder_zoomrect);
    } 
    else {
        if (payment_panel_holder) {
            $("#payment_panel_holder").css("left", "" + (loc.x + 129) + "px");
            $("#payment_panel_holder").css("top", "" + (loc.y + 1) + "px");
            panel_holder_zoomrect = { left: (loc.x + 129), top: (loc.y + 1), width: panel_holder_width, height: panel_holder_height };
            panel_holder_mousepos = { x: (loc.x + 129), y: (loc.y + 1) };
            animate.open("payment_panel_holder", function() { $("#payment_panel_holder").show(); payment_panel_visible = true; }, null, panel_holder_mousepos, panel_holder_zoomrect);
        }
    }
}

function set_payment(oBtnSubmit) {  
    var req = getreq();

    this.handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (Error) { /* ignore */ }
                if (rslt.Success) {
                    $('#payment_details').html(rslt.Message);
                    payment_info_set = true;
                    in_submit_order_process = false;
                    document.getElementById("progress_tracker_4").className = "done";
                    toggle_payment_panel();
                    $("#edit_payment_link").show();
                    $("#btn_checkout").attr("value", "Checkout");
                    $("#checkout_msg").html("Please review your order carefully. You must click 'Checkout' to complete your purchase.");
                    $("#checkout_msg").slideDown("slow");
                }
                else {
                    alert(req.responseText);
                }
            }
        }
    }

    this.validate = function() {
        var err = "";
        var retval = { cc_num: "", payment_method: 0, exp_month: 0, exp_year: 0, cc_cvv: "", cc_name: "" };
        try {
            retval.cc_num = document.getElementById("tbx_cc_num").value.trim();
            if (retval.cc_num.length == 0)
                err += "\r\n - Credit Card Number";
            retval.payment_method = parseInt(get_menu_val("payment_methods"));
            if (retval.payment_method == 0)
                err += "\r\n - Select Card Type";
            retval.exp_month = parseInt(get_menu_val("ddl_exp_mo"));
            if (retval.exp_month == 0)
                err += "\r\n - Expiration Month";
            retval.exp_year = parseInt(get_menu_val("ddl_exp_year"));
            if (retval.exp_year == 0)
                err += "\r\n - Expiration Year";
            retval.cc_cvv = document.getElementById("tbx_cvv").value.trim();
            if (retval.cc_cvv.length == 0)
                err += "\r\n - Credit Card Security Code";
            retval.cc_name = document.getElementById("tbx_cc_name").value.trim();
            if (retval.cc_name.length == 0)
                err += "\r\n - Name on Cart";

            if (err.length)
                alert("Required fields: " + err);
            else
                return retval;
        }
        catch (e) { alert("Required fields: " + err); }
    }

    var sendObj = this.validate();

    if (req && sendObj) {
        req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "SetPayment"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        document.body.style.cursor = "wait";
        try {
            pageTracker._trackPageview("/checkout/payment_method ");
        } catch (E) { }
    }
}

function removeItems(sItemList) {
    removeLineitem("'" + sItemList + "'", null);
}

function removeLineitem(li, link) {
    var req = getreq();
    this.handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (err) { }
                if (rslt.Success) {
                    if (rslt.Total > 0)
                        $('#cartholder').html(rslt.FormattedHTML);
                    else {
                        $("#cartholder").html("<i>Shopping Cart is Empty.</i>");
                        document.getElementById("progress_tracker_0").className = "";
                        $("#addon_link_holder").hide();
                        $("#btn_checkout").hide();
                        $(".time_remaining_holder").hide();
                        eraseCookie("wpascart");
                    }
                }
                else
                    alert(rslt.ErrorMessage + req.responseText);
            }
            else
                alert(req.responseText);
        }
    }

    try {
        document.body.style.cursor = "wait";
        req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "RemoveItem"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send("{item_no: " + li + "}");
    }
    catch (err) {
        alert(err.description ? err.description : err);
    };
}


function removeAddress(iAddressNo) {
    if (!confirm("Are you sure you want to delete this address?"))
        return;

    this.handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (err) { }
                if (rslt.Success) {
                    $('#shipaddr' + iAddressNo).slideUp();
                }
                else
                    $('#shipaddr' + iAddressNo).html(this.savedContent);
            }
            else
                alert(req.responseText);
        }
    }

    this.savedContent = $('#shipaddr' + iAddressNo).html();

    $('#shipaddr' + iAddressNo).html("<img src='/lib/images/round_preload.gif' style='height: 31px; width: 31px;' alt=''>");
    document.body.style.cursor = "wait";

    var req = getreq();
    var sendObj = { address_no: iAddressNo };
    req.open("POST", (srvr + ROOT + WEBSERVICE + "RemoveAddress"), true);
    req.setRequestHeader(CONTENT_TYPE, APP_JSON);
    req.onreadystatechange = this.handler;
    req.send(JSON.serialize(sendObj));
}

function show_time_remaining() {
    var time_remaining = document.getElementById("time_remaining");

    formatTimer = function(i) {
        if (time_remaining) {
            j = i % 60;
            if (j == 0)
                k = Math.ceil(i / 60);
            else
                k = Math.ceil(i / 60) - 1;

            if (j < 10)
                j = "0" + j;
            $("#time_remaining").html(k + ":" + j);
            //timeremaining.innerHTML = "" + k + ":" + j;
        }
    }

    decrementTimer = function() {
        secs_remaining--;
        if (secs_remaining > 0) {
            formatTimer(secs_remaining);
            clearTimeout(cart_timer);
            beginTimer();

            if (secs_remaining < 60)
                $("#time_remaining").css("color", "red");
        }
        else
            window.location.href = srvr + ROOT + "/cart/expired.aspx";
    }

    beginTimer = function() {
        cart_timer = setTimeout("decrementTimer();", 1000);
    }

    if (time_remaining) {
        var msa = time_remaining.innerHTML.split(":");
        var mv = (parseInt(msa[0]) * 60) + parseInt(msa[1]);
        secs_remaining = mv;
        this.beginTimer();
    }
}

var OfferedAddOns = false;
var AddOnDataRetrieved = false;
var addon_panel_visible = false;

function toggle_addons(keys, mos) 
{                
    panel_holder_height = 400;
    panel_holder_width = 700;
    var loc = getxy(document.getElementById("addon_link_holder"));
    var addon_panel_holder = document.getElementById("addon_panel_holder");

    if (addon_panel_visible) 
    {
        animate.close("addon_panel_holder", function() { $("#addon_panel_holder").hide(); addon_panel_visible = false; }, null, panel_holder_mousepos, panel_holder_zoomrect);
        if (document.getElementById("addon_link_holder") && document.getElementById("addon_link_holder").childNodes.length == 0) 
        {
            $("#addon_link_holder").attr("class", "inset");
            $("#addon_link_holder").html("<span id=\"addon_link\">Add-on tickets to any performance and save up to 10% off <a href=\"javascript:void(0);\" onclick=\"toggle_addons('',13);\" class='red_medium' style='padding-left:1.8em;padding-right:1.8em;'>Add-On Now</a></span>");
        }
    }
    else 
    {
        if (AddOnDataRetrieved) {
            $("#addon_panel_holder").show();
            addon_panel_visible = true;
        }
        else 
        {
            if (addon_panel_holder) {
                var req = getreq();
                handler = function() 
                {
                    document.body.style.cursor = "default";
                    if (req.readyState == 4) {
                        if (req.status == 200) {
                            rslt = JSON.parse(req.responseText);
                            try {
                                rslt = rslt.d;
                            }
                            catch (err) { }

                            if (rslt.Success && rslt.FormattedHTML.length > 0) 
                            {
                                $("#addon_panel_form").html("<p>Add other performances to your subscription order now and save up to 10% off each one!</p>" + rslt.FormattedHTML + "<p><input type=\"button\" onclick=\"purchase_addons();\" value=\"Select\" /></p>");
                                var ww = getwindowsize();
                                $("#addon_panel_holder").css("left", "" + ((ww.x - 400) / 2) + "px");
                                $("#addon_panel_holder").css("top", "" + (ww.y / 2) - ((panel_holder_height / 2) - 10) + "px");
                                panel_holder_zoomrect = { left: ((ww.x - 400) / 2), top: (ww.y / 2), width: (panel_holder_width / 2), height: (panel_holder_height / 2) };
                                panel_holder_mousepos = { x: loc.x, y: loc.y };
                                animate.open("addon_panel_holder", function() { $("#addon_panel_holder").show(); addon_panel_visible = true; addShadow("addon_panel"); positionShadow("addon_panel"); }, null, panel_holder_mousepos, panel_holder_zoomrect);
                                if (!OfferedAddOns)
                                    createCookie("AddOns", true, 0);
                                AddOnDataRetrieved = true;
                            }
                        }
                    }
                }

                var sendObj = { "sKeywords": keys, "MOS": mos };
                req.open("POST", (srvr + ROOT + WEBSERVICE + "GetSubscriptionAddOn"), true);
                req.setRequestHeader(CONTENT_TYPE, APP_JSON);
                req.onreadystatechange = this.handler;
                req.send(JSON.serialize(sendObj));
                document.body.style.cursor = "wait";
            }
        }
    }
}

var contrib_panel_visible = false;
function toggle_contribution(oCallback, el) {
    panel_holder_width = 575;
    var loc = getxy(el);

    var contrib_panel_holder = document.getElementById("contrib_panel_holder");
    if (contrib_panel_visible)
        animate.close("contrib_panel_holder", function() { $("#contrib_panel_holder").hide(); contrib_panel_visible = false; }, null, panel_holder_mousepos, panel_holder_zoomrect);
    else {
        if (contrib_panel_holder) {
            $("#contrib_panel_holder").css("left", "" + ((loc.x / 2) - 70) + "px");
            $("#contrib_panel_holder").css("top", "" + (loc.y / 2) + "px");
            panel_holder_zoomrect = { left: ((loc.x / 2) - 70), top: (loc.y / 2), width: panel_holder_width, height: panel_holder_height };
            panel_holder_mousepos = { x: loc.x, y: loc.y };
            animate.open("contrib_panel_holder", function() { $("#contrib_panel_holder").show(); contrib_panel_visible = true; addShadow("contrib_panel") }, null, panel_holder_mousepos, panel_holder_zoomrect);
        }
    }

}

function ChangeContribution() 
{
    var req = getreq();
    var inputs = [];

    handler = function() {
        if (req.readyState == 4) {
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (E) { }
                if (rslt.Success) {
                    $("#contrib_wait").fadeOut("slow");
                    CreateContributionCSI(inputs);
                }
                else
                    $("#contrib_wait").html(Error_Opening_Placeholder + rslt.ErrorMessage + Error_Closing_Placeholder);
            }
        }
    }
    form_validate = function() {
        var retval = {};
        var errmsg = "";

        var tbl = document.getElementById("contribution_tbl");
        if (tbl)
            inputs = getObjectChildrenInput(tbl);

        var amt = document.getElementById("tbx_amount").value;
        if (amt <= 0)
            errmsg += "Amount must be greater than zero.";
        else
            retval.amount = amt;

        if (errmsg.length == 0)
            return retval;
        else
            alert(errmsg);
    }

    var sendObj = form_validate();
    if (sendObj) {
        req.open("POST", (srvr + ROOT + WEBSERVICE + "ChangeContribution"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        $("#contrib_wait").html("<img src='" + srvr + ROOT + "/lib/images/wait_spinner24x24.gif' align='absmiddle' /> <i style='color:#666;'>Please wait...</i>");
        $("#contrib_wait").fadeIn("slow");
    }
}

/* seat request related functionalities ---------------------------------------------------------------------------------------------------------------------------------- */


var seatreq_panel_visible = false;
function toggle_seatreq(oCallback, el) {
    var loc = getxy(el);
    var comments_panel_holder = document.getElementById("comments_panel_holder");
    if (seatreq_panel_visible)
        animate.close("comments_panel_holder", function() { $("#comments_panel_holder").hide(); seatreq_panel_visible = false; if (oCallback) { oCallback(); } }, null, panel_holder_mousepos, panel_holder_zoomrect);
    else {
        if (comments_panel_holder) {
            $("#comments_panel_holder").css("left", "" + ((loc.x / 2) + 220) + "px");
            $("#comments_panel_holder").css("top", "" + (loc.y / 2) + "px");
            panel_holder_zoomrect = { left: ((loc.x / 2) + 220), top: (loc.y / 2), width: panel_holder_width, height: panel_holder_height };
            panel_holder_mousepos = { x: loc.x, y: loc.y };
            animate.open("comments_panel_holder", function() { $("#comments_panel_holder").show(); seatreq_panel_visible = true; }, null, panel_holder_mousepos, panel_holder_zoomrect);
        }
    }
}


function handle_seatreq( sAction ) 
{
    var req = getreq();
    handler = function() {
        if (req.readyState == 4) {
            document.body.style.cursor = "default";
            if (req.status == 200) {
                rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (err) { }
                if (rslt.Success) {
                    if (rslt.FormattedHTML.length > 0) 
                    {
                        $("#seat_req").html(rslt.FormattedHTML + " <a href='javascript:void(0);' onclick=\"toggle_seatreq(null,this);\">[edit]</a> <a href='javascript:void(0);' onclick=\"handle_seatreq('remove');\">[remove]</a>");
                        toggle_seatreq(null, document.getElementById("seat_req"));
                    }
                    else {
                        $("#seat_req").html("If you have any order notes or special seating request. <a href='javascript:void(0);' onclick='toggle_seatreq(null,this);' class='red_big'>Add seating requests</a>");
                        document.getElementById("tbx_notes").value = "";
                    }
                }
                else
                    alert(rslt.ErrorMessage + req.responseText);
            }
        }
    }
    var sendObj = {};
    sendObj.action = sAction;
    if (sAction == "add")
        sendObj.notes = document.getElementById("tbx_notes").value;
    else
        sendObj.notes = "";
        
    req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "HandleSeatingRequest"), true);
    req.setRequestHeader(CONTENT_TYPE, APP_JSON);
    req.onreadystatechange = this.handler;
    req.send(JSON.serialize(sendObj));
    document.body.style.cursor = "wait";
}