﻿/* contains code for the cart bug functionality */
var Ubiquitous = (function() {
    var _user;
    var _ctrlMBlocks = [];
    var _ctrlMBlockCount = 0;
    var rightColumnExists = false;
    var cartBugExists = false;
    var myAccountExists = false;
    var recommendedExists = false;
    
    var cartBugSuccess = function(data, textStatus, elem) {
        var result = JSC.ConvertServerDataToLocal(data);
        
        if (result.serverDataOk && !result.error) {
            if ($("#rightColumnCartBug").css("display") == "block") {
                if (result.lines.length == 0) {
                    $("#rightColumnCartBugLines").text("Cart is empty.");
                    $("#rightColumnCartBugTotalDisplay").hide();
                } else {
                    $("#rightColumnCartBugCartName").text(result.cartName);
                    $("#rightColumnCartBugTotalDisplay").show();
                    
                    var orderHtml = '<table width="100%" border="0" cellpadding="2" cellspacing="0">';
                    var lineCount = result.lines.length - 1;
                    for (var i = 0; i <= lineCount; i++) {
                        var curLine = result.lines[i];
                        
                        var lineHtml = '<tr valign="top"';
                        if (i > 6)
                            lineHtml += ' class="cartBugExcessLines" style="display:none;"';
                            
                        lineHtml += '><td style="border-bottom:solid 1px #757A7D;"><span style="font-size:11px; font-weight:bold;">' + 
                            curLine.description + '</span><br/><span style="font-size:xx-small;">' +
                            curLine.partNumber + '</td><td style="width:10px; border-bottom:solid 1px #757A7D;">&nbsp;</td>' + 
                            '<td align="right" style="border-bottom:solid 1px #757A7D; font-size:11px;">' + curLine.extPrice + '</td></tr>';
                            
                        orderHtml += lineHtml;
                        
                        if (i == 6 && lineCount > 6) {
                            var trueLineCount = lineCount + 1;
                            orderHtml += '<tr><td colspan="3" style="font-size:x-small;"><a class="cartLinks" id="cartBugShowAll">' +
                                'Show All Lines</a> (' + trueLineCount + ')</td></tr>';
                        }
                    }
                    orderHtml += '</table>';

                    $("#cartBugShowAll").unbind();
                    $("#rightColumnCartBugLines").html(orderHtml);
                    $("#cartBugShowAll").click(function() {
                        $(this).parents("tr:first").hide();
                        $("#rightColumnCartBugLines tr.cartBugExcessLines").show();
                    });
                    
                    // cart information
                    $("#rightColumnCartBugSubtotal").text(result.subtotal);
                    
                    if (result.zipForEstimates == '') {
                        $("#rightColumnCartBugShipping").text('N/A');
                        $("#rightColumnCartBugTax").text('N/A');
                    } else {
                        $("#rightColumnCartBugShipping").text(result.shipping);
                        $("#rightColumnCartBugTax").text(result.tax);
                    }
                    $("#rightColumnCartBugTotal").text(result.total);
                    
                    if (result.promo == "0.00") {
                        $("#rightColumnCartBugPromoRow").hide();
                    } else {
                        $("#rightColumnCartBugPromoRow").show();
                        $("#rightColumnCartBugPromo").text(result.promo);
                    }
                    
                    if (result.shippingSet) {
                        $("#rightColumnCartBugZipSelection").hide();
                        $("#rightColumnCartBugZipNote").show();
                    } else {
                        $("#rightColumnCartBugZipSelection").show();
                        $("#rightColumnCartBugZipNote").hide();
                        $("#rightColumnCartBugZipCode").text(result.zipForEstimates);
                    }
                }
            }
        };
        
        if ($("#rightColumnCartBug").css("display") == "block")
            $("#rightColumnCartBug").unblock();
    };

    var changeCart = function(cartName) {
        var postData = {};
        postData["action"] = "changeCart";
        postData["cartName"] = cartName;
        JSC.ServerPost(postData, function() { JSCE.Fire("CartSelected", null, "Ubiquitous.changeCart"); }, ignoreError, null);
    };
    
    var changeZipCode = function() {
        $("#rightColumnCartBug").block("Loading ...");

        var zipCode = $("#rightColumnCartBugZipInput").val();
        if (zipCode == "") {
            return;
        }

        var postData = {};
        postData["action"] = "setZipForEstimates";
        postData["zipCode"] = zipCode;
        JSC.ServerPost(postData, changeZipCodeSuccess, ignoreError, null);
    };
    
    var changeZipCodeSuccess = function(data, textStatus, elem) {
        cartBugSuccess(data, textStatus, elem, false);
        JSCE.Fire("CartUpdated", {"triggerAction":"zipForEstimateChanged"}, "Ubiquitous.changeZipCodeSuccess");
    };
    
    var ignoreError = function(xhrequest, textStatus, errorThrown, elem) { 
        //alert(errorThrown); 
    };
    
    var loadRecommended = function(data, textStatus) {
        if (data == null) {
            JSC.ServerPost({"action":"recommendedProducts"}, function(data, textStatus) { loadRecommended(data, textStatus); }, ignoreError, null);
        } else {
            
            if (data == "") {
                $("#recommendedProductsBug").hide();
            } else {
                $("#recommendedProducts").html(data);
                $("#recommendedProducts div.recommended-images").corner();
                $("#recommendedProductsBug").show();
            }
        }
    };
    
    var loadUserInfo = function() {
        var postData = {};
        postData["action"] = "user";
        JSC.ServerPost(postData, function(data, textStatus, elem) { _user = eval("(" + data + ")"); setUpCartBug(); setUpMyAccountBug(); JSCE.Fire("UbiquitousLoaded", null, "Ubiquitous.loadUserInfo"); }, ignoreError, null);
    };
    
    var setUpCartBug = function() {
        if (cartBugExists) {
            // only show the reference number on the view cart and checkout pages
            if (window.location.toString().toLowerCase().indexOf("viewcart.aspx") >= 0 ||
                    window.location.toString().toLowerCase().indexOf("checkout.aspx") >= 0 ||
                    window.location.toString().toLowerCase().indexOf("checkout2.aspx") >= 0) {
                $("#rightColumnCartBugRefNumOnly").show();
                $("#rightColumnCartBug").hide();
                $("#rightColumnCartBug").removeClass("rcol-section");

                updateCartBug();
            } else {
                $("#rightColumnCartBugRefNumOnly").hide();
                $("#rightColumnCartBug").show();

                // bind the zip code estimate link
                $("#rightColumnCartBugZipCodeChange").click(function() {
                    $("#rightColumnCartBugZipInputWrapper").show();
                    $("#rightColumnCartBugZipInput").focus();
                });
                
                $("#rightColumnCartBugZipSubmit").click(function() {
                    $("#rightColumnCartBugZipInputWrapper").hide();
                    changeZipCode();
                });
            
                $("#rightColumnCartBugZipInput").keydown(function(e) {
                    if (e.keyCode == 13 || e.keyCode == 9) {
                        e.preventDefault();
                        $("#rightColumnCartBugZipInputWrapper").hide();
                        changeZipCode();
                    }
                });
                
                // update the cart bug and cart list
                updateCartBug();
                updateCartList();
                
                // can they change carts?
                $("#rightColumnCartBugCartsLink").click(function() {
                    if ($(this).text() == "change") {
                        $(this).text("cancel");
                        $("#rightColumnCartBugCarts").show();
                    } else {
                        $(this).text("change");
                        $("#rightColumnCartBugCarts").hide();
                    }
                });

                $("#rightColumnCartBugList").change(function() {
                    $.extend($.blockUI.defaults.elementMessageCSS, { width:'150px' });
                    $("#rightColumnCartBug").block("Loading ...");
                    changeCart($("#rightColumnCartBugList option:selected").text());
                });
            }
        }
    };
    
    var setUpMyAccountBug = function() {
        if (myAccountExists) {
            if (_user.loggedIn) {
                $("#myAccountBugUserRow").show();
                $("#myAccountBugAnonRow").hide();
                $("#myAccountBugUserContent").show();
                $("#myAccountBugAnonContent").hide();
            } else {
                $("#myAccountBugUserRow").hide();
                $("#myAccountBugAnonRow").show();
                $("#myAccountBugUserContent").hide();
                $("#myAccountBugAnonContent").show();
            }

            if (_user.internalUser) {
                $("#myAccountBugCustomerInfo").html(_user.customerName + " (" + _user.customerNumber + ")<br/>" + _user.priceList);
                $("#myAccountBugCustomerInfo").show();
            } else {
                $("#myAccountBugCustomerInfo").hide();
            }
            
            // display a reference number if they are calling for help
            if (_user.basketId == 0) {
                $("#myAccountBugReferenceNumber").hide();
            } else {
                var html = "<b>Your reference number:</b>" + _user.basketId;
                if (_user.internalUser) {
                    if (_user.convertedToOrder)
                        html += "<br/><span style='color:red;'>PLEASE NOTE: This is a customer cart that has been converted to an order.</span>";
                    else if (_user.customerOrder)
                        html += "<br/><span style='color:red;'>PLEASE NOTE: This is a customer cart.</span>";
                }

                $("#myAccountBugReferenceNumber").html(html);
                $("#myAccountBugReferenceNumber").show();
            }
        }
    };

    var setUpRightColumn = function() {
        if (rightColumnExists) {
            // set up rounded corners in the right column
            $(".rcol-section").corner();
            $(".rcol-section").show();
            
            // set up the close/open links
            $(".rcol-section-topline a").click(function() {
                if ($(this).text() == "Close") {
                    $(this).parents("div:first").next().slideUp("fast");
                    $(this).text("Open");
                } else {
                    $(this).parents("div:first").next().slideDown("fast");
                    $(this).text("Close");
                }
            });
        }
    };
    
    var setUpSearch = function() {
        $("#searchInput").focus(function() {
            if ($(this).val() == "Search")
                $(this).val("");
        });
        
        $("#searchInput").keydown(function(e) {
            if (e.keyCode == 13 || e.keyCode == 9) {
                if (e.keyCode == 13)
                    e.preventDefault();
                if ($.trim($(this).val()) != "" && $.trim($(this).val()) != "Search") {
                    window.location.href = "/www/Search/Search.aspx?q=" + escape($.trim($(this).val()));
                }
            }
        });
        
        $("#searchLink").click(function() {
            var searchText = $.trim($("#searchInput").val());
            if (searchText != "" && searchText != "Search")
                window.location.href = "/www/Search/Search.aspx?q=" + escape($("#searchInput").val());
        });

        // quick check for search results to add to a cart
        if (window.location.href.toLowerCase().indexOf("search.aspx") >= 0) {
            $("a.add-non-cs-item").click(function() {
                $(this).parents("div.results-part-table").block("Adding to cart ...");
                var postData = {};
                postData["action"] = "addNonCSItemToCart";
                postData["quickEntryPartNumber"] = $.trim($(".search-input").val());
                postData["quickEntryQuantity"] = "1";
                var that = $(this);
                JSC.ServerPost(postData, function() {
                    that.text("Add another of");
                    that.parents("div.results-part-table").unblock();
                    JSCE.Fire("CartUpdated", null, "Ubiquitous.setUpSearch");
                }, ignoreError, null);
            });
        }
    };
        
    var updateCartBug = function() {
        if (cartBugExists) {
            if ($("#rightColumnCartBug").css("display") == "block")
                $("#rightColumnCartBug").block("Loading ...");
            
            var postData = {};
            postData["action"] = "cartBugInfo";
            JSC.ServerPost(postData, cartBugSuccess, ignoreError, null);
        }
    };
    
    var updateCartList = function() {
        if (cartBugExists)
            JSC.ServerPost({ "action":"cartList" }, updateCartListSuccess, ignoreError, null);
    };

    var updateCartListSuccess = function(data, textStatus, elem) {
        var cartList = eval("(" + data + ")");

        if (cartList.length <= 1) {
            $("#rightColumnCartBugCarts").hide();
            $("#rightColumnCartBugCartNameWrapper").hide();
        } else {
            // create the new list of options
            var options = "";
            var selectedIndex = -1;
            for (var i = 0; i < cartList.length; i++) {
                options += '<option value="' + cartList[i].basketId + '">' + cartList[i].cartName + '</option>';
                if (cartList[i].currentBasket)
                    selectedIndex = i;
            }
            
            $("#rightColumnCartBugList").html(options);
            $("#rightColumnCartBugList").get(0).selectedIndex = selectedIndex;
            $("#rightColumnCartBugCartNameWrapper").show();
            $("#rightColumnCartBugCartsLink").text("change"); 
            $("#rightColumnCartBugCarts").hide();
        }
    };
    
    var updateMyAccountBug = function() {
        var postData = {};
        postData["action"] = "user";
        JSC.ServerPost(postData, function(data) { 
            _user = eval("(" + data + ")"); 
            setUpMyAccountBug(); 
        }, ignoreError, null);
    };
   
    return {
        ConvertDatePickerDate : function(date) {
            var dy = date.getFullYear();
            dy += (dy < 1970 ? 100 : 0);
            var dm = date.getMonth() + 1;
            var dd = date.getDate();
            var ys = new String(dy);
            var ms = new String(dm);
            var ds = new String(dd);
            return (ms.length == 1 ? ("0" + ms) : ms) + "/" + (ds.length == 1 ? ("0" + ds) : ds) + "/" + ys;
        },
        
        CtrlMBlock : function(blockName, blocked) { 
            if (blocked) {
                if (_ctrlMBlocks[blockName])
                    _ctrlMBlocks[blockName] += 1;
                else
                    _ctrlMBlocks[blockName] = 1;
                _ctrlMBlockCount++;
            } else {
                if (_ctrlMBlocks[blockName] && _ctrlMBlocks[blockName] > 0) {
                    _ctrlMBlocks[blockName] -= 1;
                    _ctrlMBlockCount--;
                }
            }
        },
        
        Init : function() {
            JSCE.Subscribe("CartUpdated", function() { updateCartBug(); loadRecommended(); });
            JSCE.Subscribe("CartItemAdded", function() { updateCartBug(); loadRecommended(); });
            JSCE.Subscribe("CartSelected", function() { updateCartList(); updateCartBug(); loadRecommended(); updateMyAccountBug(); });
            JSCE.Subscribe("CartSubmitted", function() { $("#rightColumnCartBug,#rightColumnCartBugRefNumOnly").hide(); });
            JSCE.Subscribe("ManageItClosed", function() {
                // workaround corner bug in ie
                if ($.browser.msie && rightColumnExists) {
                    $(".rcol-section").uncorner();
                    $(".rcol-section").corner();
                }
            });
        },
        
        IsCtrlMBlocked : function() { return (_ctrlMBlockCount > 0); },
        
        Load : function() {
            // date format ...
            Date.format = "mm/dd/yyyy";
            Date.firstDayOfWeek = 0;

            // block ui defaults
            $.extend($.blockUI.defaults.elementMessageCSS, { backgroundColor:'#FF9', color:'#666', fontSize:'large', 
                fontWeight:'bold', border:'solid 1px #666', width:'150px' });
            $.extend($.blockUI.defaults.pageMessageCSS, { backgroundColor:'#FF9', color:'#666', fontSize:'large', 
                fontWeight:'bold', border:'solid 1px #666', padding:'15px', width:'400px'} );

            // check for bug existence
            rightColumnExists = ($(".rcol-section").size() > 0);
            cartBugExists = ($("#rightColumnCartBug").size() > 0);
            myAccountExists = ($("#myAccountBug").size() > 0);
            recommendedExists = ($("#recommendedProductsBug").size() > 0);            
            
            // get user information for client decisions ... all user restrictions are revalidated upon post to the server
            //      also calls setUpCartBug after the callback
            //      also calls setUpMyAccountBug after the callback
            //      fires UbiquitousLoaded when done
            loadUserInfo();

            // set up search
            setUpSearch();
            
            // set up recommended products
            if (recommendedExists) {
                loadRecommended();
            }
            
            setUpRightColumn();

            // legacy telect js code
            initPage();
        },
        
        User : function() { return _user; }
    }
})();

Ubiquitous.Init();
$(document).ready(Ubiquitous.Load);
