site.product.init = function() { 
    if (!page_data || site.product.abort) return;
    //console.log("site.product.init ");
    
    // set rb keys
    site.product.getRBKeys();
    
    var catalog = page_data.catalog;
    
    if (catalog) {
    
        // init waitlist popover behavior
        site.product.waitlist.init();
        
        if (catalog.spp) {
            generic.events.fire({event:"PAGEDATA:RESULT",msg:"catalog.spp.product"});
            site.spp.init();
        }
        if (catalog.mpp) { // e.g. what's new, looks
            generic.events.fire({event:"PAGEDATA:RESULT",msg:"catalog.mpp.products"});
            site.mpp.initSections();
            
            // START: IGNORE SHOPPABLES ON FAVES PAGE FOR NOW
            var pageid = "";
            try {
                pageid = page_data.panel_nav["default"].item.id;
            }
            catch(err) {}
            if (pageid === "faves") {
                // for now: get rid of link styles
                var favesLinks = $$(".shoppable");
                favesLinks.each(function(node) {
                    node.style.textDecoration = "none";
                    node.style.cursor = "default";
                });
                return;
            }
            // END: IGNORE SHOPPABLES ON FAVES PAGE FOR NOW
            
            // content pages with product popovers
            if ($$(".shoppable")[0]) { 
                site.product.initShoppables({ products: catalog.mpp.products });
                return;
            }
        } 
    }
    if (page_data.video_products) { 
        site.product.videoPlayer.init();
    }
        
    // outlier pages     
    if (page_data.cms_generated && catalog) {
        if (catalog.cross_sell) {  // e.g. giving back viva glam 
            site.mpp.item.init({
                data: catalog.cross_sell
            }); 
        }
    }
};

site.product.getRBKeys = function () {
    site.product.rb = site.product.rb || {};
    
    // from global "language" bundle
    site.product.rb.added_to_shopping_bag = generic.rb.language.get("added_to_shopping_bag");
    //site.product.rb.items_in_bag = generic.rb.language.get("itemsinbag"); // needed?
    //site.product.rb.item_in_bag = generic.rb.language.get("item_in_bag"); // needed?
    site.product.rb.continue_shopping = generic.rb.language.get("continue_shopping");
    site.product.rb.checkout = generic.rb.language.get("checkout");
    site.product.rb.thank_you = generic.rb.language.get("thank_you");
    site.product.rb.add_to_bag = generic.rb.language.get("add_to_bag");
    site.product.rb.sorry = generic.rb.language.get("sorry");
    
    // from "brand" bundle
    var rbProduct = generic.rb("brand");
    site.product.rb["select"] = rbProduct.get("select");
    site.product.rb.to_shop = rbProduct.get("to_shop");
    site.product.rb.favorites = rbProduct.get("favorites");
    site.product.rb.added_to_favourites = rbProduct.get("was_added_to_your_favourites");
    //site.product.rb.items_in_favourites = rbProduct.get("items_in_favourites"); // needed?
    //site.product.rb.item_in_favourites = rbProduct.get("item_in_favourites"); // needed? 
    site.product.rb.limited = rbProduct.get("limited"); 
    site.product.rb.macpro = rbProduct.get("macpro");
    site.product.rb.step = rbProduct.get("step"); 
    site.product.rb.of = rbProduct.get("of");
    site.product.rb.search_results = rbProduct.get("search_results");
    site.product.rb.search_no_results = rbProduct.get("search_shades_no_results");
};


site.product.initShoppables = function(args) {  
    //console.log("site.product.initShoppables");
    brand.product.shoppableContent.init({ 
        products: args.products,
      
        // position popup near mouse
        positionPopup: function(evt, cartAddMsg, cartConfirmMsg) {
            var lmin = 6;
            var lmax = 530;
            var xOffset = 310; // left nav (190) & half of length of popup (120)   
            var yOffset = 100; // ~ height of popup 
            
            var t = (evt.pageY - yOffset);
            var l = (evt.pageX - xOffset); 
            // adjust for left & right edges
            if (l < lmin) {
                l = lmin;
            } else if (l > lmax) {
                l = lmax;
            }
            
            console.log("t = "+t+" l = "+l);
            cartAddMsg.position = {top: t, left: l};
            cartConfirmMsg.position = {top: t, left: l};            
        }
    });  
};

// extends brand.spp
if (!brand.spp) brand.spp = {};
site.spp = Object.extend(brand.spp, {

    // entity chars that should be replaced by unicode for display in select menus (e.g. "Matte&#178" finish)
    entitiesToUnicode: { 
        "&#178" : "\262"
    },
    
    inventoryStatusNode: null,
    skuField: null,
    skuFavField: null,
        
    init: function() { 
        // console.log("site.spp.init");
        
        // SPP main product
        var self = this;
        var is_shaded = false;
        this.skuField = skuField = $("prod_sku");
        this.skuFavField = skuFavField = $("btn_save_to_favorites");
        var prodBrowserSkuField = $("btn_color_play");
        var product = page_data.catalog.spp.product;
        this.inventoryStatusNode = $("inventory_btn_message");
        var isDiscontinued = false; 
        var isSized = ((product.sized == 1 && product.skus.length > 1) ? true : false); // isSized: products with multiple skus based on size (non-shaded)
        /* TODO: distinguish between featured goodbyes products that are shoppable & unshoppabled disco prods.  Commenting out for now so that goodbyes are shoppable
        try {
            if (page_data.panel_nav["default"].item.id == "discontinued") isDiscontinued = true; 
        } catch(e) {
        }
        */

        var shadedType = null;
        var hasTabs = false;

        // solos, duos, trios+ notes:
        // solos & duos: page data "shaded" is 1
        // duos: sku[n]sku_multicolor_type is defined
        // "multi-colored" single skus (i.e. trio prod spp with only 1 sku containing 3 shades): page data "shaded" is 0, product.product_multicolor_type is defined
        if (product.shaded == 1 || product.product_multicolor_type) {
            // solos & multi-skued duos
            var isMultiShadedSingleSku = false;
            if (product.shaded == 1) {
                is_shaded = true;
            }
            // check for multicolored
            var shadetype_data = brand.product.getShadeType({product: product, multicolor_min: 2}); // pass minimum # of shades to count as multi-colored
            shadedType = shadetype_data.type;
            shadedTypeIsMulti = shadetype_data.ismulti;
            
            if ((shadetype_data.ismulti && !product.shaded) && product.skus.length == 1) {
                // skus that are 3+ multi-colored are displayed on SPP all by themselves (NOT the same as products with only 1 shoppable sku.  Former is a constant, latter is not.)
                // single-skued products are flagged as shaded = 0, whereas multi-skued duos are shaded = 1
                isMultiShadedSingleSku = true;
            } 
        }

        var cartConfirmMsg = new site.product.cartConfirm({
            id: "cart_confirm_spp",
            is_shaded: is_shaded,
            prodName: product.name,
            nodeToReplace: $("cart_confirm_placeholder")
        });

			// init "more" description link
            brand.spp.initDescription({
                linkNode: $("descr-full-link"), 
                descriptionNode: $("descr-full"), 
                hasDescription: product.more_desc_flag
            });

        // show swatch container for any singles, duos, trios, etc...
        if (is_shaded || shadedType) {
            //console.log("site.product.spp: is_shaded");

            if (!isMultiShadedSingleSku) {           
                // tab container & toggling handler
                if ($("prod-tabs")) {
                    site.spp.tabContainer.init();
                    hasTabs = true;
                }
            }
            
            // selected or default or first sku as sorted by color
            var selectedSku = page_data.selected_sku;
            if (selectedSku && selectedSku.indexOf("SKU")) { // get sku base id from full path
                selectedSku = "SKU" + selectedSku.split("SKU")[1];
            }
            if (!selectedSku) {
                if (page_data.default_sku) {
                    selectedSku = page_data.default_sku;
                } else {
                    selectedSku = product.skus[0].sku_id;
                }
            }

            // init swatches
            var swatchArgs = {
                product: product,
                skuField: skuField,
                shadedType: shadedType,
                isDiscontinued: isDiscontinued,
                selectedSku: selectedSku,
                domParent: "spp-thumbs-wrapper",
                initDefault: true
            }
            var pageArgs = {
                isMultiShadedSingleSku: isMultiShadedSingleSku,
                prodBrowserSkuField: prodBrowserSkuField,
                favField: skuFavField,
                cartConfirm: cartConfirmMsg,
                hasTabs: hasTabs
            };

            var swatchSet = site.spp.initSwatches({
                node: $("spp-thumbs-container"),
                swatchArgs: swatchArgs,
                pageArgs: pageArgs
            });

            // init color play link (optional)
            site.spp.initColorPlayButton(prodBrowserSkuField);
        } else if (isSized) {
            // isSized: products with multiple skus based on size (non-shaded)
            //console.log("site.product.spp.init: sized prod");
            site.spp.initSized({
                skus: product.skus,
                skuField: skuField,
                favField: skuFavField,
                menuNode: $("menu-sizes"),
                cartConfirmMsg: cartConfirmMsg
            });   
        } else {
            // non-shaded: 1st sku is default add-to-bag button value
            //console.log("site.product.spp.init: non-shaded");
            this.setSkuSelection({ sku: product.skus[0], cartConfirmMsg: cartConfirmMsg });
        } 

        // main image rollover (optional)
        site.spp.photoRollover.init(product.image_medium, product.image_medium_rollover);
        
        // unless discontinued: set up cart/favorites buttons & cross-sell items
        if (isDiscontinued) return;
        
        // add to cart button
        var sppButton = brand.product.addButton({
            addButtonNode: skuField,
            progressNode: $("progress_add_to_bag"),
            callback: function(response) {
                //console.log("site.product.sppInit sppButton callback "+cartConfirmMsg);
                cartConfirmMsg.setDisplayProperties({ type: "cart", lockToNode: $("add_to_bag"), useLeftAlign: false });
                cartConfirmMsg.show({ response: response });
            }
        });
        
        // add to favorites button
        var favSppButton = brand.product.addButton({
            addButtonNode: skuFavField,
            skuField: skuField,
            progressNode: $("progress_add_to_fav"),
            itemType: "favorites",
            callback: function(response) {
                cartConfirmMsg.setDisplayProperties({ type: "favorites", lockToNode: $("add_to_fav"), useLeftAlign: false });
                cartConfirmMsg.show({ response: response });
            }
        });
 
        // MPP cross-sell products
        site.mpp.item.init({
            data: page_data.catalog.spp.product.cross_sell
        });
           
    },
    
    // for non-shaded prods & shaded prods that are supposed to display like non-shaded
    // (no swatches, no menus)
    // 1st sku is default add-to-bag button value
    setSkuSelection: function(args) {
        var sku = args.sku;
        // inventory status
        site.product.inventoryStatus({
            shoppable: sku.shoppable,
            message: sku.inventory_status_message,
            messageNode: this.inventoryStatusNode,
            containerNode: $("prod-details")
        });
        
        self.skuField.value = sku.path;
        self.skuFavField.value = self.skuField.value;
        args.cartConfirmMsg.sku = sku;
        
        // shaded: product photo per-sku
        if (args.isShaded) {
            hasPhotosBySku = site.spp.photoBySku.init();
            if (hasPhotosBySku) {
                site.spp.photoBySku.onSkuSelect(sku, "0");
            }
        }
    }
});

if (!brand.mpp) brand.mpp = {};
site.mpp = Object.extend(brand.mpp, {
    initSections: function() { 
        //console.log("site.mpp.initSections");
        var pageContext = page_data.panel_nav["default"];
                
        if ( pageContext.item && pageContext.item.id === "looks") {
            site.mpp.initLooks();
            return;
        }

        if ( pageContext.item && page_data.catalog.subcollection_page ) {
            site.mpp.initSubcollection();
            return;                        
        }

        if ( pageContext.item && page_data.catalog.picks_page ) {
            site.mpp.initPicksCollection();
            return;                        
        }

        // favorites page
        if ( pageContext.item && pageContext.item.id === "favorites" ) {
            site.mpp.initFavorites();
            return; 
        }
    
        // Default
        site.mpp.item.init({
            data: page_data.catalog.mpp.products
        }); 
    },
    
    initLooks: function() { 
        // buttons
        var looksSkus = page_data["all_shoppable_looks_skus"]; 
        
        if (looksSkus) {
            var skus = [];
            looksSkus.each(function(sku){
                skus.push(sku+":1");
            });
            var addAllToCart = brand.product.addButton({
                addButtonNode: $("all_to_cart_img"),
                skus: skus,
                //itemType: "collection", // MERGE NOTE: results in server error
                progressNode: $("progress_all_to_cart"),
                callback: function(response) {
                    // cart confirm popover
                    brand.overlay.launch({
                        foregroundNode: $("popover-confirm-all-to-cart"),
                        displayInline: true,
                        removeOnHide: false
                    });
                }
            });
        }
        
        var products = page_data.catalog.mpp;
        for( catId in products ) {
            site.mpp.item.init({
                data: page_data.catalog.mpp[catId].products,
                initButtons: true
            });
        }   
    }, // end initLooks     

    initSubcollection: function() {
        // confirmation popovers
        /* MERGE NOTE: old/needed?
        function initConfirmMsg(id) {
            var pop = new generic.popupMessage({
                popup: $("popup_confirm_"+id),
                buttonClose: $("popup_close_confirm_"+id)
            });
            return pop;
        }
        */
        var products = page_data.catalog.mpp;
        for( catId in products ) {
            site.mpp.item.init({
                data: page_data.catalog.mpp[catId].products,
                initButtons: true
                //altNodeId: true,
                //altType: true
            });
        }
    }, // end initSubcollection
    
    initPicksCollection: function() {
        // confirmation popovers
        /* MERGE NOTE: old/needed?
        function initConfirmMsg(id) {
            var pop = new generic.popupMessage({
                popup: $("popup_confirm_"+id),
                buttonClose: $("popup_close_confirm_"+id)
            });
            return pop;
        }
        */
        var products = page_data.catalog.mpp;
        for( catId in products ) {
            site.mpp.item.init({
                data: page_data.catalog.mpp[catId].products,
                initButtons: true
                //altNodeId: true,
                //altType: true
            });
        }
    } // end initSubcollection
});

