var site = site || {};
site.shopTogether = site.shopTogether || {};

// LOAD
document.observe("dom:loaded", function() {
    site.shopTogether.init();
});
            

/**
 * site.shopTogether
 * Init and bridge/mediating functions to support Shop Together app
 */
site.shopTogether = {

    // bv review content has loaded flag
    bvHasLoaded: false,
    
    init: function() {
        if (typeof ShopTogether === "undefined" || !ShopTogether.Initialize || typeof stlang === "undefined" || !ShopTogether.openInvite) {
            //console.log("ShopTogether.Initialize undefined")
            return;
        }
        if (!page_data || !page_data.shop_together) {
            //console.log("page_data.shop_together undefined");
            return;
        }
        var stdata = page_data.shop_together;
        
        // send page variables to external ShopTogether app (files.shoptogether.com/Clients/MAC/prod/ShopTogether.js)
        //console.log("page_data.shop_together (passing to ShopTogether.Initialize) = ",stdata);
        try {
            ShopTogether.Initialize(stdata);
        }
        catch(err) {
            console.log("ShopTogether.Initialize error = ",err);
            return;
        };
        
        var self = this;
        
        // ST footer button
        var footerButton = $("shop_together_link");
        this.initButton(footerButton);
        footerButton.show();
        
        // other buttons (ex: utility nav)
        var shopTogetherButtons = $$("a.shoptogether-button");
        shopTogetherButtons.each( function(node) {
            self.initButton(node);
        });

        // add icon to BVRR SPP content
        if ( $("BVReviewsContainer") ) {
            //console.log("going to try to insert extra BV icon");
            generic.events.observe("bv:loaded", function(eventArgs) {
                self.addIcon();
            });
        };
    },

    initButton: function(buttonNode) {
        if (!buttonNode) return;
        buttonNode.observe("click", function(event) {
            if (event.preventDefault) event.preventDefault();
            ShopTogether.openInvite();
        });    
    },
    
    /**
     * This function adds a sku to cart or favorites for the Shop Together app
     * @example
     * // site.shopTogether.addToCart({
     * //   skuId: "20174",
     * //   itemType: "favorites",
     * //   onSuccess: function() {
     * //       // Action to take on success, if any
     * //   },
     * //   onFailure: function() {
     * //       // Action to take on failure, if any
     * //   }
     * // });
     * @param {String} args.skuId SKU value to add.  Can be either sku_base_id (ex: "2148") or full CATPRODSKU (ex: CAT152PROD259S).
     * @param {String} args.itemType Which cart type to add the sku to.  Valid values are "favorites" or "cart".  Defaults to "cart" if no value specified. (Optional)
     * @param {Object|Node} args.lockToNode DOM node to which confirmation popover should position itself relative to or anchored to.
     * @param {Function} args.onSuccess Callback function to call after rpc call returns success. (Optional)
     * @param {Function} args.onFailure Callback function to call after rpc call fails.  (Optional)
     */   
    addToCart: function(args) {
        // console.log("site.shopTogether.addToCart, args = ",args);
        var skus = []; // Array of sku_base_ids (probably will only ever be 1 in case of Shop Together).
        var itemType = args.itemType || 'cart';
        var onSuccessCallback = args.onSuccess || function() {};
        var onFailureCallback = args.onFailure || function() {};
        var lockToNode = args.lockToNode;
        
        // get selected offsets and scroll offsets
        var windowScrollOffsets = document.viewport.getScrollOffsets();
        var offsetLeft = args.offsetLeft || -240;
        offsetLeft = (offsetLeft + windowScrollOffsets.left);
        var offsetTop = args.offsetTop || 0;
        offsetTop = (offsetTop + windowScrollOffsets.top);

        // get sku
        if (args.skuId) {
            var sku = args.skuId;
        } else {
            var skuField = $("prod_sku");
            var sku = (skuField) ? skuField.value : null;
        }
        if (!sku) {
            //console.log("site.shopTogether.addToCart: sku & skuField undefined");
            return;
        }
        sku = sku.toString();
        if (sku.indexOf("SKU") > -1) {
            sku = sku.split("SKU")[1];
        }
        skus[0] = sku;
        //console.log("site.shopTogether.addToCart, args.skuId = "+args.skuId+" sku = "+sku);

    
        initCartConfirm = function(productData, cartAddResponse) {
            // args to pass to generic.overlay
            var overlayArgs = {
                cssClass: "shop-together-confirm-overlay-container",
                lockToDomNode: lockToNode,
                isCentered: false,
                offsetLeft: offsetLeft,
                offsetTop: offsetTop,
                lockPosition: true
            };
            
            // default text
            var text_addedMessageCheckout = site.product.rb.added_to_shopping_bag || "";
            var text_addedMessageFavorites = site.product.rb.added_to_favourites || "";
            
            // populate overlay with content
            var render = function() {
                var overlayContainerNode = $$('.' + overlayArgs.cssClass)[0];
                if (!overlayContainerNode) return;
               
                // images
                var checkoutBtnNode = overlayContainerNode.select('.popover-btn-checkout')[0];
                var favoritesBtnNode = overlayContainerNode.select('.popover-btn-favorites')[0];
                //checkoutBtnNode.style.visibility = "hidden"; // hide until set up
                //self.regionalizeImage(checkoutBtnNode);
                //var continueBtnNode = overlayContainerNode.select('.btn-continue')[0];
                //continueBtnNode.style.visibility = "hidden"; // hide until set up
                //self.regionalizeImage(continueBtnNode);
                
                // render text content
                var contentContainerNode = $('cart-confirm-content');
                var prodNameNode = overlayContainerNode.select('.popover-product-name')[0];
                prodNameNode.update(productData.productName);
                var addedMessageNode = overlayContainerNode.select('.confirm-added-message')[0];
                if (productData.shadeName) {
                    var shadenameNode = overlayContainerNode.select('.popover-shadename')[0];
                    shadenameNode.update("&nbsp;-&nbsp;" + productData.shadeName);
                }
    
                if (itemType === "favorites") {
                    checkoutBtnNode.addClassName("hidden");
                    favoritesBtnNode.removeClassName("hidden"); 
                    addedMessageNode.update(text_addedMessageFavorites); 
                } else {
                    checkoutBtnNode.removeClassName("hidden");
                    favoritesBtnNode.addClassName("hidden");      
                    addedMessageNode.update(text_addedMessageCheckout);  
                }
                    
                // check for error message
                var hasErrors = cartAddResponse ? cartAddResponse.getError() : false;         
                // show error
                if (hasErrors) {
                    var errorMessageNode = overlayContainerNode.select('.cart-confirm-error-message')[0];
                    var errorContainerNode = overlayContainerNode.select('.cart-confirm-error')[0];
                    var messages = cartAddResponse.getMessages();
                    errorMessageNode.innerHTML = messages ? messages[0].text : ""; 
                    errorContainerNode.removeClassName("hidden");
                    contentContainerNode.addClassName("hidden");  
                } 
                
            };        
    
            var getTemplate = function() {
                generic.templatefactory.get({path: '/templates/products-cart-confirm.tmpl'}).evaluateCallback({
                    callback: function(html) {
                        overlayArgs.content = html;
                        // open overlay
                        generic.overlay.launch(overlayArgs);
                        
                        render();
                    }
                }); 
            };
            
            getTemplate();
        
        };  
    
        var callback = function(cartAddResponse, success) {
            if (success) {
                var productResult;
                var cartResults = cartAddResponse.getCartResults();
                if (cartResults) {
                    productResult = cartResults.getItem();
                    if (productResult && productResult.product && productResult.product.sku) {
                        productResult = {
                            productName: productResult.product.PROD_RGN_NAME,
                            shadeName: productResult.product.sku.SHADENAME
                        }
                    }
                }
            }   

            // display confirm popover
            initCartConfirm(productResult, cartAddResponse);
        };
     
        generic.checkout.cart.updateCart({
            params: {
                "skus": skus,
                "itemType": itemType,
                "action": "add"
            },
            onSuccess: function(cartAddResponse) {
                //var resultData = cartAddResponse.getData();
                callback(cartAddResponse, true);
                onSuccessCallback();
            },
            onFailure: function(cartAddResponse) {
                callback(cartAddResponse, false);
                onFailureCallback();
            }
        });

    },

    /**
     * This function makes the rpc call to sign up customer for email
     * @example
     * // site.shopTogether.emailSignup({
     * //   emailAddress: "me@thing.com",
     * //   emailAddressVerify: "me@thing.com",
     * //   callback: function(response) {
     * //       // Action to take on rpc response load
     * //   }
     * // });
     * @param {String} args.emailAddress Email address to add.
     * @param {String} args.emailAddressVerify Duplicate entry for email.
     * @param {Function} args.callback Callback function to call after rpc call returns response. 
     *     Returns Object with the following properties:
     *     - resultData
     *     - message
     *     - error
     */   
    emailSignup: function(args) {
        // console.log("site.shopTogether.emailSignup, args = ",args);
        var externalCallback = args.callback || function() {};
        
        var getResponse = function(response, success) {
            if (!response) {
                externalCallback({ error: { message: "Error: no response."} });
                return;
            }
            
            var resultData = response.getData();
            var resultMessage = response.getMessages();
            var resultError = response.getError();
            if (resultData && resultData.userinfo) {
                resultData = resultData.userinfo;
            }
            
            externalCallback({ resultData: resultData, message: resultMessage, error: resultError });
        };      
        
        // call email_signup rpc method
        generic.jsonrpc.fetch({
            method: 'email_signup',
            params: [{
                "_SUBMIT": "email_signup",
                "EMAIL_ADDRESS": args.emailAddress,
                "EMAIL_ADDRESS_VERIFY": args.emailAddressVerify
            }],
            onSuccess: function(response) {
                getResponse(response, true);
            },
            onFailure: function(response) {
                getResponse(response, false);
            }
        });
    },
    
    addIcon: function() {
        if (this.bvHasLoaded) return;
        //console.log("adding icon");
        this.bvHasLoaded = true;
        var containerNode = $("BVCustomerRatings");
        var iconNode = $("sharelink-shoptogether");
        if (!containerNode || !iconNode) return;
        
        // make sure reviews icon content has loaded
        var timerCount = 0;
        var contentHasLoaded = function() {
            timerCount++;
            //console.log("contentHasLoaded: checking, timerCount = "+timerCount);
            var labelNode = containerNode.select(".BVRRProductBookmarkingLabel")[0];
            if (labelNode) {
                clearInterval(timer);
                labelNode.insert({ after: iconNode }); // insert icon
                iconNode.show(); // show icon
                site.shopTogether.initButton(iconNode); // icon link handler
            } else if (timerCount > 6) {
                clearInterval(timer);
                //console.log("BVR content failed to load. Giving up.");
            }
        }; 
        var timer = setInterval(contentHasLoaded, 1500);
    }    

};

