var generic = generic || {};
var bb = bb || {};

bb.productView = bb.productView || {}
bb.productView.mpp = bb.productView.mpp || {}
bb.productView.mpp.hasPageControls = false;

// TODO: replace with actual RB
bb.rb = bb.rb || {}
bb.rb.product = new Hash({});

bb.mpp = function () {
    var tableContainerNode, pagingContainerNode;
    var productsDataArray = [];

    // the following are common in BrX but not implemented in BB JP:
    var tableContainerNodeName = "products_container"; // "products-grid-container"
    var pagingContainerNodeName = "paging-controls-container"; // "paging-controls-container";

    var self;

    //
    // define filter fields and menu labels for different categories
    // BB JP does not implement category filters
    var categoryFilterMenus = new Hash({
    });

    var that = bb.productView.filterTable();

    that.init = function(mppData) {
        self = this;
        pagingContainerNode = pagingContainerNodeName ? $$("#" + pagingContainerNodeName)[0] : null;
        tableContainerNode  = tableContainerNodeName  ? $$("#" + tableContainerNodeName)[0]  : null;

        productsDataArray = this.sortProducts(mppData.products);
        productsDataArray.each(function(item){
            item.display = true;
        });

        // Sets the proper category in the global nav to 'on'.
        var global_cat = generic.page_data("global_cat").get("global_cat");
        bb.page.setGlobalCat(global_cat)

        //
        // start filter & sort logic. This should remain on JS side
        var filtersContainerNode = $('filter-toolbar');
        var hideFilters = true;
        
        if (Object.isElement(filtersContainerNode)) {
            // BB JP does not implement filtering and sorting.
        }

        this.renderTable();
    };

    /**
     * This method provides a hook for the bb.filter class. It is called
     * after that class filters & sorts the data.
     * @methodOf bb.mpp
     */
    that.build = function(filteredData) {
        productsDataArray = filteredData;
        this.renderTable();
    }

    that.renderTable = function() {
        // display property will be toggled when the table is filtered or sorted
        var filteredProducts = productsDataArray.select( function(p) {
            return p.display;
        });
        
        // BB JP: display only shoppable products
        filteredProducts  = filteredProducts.findAll(function(p){
            return p.isShoppable;
        });

        if (tableContainerNode) {
            tableContainerNode.update();
        }
        
        this.renderCommonTable(filteredProducts);

        // pagination controls
        // BB JP does not implement pagination
        if (bb.productView.mpp.hasPageControls) {
            this.renderPageControls({
                productData: filteredProducts,
                startIndex: startIndex,
                maxItems: maxItems
            });
        }
    }

    that.renderCommonTable = function(filteredProducts) {
        // BB MPP logic
        // hide featured container

        var containerNode = $$(".products_area")[0]; // "common-product-row"
        var rowOuterContainer = null;    
        var rowInnerContainer = null;

        // process products
        for (var i=0, len=filteredProducts.length; i<len; ++i) {
            if ((i % 4) === 0) {
                // make new row
                rowOuterContainer = new Element("div", {"class":"whatsnew-block", style:"visibility:hidden"});
                rowInnerContainer = new Element("div", {"class":"content products"});
                rowOuterContainer.insert(rowInnerContainer);
                containerNode.insert(rowOuterContainer);
				// on first pass, insert the header container
				if (i < 4) {
					rowOuterContainer.setStyle({'border':'none'});
					rowInnerContainer.setStyle({'border':'none','padding':'0'});
				}
            }
            var productData = filteredProducts[i];
            this.loadProducts(productData, rowInnerContainer);
        }

        // show the resulting page
        this.displayProducts();
    }

    that.loadProducts = function(productData, rowInnerContainer) {

        // 1. Augment the productData structure if necessary

        // BRX: fetch the template for an LI for each product
        // here we perform the same logical task but using a different
        // containing block structure
        var templt_args = {};
        // BB JP does not implement rating and reviews.
        templt_args.ratingDisplay = 'none';

        Object.extend(productData, templt_args);

        generic.templatefactory.get({path: '/templates/products/whatsnew_product_thumb.tmpl'}).evaluateCallback({
            object: productData,
            callback: function(container, productData, html) {
                var thumbNode = new Element("div");
                container.insert(thumbNode);
                thumbNode.insert(html);
                that.initProductThumb({
                    thumbNode: thumbNode,
                    productData: productData
                });
                var parentContainerNode = container.parentNode;
                $(parentContainerNode).setStyle({visibility: "visible"});
            }.curry(rowInnerContainer, productData)
        });
				
    };

    that.sortProducts = function(products) {
        var productsDataArray = products;

        productsDataArray = productsDataArray.sortBy(function(productData){
            return productData.PROD_CAT_DISPLAY_ORDER;
        });

        return productsDataArray;

    }

    that.displayProducts = function() {
        // once the product table is constructed...
        //$$(".loading-container")[0].style.display = "none";
        var productAreaArray = [$$(".products_area")[0], $$(".whatsnew-area")[0], $$(".sec_content")[0], $$(".products_container")[0]];
        productAreaArray.each(function(s){
        //    s.setStyle({display:"block"});
        });
    }

    that.initProductThumb = function (args) {

        // Note: truncated short-description provided by back-end
        var calloutContainer = args.thumbNode.select('.callout')[0];
        if (calloutContainer) {
            bb.productView.setCallout(calloutContainer, args.productData);
        }

        var quickshopLinkNode = args.thumbNode.select('a.open-product-1')[0];
        bb.productView.initQuickshopLink(quickshopLinkNode, args.productData);

        //
        // TO DO: Bobbi Features
        // render attributes (Coverage, Skin Types, Benefits, etc)
        var attrContainer = args.thumbNode.select('.attributes')[0];
        if (attrContainer) {
            this.displayAttributes({
                containerNode : attrContainer,
                productData   : args.productData
            });
        }

        // render product price
        var priceContainer = args.thumbNode.select('.price')[0];
        if (priceContainer) {
        	var price = bb.productView.formatPriceRange(args.productData);
        	priceContainer.update(price)
        }
    };

    /* Not needed for BB JP: for reference only */
    that.renderPageControls = function(args) {
        var totalProducts = args.productData.length;
        var rangeEnd = args.startIndex + args.maxItems;
        if (rangeEnd > totalProducts) {
            rangeEnd = totalProducts;
        }
        var range = (args.startIndex + 1) + " - " + rangeEnd;
        //
        // create links to pages
        var pageNumber = 1;
        var pageLinks = [];
        for (var i=0; i< totalProducts; i++) {
            if (i % defaultMaxItems === 0) {
                var link = new Element("a", {
                    href:"#"
                });
                if ( (maxItems <= defaultMaxItems) && // if we are not showing All Items
                        (i == args.startIndex) ) { // if this is the current page number
                    link = new Element("span"); // use SPAN instead of A
                }
                link.className += " start-" + i;
                link.insert(pageNumber);
                pageNumber++;
                pageLinks.push(link);
            }
        }
        generic.templatefactory.get({path: '/templates/products/mpp-paging-controls.tmpl'}).evaluateCallback({
            object: {
                totalProducts: totalProducts,
                range: range
            },
            callback: function(html) {
                pagingContainerNode.update(html);
                var linksContainer = pagingContainerNode.select("span#page-links")[0];
                pageLinks.each( function (link) {
                    linksContainer.insert(" ");
                    linksContainer.insert(link);
                    if (link.tagName.toLowerCase() === "a") {
                        link.observe("click", function(e) {
                            var reResults = e.target.className.match(/start\-(\d)+/);
                            if (Object.isArray(reResults)) {
                                maxItems = defaultMaxItems;
                                startIndex = parseInt(reResults[1]);
                                self.renderTable();
                            }
                        });
                    }
                }); // end pageLinks.each()
                var viewAllLinkNode = pagingContainerNode.select("a#view-all-link")[0];
                if (viewAllLinkNode) {
                    viewAllLinkNode.observe("click", function(e) {
                        maxItems = totalProducts;
                        startIndex = 0;
                        self.renderTable();
                    });
                }
            } // end callback
        }); // end generic.templatefactory.get() 
        
    };


    // default product catalog rpc fields
    that.mppParams = {
        categoryFields: {
            categoryFields : ["CATEGORY_ID", "CAT_BASE_ID", "CATEGORY_NAME", "products"]
        },
        productFields: {
            productFields : ["PRODUCT_ID", "PROD_BASE_ID", "DEFAULT_CAT_ID", "PARENT_CAT_ID", "PROD_RGN_NAME", "PROD_RGN_SUBHEADING", "SUB_LINE", "DESCRIPTION", "SHORT_DESCRIPTION", "PROD_SKIN_TYPE", "PROD_SKIN_TYPE_TEXT", "PROD_CAT_IMAGE_NAME", "PROD_CAT_DISPLAY_ORDER", "SMALL_IMAGE", "LARGE_IMAGE", "THUMBNAIL_IMAGE", "PRODUCT_USAGE", "ATTRIBUTE_FORM", "displayName", "skus", "palette", "shaded", "sized", "url"]
        },
        skuFields: {
            skuFields : ["SKU_ID", "SKU_BASE_ID", "PRODUCT_ID", "SHADENAME", "SHADE_DESCRIPTION", "DISPLAY_ORDER", "SKIN_TYPE", "SKIN_TYPE_TEXT", "PRODUCT_SIZE", "STRENGTH", "PRICE", "formattedPrice", "formattedTaxedPrice", "INVENTORY_STATUS", "SMOOSH_DESIGN", "SMOOSH_PATH_STRING", "REFILLABLE", "HEX_VALUE", "HEX_VALUE_STRING", "FINISH", "LIFE_OF_PRODUCT", "COLORGROUPING"]
        }
    };

    return that;    
}();

document.observe("dom:loaded", function() {
    // load data from either page_data or AJAX
    // 1. Set up the product catalog fetch parameters
    var productDataParams = {};
    productDataParams.pageDataKey = 'catalog.mpp';
    productDataParams.categoryId = window.CATEGORY_ID;
    productDataParams.callback = function(mppData) {
        // pass category and products to multiple product filter view
        bb.mpp.init(mppData);
    };
    // obtain the fields from the page_data resource otherwise use a hardcoded default
    bb.mpp.page_data_configuration = generic.rb("page_data_configuration");
    if (bb.mpp.page_data_configuration.get("catalog.mpp.categoryFields") != 'catalog.mpp.categoryFields') {
        productDataParams.categoryFields = bb.mpp.page_data_configuration.get("catalog.mpp.categoryFields");
        productDataParams.productFields = bb.mpp.page_data_configuration.get("catalog.mpp.productFields");
        productDataParams.skuFields = bb.mpp.page_data_configuration.get("catalog.mpp.skuFields");
    }
    else {
        productDataParams = Object.extend ( productDataParams, bb.mpp.mppParams.categoryFields );
        productDataParams = Object.extend ( productDataParams, bb.mpp.mppParams.productFields );
        productDataParams = Object.extend ( productDataParams, bb.mpp.mppParams.skuFields );
    }

    // 2. Obtain the data
    generic.productData.getCategoryData(productDataParams);
});
//
//document.observe('cart:updated', function(e) {
//    alert(e.memo.ac_results[0].result.CARTITEM["prod.PROD_RGN_NAME"] + " added to cart.");
//});

// 
// document.observe("mpp-product-thumb:rendered", function (e) {
//     bb.mpp.initProductThumb(e.memo);    
// });

