/** @namespace global namespace for all JS code on bobbibrowncosmetics.com site */
var bb = {};
/** @namespace namespace for page-specific JS code */
bb.page = {};

bb.urlRoot = window.location.protocol + "//" + window.location.hostname;
//var uri = location.href.parseUri();
//var URL_DOMAIN = uri.protocol + "://" + uri.host;
var URL_DOMAIN = bb.urlRoot; 
// TO DO: These should come from a resource bundle
bb.page.PRODUCT_IMG_PATH = "/images/products/photos/";

bb.page.isCMS = function() {
    return !!( $$('div.cms_layer')[0] );
};

bb.page.initGnav = function() {
 	var gnavDropDowns = $$(".prod li .subnav");
 	var gnavLinks = $$(".prod li .prod_link .rollover_state");
	gnavDropDowns.each(function(ele,index) {
	    var u = ele.up();
		u.observe("mouseover", function(evt) {
			ele.addClassName("gnav-show");
			gnavLinks[index].addClassName("gnav-show");
		});
		u.observe("mouseout", function(evt) {
			ele.removeClassName("gnav-show");
			gnavLinks[index].removeClassName("gnav-show");
		});
	});
}

bb.page.initSubnav = function() {
    var globalNav = $('global-nav');
    if (globalNav) {
        var subnav = globalNav.select('div.subnav');
        for ( var i=0, len=subnav.length; i<len; i++ ) {
            var liNodes = subnav[i].select('li.subnav-cat');
    
            for ( var j=0, liLen=liNodes.length; j<liLen; j++ ) {
                if (j%2 === 0) {
                    liNodes[j].className += " odd";
                } else {
                    liNodes[j].className += " even";
                }
            }
        }
    }
};

bb.page.setGlobalCat = function(pageCat) {
    var catID = '';
    // Find the correct category
    switch (pageCat) {
    case "whatsnew":
        catID="#whatsnew-nav";
        break;
    case "makeup":
        catID="#makeup-nav";
        break;
    case "skincare":
        catID="#skincare-nav";
        break;
    case "brushesetc":
        catID="#brushes_etc-nav";
        break;
    case "gifts":
        catID="#gifts-nav";
        break;
    case "learn":
        catID="#learn-nav";
        break;
    case "bobbibuzz":
        catID="#bobbi_buzz-nav";
        break;
    }
    // Adds class to the proper gnav element                    
    var categoryRegState = $$(catID + ' .reg_state')[0];
    var categoryOnState = $$(catID + ' .on_state')[0];
    categoryRegState.setStyle({'visibility':'hidden'});
    categoryOnState.setStyle({'visibility':'visible'});
}

bb.page.getSwatchNode = function(hexValue, imgPath) {
    var swatchImagePath = imgPath || "/images/products/swatch_2.png";
    var bgImgAttr = function(path) {
        return "url('" + path + "')";
    };
    var swatchStyle = {
        height: "19px",
        width : "20px",
        backgroundColor : hexValue
    };
    
    if (/MSIE (\d+\.\d+)/.test(navigator.userAgent) && parseFloat(RegExp.$1) < 7) {
        swatchStyle.filter = "progid:dximagetransform.Microsoft.AlphaImageLoader(src='" + swatchImagePath + "', sizingMethod='image')";
        swatchStyle.backgroundImage = "none";
    }
    else {
        swatchStyle.backgroundImage = bgImgAttr(swatchImagePath);
    }
    var imgDiv = new Element("div");
    imgDiv.setStyle(swatchStyle);
    return imgDiv;
};

bb.page.replaceSelects = function() {
    if (bb.cforms) {
        try {
            bb.cforms.initCustomForms();
        }
        catch(e) {
            console.log(e);
        }
    }
};

// was bb.page.DefultValueInput
bb.page.defaultValueInput = function(args) {
    this.defaultValue = args.defaultValue || "Enter Text";
    this.inputNode = args.inputNode || null;

    if (!Object.isElement(this.inputNode)) { return; }

    var self = this;
    this.inputNode.observe("focus", function(focusEvt){
        if (self.inputNode.value === self.defaultValue) {
            self.inputNode.value = "";
        }
    });
};

bb.page.isInputFieldActive = false;
bb.page.initPromoLinks = function() {
    var openBtns = $$('a.expand_link');
    for (var i=0, len=openBtns.length; i<len; i++) {
        var oBtn = openBtns[i];
        oBtn.observe("click", function(evt) {
            bb.page.openPromos();
        });
    }
    var closeBtns = $$('.promos_area .btn');
    for (var j=0, len=closeBtns.length; j<len; j++) {
        var cBtn = closeBtns[j];
        cBtn.observe("click", function(evt) {
            bb.page.closePromos();
        });
    }
    var promoEmailInputEle = $$('div.promo input.email-input')[0];
    bb.page.isInputFieldActive = false;
    if (promoEmailInputEle) {
        promoEmailInputEle.observe("focus", function(focusEvt){
            bb.page.isInputFieldActive = true;
        });
        promoEmailInputEle.observe("blur", function(focusEvt){
            bb.page.isInputFieldActive = false;
        });
    }
};

bb.page.closePromos = function() {
    if (!bb.page.isInputFieldActive) {
        Effect.BlindUp('promo_full', {duration: 0.5});
        $('promo_links').appear({duration: 0.5});
    }
};

bb.page.openPromos = function() {
    Effect.BlindDown('promo_full', {duration: 0.5});
    $('promo_links').fade({duration: 0.5});
};

// rewrite to use brx jp common libraries
bb.page.initEmailSignup = function() {
		var emailInputNode = null;
		var emailContainerNode = null;
		var emailFormNode = null;
		var emailSubmitNode = null;
		var emailProgressNode = null;
		emailContainerNode = $$("div.email-signup-container");
		if (!emailContainerNode) {
			return null;
		}
		emailContainerNode.each(function(formEle) {
			var emailFormNode = formEle.select("form")[0];
			var emailSubmitNode = formEle.select("input.input-image")[0];
			var emailProgressNode = formEle.select("span.progress")[0];
			var emailInputNode = formEle.select("input.email-signup")[0];
			var errorContainerNode = formEle.select(".error_messages")[0];
			emailFormNode.observe("submit", function(submitEvt) {
				submitEvt.preventDefault();
				emailSubmitNode.addClassName("hidden");
				emailProgressNode.removeClassName("hidden");
				var params = emailFormNode.serialize(true);
				generic.jsonrpc.fetch({
					method : 'rpc.form',
					params: [params],
					onSuccess:function(jsonRpcResponse) {
						emailProgressNode.addClassName("hidden");
						emailSubmitNode.removeClassName("hidden");
						//var d = jsonRpcResponse.getData();
						//var rb = generic.rb('language');
						//var msg = rb.get("email_signup_text");
					    document.location.href='/cms/customer_service/signup_thanks.tmpl';	
						//generic.showErrors([{text: msg, displayMode: "message"}]);

					},
					onFailure: function(jsonRpcResponse){
						var errorObjectsArray = jsonRpcResponse.getMessages();
						generic.showErrors(errorObjectsArray,errorContainerNode);
						emailProgressNode.addClassName("hidden");
						emailSubmitNode.removeClassName("hidden");
					}
				});
			});
		});
	};

bb.page.fillFormField = function(containerNode, inputID, value) {
    if (!Object.isElement(containerNode)) { return; }
    var txtInput = containerNode.select('#' + inputID)[0];
    if (txtInput) {
        txtInput.value = value;
    }
};

bb.page.selectOption = function(slct, valueToSelect, fireEvent) {
    if (valueToSelect && valueToSelect.length && valueToSelect.length > 0) {
        if (Object.isElement(slct) && slct.tagName.toLowerCase() === "select") {
            var optionToSelect = null;
            var optsArray = $A(slct.options);
            var opt = optsArray.detect(function(opt, idx){
                if (opt.value === valueToSelect) {
                    return opt;
                }
            });
            slct.selectedIndex = optsArray.indexOf(opt);
            if (fireEvent) {
                // create DOM Event and fire it manually.
                if (document.createEvent) { // Mozilla
                    var evObj = document.createEvent('Event');
                    evObj.initEvent('change', true, true);
                    slct.dispatchEvent(evObj);
                }
                else if (document.createEventObject) { // IE
                    var evObj = document.createEventObject();
                    slct.fireEvent('onchange', evObj);
                }
            }
        }
    }
};

bb.page.initErrorDisplay = function(containerNode) {
    var msgContainerNode = containerNode || $$(".error_messages")[0];
    if (msgContainerNode) {
        msgContainerNode.select("ul.error").each(function(ele){
            ele.remove();
        });
        var hide = true;
        if (bb.page.errors) {
            var ul = new Element("ul", {"class":"error"});
            bb.page.errors.pageErrors.each(function(err){
                ul.insert({bottom: '<li class="' + err.TYPE + '">' + err.MESSAGE + '</li>'});
                hide = false;
            });
        }
        if (hide) {
            msgContainerNode.style.display = "none";
        }
        else {
            msgContainerNode.insert({'top': ul});
            msgContainerNode.style.display = "block";

            // display the pop-over form
            var popoverElement = msgContainerNode.up("div.popup");
            if (popoverElement) {
                bb.overlay.launchPopover({content: popoverElement, headlineSelectors: ["h5"]});
            }
        }
        bb.page.initOverlayLinks();
        //generic.overlay.initLinks();
    }
};

bb.page.displayErrors = function() {
    if (bb.page.errors) {
        var msgContainer = $$(".error_messages")[0];
        if (msgContainer) {
            var hide = true;
            var ul = msgContainer.down('ul');
            bb.page.errors.pageErrors.each(function(err){
                ul.insert({bottom: '<li class="' + err.TYPE + '">' + err.MESSAGE + '</li>'});
                hide = false;
            });
            if (hide) {
                msgContainer.style.display = "none";
            }
            else {
                msgContainer.style.display = "block";
                if (bb.page.submittedFormName && bb.page.submittedFormName.length && bb.page.submittedFormName.length > 0) {
                    var formElement = $$("#" + bb.page.submittedFormName)[0];
                    if (formElement) {
                        var errorsContainer = formElement.select("#errors-container")[0];
                        if (errorsContainer) {
                            errorsContainer.insert({'bottom': msgContainer});
                        }
                        else {
                            formElement.insert({'top': msgContainer});
                        }

                        // display the pop-over form
                        var popoverElement = formElement.up("div.popup");
                        if (popoverElement) {
                            bb.overlay.launchPopover({content: popoverElement});
                        }
                    }
                }
            }
        }
    }
};

bb.sIFR = {};
bb.sIFR.replaceAll = function() {
// this function is a no-op for Bobbi JP
};

bb.page.overlayLinks = bb.page.overlayLinks || {};
bb.page.initOverlayLinks = function() {
    var linksToModify = $$("a.overlay-link");
    linksToModify.each( function(link){
        if (link.hasClassName("overlay-ready")) { return; }

        var styleObj = {};
        var widthRegexResults = link.className.match(/overlay-width-(\d+)/);
        if (widthRegexResults) {
            styleObj.width = widthRegexResults[1] + "px";
        }
        var heightRegexResults = link.className.match(/overlay-height-(\d+)/);
        if (heightRegexResults) {
            styleObj.height = heightRegexResults[1] + "px";
        }

        var containerDiv = new Element("div", {"class":"popup fixed-size-overlay"} );
        styleObj.display = "none";
        containerDiv.setStyle(styleObj);
        document.body.appendChild(containerDiv);
        bb.page.overlayLinks[link] = containerDiv;

        var insertCloseLink = function(containerEle) {
            //if this is the artist pop up, avoid inserting close link and add class to container div
            if (link.hasClassName("artist")) {
                containerDiv.addClassName('overlay-artist');
                var closeLink = $$('.cms_layer .close-sm')[0];
            }
            else {
                var closeLink = new Element("a", {"class": "close"});
                var closeLinkText = generic.rb.language.get('close');
                closeLink.insert(closeLinkText);
                var closeDiv = new Element("div", {"class": "holder"});
                closeDiv.insert(closeLink);
                containerEle.insert({"top": closeDiv});
            }

            closeLink.observe("click", function (closeClickEvt) {
                bb.overlay.hide();
                closeClickEvt.preventDefault();
            })
        };

        var req = new Ajax.Request(link.href, {
            method:'get',
            onSuccess: function(transport) {
                var response = transport.responseText || "no response text";
                containerDiv.update(response);
                insertCloseLink(containerDiv);
            },
            onFailure: function(){
                var errMsg = "Error loading " + link.href
                containerDiv.update(errMsg);
                insertCloseLink(containerDiv);
            }
        });
        
        link.observe("click", function(clickEvt) {
            clickEvt.preventDefault();
            bb.overlay.launchPopover({content: containerDiv});
        });
        link.addClassName("overlay-ready");
    });
};
generic.overlay.initLinks = function() {
    bb.page.initOverlayLinks();
}
generic.overlay.hide = function() {
    bb.overlay.hide();
}

// TO DO: use resource bundle gnav_header
bb.user = {};
bb.user.initGnav = function() {
    var headerEle = $('header');
	if (headerEle) /* 56703 30 July 2010 Product Checkout Print page error fixed*/
	{
		var utilityLinksContainerNode = headerEle.select("ul.utilitynav")[0];
	}

    if (headerEle && utilityLinksContainerNode) {
        if (generic.user.recognized_user && generic.user.registered_user) {
            utilityLinksContainerNode.insert({top: '<li><a href="/account/index.tmpl">会員情報</a></li>'});
            utilityLinksContainerNode.insert({top: '<li class="spacer"><img src="/images/icons/spacer.gif"></li>'});
            utilityLinksContainerNode.insert({top: '<li><strong>#{fullName}</strong> | <a id="signout-link" href="/account/signin.tmpl?_SUBMIT=signout">ログアウト</a></li>'.interpolate(generic.user)});
        }
        else {
            utilityLinksContainerNode.insert({top: '<li><a id-"signin-link" href="/account/signin.tmpl" manual_cm_sp="Gnav-_-SignIn-_-Main">ログイン/会員情報</a></li>'});
        }

        // sign-in popup
    }
};

/* add page events */
document.observe("dom:loaded", function() {
    bb.page.initSubnav();
    bb.page.initPromoLinks();
    bb.page.initGnav();
	bb.page.initEmailSignup();
    bb.page.replaceSelects();
    bb.page.initOverlayLinks();

    // setup user
    var userParams = {};
    userParams.pageDataKey = "nav-header.user";
    generic.user.getUser(userParams);
    bb.user.initGnav();

    // setup cart
    var cartParams = {};
    cartParams.pageDataKey = 'nav-header.cart';
    generic.checkout.cart.getCart(cartParams);
    if (bb.productView && bb.productView.cartOverlay) {
        bb.productView.cartOverlay.init();
    }

});

/* video page events */
bb.getQueryStringValue = function(keyToFind) {
    var returnVal = '';
    var queryString = window.location.search;
    if (queryString.length > 4) {
        var allPairs = queryString.substring(1, queryString.length);
        var keyValuePairStrings = allPairs.split("&");
        var keyValuePairs = {};
        keyValuePairStrings.each( function(pairString) {
            var pair = pairString.split("=");
            keyValuePairs[unescape(pair[0])] = unescape(pair[1]);
        });
        returnVal = keyValuePairs[keyToFind] || '';
    }
    return returnVal;
};

bb.goToURL = function (url) {
     if (url !== null && url !== '') {
         self.location.href = url;
     }
};
