/* AUTO-GENERATED FILE - DO NOT EDIT.
@title:  browseApplicationFunctionsOptimized.js
@date: auto-generated
@author: Byung Kim
@desc: File is auto-generated from multiple source files to 
optimize browser and client / server request performance.
*/

/** Browse Base Module **/

var applicationOnLoadFunctions = function() {
    // setSideNavHeight();
    quickLook.initializeQuickLook();
};

var applicationOnUnLoadFunctions = function() {
    if(window['quickLook'] && quickLook.closeRelatedWindows) { quickLook.closeRelatedWindows(); }
}

Event.observe(window,'load', applicationOnLoadFunctions);
Event.observe(window,'beforeunload', applicationOnUnLoadFunctions);


/** Browse Quicklook Module **/
var quickLook = {
    productFunctionPath: '/gid/js/common/layouts/en/productFunctions.js',
    QuickLookBtnAdj: {'1':0,'2':0,'3':0,'4':0,'10':0,'7':0,'8':0,'9':0,'20':0,'21':0},
    QuickLookLauncherMap : {
	   objQuickLook : 'quickLookWindow',
	   objQuickLookLauncher : "quickLookLauncher"},
	initializeQuickLook : function() {
		gidLib.loadDomObjMap(this, this.QuickLookLauncherMap);
		if (window["objSBS"] && objSBS.isFilterEngaged) this.isFromSBS = true;
        this.isLoaded = true;
        this.launcherHalfWidth = this.objQuickLookLauncher.width / 2;
        this.launcherHalfHeight = this.objQuickLookLauncher.height / 2;
	},
    setUserSizeSelections : function(strSizeCategoryDimension,strSizeSelections) {
		if (!this.objUserSizeSelections) this.objUserSizeSelections = {};
		var objUserSelections = this.objUserSizeSelections;
		if (!objUserSelections.arraySizeCategories) objUserSelections.arraySizeCategories = [];
		with(objUserSelections) {
			var arraySizeSelections = strSizeSelections.split("||");
			var arraySizeValues = arraySizeSelections[0].split("^,^");
			arraySizeCategories[strSizeCategoryDimension] = {strSizeDimensionValueId: arraySizeValues[0], strSizeDimensionAlphaSize: arraySizeValues[1]};
		}
	},
    loadQuickLookCallback: function(obj,periodicalExecuterRef) {
        if(!quickLook.initializeData) return false;
        objGIDPageViewAdapter.initializeGidProducts();
        periodicalExecuterRef.stop();
        quickLook.isLoaded = true;
        if(quickLook.relaunchQuickLook) { quickLook.relaunchQuickLook = false; quickLook.launchQuickLook(); }
        return true;
    },
    isQuickLookOpen : false,
    initializing: false,
    loadQuickLookModule: function(brandCode) {
        if(quickLook.initializing) return;
        quickLook.initializing = true;
        gidLib.loadScript({
            callerObject:this, src:this.productFunctionPath,
            timeout:{
                handler:function() {return true; },
                args:null,
                timeDelay:2
            },
            callback:{
                handler:this.loadQuickLookCallback,
                args:this,
                timeDelay:1
            }
        });
    },
    launchQuickLook: function() { this.relaunchQuickLook = true; },
	openQuickLookLauncher : function(strProductId,strDefaultStyleColor,strCategoryId,strVariantId,targetImg, isCrossSell, brandCode, customProperties) {
		if (this.isLoaded) {
			var blnOpen = false;
			if (this.isQuickLookOpen) {
				if (this.objP.strProductId != strProductId) blnOpen = true;
			} else {
				blnOpen = true;
			}
            brandCode = brandCode||gidBrandSiteConstruct.currentBrandCode;

            var constants = customProperties || brandProperties;

            if (blnOpen) {
				var targetObj = $(targetImg);
                if(!targetObj) return;
                var cumulativeOffset = Position.cumulativeOffset(targetObj);
                var realOffset =  Position.realOffset(targetObj);
                var scrollTop = (document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
                var scrollLeft = (document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
                var position = [cumulativeOffset[0]-(realOffset[0]-scrollLeft),cumulativeOffset[1]-(realOffset[1]-scrollTop)];
                /* targetImgCount is required to test strDefaultStyleColor the imageLoader.categoryProductsMap
                 * is constructed differently based on whether the item is STYLECOLOR or not in the JSP */
                var targetImgCount = targetImg.split("_");
				var isStyleColor = ( targetImgCount.length == 3 );
                var imgLoaderObjRef = strCategoryId + "_" + (isStyleColor ? strProductId : strDefaultStyleColor) + "_" + strDefaultStyleColor;
                if(!isCrossSell  && imageLoader.categoryProductsMap[imgLoaderObjRef]){
	                var selectedStyleID = imageLoader.categoryProductsMap[imgLoaderObjRef].selectedScid;
	                strDefaultStyleColor = selectedStyleID;
                }
                var target = this.objQuickLookTarget = {
					strProductId : strProductId,
					strDefaultStyleColor : strDefaultStyleColor,
					strCategoryId : strCategoryId,
					strVariantId : strVariantId,
					position : position,
					isCrossSell: isCrossSell,
					obj : targetObj,
                    brandCode: brandCode
                };

                var targetWidth = target.obj.width;
                var targetHeight = target.obj.height;
                this.quickLookLauncherBoundBox = {top:target.position[1],left:target.position[0],right:target.position[0] + targetWidth, btm:target.position[1] + targetHeight};
                this.objQuickLookLauncher.setStyle({left: (target.position[0] + (targetWidth * 0.5) - this.launcherHalfWidth) + 'px',
					top: (target.position[1] + (targetHeight * 0.8 - this.launcherHalfHeight)) + 'px', visibility: 'visible'});

                if(!quickLook.initializeData) {
                    this.loadQuickLookModule(brandCode);
                }
            }
		}
	},
    logTeaLeafEvent: function(itemSource, eventType) {
        var tlevt = new TeaLeaf.Event("GUI", eventType);

        var tlAddNameValueArray = ["Name", itemSource.name,
                                     "Id", itemSource.id,
                                     "ElementType", itemSource.type,
                                     "TagName", itemSource.tagName,
                                     "XPath", TeaLeaf.Client.tlGetXPathFromNode(itemSource)];
        tlevt.tlAddData(tlAddNameValueArray);
        tlevt.tlSend();
    },

	closeQuickLookLauncher : function(e) {
		if(e && this.quickLookLauncherBoundBox && !gidLib.isMouseOut(Event.pointerX(e), Event.pointerY(e), this.quickLookLauncherBoundBox)) {
			return;
		}
		if(this.isLoaded && this.objQuickLookTarget) {
			this.objQuickLookLauncher.style.visibility = 'hidden';
			this.objQuickLookLauncher.src = '/gid/assets/common/quicklook/'+brandConst.BRAND_LOCALE+'/button_quicklook_launcher_on.gif';
			this.objQuickLookTarget.strProductId = 0;
		}
	}
};	

/** Browse Search Refinements Module **/
/* Search Refinements */

function Search(
	strRefinementGroups,
	strSelectedRefinements,
	strAbstractRefinementGroupKeys,
	strAbstractSelectedRefinementKeys) {

	this.strRefinementGroups = strRefinementGroups;
	this.strSelectedRefinements = strSelectedRefinements;
	this.strAbstractRefinementGroupKeys = strAbstractRefinementGroupKeys;
	this.strAbstractSelectedRefinementKeys = strAbstractSelectedRefinementKeys;
	this.arrayRefinementGroups = new Array();
	this.arraySelectedRefinements = new Array();
	this.arrayAbstractRefinementGroupKeys = new  Array();
	this.arrayAbstractSelectedRefinementKeys = new Array();
	this.isSearchActive = false;

	this.RefinementGroup = function() {
		this.arrayRefinements = new Array();
	}
	
	this.Refinement = function(
		type,
		name,
		displayValue,
		value,
		productCount) {
		
		this.type = type;
		this.name = name;
		this.displayValue = displayValue;
		this.value = value;
		this.productCount = productCount;
	}
	
	this.submitRefinement = function(objDropdown) {
		var strRefinementGroupKey = objDropdown.name;
		var intRefinementCount = objDropdown.selectedIndex -1;
		
		objRefinement = objSearch.arrayRefinementGroups[strRefinementGroupKey].arrayRefinements[intRefinementCount];
		
		/*
		alert("strRefinementGroupKey = " + strRefinementGroupKey + 
			"\r\nintRefinementCount = " + intRefinementCount +
			"\r\nobjRefinement.type = " + objRefinement.type + 
			"\r\nobjRefinement.name = " + objRefinement.name + 
			"\r\nobjRefinement.value = " + objRefinement.value);
		*/
		/**
 		* Modified:  Keo 07/28/08 - Added wrapper for G to H 
 		*/
		if(!(reportingService||{}).isActive){
			omni.objSearchProcessor.setRefinement(objRefinement,true);
		} else {
			reportingService.controller.appManagers.searchAppManager.setRefinement(objRefinement,true);
		}
		
		objSearch.setSearchSelectionFormValues(
			objRefinement.type,
			objRefinement.name,
			objRefinement.value,
			"refine");	
	}
	
	this.submitRefinementLink = function(objLink, intRefinementCount, strRefinementGroupKey) {
		
		objRefinement = objSearch.arrayRefinementGroups[strRefinementGroupKey].arrayRefinements[intRefinementCount];
		
		/*
		alert("strRefinementGroupKey = " + strRefinementGroupKey + 
			"\r\nintRefinementCount = " + intRefinementCount +
			"\r\nobjRefinement.type = " + objRefinement.type + 
			"\r\nobjRefinement.name = " + objRefinement.name + 
			"\r\nobjRefinement.value = " + objRefinement.value);
		*/
				/**
 		* Modified:  Keo 07/28/08 - Added wrapper for G to H 
 		*/
		if(!(reportingService||{}).isActive){
			omni.objSearchProcessor.setRefinement(objRefinement,true);	
		}else {
			reportingService.controller.appManagers.searchAppManager.setRefinement(objRefinement,true);
		}
		return true;
		
	}
	
	this.submitUnRefinement = function(objDropdown) {
		var strSelectedRefinementKey = objDropdown.name;
		
		objSelectedRefinement = objSearch.arraySelectedRefinements[strSelectedRefinementKey];
		/**
 		* Modified:  Keo 07/28/08 - Added wrapper for G to H 
 		*/
		if(!(reportingService||{}).isActive){
			omni.objSearchProcessor.setRefinement(objSelectedRefinement,false);
		} else {
			reportingService.controller.appManagers.searchAppManager.setRefinement(objSelectedRefinement,false);
		}
		objSearch.setSearchSelectionFormValues(
			objSelectedRefinement.type,
			objSelectedRefinement.name,
			objSelectedRefinement.value,
			"unrefine");
	}
	
	this.submitUnRefinementLink = function(strSelectedRefinementKey) {
		objSelectedRefinement = objSearch.arraySelectedRefinements[strSelectedRefinementKey];		
		/*
		alert("strSelectedRefinementKey = " + strSelectedRefinementKey + 
			"\r\nobjSelectedRefinement.type = " + objSelectedRefinement.type + 
			"\r\nobjSelectedRefinement.name = " + objSelectedRefinement.name + 
			"\r\nobjSelectedRefinement.value = " + objSelectedRefinement.value);
		*/
		/**
 		* Modified:  Keo 07/28/08 - Added wrapper for G to H 
 		*/
		if(!(reportingService||{}).isActive){
			omni.objSearchProcessor.setRefinement(objSelectedRefinement,false);
		}else {
			reportingService.controller.appManagers.searchAppManager.setRefinement(objSelectedRefinement,false);
		}
		return true;
	}
	
	this.setSubmitForm = function() {
		if (!objSearch.objSubmitForm) {
			objSearch.objSubmitForm = document.forms.searchSelectionForm;
		}
	}
	
	this.setSearchSelectionFormValues = function (
		strType,
		strName,
		strValue,
		strRefinementMode) {
		
		objSearch.setSubmitForm();
		
		objSearch.objSubmitForm.searchFilter.value = strType;
		objSearch.objSubmitForm.searchFilterName.value = strName;
		objSearch.objSubmitForm.searchFilterValue.value = strValue;
		objSearch.objSubmitForm.searchRefinementMode.value = strRefinementMode;
		objSearch.objSubmitForm.searchContextPath.value = objSearch.strSearchContextPath;
		if (objSearch.sortBy) {
			objSearch.objSubmitForm.sortBy.value = objSearch.sortBy;
		}

		objSearch.setSearchViewFormValues(objSearch);
		
		/*
		alert("objSearch.objSubmitForm.searchFilter.value = " + objSearch.objSubmitForm.searchFilter.value +
		"\r\nobjSearch.objSubmitForm.searchFilterName.value = " + objSearch.objSubmitForm.searchFilterName.value +
		"\r\nobjSearch.objSubmitForm.searchFilterValue.value = " + objSearch.objSubmitForm.searchFilterValue.value +
		"\r\nobjSearch.objSubmitForm.searchRefinementMode.value = " + objSearch.objSubmitForm.searchRefinementMode.value +
		"\r\nobjSearch.objSubmitForm.searchContextPath.value = " + objSearch.objSubmitForm.searchContextPath.value +
		"\r\nobjSearch.objSubmitForm.cid.value = " + objSearch.objSubmitForm.cid.value);
		*/
		
		objSearch.objSubmitForm.submit();
	
	}
	
	this.processAbstractRefinementGroupKeys = function() {
		if (objSearch.strAbstractRefinementGroupKeys) {
			objSearch.arrayAbstractRefinementGroupKeys = objSearch.strAbstractRefinementGroupKeys.split("^,^");
		}
	}

	this.processAbstractSelectedRefinementKeys = function() {
		if (objSearch.strAbstractSelectedRefinementKeys) {
			objSearch.arrayAbstractSelectedRefinementKeys = objSearch.strAbstractSelectedRefinementKeys.split("^,^");
		}
	}
	
	this.processRefinementGroups = function() {
		if (objSearch.strRefinementGroups) {
			var arrayRefinementGroups = objSearch.strRefinementGroups.split("^^^^");
			for (var intGroupCounter=0;intGroupCounter < arrayRefinementGroups.length;intGroupCounter++) {
				var strRefinementGroup = arrayRefinementGroups[intGroupCounter];
				var arrayRefinementGroup = strRefinementGroup.split("||");
				var strRefinementGroupKey = objSearch.arrayAbstractRefinementGroupKeys[intGroupCounter];
				objSearch.arrayRefinementGroups[strRefinementGroupKey] = new objSearch.RefinementGroup();
				
				for (var refinementCounter = 0; refinementCounter < arrayRefinementGroup.length; refinementCounter++) {
					var strRefinement = arrayRefinementGroup[refinementCounter];
					var arrayRefinement = strRefinement.split("^,^");
					var objRefinement = new this.Refinement();
					objRefinement.type = arrayRefinement[0];
					objRefinement.name = arrayRefinement[1];
					objRefinement.displayValue = arrayRefinement[2];
					objRefinement.value = arrayRefinement[3];
					objRefinement.productCount = arrayRefinement[4];
					objRefinement.refinementCount = eval(arrayRefinement[5] - 1);
					objSearch.arrayRefinementGroups[strRefinementGroupKey].arrayRefinements[objRefinement.refinementCount] = objRefinement;
				}
			}
		}
	}
	
	this.processSelectedRefinements = function() {
		if (objSearch.strSelectedRefinements) {
			var arraySelectedRefinements = objSearch.strSelectedRefinements.split("||");		
			
			for (var intSelectedRefinementCounter=0;intSelectedRefinementCounter < arraySelectedRefinements.length;intSelectedRefinementCounter++) {
				var strSelectedRefinementKey = objSearch.arrayAbstractSelectedRefinementKeys[intSelectedRefinementCounter];
				var strSelectedRefinement = arraySelectedRefinements[intSelectedRefinementCounter];
				var arraySelectedRefinement = strSelectedRefinement.split("^,^");
				var objSelectedRefinement = new objSearch.Refinement();
				objSelectedRefinement.type = arraySelectedRefinement[0];
				objSelectedRefinement.name = arraySelectedRefinement[1];
				//objSelectedRefinement.displayValue is not required
				objSelectedRefinement.value = arraySelectedRefinement[2];
				objSearch.arraySelectedRefinements[strSelectedRefinementKey] = objSelectedRefinement;
			}
		}	
	}
	
	this.setIsSortBySelectedCookie = function(bool) {
		/**
 		* Modified:  Keo 07/28/08 - Added wrapper for G to H 
 		*/
		if(!(reportingService||{}).isActive){
			omni.objSearchProcessor.setIsSortBySelectedCookie(bool);
		}else {
			reportingService.controller.appManagers.searchAppManager.setIsSortBySelectedCookie(bool);
		}
	}
}


function setCategorySort(objFormField) {
	// 1) Set both inputs to the same value.
	var intCurrentSortSelectedIndex = objFormField.selectedIndex;
	var filterToolsForm = document.getElementById("filterTools");
	filterToolsForm.sortBy.selectedIndex = intCurrentSortSelectedIndex;
	var strSortValue = objFormField.options[objFormField.selectedIndex].value;
	// 2) Test if user has made a valid selection against default value 0 and different than the current
	// Dylan: removed test against 0 because page should refresh when no sort is chosen
	if (objFormField.options && strSortValue != "-1" /*&& objSBS.objSmartDropDowns.strSelectedSortByOption != strSortValue*/) {
		if (objSearch.isSearchActive) {
			objSearch.setIsSortBySelectedCookie(true);
		}
		var strURL = window.location.href;
		strURL = removeQueryStringParam(strURL,'sizDivReset');
		strURL = removeQueryStringParam(strURL,'pageID');
		strURL = removeQueryStringParam(strURL,'sortBy');
		strURL += "&sortBy=" + strSortValue;
		window.location.href = strURL;
	}

}

//Search.prototype.toString = GIDProduct.prototype.toString;
//Search.prototype.toStringParseConstructor = GIDProduct.prototype.toStringParseConstructor;

objSearch = new Search();
	

/** Browse Image Loader Module **/

var imageLoader = {
    productPerRow: 3,
    imgs:[],
    isSwatchesActive : true,
    categoryProductsMap : {},
    currentImg: 0,
	swatchWidth: brandProperties.PRODUCTIMAGE_SPRITE_SWATCH_WIDTH,
	swatchHeight: brandProperties.PRODUCTIMAGE_SPRITE_SWATCH_HEIGHT,
    swatchPadding: 5,
    swatchDisplayDimensions: 12,
    externalOverrides : {
        imageServiceEnabled: true,
        swatchImageLoadEnabled : true
    },
    loadedGroups: {count: 0, lastLoaded: 0},
    browserDim: [(window.innerWidth || document.documentElement.clientWidth), (window.innerHeight || document.documentElement.clientHeight)],
    
    imageServiceURI : new Template("#{host}/image/productImage.do?imageType=categorySwatch&imageBrand=#{brand}&imagePid=#{pid}&imageScid=#{scid}&imageScidList=#{scidList}&imageVersion=swatch.#{swVersions}-quicklook.#{qlVersions}"),
    productImagePattern : new RegExp(/\/Asset_Archive\/.{2}Web\/Assets\/Product\/\d{3}\/\d{6}\//),
    imgVersionRegExp : new RegExp(/\d{2}(?=\.)/),
    
    delayLoad: function(loaderElement, args) {
    	// legacy support pre swatches display
    	// TODO: remove this once swatches is live
    	if (typeof args == "string") {
            this.imgs[this.currentImg] = {img:loaderElement, src: args};
            this.isSwatchesActive = false;
        // swatches support
    	} else {
    		this.setSwatchesImageData(loaderElement, args);
    	}

    	this.currentImg = this.currentImg + 1;
    },
    
    setSwatchesImageData : function(loaderElement, args) {
		// check the integrity of the image paths received
		var hasInvalidImagePath = false;
		var productImagePattern = this.productImagePattern;
		if (args.swImages && args.qlImages) (Object.values(args.swImages).concat(Object.values(args.qlImages))).each(function(img){
			if (productImagePattern.test(img) == false) hasInvalidImagePath = true;
		});
		
		var productInfo = {
        	img: loaderElement,
        	isSwatches : true,
        	args : args,
        	selectedScid: args.scid,
        	hasInvalidImagePath:hasInvalidImagePath
        };
        this.imgs[this.currentImg] = productInfo;
        this.categoryProductsMap[args.cid + "_" + (args.isStyleColor ? args.scid : args.pid) + "_" + args.scid] = productInfo; 

        loaderElement.onload = null;
    },
    
    setSwatchImageEventHandlers : function(swatchImgNode,args,swatchId,img) {
		// Swatch events
        Event.observe(swatchImgNode, "mouseover",
        		browseSwatches.controller.handlers.swatchOnMouseOverHandler.bindAsEventListener(browseSwatches.controller.handlers,args,swatchId,img));
        Event.observe(swatchImgNode, "mouseout", 
        		browseSwatches.controller.handlers.swatchOnMouseOutHandler.bindAsEventListener(browseSwatches.controller.handlers,args,swatchId,img));
        Event.observe(swatchImgNode, "click", 
        		browseSwatches.controller.handlers.swatchOnClickHandler.bindAsEventListener(browseSwatches.controller.handlers,args,swatchId,img));
    },
    
	setMarketingFlag: function(img) {
    	var args = img.args;
    	var cid = args.cid;
    	var pid = args.pid;
    	var scid = args.scid;  
		var id = pid;

		if (args.isStyleColor) {
			id = args.scid;
		}
		var styleColorNode = $("styleColorMarketingFlag_" + cid + "_" +  id  + "_" + scid);
		var styleNode =$("styleMarketingFlag_" +  id  + "_" + cid);
		var marketingFlagsNode = $("marketingFlagContainer_" + id + "_" + cid);
		
		if (styleColorNode) {
			styleColorNode.addClassName("productColorMarketingFlagSelected");
		} else if (styleNode) {
			styleNode.addClassName("productColorMarketingFlagSelected");
		}
				
		if (marketingFlagsNode && marketingFlagsNode.childElements().any() && !(marketingFlagsNode.hasClassName("marketingFlagContainer"))) 
			marketingFlagsNode.addClassName("marketingFlagContainer");
		if(marketingFlagsNode && !marketingFlagsNode.childElements().any())
			marketingFlagsNode.remove();
    },
    loadSwatchImgsHelper : function(img,imageServiceURL) {
    	var args = img.args;
    	var cid = args.cid;
    	var pid = args.pid;
    	var scid = args.scid;
    	var swatchIterator = function(swatchId,i) {
        	var swatchImgNode = $("swatchImg_" + cid + "_" + (args.isStyleColor ? scid : pid) + "_" + swatchId);
        	if (swatchImgNode) {
        		var swatchesPerColumn = Math.floor(brandProperties.QUICKLOOKIMGHEIGHT/(imageLoader.swatchHeight + imageLoader.swatchPadding));
        		if (imageLoader.externalOverrides.imageServiceEnabled == true && img.hasInvalidImagePath == false) {
                	var x = (brandProperties.QUICKLOOKIMGWIDTH + imageLoader.swatchPadding) + (Math.floor(i/swatchesPerColumn))*(imageLoader.swatchWidth + imageLoader.swatchPadding) + ((imageLoader.swatchWidth - imageLoader.swatchDisplayDimensions)/2);
                	var y = (i % swatchesPerColumn)*(imageLoader.swatchHeight + imageLoader.swatchPadding) + ((imageLoader.swatchHeight - imageLoader.swatchDisplayDimensions)/2);
                	swatchImgNode.setStyle({
                		backgroundImage : 'url("' + imageServiceURL + '")',
                		backgroundRepeat : 'no-repeat',
                		backgroundPosition : '-' + x + 'px -' + y + 'px'
                	});
        		} else {
        			var imgSrc = args.swImages[swatchId];
        			if (imgSrc) swatchImgNode.src = imgSrc;
        		}
        		
        		this.setSwatchImageEventHandlers(swatchImgNode,args,swatchId,img);
        	}
    	};
    	
    	args.scidList.split(",").each(swatchIterator.bind(this));
    },
    
    getStyleIdFromImagePath : function(imgPath) {
    	var styleId = null;
    	var matchResult = imgPath.match(/\d{6}/);
    	if (matchResult && matchResult[0]) styleId = matchResult[0];
    	return styleId;
    },
    
    getStyleColorIdFromImagePath : function(imgPath) {
    	var styleColorId = "";
    	var styleColorMatchResult = imgPath.match(/\d{6}-\d{2}/);
    	if (styleColorMatchResult && styleColorMatchResult[0]) {
    		styleColorId = styleColorMatchResult[0].replace(/-/,"");
    		styleColorId = styleColorId + "0"; // stylecolorid is 9 digits.  we only get 8 digits from the image path.
    	}
    	return styleColorId;
    },
    
    getStyleColorIdList : function(args) {
    	var colorList = [];
    	var scidList = args.scidList.split(","); 
    	scidList.each((function(scid){
    		var path = args.swImages[scid];
    		if (path.indexOf(args.pid) == -1) {
    			var styleColorId = this.getStyleColorIdFromImagePath(path);
    	    	var styleId = "";
    	        var styleMatchResult = path.match(/\d{6}(?=\/)/);
    	    	if (styleMatchResult && styleMatchResult[0]) {
    	    		styleId = styleMatchResult[0];
    	    	}
        		colorList.push(styleColorId + "-" + styleId);
    		} else {
    			colorList.push(scid + "-" + args.pid);
    		}
    	}).bind(this));
    	return colorList.join(",");
    },
    
    getImageServiceUri : function(img) {
    	var swVersions = [];
    	var qlVersions = [];
    	var imgPid = img.args.pid;
    	var imgScid = img.args.scid;
    	var hasMergedStyleImages = false;
    	
    	// check to see if the default style color is a merged style image
    	var defaultStyleColorImagePath = img.args.swImages[img.args.scid];
    	if (defaultStyleColorImagePath && defaultStyleColorImagePath.indexOf(img.args.pid) == -1) {
    		hasMergedStyleImages = true;
    		imgPid = this.getStyleIdFromImagePath(defaultStyleColorImagePath);
    		imgScid = this.getStyleColorIdFromImagePath(defaultStyleColorImagePath);
    	}
    	
    	Object.values(img.args.swImages).each((function(url){
    		var version = url.match(this.imgVersionRegExp);
    		if (url.indexOf(img.args.pid) == -1) hasMergedStyleImages = true;
    		swVersions.push((version ? version[0] : "01"));
    	}).bind(this));

    	Object.values(img.args.qlImages).each((function(url){
    		var version = url.match(this.imgVersionRegExp);
    		if (url.indexOf(img.args.pid) == -1) hasMergedStyleImages = true;
    		qlVersions.push((version ? version[0] : "01"));
    	}).bind(this));
    	
    	var imgScidList = this.getStyleColorIdList(img.args);
    	
    	var imageServiceHost = "";
    	if (window["gidBrandSiteConstruct"] && gidBrandSiteConstruct.gidBrandSites[img.args.brand]) {
    		if (gidBrandSiteConstruct.gidBrandSites[img.args.brand].imageServiceUrl) {
        		imageServiceHost = gidBrandSiteConstruct.gidBrandSites[img.args.brand].imageServiceUrl;
    		}
    	}

    	var imageServiceURL = this.imageServiceURI.evaluate({
        	host : imageServiceHost,
        	pid : imgPid,
        	scid : imgScid,
        	brand : img.args.brand,
        	scidList : imgScidList,
        	swVersions : swVersions.join(","),
        	qlVersions : qlVersions.join(",")
        });
    	
    	// account for SEM when we are on the unique domains
    	if (window["gidBrandSiteConstruct"] && gidBrandSiteConstruct.renderOnCurrentBrandUrl == true) {
    		imageServiceURL += "&sem=true";
    	}
    	
    	return imageServiceURL;
    },
    
    loadImgs: function(group) {
        if(this.loadedGroups[group]) return;
        var count = 1;
        var i =  this.groupSize * group;
        i = this.shouldFlipImgArray ? (this.imgs.length - 1) - i : i;
        var offset = this.shouldFlipImgArray ? -1 : 1;
        var done = false;
        var img = this.imgs[i];
        var productsToLoadSwatches = [];
        var swatchesEnabled = false;

        while(img && !done) {
            img.img.onload = null;

            if (img.isSwatches == true) {
            	swatchesEnabled = true;
            	
            	if(this.externalOverrides.imageServiceEnabled == true && img.hasInvalidImagePath == false) {
            		var imageServiceURL = this.getImageServiceUri(img);
                	
                	var imageContainerNode = $("categoryProductItemImageContainer_" + (img.args.isStyleColor ? img.args.scid : img.args.pid) + "_" + img.args.cid);
                	if (imageContainerNode) imageContainerNode.setStyle({
                		backgroundImage: 'url("' + imageServiceURL + '")',
                		backgroundRepeat: 'no-repeat',
                		backgroundPosition: brandProperties.PRODUCTIMAGE_SPRITE_MAIN_IMAGE_POSITION,
                		height: brandProperties.PRODUCTIMAGE_SPRITE_MAIN_IMAGE_HEIGHT
                	});

            	} else {
            		var imgSrc = img.args.qlImages[img.args.scid];
            		if (imgSrc) $(img.img).src = imgSrc; 
            	}
            	
            	// queue swatch loader for this product
            	productsToLoadSwatches.push({data:img,url:imageServiceURL});
            	
            // TODO: remove this once swatches is live 6.60
            } else {
                var regexp1 = new RegExp("category");
                var regexp2 = new RegExp("viv");
                var regexp3 = new RegExp("Outfit");

                if (regexp3.test(img.src) == false) {
                    img.img.src = img.src.replace(regexp1,"quick").replace(regexp2,"qlv");
                } else {
                	img.img.src = img.src.replace(regexp2,"dv");
                }
            }

            done = (count == this.groupSize);
            i = i+offset;
            count = count + 1;
            img = this.imgs[i];
        }
        
        // Load swatches after the main images have been loaded
		productsToLoadSwatches.each((function(product){
			if (swatchesEnabled && imageLoader.externalOverrides.swatchImageLoadEnabled == true) {
				 this.loadSwatchImgsHelper(product.data,product.url);
			}
			this.setMarketingFlag(product.data);
		}).bind(this));
    	
        this.loadedGroups[group] = true;
        this.loadedGroups.count = this.loadedGroups.count + 1;
        this.loadedGroups.lastLoaded = group;
    },
    getRowNumber: function(height) {
        height = height < 0 ? 0 : (height > this.maxH ? this.maxH : height);
        return Math.floor(height * this.rowsHeightInverse);
    },
    fetch: function() {
        this.isDone = this.groupCount == this.loadedGroups.count;
        if(this.imgs.length == 0) return;
        if(this.isDone) { Event.stopObserving(window, 'scroll', this.scrollHandler); }
        var group = this.getRowNumber( (window.pageYOffset || document.documentElement.scrollTop) - this.minH);
        this.loadImgs(group);
        if(group > 0)
            this.loadImgs(group-1);
        if(group < this.groupCount - 1)
            this.loadImgs(group+1);
    },
    init: function() {
        var productGrid = this.productGrid = $('tabTable')||$('tabTableOff')||$('searchProductIteration')||$$('div[class="categoryContent"]')[0];
        if(!productGrid) return;
        this.productList = $('mainContent').select('div[class~="productCatItem"]');
        
        // TEMPORARY FOR CATALOG1 SUPPORT.  TO DO: Remove in 6.30
        if (this.productList.length == 0) this.productList = $('mainContent').select('div[class~="productItem"]');
        
        if(this.productList.length == 0) return;

        this.firstProductImg = Selector.findChildElements(this.productList[0], ['img']);

        this.shouldFlipImgArray = this.firstProductImg[0].id == this.imgs[this.imgs.length - 1].img.id;
        this.productDim = this.productList[0].getDimensions();

        this.productViewportRowCount = this.browserDim[1] / this.productDim.height;
        this.groupSize = Math.ceil(this.productViewportRowCount * this.productPerRow);

        this.groupCount = Math.ceil(this.productList.size() / this.groupSize);
        this.productGridDim = productGrid.getDimensions();
        this.productRowCount = Math.floor(this.productGridDim.height / this.productDim.height);
        this.rowSize = this.productRowCount / this.groupCount;

        this.rowsHeight = this.productDim.height * this.rowSize;
        this.rowsHeightInverse = 1/this.rowsHeight;

        this.productGridOffset = Position.cumulativeOffset(productGrid);
        this.minH = this.productGridOffset[1];
        this.maxH = this.minH + this.productGridDim.height - this.rowsHeight;

        this.scrollHandler = imageLoader.fetch.bind(imageLoader);

        Event.observe(window, 'scroll', this.scrollHandler);
        this.fetch();
        
    }
};



Event.observe(window, 'load', imageLoader.init.bind(imageLoader));
	

/** Browse Cross Links Module **/
var crossLink = {
    wct: '',
    data: null,
    brandData: {},
    screenWidthCutoff: 1024,
    screenWidth: screen.width,
    isHighRes: null,
    crossLinkPosition:{top:"-5000px",left:"0px"},
    quickLinksOpen: true,
    closeBoxTimer : null,
    mouseOutEvent : null,
	LINK: new Template('<a href="#{url}#{action}.do?cid=#{cid}&ssiteid=#{siteid}&fromCL=#{from}" onmouseover="crossLink.getLongName(event, #{code}, #{index});" onmouseout="crossLink.getShortName(event, #{code}, #{index});">{brandName}#{name}</a>'),
    LINK_PREVIEW: new Template('<a href="#{url}/preview/launch.do?date=#{date}&targetURL=#{url}#{action}.do?cid=#{cid}&ssiteid=#{siteid}&fromCL=#{from}"  onmouseover="crossLink.getLongName(event, #{code}, #{index});" onmouseout="crossLink.getShortName(event, #{code}, #{index});">{brandName}#{name}</a>'),
    CONTENT: new Template('<div id="#{brandCode}Links"></div><div id="#{brandCode}Greek" class="greek"><p>#{smallLinks}</p></div>'),
	LETTER_COUNT_MAX: 13,
	LETTER_COUNT_MAX_LowRes: 8,
    MODULE_CLOSED : new Template(
		'<div class="brandRow">' +
	        '<div class="logo"><img id="#{brandCode}Logo" src="#{assetPath}badgeSmall.gif" /></div>' +
	        '<div id="#{brandCode}Content" class="content">#{content}</div>' +
		'</div>'),
	init: function() {
    	this.buildPath();
        if(!this.wct || this.wct == '') return;
        if(!environmentModelValues.isCatalog2UniversalSiteActive || environmentModelValues.isCatalog2UniversalSiteActive == "false"){this.LETTER_COUNT_MAX = this.LETTER_COUNT_MAX_LowRes;}
        this.getScreenWidth();
        this.createDivs();
        this.brandConstruct = window['gidBrandSiteConstruct'].gidBrandSites.compact();
        this.currentBrandCode = gidBrandSiteConstruct.currentBrandCode;
		this.currentBrand = this.getConfirmBrand(this.currentBrandCode);
        this.brandAbbr = this.currentBrand.brandAbbr;
        this.mainContent = $('bodyContainer');
		this.mainContentDim = crossLink.mainContent.getDimensions();
        this.moduleBrands = $('crossLinkBrands');
        
		var paramSem = getQuerystringParam("sem");            
        var semParam = '';
        if(paramSem == 'true'){
          semParam =  "&sem=true";
        }
        
        if(window['objPreview']) {
            this.previewDate = objPreview.ppdDate.match(/\d\d\/\d\d\/\d\d\d\d/)[0];
        }

        for(var i=1; i<=this.brandConstruct.length; i++) {
			var loopBrandCode = this.brandConstruct[i-1].brandCode;
			if(loopBrandCode == this.currentBrandCode) continue;
			var brand = 'brand' + loopBrandCode;
			var brandContainer = brand + 'Container';
			this[brand] = $(brand);
			this[brandContainer] = $(brandContainer);
		    var args = {brandCode: loopBrandCode};
		    
		    gidLib.loadScript({
		    	callerObject:{},
		        src: this.getConfirmBrand(loopBrandCode).unsecureUrl + '/lynx/CrossLinkData?wct=' + this.wct + ((this.previewDate && this.previewDate != '') ? '&previewDate=' + this.previewDate : '' + semParam ),
				timeout:{
						handler:this.loadScriptTimeoutHandler,
						args:args,
						timeDelay:20
				},
				callback:{
						handler:this.renderBrandData,
						args:args,
						timeDelay:0.1
				}
			});
        }


        if(clientBrowser.isIE6) {
            Event.observe(window, 'scroll', crossLink.setPos);
        }
        Event.observe(window, 'resize', crossLink.setPos);
        this.isReady = true;
    },
	setPos : function() {
		if(!(crossLink.mainContent && crossLink.moduleDim)) return;
		crossLink.mainContentPos = Position.cumulativeOffset(crossLink.mainContent);
		var setLeftAdjust = (crossLink.quickLinksOpen)?124:28;
		var setTopAdjust = (crossLink.quickLinksOpen)?50:-10;
		if(crossLink.isHighRes){
			setLeftAdjust = 4;
			setTopAdjust = 0;
		}
		if(environmentModelValues.isCatalog2UniversalSiteActive == "false"){
			setLeftAdjust = 4;
		}
        var browserOffset = clientBrowser.isIE6 ? window.pageYOffset || document.documentElement.scrollTop: 0;
        var crossLinkPos = crossLink.modulePos = crossLink.modulePos = [((crossLink.mainContentDim.width + crossLink.mainContentPos[0])),
		    (window.innerHeight || document.documentElement.clientHeight) + browserOffset - crossLink.moduleDim.height];

        if(!crossLink.isShown) {
        	crossLink.module.setStyle({ opacity: '0'});
			crossLink.isShown = new Effect.Appear(crossLink.module.id, {duration: 1.0} );
		} 
        crossLink.module.setStyle({left: crossLinkPos[0]- setLeftAdjust + 'px', top: crossLinkPos[1] + setTopAdjust + 'px'});
        this.crossLinkPosition = {left: crossLinkPos[0]- setLeftAdjust, top: crossLinkPos[1]+ setTopAdjust};
    },
    /* This is needed because IE 7 throws the menu off the bottom of the page otherwise */
    setPosY: function() {
        var browserOffset = clientBrowser.isIE6 ? window.pageYOffset || document.documentElement.scrollTop: 0;
        var dim = crossLink.module.getDimensions();
        var ypos = (window.innerHeight || document.documentElement.clientHeight) + browserOffset - dim.height - 10;
        crossLink.module.setStyle({top: ypos + 'px'});
    },
    trimText: function(str) {
        str = gidLib.unUnicode(str);
        return str.length > crossLink.LETTER_COUNT_MAX ? str.substring(0,crossLink.LETTER_COUNT_MAX) + '...' : str;
    },
    getSmallLinks: function(str, obj) {
        return (str + crossLink.trimText(obj.catalogItemName) + '<br/>');
    },
    getBrands: function(code, data) {
		var brandCode = 'brand' + code;
        var trimText = crossLink.trimText;
        var smallLinks = '';

		if(data.length > 3) {
			smallLinks = trimText(data[0].catalogItemName) + '<br/>' + trimText(data[1].catalogItemName) + '<br/>...';
		} else {
			smallLinks = data.inject('', crossLink.getSmallLinks);
		}
		
		var strContent = crossLink.CONTENT.evaluate({
		    brandCode: brandCode,
		    smallLinks: smallLinks
		});
		
        return strContent;
     },
    getLongName: function(e, code, i) {
        var obj = crossLink.brandData[code][i];
        (e.target||e.srcElement).innerHTML = obj.catalogItemName;
    },
    getShortName: function(e, code, i) {
        var obj = crossLink.brandData[code][i];
        (e.target||e.srcElement).innerHTML = obj.shortName;
    },
    getLinksHTML : function(array, obj, index) {
        var code = array.code;
        //var siteid = 'cl' + crossLink.brandAbbr + crossLink.brandConstruct[code-1].brandAbbr;
        var siteid = 'cl' + crossLink.brandAbbr + crossLink.getConfirmBrand(code).brandAbbr;
        var url = crossLink.getConfirmBrand(code).unsecureUrl;
        var from = crossLink.currentBrandCode + crossLink.cid;
        var name = obj.shortName = (obj.shortName || crossLink.trimText(obj.catalogItemName));
        var previewDate = crossLink.previewDate||'';
        array.push( ((previewDate && previewDate != '') ? crossLink.LINK_PREVIEW : crossLink.LINK).evaluate({
                url: url,
                action: obj['categoryAction']||'/browse/category',
                cid: obj.catalogItemId,
                siteid: siteid,
                code: code,
                from: from,
                name: name,
                index: index,
                date: previewDate
        }));
        return array;
    },
    getScreenWidth: function(){
    	this.isHighRes = (this.screenWidth > this.screenWidthCutoff)?true:false;
    	if((this.screenWidth != null) && this.isHighRes){
    		var crossLinkScrollbarEnforcer = document.createElement('div');
    		crossLinkScrollbarEnforcer.id = 'crossLinkScrollbarEnforcer';
			document.body.appendChild(crossLinkScrollbarEnforcer);

 	    }
    	else{ this.quickLinksOpen = false;}
    },
	renderBrandData: function(args, periodicalExecuterRef) {
        var code = args.brandCode;
        var data = crossLink.brandData[code];
        if(!data || data.length == 0) return false;

		periodicalExecuterRef.stop();

        var brandCode = 'brand' + code;
		var brandContent = brandCode + 'Content';
		var greek = brandCode + 'Greek';
		var links = brandCode + 'Links';
		var strModuleContent = crossLink.MODULE_CLOSED.evaluate({
	        brandCode: brandCode,
	        brandId: code,
	        content: crossLink.getBrands(code, data),
	        assetPath: crossLink.getConfirmBrand(code).badgeContentPath
	    });
        crossLink[brandCode].innerHTML = strModuleContent;

        links = crossLink[links] = $(links);
		crossLink[brandContent] = $(brandContent);
		greek = crossLink[greek] = $(greek);
        crossLink[brandCode].style.display = 'block';

        var linksHTML = [];
        //var brandName = crossLink.brandConstruct[code-1].brandDisplayName + ' ';
        var brandName = crossLink.getConfirmBrand(code).brandDisplayName + ' ';
        linksHTML.code = code;
        links.innerHTML = data.inject(linksHTML, crossLink.getLinksHTML).join('').replace(/{brandName}/g, '');

        crossLink.skipLinks.innerHTML = crossLink.skipLinks.innerHTML + linksHTML.join('').replace(/{brandName}/g, brandName);

        links.style.display = 'none';
        crossLink.moduleDim = crossLink.module.getDimensions();
		crossLink.setPos();
        return true;
    },
    loadScriptTimeoutHandler: function(args) {
        return (!crossLink.data || crossLink.data.length == 0);
    },
    createDivs: function() {
    	var module = document.createElement('div');
        var myCSSState = (this.quickLinksOpen)?"open":"closed";
        module.id = 'crossLinkModule';
        module.className = myCSSState;
        module.innerHTML = 	'<div id="crossLinkHeader"><div id="skipNavCrossLinks" class="skipNavs"><a name="crossLinks" class="skipNavs">' + this.headerText + '</a></div></div>' +
                            '<div id="crossLinkBrands"><ul onmouseover="crossLink.openedBoxOverHandler();">' +
	                                '<li id="brand1" onmouseover="crossLink.show(event, 1);" onmouseout="crossLink.hide(event, 1);" class="brandMain"></li>' +
	                                '<li id="brand3" onmouseover="crossLink.show(event, 3);" onmouseout="crossLink.hide(event, 3);" class="brandMain"></li>' +
	                                '<li id="brand2" onmouseover="crossLink.show(event, 2);" onmouseout="crossLink.hide(event, 2);" class="brandMain"></li>' +
	                                '<li id="brand4" onmouseover="crossLink.show(event, 4);" onmouseout="crossLink.hide(event, 4);" class="brandMain"></li>' +
	                                '<li id="brand10" onmouseover="crossLink.show(event, 10);" onmouseout="crossLink.hide(event, 10);" class="brandMain"></li>'+
	                          '</ul></div>';
        if(environmentModelValues.isCatalog2UniversalSiteActive == "true"){
        	module.innerHTML += '<div id="crossLinkFooter">&nbsp;</div>';
        }
        module.innerHTML += '</div>';
        
        /* we do this so the left/right scroll maintains the correct 
    	 * relative position right of the main content 
    	 * This beats the heck out of doing it with JavaScript*/
        if(this.isHighRes){
        	$("crossLinkScrollbarEnforcer").appendChild(module);
        }
        else{
        	document.body.appendChild(module);
        }
        if(environmentModelValues.isCatalog2UniversalSiteActive == "true" && !this.isHighRes){
        	$("crossLinkModule").observe('mouseover', function(){crossLink.setOpen()});
        	$("crossLinkModule").observe('mouseout', function(e){crossLink.setClosed(e,this)});
        	$("crossLinkModule").observe('click', function(){crossLink.closeBox()});
        }
        
        this.module = $(module.id);
        this.skipLinks = $('skipNavCrossLinks');
    },
    buildPath: function() {
        var isCategoryPage = !(window['productPage']||window['outfitPage']);
        var path = getCookieVar("globalSession","xlinkFrom")||'';
        var cid = this.cid = getQuerystringParam("cid")||this.cid;
        var states = path.split('|');
        var fromCL = getQuerystringParam("fromCL");
        var oldFromCL = states[0];
		var oldCid = states[1]||cid;

        path = (cid && fromCL) || (cid && oldFromCL && !(isCategoryPage && cid != oldCid)) ? (fromCL||oldFromCL) + '|' + (fromCL ? cid : oldCid) + '|' + (states[2]||'') : '';
        setCookieVar('globalSession', 'xlinkFrom', path);
    },
    getConfirmBrand: function(code) {
    	for (var i=0; i < this.brandConstruct.length; i++) {
    		brand = this.brandConstruct[i];
    		if (brand.brandCode == code) {
    			return brand;
    		}
    	}
    	return null;
    },
	show : function(e, brandCode) {
    	var target = crossLink['brand' + brandCode];
        var src = target.contains ? (e.toElement||e.relatedTarget) : (e.fromElement || e.target);
        crossLink['brand' + brandCode + 'Greek'].style.display = 'none';
        crossLink['brand' + brandCode + 'Links'].style.display = 'block';
        //if(environmentModelValues.isCatalog2UniversalSiteActive == "false"){
			this.setPosY();
		//}
	},
	hide : function(e, brandCode) {
		var target = crossLink['brand' + brandCode];
        var src = e.toElement || e.relatedTarget;
        crossLink['brand' + brandCode + 'Greek'].style.display = 'block';
        crossLink['brand' + brandCode + 'Links'].style.display = 'none';
        //if(environmentModelValues.isCatalog2UniversalSiteActive == "false"){
			this.setPosY();
		//}
	},
	/** mouseover event for the collapsed box.
	 *  sets a timer to automatically close the openedBox if a user doesn't interact.
	 */
    setOpen: function(){
    	if (this.quickLinksOpen == false) {
    		$("crossLinkModule").removeClassName("closed");
			this.closeBoxTimer = setTimeout(this.closeBox.bind(this),500);
			this.quickLinksOpen = true;
			crossLink.setPos();
		}
    },
    setClosed:function(e,box){
		if (!this.isHighRes && gidLib.isTrueMouseOutEvent(e,box)) {
			this.closeBox();
		}
    },
    closeBox : function() {
    	$("crossLinkModule").addClassName("closed");
    	this.quickLinksOpen = false;
    	crossLink.setPos();	
	},
	/** clears the automatic closing of the openedBox if a user interacts
	 *  with the openedBox
	 */
	openedBoxOverHandler : function() {
		if(!this.isHighRes && environmentModelValues.isCatalog2UniversalSiteActive == "true"){
			clearTimeout(this.closeBoxTimer);
		}
	},
    getOmniValue: function() {
        var xlink = 'no crosslink';
        var path = getCookieVar("globalSession","xlinkFrom")||'';
        var states = path.split('|');
        var state = (states.length - 1)||1;

        if(state == 2) {
                var appComponent = states[2].split(':');
                var oldPid = appComponent[1];
                var oldCid = states[1];
                var app = (window['productPage']||window['outfitPage']||window['quickLook']||'').type||'';

                if(states[2] != '')
                    path = path.replace(states[2], '');

                if(app != '' && getQuerystringParam("cid") ) {
                    path = path + app;
                    var pid = window[app].objP.strProductId;
                    path = path + ':' + pid;

                    if(pid != oldPid) {
                        xlink = states[0] + '|' + gidBrandSiteConstruct.currentBrandCode + oldCid;
                    }
                }

        }

        setCookieVar('globalSession', 'xlinkFrom', path);
        return xlink;
    }
};

Event.observe(window, 'load', crossLink.init.bind(crossLink));
	

/** Browse Swatches Module **/
/*
 *  Browse Swatches
 *  Author: Byung Kim
 */

var browseSwatches = {
	currentPid : null,
	
	model : {},
	view : {},
	controller : {
		handlers : {},
		reporting : {}
	}
};

Object.extend(browseSwatches.view, {
	// Set the category product image based on the scid given
	setProductImageForSwatch : function(args,scid,img) {
		if (args.isStyleColor) {
			var divIdString = args.scid;
		} else {
			var divIdString = args.pid;
		}
		
		var productImageDiv = $('categoryProductItemImageContainer_' + divIdString + "_" + args.cid);

		var imgSrc = args.qlImages[scid];
		if (imgSrc) {
			if (img.hasInvalidImagePath == false) {
				productImageDiv.style.backgroundImage = "url(" + imgSrc + ")";
			} else {
				img.img.src = imgSrc;
			}
		}
		
		
	},	
	
	getMarketingMessageForSwatch : function(args,scid) {
		var message = null;
		if (scid && $(this.getStyleColorMessage(args,scid))!= null) {
			message = this.getStyleColorMessage(args,scid);			
		} else if($(this.getStyleMessage(args,scid)) != null) {
			message = this.getStyleMessage(args,scid);
		}
		return $(message);
	},
	
	getStyleMessage: function(args,scid) {
		var id = args.pid;
		if (args.isStyleColor) {
			id = args.scid;
		}
		
		return $("styleMarketingFlag_" + id  + "_" + args.cid);
	},	
	
	getStyleColorMessage: function(args,scid) {
		var nodeId = this.getNodeId(args,scid);
		
		return $("styleColorMarketingFlag_" + nodeId);
	},	
	
	getNodeId: function(args,scid) {
		var pidScid = args.pid;
		if (args.isStyleColor)
			pidScid = args.scid;
		
		var nodeId = args.cid + "_" + pidScid + "_" + scid;
		return nodeId;
	},
	
	getSwatch: function(args,scid) {
		var nodeId = this.getNodeId(args,scid);
		
		return $("swatchLi_" + nodeId);
	},	
	
	setSwatchMouseOver : function(args,scid,img) {
		this.setProductImageForSwatch(args, scid,img);
		this.getSwatch(args,scid).addClassName("hover");

		if(this.getMarketingMessageForSwatch(args,img.selectedScid) )
			this.getMarketingMessageForSwatch(args,img.selectedScid).removeClassName("productColorMarketingFlagSelected");		

		if(this.getMarketingMessageForSwatch(args,scid)) 
			this.getMarketingMessageForSwatch(args,scid).addClassName("productColorMarketingFlagSelected");

	},
	
	setSwatchMouseOut : function(args,scid,img) {
		this.setProductImageForSwatch(args, img.selectedScid,img);
		this.getSwatch(args,scid).removeClassName("hover");
		
		if(this.getMarketingMessageForSwatch(args,scid))
			this.getMarketingMessageForSwatch(args,scid).removeClassName("productColorMarketingFlagSelected");
		if(this.getMarketingMessageForSwatch(args,img.selectedScid))
			this.getMarketingMessageForSwatch(args,img.selectedScid).addClassName("productColorMarketingFlagSelected");
	},
	
	setSwatchOnClick : function(args,scid,img) {
		if (img.selectedScid && this.getSwatch(args,img.selectedScid))
			this.getSwatch(args,img.selectedScid).removeClassName("swatchselected");
		if (img.selectedScid && this.getMarketingMessageForSwatch(args,img.selectedScid))
			this.getMarketingMessageForSwatch(args,img.selectedScid).removeClassName("productColorMarketingFlagSelected");
		
		img.selectedScid = scid;
		if(this.getMarketingMessageForSwatch(args,scid)) 
			this.getMarketingMessageForSwatch(args,scid).addClassName("productColorMarketingFlagSelected");
		this.getSwatch(args,scid).addClassName("swatchselected");

		// Trigger omniture reporting
		browseSwatches.controller.reporting.triggerSwatchEngagementReporting();

	}, 

	// Background load a swatch for a given style color
	loadMainImage : function(args,scid) {
    	var mainImage = new Image();
    	mainImage.src = args.qlImages[scid];
	}
	
});

Object.extend(browseSwatches.controller, {
	handlers : {
		swatchOnMouseOverHandler : function(element,args,swatchId,img) {
			browseSwatches.view.setSwatchMouseOver(args,swatchId,img);
			
			// Record the current pid whenever it changes
			browseSwatches.currentPid = args.pid;
			
			browseSwatches.controller.checkloadMainImagesForProduct.delay(0.5,args);
			
			return false;
		},
		
		swatchOnMouseOutHandler : function(element,args,swatchId,img) {
			browseSwatches.view.setSwatchMouseOut(args,swatchId,img);

			// No current pid 
			browseSwatches.currentPid = null;
			
			return false;
		},
		
		swatchOnClickHandler : function(element,args,swatchId,img) {
			browseSwatches.view.setSwatchOnClick(args,swatchId,img);
			return false;
		}
	},

	/**
	 * If we are still over a swatch for the same product, load all
	 * main images for that product.
	 * 
	 * Also triggers a potential omniture report
	 */
	checkloadMainImagesForProduct :  function(args) {
		if (browseSwatches.currentPid == args.pid) {
			browseSwatches.controller.loadMainImagesForProduct(args);
			
			// Trigger omniture reporting
			browseSwatches.controller.reporting.triggerSwatchEngagementReporting();
		}
	},
	
	loadMainImagesForProduct :  function(args) {
		args.scidList.split(",").each(browseSwatches.view.loadMainImage.bind(browseSwatches.view,args));
	},
	
	reporting : {
		triggered : false,
		
		/**
		 * Kick off an omniture report if one has not previously been sent
		 * for this page.
		 */
		triggerSwatchEngagementReporting : function() {
			if (!this.triggered) {
				reportingService.controller.viewManagers['swatchEngagementViewManager'].controller.getReportRequest();
				this.triggered = true;
			}
		}
	}
});

	

/** Browse Third Party Pixels Module **/

var AcernoPixel = {
		setPixel: function() {
			var cid = gidLib.getQuerystringParam("cid");
			if (cid != ''){
								
					var AcernoPixel = document.createElement('p');
					AcernoPixel.style.display = 'none';
					document.body.appendChild(AcernoPixel);
					AcernoPixel.innerHTML = '<img src="http://www.imiclk.com/cgi/r.cgi?m=3&mid=7jGZZuuX&did=' + cid+'" width="0" height="0"/>';								
			}
		}
};
if (location.pathname == '/browse/division.do' || location.pathname == '/browse/category.do' || location.pathname == '/browse/subDivision.do' || location.pathname == '/browse/categorySearch.do'){
	Event.observe(window,'load',AcernoPixel.setPixel);
}

var TurnPixel = {
		setPixel: function() {
			var TurnPixel = document.createElement('p');
			TurnPixel.style.display = 'none';
			document.body.appendChild(TurnPixel);
			TurnPixel.innerHTML = '<img border="0" src="https://r.turn.com/r/beacon?b2=v1_ehGrysYAq_TblpP_6DIZzTQcFXJ6ZUgN6BG-H8AVvVIiiWg4oA_oDCdpBV6rGuCPvu6Rjeq6zy7VcYLeCWg&cid="/>';		
		}
};

if (location.pathname == '/browse/division.do' || location.pathname == '/browse/category.do' || location.pathname == '/browse/subDivision.do' || location.pathname == '/browse/categorySearch.do'){
	Event.observe(window,'load',TurnPixel.setPixel);
}
	

/** Browse General Category Page Module **/
/**
* categoryPage - Handles functions which are specific to Category Page /browse/category.do
* @constructor
* @author Nichole Shannon
* @date 02/22/2010
*/
var categoryPage = {
	type : 'categoryPage',
	externalOverrides : {
		/* Placeholder */
	},
	/**
	 * Sets the href for a product
	 * @author N.Shannon
	 * 
	 * @param linkType JSP location reference - not all URLs are built in the same place or pass 
	 * 	the same commonNodeID needed to access the imageLoader.categoryProductsMap["000000_000000_00000000"]
	 * @param strProductId
	 * @param strCategoryId
	 * @param commonNodeId
	 * @param defaultSizeVariantId
	 * @param targetImg
	 * 
	 * Example Product Query String: ?cid=100010&vid=1&pid=501001&scid=501001062
	 * 
	 * console.log("GID.Browse() setItemHref.params:", "pid="+strProductId, ": cid="+strCategoryId, ": cNode="+commonNodeId, ": bid="+defaultSizeVariantId, ": targetImg="+targetImg);
	 * console.log("GID.Browse() setItemHref.imgLoaderObjRef", imgLoaderObjRef);
	 * console.log("GID.Browse() setItemHref.HREF", $(elem).readAttribute('href') );
	 * 
	 */
		setItemHref : function(productId, strCategoryId, productStyleId, defaultSizeVariantId, targetImg) {
            var isSearchActive = (window['objSearch'] && objSearch.isSearchActive);
			var strProductURL = '/browse/product.do?';	
			strProductURL += (isSearchActive ? 'searchCID=' : "cid=") + strCategoryId;
			strProductURL += "&vid=" + defaultSizeVariantId;
			strProductURL += "&pid=" + productStyleId;
			var targetImgCount = targetImg.split("_");
			var isStyleColor = (targetImgCount.length == 3);
			var imgLoaderObjRef = strCategoryId + "_" + (isStyleColor ? productId : productStyleId) + "_" + productId;
			if ( imageLoader.categoryProductsMap[imgLoaderObjRef]) {
				strProductURL += "&scid=" + imageLoader.categoryProductsMap[imgLoaderObjRef].selectedScid;
				//console.log("true");
			} else if (isStyleColor){
				strProductURL += "&scid=" + productId;
			}
			//console.log(productId, strCategoryId, productStyleId, defaultSizeVariantId, targetImg);
			//console.log(strProductURL);
			window.location.href = strProductURL;
		}
};





/** Browse SearchDex Footers Module **/
/*
 *  Browse SearchDex Footer
 *  Author: Amy Tang
 */
var browseSearchDexFooters = {

        linksets : null,
        plusset : null,
        minusset : null,
       
        init : function() {
			if($('linkContainers') != null){
				this.linksets = $('linkContainers').select('.linkContainer');
			}
			if($('searchDexFooterContainer') != null){
				this.plusset = $('searchDexFooterContainer').select('.plus');
				this.minusset = $('searchDexFooterContainer').select('.minus');
			}
        },

        expandLink: function(s){
            var expand = this.linksets[s] ;
            var lsp = this.plusset[s] ;
            var lsm = this.minusset[s] ; 

            this.shrinkLinks();

            if(expand != null){
                expand.style.display = 'inline';
                expand.style.float = 'none';
            }      
            if(lsm != null){
                lsm.style.display = 'inline';
            }
            if(lsp != null){
                lsp.style.display = 'none';
            }
        },

        shrinkLinks: function(){
	    if(this.plusset != null){
                this.plusset.invoke("setStyle",{display:'inline'});
            }
	    if(this.minusset != null){
                this.minusset.invoke("setStyle",{display:'none'});
            }
	    if(this.linksets != null){
                this.linksets.invoke("setStyle",{display:'none'});
            }
        }
           
};
Event.observe(window,"load", function() {
 browseSearchDexFooters.init();
});



		