dojo.declare("WHPipController", null, {
	constructor: function() {
		this._productDatasetLookup = new ProductDatasetLookup();
		this._renderProductAttributeData();
		this._interceptCartXML();
		this._resetBaseXMLRequest();
		
		dojo.subscribe("/riaCloseEvent", this, "_handleRiaCloseEvent");
		dojo.subscribe("/swapHeroImageFromThumbUrlEvent", this, "_handleHeroImageFromThumbUrlEvent");
		dojo.subscribe("/swatchSelectBySku", this, "_handleChangeHeroOnSwatchClick");
		dojo.connect(dojo.byId('pipform'), "onsubmit", this, "_handlePipFormSubmit");
		
		dojo.subscribe('infotabs-selectChild', this, "_handleTabChange" );
		dojo.query('.thumb img').reverse().forEach(function(item){ dojo.connect(item, "onclick", this, "_handleSubsetThumbClick"); }, this);

        /* opionlabs IE6
        if(dojo.isIE == 6){
        	this._opinionLabsTopPosition = document.documentElement.scrollTop + (dijit.getViewport().h * .90);
            dojo.connect(window, "onscroll", this, "_handleOpinionLabsMove");
        }
        */
	},
	
	selectElemEventIds: {},
	initText: "",
	currentText: "",
	timerId: -1,
	_fadeTimeout: -1,
	_currentlyHovering: false,
	_xml: null,
	_productDatasetLookup: null,
	REG_PRICE: 1,
	SALE_PRICE: 2,
	SPECIAL_PRICE: 3,
	isNLAInEditMode :true,
	_shownSkuWiseErrorCount: 0,
	_fadeTimeoutPageWise: -1,
	_clickGiftWrapCheckBoxCMOnce: false,
	_clickshiptoCheckBoxCMOnce: false,
	_opinionLabsTimerId: 0,
	_opinionLabsTopPosition: 0,
	
    _doOpinionLabsMove: function() {
    	var anim = dojo.animateProperty({
			node: dojo.byId("oo_feedback_float"),
			properties: {
				top: {
					start: this._opinionLabsTopPosition,
					end: document.documentElement.scrollTop + (dijit.getViewport().h * .90)
				}
			}
		});
		dojo.connect(anim, "onEnd", dojo.hitch(this, function() { this._opinionLabsTopPosition = dojo.style(dojo.byId('oo_feedback_float'), "top"); }));
		anim.play();
    },
    _handleOpinionLabsMove: function() {
        clearTimeout(this._opinionLabsTimerId);
        this._opinionLabsTimerId = setTimeout(dojo.hitch(this, function(){
            this._doOpinionLabsMove();
        }), 250);
    },
	_handleSubsetThumbClick: function(evt){
    	var id = evt.currentTarget.getAttribute("id");
		var idSplit = id.split("subhero_product");
		if(id.length > 1)
			cmCreatePageElementTag("Subset Thumbnail " + idSplit[1], 'PIP Item');
	},
	_handleTabChange: function(evt){
		switch(evt.title)
		{
			case "PRODUCT INFO":
				this._tabCMCall("Product Info Tab");
			 	break;
			case "SHIPPING INFO":
				this._tabCMCall("Ship Info Tab");
			  	break;
			case "SUMMARY":
				this._tabCMCall("Summary Tab");
			  	break;
		};
	},
	_tabCMCall: function(arg){
		cmCreateManualLinkClickTag('PIP', arg);
		cmCreatePageElementTag(arg, 'PIP Item');			
	},
	_handlePipFormSubmit: function(evt){ 
		evt.preventDefault(); 
		evt.stopPropagation(); 
		
		if(dojo.byId('userstatus') && (dojo.byId('userstatus').value == "giftgiver"))
			this._handleAddToCartGiftGiver(evt.currentTarget);
		else
			this._handleAddToCart(evt.currentTarget);
	},
	_interceptCartXML: function(){
		if (!isEmpty(dojo.byId("cartxml")) && !isEmpty(dojo.byId("cartxml").value))
			this._processXMLResponse(dojo.byId("cartxml").value);
	},
	_resetBaseXMLRequest: function(){
		this._xml = dojox.data.dom.createDocument("<addtocartrequest><isgiftcard></isgiftcard><shopeditskus></shopeditskus><cmsrc></cmsrc><cmgid></cmgid><items></items><shiptoinfo></shiptoinfo></addtocartrequest>");
	},
	setColorSelectionFromPopup: function(childArgs){
		var subsetSku = childArgs["subsetSku"];
		if(subsetSku == null){
			console.debug('unable to parse subsetSku from popup');
			return;
		}
		var productString = "";
		try{
			productString = dojo.query('input[defaultsku*="' + subsetSku + '"]')[0].getAttribute('productcount');
			_previewSubsetCounter = productString.split('product')[1];
		} catch(err){
			console.debug('unable to scan pip');
			return;
		}
		
		_previewSubsetCounter = _previewSubsetCounter - 1;

		if(_previewSubsetCounter==0){
			this._swapHeroImage(null, childArgs["newSource"], "", true, childArgs["requestUrl"]);
			var shownText = "Shown in " + childArgs["swatchTitle"];	
			this._setSwatchTitle(shownText);
			this.currentText = shownText;
			
			var skus = "";
			var defaultSku = dojo.eval(childArgs["sku"])[0];
			dojo.query('#swatch-container ul li').forEach(
				function(swatchLi) {
				    skus = swatchLi.getAttribute('skuarray');
				    if(!skus) return;
				    if(skus.indexOf(defaultSku) > 0){
					actualImgElement = swatchLi.childNodes[0];
					this._handleHighlightClick(actualImgElement);
					this._setSwatchTitle(actualImgElement.alt);
					this.currentText = actualImgElement.alt;
				    }
			       },
			    this); 
		}
		
		var errorNode = dojo.byId('SkuWiseErrorContainer_product' + (_previewSubsetCounter+1));
		removeChildren(errorNode);
		var divContainer = this._createErrorContainerDiv("Your item has been updated with your color selection.");
		errorNode.appendChild(divContainer);
		errorNode.scrollIntoView(true);
		var swatchImgSkuArray = dojo.eval(childArgs["sku"]);
		
		if(swatchImgSkuArray.length > 1)
			this._findSkuInDropDownsForPartialSelection(swatchImgSkuArray,_previewSubsetCounter);
		else
			this._findSkuInDropDowns(swatchImgSkuArray[0],_previewSubsetCounter);
			
		//this._alterPreviewButtonRequestUrl(childArgs["requestUrl"], _previewSubsetCounter);
		this._setupRequestUrls(childArgs["requestUrl"], _previewSubsetCounter)
	},
	showPopupByUrl: function(url, subsetCounter, subsetAnchorForScrollElement){
		_previewSubsetCounter = subsetCounter - 1;
		pipPopup.show(url);
	},
	showDetailPopup: function(url){
		_previewSubsetCounter = 0;
		pipPopup.show(url);
	},
	handleSwatchOnClick: function(sourceNode, skuImgSrc, skuImgAlt, requestUrl, swatchItemNumber, pipItem, swatchImgSku, alt){
		var swatchSkuArray = dojo.eval(swatchImgSku);
		
		this.swapHeroImage(sourceNode, skuImgSrc, skuImgAlt, true, requestUrl);
		this._swapProductThumbnailImage(sourceNode, skuImgSrc, skuImgAlt, true, requestUrl, swatchSkuArray[0]);
		
		var altname = sourceNode.alt;
		var shownText = "Shown in " + altname;	
		this._setSwatchTitle(shownText);
		this.currentText = shownText;
		
		this._handleHighlightClick(sourceNode);
		var swatchImgSkuArray = dojo.eval(swatchImgSku);
		if(swatchImgSkuArray.length > 1)
			this._findSkuInDropDownsForPartialSelection(swatchImgSkuArray,0);
		else
			this._findSkuInDropDowns(swatchImgSkuArray[0],0);
	},
	_handleChangeHeroOnSwatchClick: function(evt){
		if((evt == "") || (evt == "undefined"))
			return;
		var swatch = null;
		var temp = dojo.query('li[skuarray*="'+ evt + '"] img');
		if(temp.length < 1)
			return;
		
		swatch = temp[0];
		var altname = swatch.alt;
		var shownText = "Shown in " + altname;	
		this._setSwatchTitle(shownText);
		this.currentText = shownText;
		
		this._handleHighlightClick(swatch);
		//dijit.scrollIntoView(swatch);
		if(dojo.query('.large-swatch-list').length > 0)
			dojo.query('.large-swatch-list')[0].scrollTop = (swatch.offsetTop - dojo.query('.large-swatch-list')[0].offsetTop) - 17;
	},
	_findSkuInDropDowns: function(sku,productCount){
		var products = productMap.products.productSet;
		var product;
		var foundAtInfo = this._productDatasetLookup.searchDataSetForSku(products, sku, 1, null,productCount);
		var productFoundIn;
		var selectElem;
		var self = this;
		
		if (foundAtInfo["depth2_index"]) {
			setTimeout(function(){
				productFoundIn = foundAtInfo["depth1_index"];
				selectElem = dojo.byId("product" + productFoundIn + "_attr2");
				selectElem.selectedIndex = foundAtInfo["depth2_index"];
				self._handleAttr2OnChange(selectElem);
			}, 10);
		}
		if (foundAtInfo["depth3_index"]) {
			setTimeout(function(){
				productFoundIn = foundAtInfo["depth1_index"];
				selectElem = dojo.byId("product" + productFoundIn + "_attr3");
				selectElem.selectedIndex = foundAtInfo["depth3_index"];
				self._handleAttr3OnChange(selectElem);
			}, 800);
		}
		if (foundAtInfo["depth4_index"]) {
			setTimeout(function(){
				productFoundIn = foundAtInfo["depth1_index"];
				selectElem = dojo.byId("product" + productFoundIn + "_attr4");
				selectElem.selectedIndex = foundAtInfo["depth4_index"];
				self._handleAttr4OnChange(selectElem);
			}, 1000);
		}
		
		//this will supress the skuWiseErrorContainer message when we're in edit mode. -CS
		var isEditMode = (dojo.byId('skuEdit_' + (productCount +1) ) && dojo.byId('skuEdit_' + (productCount+1)).value !="" );
		if(isEditMode)
			return;

		removeChildren(dojo.byId('SkuWiseErrorContainer_product' + foundAtInfo["depth1_index"]));
		var divContainer = this._createErrorContainerDiv("Your item has been updated with your color selection.");
		dojo.byId('SkuWiseErrorContainer_product' + foundAtInfo["depth1_index"]).appendChild(divContainer);
	},
	swapHeroImage: function(sourceNode, newSource, altText, setVal, requestUrl){
		var heroImgNode = dojo.byId('imgHero');
		if (heroImgNode) {
			heroImgNode.removeAttribute("width");
			heroImgNode.removeAttribute("height");
			heroImgNode.src = newSource;
			heroImgNode.title = (altText) ? altText : "";
			heroImgNode.alt = (altText) ? altText : "";
			if (requestUrl){
				this._alterHeroImageRequestUrl(requestUrl);
			}
		}
	},
	swapHeroLink: function(sourceNode, newSource, altText, setVal, requestUrl){
		var heroImgNode = dojo.byId('imgHero');
		if (heroImgNode) {
			heroImgNode.src = newSource;
			if(altText)
				heroImgNode.alt = altText;
			else
				heroImgNode.alt = "";
				
			if(altText)
				heroImgNode.title = altText;
			else
				heroImgNode.title = "";
		}
		if (requestUrl){ 
			if ( dojo.byId('viewLarger') ) {
				dojo.byId('viewLarger').href = 'javascript:pipPopup.show(\'' + requestUrl + '\')';
			}
		}
	},
	_handleHeroImageFromThumbUrlEvent: function(originalImageUrl, heroAlt){
		if(!originalImageUrl || originalImageUrl == ""){
			return;
		}
		
		if(!heroAlt) {
			heroAlt = "";
		}
				
		var urlArray = originalImageUrl.split('/');
		var imagePortionOfUrl = urlArray[urlArray.length - 1];
		var imageSplit = imagePortionOfUrl.split('.');
		if(imageSplit.length != 2)
			return;
		
		var newImage = imageSplit[0].substring(0, imageSplit[0].length-1) + 'm.' + imageSplit[1];
		var newHeroUrl = originalImageUrl.substring(0, originalImageUrl.lastIndexOf('/')) + '/' + newImage;
		this.swapHeroImage(null, newHeroUrl, heroAlt, null, null);
	},
	_findSkuInDropDownsForPartialSelection: function(skus,productCount){
		var MAXIMUM_NUMBER_OF_SUBSETS = 5;
		var products = productMap.products.productSet;
		var product;
		var sku;
		var foundAtInfoArray = [];
		for(var i = 0; i < skus.length; i++){
			sku = skus[i];
			foundAtInfoArray[i] = this._productDatasetLookup.searchDataSetForSku(products, sku, 1, null,productCount);
		}
		sku = skus[0];
		//determine the minimum depth to populate dropdowns -CS SS
		var tempDepth;
		var minDepth = null;
		for(var depth = 1; depth < 5; depth++){
			if(!foundAtInfoArray[0]["depth" + depth + "_index"]){
				minDepth = depth;
				break;	
			}
			tempDepth = foundAtInfoArray[0]["depth" + depth + "_index"];
			for(var j = 1; j < foundAtInfoArray.length; j++){
				if((!foundAtInfoArray[j]["depth" + depth + "_index"]) || (foundAtInfoArray[j]["depth" + depth + "_index"] != tempDepth)){
					minDepth = depth;
					break;					
				}
			}
			if(minDepth != null)
				break;
		}
		
		//set the foundAtInfo as zero index -CS SS
		foundAtInfo = foundAtInfoArray[0];
		
		var selectElem;
		var productFoundIn;
		var self = this;
		
		//clear any pricing info, backorder status messages, etc...
		removeChildren(dojo.byId('product' + (productCount+1) + '_priceHook'));
		removeChildren(dojo.byId('product' + (productCount+1) + '_backOrderHook'));
		var divContainer = this._createErrorContainerDiv("Please select from remaining drop-downs.", "select-remaining");
		
		var attrDropDownLevelToChange = minDepth; 
		if (attrDropDownLevelToChange > 2) {
			setTimeout(function(){
				productFoundIn = foundAtInfo["depth1_index"];
				selectElem = dojo.byId("product" + productFoundIn + "_attr2");
				selectElem.selectedIndex = foundAtInfo["depth2_index"];
				self._handleAttr2OnChange(selectElem);
			}, 10);
		}
		if (attrDropDownLevelToChange > 3) {
			setTimeout(function(){
				productFoundIn = foundAtInfo["depth1_index"];
				selectElem = dojo.byId("product" + productFoundIn + "_attr3");
				selectElem.selectedIndex = foundAtInfo["depth3_index"];
				self._handleAttr3OnChange(selectElem);
			}, 65);
		}
		if (attrDropDownLevelToChange > 4) {
			setTimeout(function(){
				productFoundIn = foundAtInfo["depth1_index"];
				selectElem = dojo.byId("product" + productFoundIn + "_attr4");
				selectElem.selectedIndex = foundAtInfo["depth4_index"];
				self._handleAttr4OnChange(selectElem);
			}, 120);
		}
		if (attrDropDownLevelToChange == 2) {
			setTimeout(function(){
				productFoundIn = foundAtInfo["depth1_index"];
				var attr2Select = dojo.byId('product' + productFoundIn + '_attr2');
				if (attr2Select) {
					attr2Select.selectedIndex = 0;
					attr2Select.disabled = false;
					self._handleAttr2OnChange(attr2Select);
				}
			}, 10);
			divContainer = this._createErrorContainerDiv("Please select from drop-down.","select-from-drop-down");
		}
		
		//set the popupUrls
		this._setupRequestUrls((productCount + 1), sku);
		
		//change the thumb img
		var dataSet = this._getDataSetForPartialThumbAssignment(foundAtInfo, products);
		this._renderThumbBySku(productCount + 1, dataSet, sku);
		
		//Inform the user that attention is needed.
		removeChildren(dojo.byId('SkuWiseErrorContainer_product' + foundAtInfo["depth1_index"]));
		dojo.byId('SkuWiseErrorContainer_product' + foundAtInfo["depth1_index"]).appendChild(divContainer);
	},
	handleHeroClick: function(url){
		_previewSubsetCounter = 0;
		pipPopup.show(url);	
	},
	_getDataSetForPartialThumbAssignment: function(foundAtInfo, products){
		var dataSet = null;
		if(foundAtInfo["depth3_index"]){
			if(products[foundAtInfo.depth1_index-1].attr2[foundAtInfo.depth2_index-1].attr3[foundAtInfo.depth3_index-1].attr4)
				dataSet = products[foundAtInfo.depth1_index-1].attr2[foundAtInfo.depth2_index-1].attr3[foundAtInfo.depth3_index-1].attr4;
			else
				dataSet = products[foundAtInfo.depth1_index-1].attr2[foundAtInfo.depth2_index-1].attr3[foundAtInfo.depth3_index-1];
			return dataSet;
		}
		if(foundAtInfo["depth2_index"]){
			if(products[foundAtInfo.depth1_index-1].attr2[foundAtInfo.depth2_index-1].attr3)
				dataSet = products[foundAtInfo.depth1_index-1].attr2[foundAtInfo.depth2_index-1].attr3;
			else
				dataSet = products[foundAtInfo.depth1_index-1].attr2[foundAtInfo.depth2_index-1];
			return dataSet;
		}
		if(foundAtInfo["depth1_index"]){
			if(products[foundAtInfo.depth1_index-1].attr2)
				dataSet = products[foundAtInfo.depth1_index-1].attr2;
			else
				dataSet = products[foundAtInfo.depth1_index-1];
			return dataSet;
		}
		//fail with null.	
		return null;
	},
	_swapHeroImage: function(sourceNode, newSource, altText, setVal, requestUrl){

		var heroImgNode = dojo.byId('imgHero');
		if (heroImgNode) {
			heroImgNode.src = newSource;
			if(altText)
				heroImgNode.alt = altText;
			else
				heroImgNode.alt = "";
				
			if(altText)
				heroImgNode.title = altText;
			else
				heroImgNode.title = "";
		}
	},
	_swapProductThumbnailImage: function(sourceNode, newSource, altText, setVal, requestUrl, clickedSku){
		var products = productMap.products.productSet;
		var attribs = null;
		if(products[0])
			attribs = products[0].attr2;
		
		if(!attribs)
			return;
			
		//find the thumb url
		var thumbUrl = null;
		var thumbAlt = "";
		var attr2 = null;
		var attr3 = null;
		
		//scan for the thumb at attr2 level, if not found begin scanning at attr3 level
		for(var i = 0; i < attribs.length; i++){
			attr2 = attribs[i];
			if (attr2.sku) {
				if (attr2.sku == clickedSku) {
					thumbUrl = this._getThumbImageSrcFromDataset(attr2);
					thumbAlt = attr2.thumb.alt;
					break;
				}
			}
			else {
				for (var j = 0; j < attr2.attr3.length; j++) {
					attr3 = attr2.attr3[j];
					if (attr3.sku == clickedSku) {
						thumbUrl = this._getThumbImageSrcFromDataset(attr3);
						thumbAlt = attr3.thumb.alt;
						break;
					}
				}
			}
		}
		this._renderThumbImg("", thumbUrl, thumbAlt);
	},
	_renderThumbImg: function(productNumber, thumbUrl, thumbAlt){
		var thumb = dojo.byId('subhero_product' + productNumber);
		if(!thumbAlt) {
			thumbAlt = "";
		}
		if (thumb && thumbUrl) {
			thumb.src = thumbUrl;
			thumb.alt = thumbAlt;
			thumb.title = thumbAlt;
		}
			var previewButtonNode = dojo.byId('previewid_product'+productNumber);
			if(productNumber == 1)
				dojo.publish("/swapHeroImageFromThumbUrlEvent", [thumbUrl, thumbAlt]);
	},
	_renderStaticPricing: function(productCounter){
		var productSet = productMap.products.productSet;
		var priceHook;

		priceHook = document.createElement("div");
		priceHook.setAttribute("id", "product" + (productCounter+1) + "_priceHook");
		dojo.byId('product' + (productCounter + 1)).appendChild(priceHook);
		var price = productSet[productCounter].price;
		if (price) {
			var dl = document.createElement("dl");
			removeChildren(dojo.byId("product" + (productCounter+1) + "_priceHook"));
			var dd = document.createElement("dd");
			var priceSpan = document.createElement("span");
			setClass(priceSpan, "price-regular");
			text = document.createTextNode("$" + price.regular);
			priceSpan.appendChild(text);
			dd.appendChild(priceSpan);
			dd.appendChild(document.createTextNode(" "));
			
			var saleSpan = document.createElement("span");
			setClass(saleSpan, "prodSalePricing");
			
			
			var checkPriceRes = this.checkPrice(price);
			
			//check to see if regular and saleSpecial differ, if so - render accordingly.
			switch (checkPriceRes) {
				case this.SPECIAL_PRICE:
					text = document.createTextNode("Special $" + price.saleSpecial + " ");
					saleSpan.appendChild(text);
					dojo.addClass(priceSpan, "strike");
					break;
					
				case this.SALE_PRICE:
					text = document.createTextNode("Sale $" + price.saleSpecial + " ");
					saleSpan.appendChild(text);
					dojo.addClass(priceSpan, "strike");

				default: 
					break;
			}
			
			dd.appendChild(saleSpan);

			var span;
			//creates the 'handling' portion of the pricing
			if(parseInt(price.handling) > 0){
				span = 	document.createElement("span");
				setClass(span, "plain");
				text = document.createTextNode("($" + price.handling + "*)");
				
				span.appendChild(text);
				this._connectEventsForPriceSurchargeTooltip(span);
				dd.appendChild(span);
			}
			
			dl.appendChild(dd);
			dojo.byId("product" + (productCounter+1) + "_priceHook").appendChild(dl);
		}
		this._setCatalogField((productCounter+1),productSet[productCounter]);

		//code suffers from "plus 1" syndrome. the CF array index begins at 1, while JS at 0. -CS
		this._setPipFormValues((productCounter + 1), productSet[productCounter], productSet[productCounter].sku);
	},
	_renderStaticBackOrderStatus: function(productCounter){
		var productSet = productMap.products.productSet;
		var backOrderHook;
		backOrderHook = document.createElement("div");
		backOrderHook.setAttribute("id", "product" + (productCounter+1) + "_backOrderHook");
		dojo.byId('product' + (productCounter + 1)).appendChild(backOrderHook);
		var backorder = productSet[productCounter].backorder;
		
		if (backorder) {
			var dl = document.createElement("dl");
			removeChildren(dojo.byId("product" + (productCounter+1) + "_backOrderHook"));
			var dd = document.createElement("dd");
			setClass(dd, "sA_static");
			var backOrderMessage = document.createTextNode("Available to ship after "  + this._formatDate(backorder," ",", ",'MONTHDDYYYY'));
			dd.appendChild(backOrderMessage);
			dl.appendChild(dd);
			dojo.byId("product" + (productCounter+1) + "_backOrderHook").appendChild(dl);
		}		
	},
	_renderProductAttributeData: function(sku){
		var products = productMap.products.productSet;
		var selectElem = null;
		var optionElem = null;
		var textNode = null;
		
		var dropDownHook, attribs, priceHook;
		for(var i = 0; i < products.length; i++){
			attribs = products[i].attr2;
			if (!attribs) {
				this._renderStaticPricing(i);
				this._renderStaticBackOrderStatus(i);
			} else {
				this._renderDropDownForSubset(i);
				this._populateDropDownEditMode(i);
			}
			this._populateQuantityBoxEditMode(i);
		}
		dojo.byId('skuTotal').value = products.length;
	},
	_setCatalogField: function(productNumber,dataset)
	{
		//Variables created by front end javascript or Dojo should set it's id as  productnumber + 1
		var form = dojo.byId('pipform');
		if(!form["catalog" + eval(productNumber)]){
				var input = document.createElement("input");
				input.setAttribute("id", "catalog" + eval(productNumber));
				input.setAttribute("name", "catalog" + eval(productNumber));
				input.setAttribute("type", "hidden");
				form.appendChild(input);
			}
		form["catalog" + eval(productNumber)].value = dataset.catalog;
		if(!form["skucatalog" + eval(productNumber)]){
				var input = document.createElement("input");
				input.setAttribute("id", "skucatalog" + eval(productNumber));
				input.setAttribute("name", "skucatalog" + eval(productNumber));
				input.setAttribute("type", "hidden");
				form.appendChild(input);
			}
		form["skucatalog" + eval(productNumber)].value = dataset.catalog;
	},
	_renderDropDownForSubset:  function(productCounter){
			var products = productMap.products.productSet;
  			dropDownHook = dojo.byId("product" + (productCounter+1));
			//setClass(dropDownHook, "attrDropDowns");
			removeChildren(dropDownHook);
			selectElem = document.createElement("select");
			selectElem.setAttribute("id", "product" + (productCounter+1) + "_attr2");
			//set a class simply so we can dojo.query to get an array of all selects. -Chad			
			setClass(selectElem, "attr2");
			selectElem.productNumber = (productCounter+1);
			this.selectElemEventIds['product' + (productCounter+1) + '_attr2'] = dojo.connect(selectElem, "onchange", this, "handleAttr2OnChange");
			
			attribs = products[productCounter].attr2;
			if(!attribs)
				return;
			if (attribs[0]) {
				optionElem = document.createElement("option");
				optionElem.setAttribute("value", "");
				//textNode = document.createTextNode(attribs[0].label);
				//optionElem.appendChild(textNode);
				optionElem.innerHTML = attribs[0].label;
				selectElem.appendChild(optionElem);
			}
				
			for(var j = 0; j < attribs.length; j++){
				optionElem = document.createElement("option");
				optionElem.setAttribute("value", attribs[j].sku);
				//textNode = document.createTextNode(attribs[j].value);
				//optionElem.appendChild(textNode);
				optionElem.innerHTML = attribs[j].value;
				optionElem.attr3 = attribs[j].attr3;
				selectElem.appendChild(optionElem);
			}
			
			dropDownHook.appendChild(selectElem);
			dropDownHook.appendChild(document.createElement('br'));
			if (attribs[0].attr3) {
				//render 2 disabled DDs
				selectElem = document.createElement("select");
				selectElem.disabled = true;
				selectElem.setAttribute("id", "product" + (productCounter+1) + "_attr3");
				setClass(selectElem, "attr3");
				selectElem.productNumber = (productCounter+1);
				dropDownHook.appendChild(selectElem);
				dropDownHook.appendChild(document.createElement('br'));
				if (attribs[0].attr3[0].attr4) {
					selectElem = document.createElement("select");
					selectElem.disabled = true;
					selectElem.setAttribute("id", "product" + (productCounter+1) + "_attr4");
					setClass(selectElem, "attr4");
					selectElem.productNumber = (productCounter+1);
					dropDownHook.appendChild(selectElem);
					dropDownHook.appendChild(document.createElement('br'));
				}
			}
			
			
			
			//create the price "hook"
			priceHook = document.createElement("div");
			priceHook.setAttribute("id", "product" + (productCounter+1) + "_priceHook");
			setClass(priceHook, "priceHook");
			dropDownHook.appendChild(priceHook);
		//}	
	},
	_wipeOutBackOrderByProductNumber :function (productNumber){
		if(dojo.byId(dojo.byId("product" + productNumber + "_backOrderHook"))){
			removeChildren(dojo.byId("product" + productNumber + "_backOrderHook"));
		}
	},
	handleAttr2OnChange: function(evt){
		this._fadeOutSkuError(evt.target.productNumber);
		this._fadeOutPageError();
		this._handleAttr2OnChange(evt.target);
		var sku = evt.target.value;
		dojo.publish("/swatchSelectBySku", [sku]);
	},
	_handleAttr2OnChange: function(sourceElem){
		var currentProductNumber = sourceElem.productNumber;
		
		if(this.selectElemEventIds['product' + currentProductNumber + '_attr3'])
			dojo.disconnect(this.selectElemEventIds['product' + currentProductNumber + '_attr3']);
		
		//clear attr3 and attr4 and priceHook
		removeChildren(dojo.byId('product' + currentProductNumber + '_priceHook'));
		//clearing backorder message
		this._wipeOutBackOrderByProductNumber(currentProductNumber);
		
		
		//This line is commented because once we enter quantity in the box, after the drop down selection change , the quantity cleaning is not required. The line below was also used in _handleAttr3OnChange and _handleAttr4OnChange udfs but i have removed it.
		//this._clearQuantityBox(currentProductNumber);
		var attr3Select = dojo.byId('product' + currentProductNumber + '_attr3');
		if (attr3Select) {
			removeChildren(attr3Select);
			attr3Select.disabled = false;
		}

		var attr4Select = dojo.byId('product' + currentProductNumber + '_attr4');	
		if (attr4Select) {
			removeChildren(attr4Select);
			attr4Select.disabled = true;
		}
				
		//disable attr3 dropdown (if exists), check if we need to render the price, then exit the function
		if (!sourceElem.options[sourceElem.selectedIndex].attr3) {
			if(attr3Select)
				attr3Select.disabled = true;

			var dataSet = productMap.products.productSet[currentProductNumber-1].attr2;
			var sku = sourceElem.value;
			this._doPriceAndThumbRender(currentProductNumber, dataSet, sku);
			this._setupRequestUrls(currentProductNumber, sku);
			this._renderBackOrderStatus(currentProductNumber, dataSet, sku);
			this._setPipFormValues(currentProductNumber, dataSet[sourceElem.selectedIndex - 1], sku);
			
			if(sourceElem.selectedIndex == 0)
				this._clearQuantityBox(currentProductNumber);
			return;
		}
		
		var attr3Dataset = sourceElem.options[sourceElem.selectedIndex].attr3;
		
		//load label
		if (attr3Dataset[0]) {
			optionElem = document.createElement("option");
			optionElem.setAttribute("value", "");
			//textNode = document.createTextNode(attr3Dataset[0].label);
			//optionElem.appendChild(textNode);
			optionElem.innerHTML = attr3Dataset[0].label;
			attr3Select.appendChild(optionElem);
		}
		
		for(var i = 0; i < attr3Dataset.length; i++){
			optionElem = document.createElement("option");
			optionElem.setAttribute("value", attr3Dataset[i].sku);
			//textNode = document.createTextNode(attr3Dataset[i].value);
			//optionElem.appendChild(textNode);
			optionElem.innerHTML = attr3Dataset[i].value;
			optionElem.attr4 = attr3Dataset[i].attr4;
			attr3Select.appendChild(optionElem);
		}
		
		this.selectElemEventIds['product' + currentProductNumber + '_attr3'] = dojo.connect(attr3Select, "onchange", this, "handleAttr3OnChange");
	},
	handleAttr3OnChange: function(evt){
		this._fadeOutSkuError(evt.target.productNumber);
		this._fadeOutPageError();
		this._handleAttr3OnChange(evt.target);
		var sku = evt.target.value;
		dojo.publish("/swatchSelectBySku", [sku]);
	},
	_handleAttr3OnChange: function(sourceElem){
		var currentProductNumber = sourceElem.productNumber;
		
		//clear price hook
		removeChildren(dojo.byId('product' + currentProductNumber + '_priceHook'));
		//clearing backorder message
		this._wipeOutBackOrderByProductNumber(currentProductNumber);
		
		var attr4Select = dojo.byId('product' + currentProductNumber + '_attr4');
		if(this.selectElemEventIds['product' + currentProductNumber + '_attr4'])
			dojo.disconnect(this.selectElemEventIds['product' + currentProductNumber + '_attr4']);
			
		var attr2Select = dojo.byId('product' + currentProductNumber + '_attr2');
		var dataSet = attr2Select.options[attr2Select.selectedIndex].attr3;
		var sku = sourceElem.value;
		this._doPriceAndThumbRender(currentProductNumber, dataSet, sku);
		this._setupRequestUrls(currentProductNumber, sku);
		this._renderBackOrderStatus(currentProductNumber, dataSet, sku);
		this._setPipFormValues(currentProductNumber, dataSet[sourceElem.selectedIndex - 1], sku);
		
		//clear our attr4 
		removeChildren(attr4Select);
		var attr4Dataset = sourceElem.options[sourceElem.selectedIndex].attr4;
		
		//see if we have an attr4 dataset, if not than we know this is the deepest dataset
		//then return out of function...
		if (!attr4Dataset) {
			if(attr4Select)
				attr4Select.disabled = true;	
			return;
		}
		
		attr4Select.disabled = false;
		
		//load label
		if (attr4Dataset[0]) {
			optionElem = document.createElement("option");
			optionElem.setAttribute("value", "");
			//textNode = document.createTextNode(attr4Dataset[0].label);
			//optionElem.appendChild(textNode);
			optionElem.innerHTML = attr4Dataset[0].label;
			attr4Select.appendChild(optionElem);
		}
		
		for(var i = 0; i < attr4Dataset.length; i++){
			optionElem = document.createElement("option");
			optionElem.setAttribute("value", attr4Dataset[i].sku);
			//textNode = document.createTextNode(attr4Dataset[i].value);
			//optionElem.appendChild(textNode);
			optionElem.innerHTML = attr4Dataset[i].value;
			attr4Select.appendChild(optionElem);
		}
		this.selectElemEventIds['product' + currentProductNumber + '_attr4'] = dojo.connect(attr4Select, "onchange", this, "handleAttr4OnChange");
	},
	handleAttr4OnChange: function(evt){
		this._fadeOutSkuError(evt.target.productNumber);
		this._fadeOutPageError();
		this._handleAttr4OnChange(evt.target);
		var sku = evt.target.value;
		dojo.publish("/swatchSelectBySku", [sku]);
	},
	_handleAttr4OnChange: function(sourceElem){
		var currentProductNumber = sourceElem.productNumber;
		//clearing backorder message
		this._wipeOutBackOrderByProductNumber(currentProductNumber);
		
		var attr3Select = dojo.byId('product' + currentProductNumber + '_attr3');
		var dataSet = attr3Select.options[attr3Select.selectedIndex].attr4;
		var sku = sourceElem.value;
		this._doPriceAndThumbRender(currentProductNumber, dataSet, sku);
		this._setupRequestUrls(currentProductNumber, sku);
		this._renderBackOrderStatus(currentProductNumber, dataSet, sku);
		this._setPipFormValues(currentProductNumber, dataSet[sourceElem.selectedIndex - 1], sku);
	},
	_renderBackOrderStatus: function(productNumber, dataSet, sku){
		var backorder = null;
		var backOrderHook;
		for(var j = 0; j < dataSet.length; j++){
			if (dataSet[j].sku == sku) {
				backorder = dataSet[j].backorder;
				break;
			}
		}
		backOrderHook = document.createElement("div");
		if(! dojo.byId(dojo.byId("product" + productNumber + "_backOrderHook"))){
			backOrderHook.setAttribute("id", "product" + productNumber + "_backOrderHook");
			dojo.byId('product' + productNumber).appendChild(backOrderHook);
		}
		//The following  line is commented becuase it has been moved at the very start of handleattr2Onchange so not required here
		//removeChildren(dojo.byId("product" + productNumber + "_backOrderHook"));
		// This line is commented becuase it was wiping of the backorder messages for other product numbers also.so this line is used in riaclose event
		//dojo.query(".specialAlerts").forEach("item.innerHTML = '';");
		if (backorder) {
				var dl = document.createElement("dl");
				var dd = document.createElement("dd");
				setClass(dd, "specialAlerts");
				var backOrderMessage = document.createTextNode("Available to ship after "  + this._formatDate(backorder," ",', ','MONTHDDYYYY'));;
				dd.appendChild(backOrderMessage);
				dl.appendChild(dd);
				dojo.byId('product' + productNumber + '_backOrderHook').appendChild(dl);
			}
	},
	
	_formatDate: function (dateStr,separator1,separator2,format)
	{
		var year = "";
		var day = "";
		var month = "";
		var date="";
		var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December');
		var SHORTMONTH_NAMES =new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
		if (((dateStr.length) == 8) && (isNumeric(dateStr))) {
		   year = dateStr.substr(0,4);
		   month =dateStr.substr(4,2);
		   day = dateStr.substr(6,2);
		   if(separator1 ==""){
			 separator1 =" " 
		   }
		    if(separator2 ==""){
			 separator2 =" " 
		   }
		   if (format == "MMDDYYYY"){
		         month =month;
		   } else if(format == "MONDDYYYY"){
		         month = SHORTMONTH_NAMES[month-1] ;
		   } else if(format == "MONTHDDYYYY"){
			   month = MONTH_NAMES[month-1] ;
		   }
		     date = month + separator1 + day + separator2 + year; 
		} 
		return date;
	},
	_doPriceAndThumbRender: function(productNumber, dataSet, sku){
		this._renderThumbBySku(productNumber, dataSet, sku);
		this._renderPriceBySku(productNumber, dataSet, sku);
		if (dataSet[0] && dataSet[0].sku) {
			this._populateQuantityBox(productNumber);
		}
	},
	_setupRequestUrls: function(productNumber, sku){
		if(sku && (sku != "") && (sku != "undefined")) {
			//Adding fromrgl to the url 
			var fromrgl = 0;
			var hRef = "";
			var groupUrl = "";

			if(dojo.byId('fromrgl') && dojo.byId('fromrgl').value =="1")
				fromrgl= 1;

			var newRequestUrl = "";
			var isPersistant = "";
				if(dojo.byId('persistant_product' + productNumber)) {
					isPersistant = dojo.byId('persistant_product' + productNumber).value;
				}

				var previewButtonNode = dojo.byId('previewid_product'+productNumber);
				if(previewButtonNode) {
					hRef = previewButtonNode.href.split("'");
					if(hRef.length > 1 ) {
						groupUrl = hRef[1].split("?");
					}
				}
							
			if(fromrgl == 1) {
				//baseUrlArray[baseUrlArray.length] = "popup.cfm?tool=vLarger&thissku=" + sku + "&fromrgl=" + fromrgl
				newRequestUrl = globalBaseUrl + sku + "/popup.cfm?tool=vLarger&thissku=" + sku + "&fromrgl=" + fromrgl;
				if(newRequestUrl != undefined){
					if(productNumber == 1)
						this._alterHeroImageRequestUrl(newRequestUrl);

					if(productNumber > 1){
						if(groupUrl.length > 0) {
							newRequestUrl = groupUrl[0] + "?tool=vColSwap&thissku=" + sku + "&summary=" + isPersistant;
						} else {
							newRequestUrl = globalBaseUrl + sku + "/popup.cfm?tool=vColSwap&thissku=" + sku + "&summary=" + isPersistant;
						}		
									
						this._alterPreviewButtonRequestUrl(newRequestUrl, productNumber);
						// Change the Sub Hero img URL to open preview colors pop up only when preview colors enabled.
						if(previewButtonNode) {
							this._alterSubHeroImageRequestUrl(newRequestUrl, productNumber);
						}
					}
				}
			} else {
				//set the subHero img and the hero img requeswtUrls
				// Change the Sub Hero img URL to open preview colors pop up only when preview colors enabled.
				if(previewButtonNode) {
					if(groupUrl.length > 0) {
						newRequestUrl = groupUrl[0] + "?tool=vColSwap&thissku=" + sku + "&summary=" + isPersistant;
					} else {
						newRequestUrl = globalBaseUrl + sku + "/popup.cfm?tool=vColSwap&thissku=" + sku + "&summary=" + isPersistant;
					}
				
					this._alterPreviewButtonRequestUrl(newRequestUrl, productNumber);
					this._alterSubHeroImageRequestUrl(newRequestUrl, productNumber);
					if(productNumber == 1)
						this._alterHeroImageRequestUrl(newRequestUrl);
				} 
			}
		}
	},
	_alterDetailsButtonRequestUrl: function(requestUrl, productNumber){
		var details = dojo.byId('details_product' + productNumber);
		if(details) {
			details.href =  'javascript:pipPopup.show(\'' + requestUrl + '\', \'' + productNumber + '\')';
		}
	},
	_alterSubHeroImageRequestUrl: function(requestUrl, productNumber){
		var SubheroImgNode = dojo.byId('subheroimgid_product'+productNumber);
		if(SubheroImgNode) {
			SubheroImgNode.href =  'javascript:pipPopup.show(\'' + requestUrl + '\', \'' + productNumber + '\')';
		}	
	},
	_alterHeroImageRequestUrl: function(requestUrl){

		var heroImgNode = dojo.byId('imgHero');
		if(heroImgNode) {
			heroImgNode.onclick =  function() { pipController.handleHeroClick(requestUrl); };
		}
	},
	_alterPreviewButtonRequestUrl: function(requestUrl, productNumber){
		var previewButtonNode = dojo.byId('previewid_product'+productNumber);
		var previewToolBoxButtonNode = dojo.byId('previewboxid');
		if(previewButtonNode) {
			previewButtonNode.href =  'javascript:pipController.showPopupByUrl(\'' + requestUrl + '\', \'' + productNumber + '\')';
		}
		if(productNumber == 1 && previewToolBoxButtonNode) {
			previewToolBoxButtonNode.href =  'javascript:pipController.showPopupByUrl(\'' + requestUrl + '\', \'' + productNumber + '\')';
		}

	},
	_setPipFormValues: function(productNumber, dataSet, sku){
		//guard against non leaf node in dataSet.
		if(!dataSet || !dataSet.sku)
			return;
		
		var form = dojo.byId('pipform');
		form["skuName_product" + productNumber].value = dataSet.skuName;
		form["skuid" + productNumber].value = dataSet.sku;
		
		// Create dynamic links for the print button
		if(dojo.byId("print_link")){
			printUrl = dojo.byId("print_link").href;		
			printUtlArray = printUrl.split('/');
			printUtlArray[printUtlArray.length-2] = dataSet.sku;;
	 		dojo.byId("print_link").href= printUtlArray.join('/');
		}
		var price = dataSet.price;
		if(price.regular > price.saleSpecial)
			form["price_product" + productNumber].value = dataSet.price.regular;
		else
			form["price_product" + productNumber].value = dataSet.price.saleSpecial;
		form["backorder_product" + productNumber].value = dataSet.backorder;
		form["cartThumbSrc_product" + productNumber].value = this._getCartImageSrcFromDataset(dataSet);
		form["cartThumbAlt_product" + productNumber].value = dataSet.thumb.alt;
		form["isMultiple_product" + productNumber].value = 1;
		form["skuquantity" + productNumber].value = dojo.byId('qty_product' + productNumber).value;
		//form["giftwrap"].value = 0; 
		//form["pip_shiptoproduct" + productNumber].value = dojo.byId('pip_shiptoproduct' + productNumber).value;
		
		//check shipTo value
		if(dojo.query('.shipTo').length > 0){
			shipToInfo = dojo.query('.shipTo')[0].value;
			dojo.byId('shipto').value = shipToInfo;
			if(form["pip_shiptoproduct1"])
				form["pip_shiptoproduct1"].value = shipToInfo;
			if(form["pip_shiptoproduct2"])
				form["pip_shiptoproduct2"].value = shipToInfo;
		}
		this._setCatalogField(productNumber,dataSet);	
		
	},
	_getThumbImageSrcFromDataset: function(dataSet){
		var src = "";
		if(dataSet.thumb && dataSet.thumb.src)
			if(dojo.byId('isFromSQ'))
				src = dataSet.thumb.src + "q.jpg";
			else
				src = dataSet.thumb.src + "u.jpg";
		return src;
	},
	_getCartImageSrcFromDataset: function(dataSet){
		var src = "";
		if(dataSet.thumb && dataSet.thumb.src)
			src = dataSet.thumb.src + "u.jpg";
		return src;
	},
	_populateQuantityBox: function(productNumber){
		var qty = dojo.byId("qty_product" + productNumber);
		if(qty && qty.value==""){
			if(dojo.byId('isPIPInEditMode').value !=  "0" && dojo.byId('qtyEdit_' + (productNumber) ) && dojo.byId('qtyEdit_' + (productNumber)).value !=""){
				qty.value = dojo.byId('qtyEdit_' + (productNumber) ).value;
			} else {
				qty.value = "1";
			}
		}
	},
	_populateQuantityBoxEditMode: function(productNumber){
		var qty = dojo.byId("qty_product" + (productNumber +1));
		if(qty &&  qty.value==""){
			if(dojo.byId('qtyEdit_' + (productNumber +1) ) && dojo.byId('qtyEdit_' + (productNumber+1)).value !=""){
				qty.value = dojo.byId('qtyEdit_' + (productNumber+1) ).value;
				this.isNLAInEditMode= false;
			}
		}
	},
	_populateDropDownEditMode: function(productNumber){
		if(dojo.isIE){
			var self = this;
			setTimeout(function(){
				self._populateDropDownEditModeHelper(self, productNumber);
			}, 10);
		}else{
			this._populateDropDownEditModeHelper(this, productNumber);
		}
	},
	_populateDropDownEditModeHelper: function(scopeObject, productNumber){
		if(dojo.byId('skuEdit_' + (productNumber +1) ) && dojo.byId('skuEdit_' + (productNumber+1)).value !="" ){
			scopeObject._findSkuInDropDowns(dojo.byId('skuEdit_' + (productNumber+1) ).value,productNumber);
		}
	},
	_clearQuantityBox: function(productNumber){
		var qty = dojo.byId("qty_product" + productNumber);
		qty.value = "";
	},
	handleQtyOnChange: function(node) {
		if (node.value && isNumeric(node.value)) {
			var productNumber = node.id.split("qty_product")[1];
			var products = productMap.products.productSet;
			var product = products[productNumber];
			var form = dojo.byId('pipform');
			form["skuquantity" + productNumber].value = dojo.byId('qty_product' + productNumber).value;				
		}
		else {
			// TODO: not complete. This needs an error "hook" for displaying the err message...
			node.value = "";
		}
	},
	_renderThumbBySku: function(productNumber, dataSet, sku){
		var thumbUrl = null;
		var thumbAlt = null;
		for(var j = 0; j < dataSet.length; j++){
			if (dataSet[j].sku == sku) {
				thumbUrl = this._getThumbImageSrcFromDataset(dataSet[j]);
				thumbAlt = dataSet[j].thumb.alt;
				break;
			}
		}	
		if(dataSet.sku && dataSet.sku == sku) {
				thumbUrl = this._getThumbImageSrcFromDataset(dataSet);
				thumbAlt = dataSet.thumb.alt;
		}

		if(thumbUrl){
			this._renderThumbImg(productNumber, thumbUrl, thumbAlt);
		}
	},
	_renderPriceBySku: function(productNumber, dataSet, sku){
		var price = null;
		for(var j = 0; j < dataSet.length; j++){
			if (dataSet[j].sku == sku) {
				price = dataSet[j].price;
				break;
			}
		}	
		if (price) {
			var dl = document.createElement("dl");
			removeChildren(dojo.byId('product' + productNumber + '_priceHook'));
			var dd = document.createElement("dd");
			var priceSpan = document.createElement("span");
			var text;
			// Product service should return price in decimals (including .00 )
			setClass(priceSpan, "price-regular");
			text = document.createTextNode("$" + price.regular);
			priceSpan.appendChild(text);
			dd.appendChild(priceSpan);
			dd.appendChild(document.createTextNode(" "));
			
			var saleSpan = document.createElement("span");
			setClass(saleSpan, "prodSalePricing");
			
			var checkPriceRes = this.checkPrice(price);
			
			//check to see if regular and saleSpecial differ, if so - render accordingly.
			switch (checkPriceRes) {
				case this.SPECIAL_PRICE:
					text = document.createTextNode("Special $" + price.saleSpecial + " ");
					saleSpan.appendChild(text);
					dojo.addClass(priceSpan, "strike");
					break;
					
				case this.SALE_PRICE:
					text = document.createTextNode("Sale $" + price.saleSpecial + " ");
					saleSpan.appendChild(text);
					dojo.addClass(priceSpan, "strike");

				default: 
					break;
			}

			dd.appendChild(saleSpan);
			
			var span;
			//creates the 'handling' portion of the pricing
			if(parseInt(price.handling) > 0){
				span = 	document.createElement("span");
				setClass(span, "plain");
				text = document.createTextNode("($" + price.handling + "*)");

				span.appendChild(text);
				this._connectEventsForPriceSurchargeTooltip(span);
				dd.appendChild(span);
			}
			
			dl.appendChild(dd);
			dojo.byId('product' + productNumber + '_priceHook').appendChild(dl);
		}
	},
	checkPrice: function(price) {
		var res = this.REG_PRICE;
		
		if(parseInt(price.regular) > parseInt(price.saleSpecial)){
			var matchStr = /[0-9]9$/i.exec(price.saleSpecial);
			if (matchStr) {
				// Sale price condition match
				res = this.SALE_PRICE;
			} else{
				// Special price condition
				res = this.SPECIAL_PRICE;
			}
		}
		return res;
	},
	handleSwatchOnMouseOver: function(sourceNode){
		this._currentlyHovering = true;
		this._setNodeHighlight(sourceNode);
		var altname = sourceNode.alt;
		this._setSwatchTitle(altname);
	},
	_setNodeHighlight: function(node){
		addClass(node, "on");
	},
	handleSwatchOnMouseOut: function(sourceNode){
		this._handleHighlightMouseOut(sourceNode);
		
		this._currentlyHovering = false;
		//reset the altText back to current, after a 1000ms timer
		if (this.timerId != -1) {
			window.clearTimeout(this.timerId);
		}
		this.timerId = setTimeout(dojo.hitch(this, function(){
			if(this._currentlyHovering == false)
				this._setSwatchTitle(this.currentText);
		}), 1000);
	},
	_handleHighlightMouseOut: function(node){
		if(this._clickedHighlightNode == node)
			return;
		removeClass(node, "on");
	},
	_setSwatchTitle: function(newTitle){
		var swatchTitle = dojo.byId('swatchTitle');
		if(swatchTitle)
			swatchTitle.innerHTML = newTitle;
	},	
	handleAltViewOnClick: function(sourceNode, skuImgSrc, skuImgAlt, requestUrl, altImageNumber, pipItem, previewUrl){
		this._handleHighlightClick(sourceNode);		

		this.swapHeroImage(sourceNode, skuImgSrc, altImageNumber, true, requestUrl);
		
		if (requestUrl){ 
			if ( dojo.byId('viewLargerButton') ) {
				dojo.byId ('viewLargerButton').href = 'javascript:heroPopup.show(\'' + requestUrl + '\')';
			}
		}
		
		if ( dojo.byId('swatchTitle') ) {
			this._setSwatchTitle(this.initText);
			
			//reset the current text as we now have the altImage shown....
			this.currentText = this.initText;
		}
		
		var previewToolBoxButtonNode = dojo.byId('previewboxid');
		if(previewToolBoxButtonNode) {
			previewToolBoxButtonNode.href =  'javascript:pipController.showPopupByUrl(\'' + previewUrl + '\')';
		}
		
		cmCreatePageElementTag(altImageNumber, pipItem); 
		cmCreateManualLinkClickTag(pipItem, altImageNumber);
	},
	handleAltViewOnMouseOut: function(sourceNode){
		this._handleHighlightMouseOut(sourceNode);
	},
	handleAltViewOnMouseOver: function(sourceNode){
		this._setNodeHighlight(sourceNode);
	},
	_handleHighlightClick: function(sourceNode){
		this._removeNodeHighlight(this._clickedHighlightNode);
		this._clickedHighlightNode = sourceNode;
		this._setNodeHighlight(sourceNode);
	},
	_removeNodeHighlight: function(node){
		if(this._clickedHighlightNode == null)
			return;
		removeClass(node, "on");
	},
	_generateXMLRequestFromForm: function(form){
		var productNumber = 1;
		var itemNode, needGiftWrap, shipToInfo;
		while(productNumber <= productMap.products.productSet.length){
			if ((form["skuid" + productNumber].value != "") && (form["skuquantity" + productNumber].value != "")) {
				itemNode = this._xml.createElement("item");
				itemNode.appendChild(this._createXMLNodeWithTextValue("sku", form["skuid" + productNumber].value));
				// commented to display back order interstitial page.
				/*if(form["backorder_product" + productNumber].value != "")
					itemNode.appendChild(this._createXMLNodeWithTextValue("backorderinfo", form["backorder_product" + productNumber].value));*/
				itemNode.appendChild(this._createXMLNodeWithTextValue("quantity", form["skuquantity" + productNumber].value));
				if(form["catalog" + productNumber ])
					itemNode.appendChild(this._createXMLNodeWithTextValue("catalog", form["catalog" + productNumber ].value));
				this._xml.getElementsByTagName("items")[0].appendChild(itemNode);
			}
			productNumber++;
		}
		
		//check shipTo value
		if(dojo.query('.shipTo').length > 0)
			shipToInfo = dojo.query('.shipTo')[0].value;
		if(shipToInfo) {
			this._xml.getElementsByTagName("shiptoinfo")[0].appendChild(this._xml.createTextNode(shipToInfo));
		}
		
		this._setGiftWrapForXMLRequest();
		if (dojo.byId('giftwrap') ) {
			this._xml.getElementsByTagName("addtocartrequest")[0].appendChild(this._createXMLNodeWithTextValue("wrapany", dojo.byId('giftwrap').value));
		}
		
		if (dojo.byId('cmsrc') ) {
			this._xml.getElementsByTagName("cmsrc")[0].appendChild(this._xml.createTextNode(dojo.byId('cmsrc').value));
		}
        if (dojo.byId('cmgid') ) {
			this._xml.getElementsByTagName("cmgid")[0].appendChild(this._xml.createTextNode(dojo.byId('cmgid').value));
		}
		if (dojo.byId('isgiftcard')) {
			this._xml.getElementsByTagName("isgiftcard")[0].appendChild(this._xml.createTextNode(dojo.byId('isgiftcard').value));
		}
		if(dojo.byId('h_added')){
			this._xml.getElementsByTagName("shopeditskus")[0].appendChild(this._xml.createTextNode(dojo.byId('h_added').value));
		}
		
		if(dojo.byId('jc_skuid') && (dojo.byId('jc_skuid').value != "")){
			var itemNode = this._xml.createElement("item");			
			var monoNode = this._xml.createElement("monograminfo");
			itemNode.appendChild(this._createXMLNodeWithTextValue("sku", dojo.byId('jc_skuid').value));
			itemNode.appendChild(this._createXMLNodeWithTextValue("quantity", dojo.byId('jc_quantity').value));
			itemNode.appendChild(monoNode);
			monoNode.appendChild(this._createXMLNodeWithTextValue("monoapplyall", 0));
			var seq = this._xml.createElement("seqmonogram");
			seq.appendChild(this._createXMLNodeWithTextValue("monogramseqnum", 1));
			var monoString = dojo.byId('jc_color').value.toUpperCase() + "|" + dojo.byId('jc_style').value + "|" + dojo.byId('jc_intial1').value + "|" + dojo.byId('jc_intial2').value + "|" + dojo.byId('jc_intial3').value;
			seq.appendChild(this._createXMLNodeWithTextValue("monogramseqinfo", monoString));
			monoNode.appendChild(seq);
			this._xml.getElementsByTagName("items")[0].appendChild(itemNode);
		}
	},
	_createXMLNodeWithTextValue: function(tagName, textValue){
		var node = this._xml.createElement(tagName);
		var textNode = this._xml.createTextNode(textValue);
		node.appendChild(textNode);
		return node;
	},
	_sendXMLToRIAService: function(){
		//generate an xmlString from this._xml
		var xmlStr;
		if(dojo.isIE){
			xmlStr = this._xml.xml;
		}else{
			var s = new XMLSerializer();
			xmlStr = s.serializeToString(this._xml);
		}
		var self = this;
		dojo.xhrPost({
			handleAs: "xml",
			url: "/services/wh/shoppingcart",
			content: { "p_xml": xmlStr },
			handle: function(res, ioArgs){
				if(dojo._isDocumentOk(ioArgs.xhr)){
					self._processXMLResponse(res);
					self._resetBaseXMLRequest();
					return true;
				}else{
					console.debug("xml_to_ria failed."); 
					return false; 
				}		
			},
			sync: true
		});
	},
	_setBasketCount: function(totalQuantity){
		var basketCount = dojo.byId("basketCount");
		if(basketCount)
			basketCount.innerHTML = totalQuantity;

		var basketItemsText = dojo.byId("basketItemsText");	
		if (basketItemsText) {
			if (totalQuantity == 1)
				basketItemsText.innerHTML = "item";
			else if (totalQuantity > 1)
				basketItemsText.innerHTML = "items";
		}

		var cartCount = dojo.byId('cart-count');
		if (cartCount)
			cartCount.style['display'] = totalQuantity > 0 ? "" : "none";		
	},
	_processXMLResponse: function(xml){
		//check xml for typeof Document
		if(typeof xml != 'object')
			xml = dojox.data.dom.createDocument(xml);	
			
		//check xml for instance of 'pageid' node
		if (xml.getElementsByTagName("pageid").length > 0) {
			console.debug(xml.getElementsByTagName("pageid"));
			// A pageid was in the xml, submit the page and it will take the user to the interstitial pages
			var transactionId = xml.getElementsByTagName("transactionid");
			dojo.byId("transactionid").value = (transactionId.length > 0) ? transactionId[0].value : "-1";
			this.setHiddenValues();
			var formObj = dojo.byId('pipform');
			formObj.method = "post";
			formObj.submit();
			return;
		}
			
		var totalItemQuantity = xml.getElementsByTagName("totalquantity")[0].firstChild.nodeValue;
		this._setBasketCount(totalItemQuantity);
		
		var dialog = dijit.byId('dialog0');
		dialog.renderFromXML(xml);
		dialog.show();
		
		
	},
	showSkuErrors:  function(errorObj) {
		var errorContainer, divContainer, timeout = null;
		var i=0;
		var skuWiseDomIdFragment;
		var messageId; 
		var skuWiseErrorContainer;

		// has kept j in decreasing order for a special purpose -Abbas
		for(var j=(errorObj.length-1) ; j >=0; j--){
			messageId = errorObj[j].messageID;
			skuWiseDomIdFragment = errorObj[j].id.id;
			skuWiseErrorContainer= dojo.byId("SkuWiseErrorContainer_" + skuWiseDomIdFragment);
			skuWiseErrorContainer.innerHTML = skuWiseErrorContainer.innerHTML + this.getErrorMessageByMessageId(messageId)  + "<br />"; 
			this._shownSkuWiseErrorCount++;
			i++;
		}
	},
	_getErrorMsgHeight: function(objectHandle,messageId){
		if(!(dojo.byId('isFromSQ') && dojo.byId('isFromSQ').value =="1")){
			return 10;
		}
		if(objectHandle.getErrorMessageByMessageId(messageId).length > 73){
			return 20;
		}else {
			return 10;
		}
	},
	_createErrorContainerDiv: function(errorMessage, id){
		var span = document.createElement("span");
		if(id != null)
			span.setAttribute('id', id);	
		span.appendChild(document.createTextNode(errorMessage));
			
		return span;
	},
	getErrorMessageByMessageId: function(messageId){
		return ErrorMap[messageId];
	},
	showGeneralError: function(areSkuErrors) {
		var generalErrorPip = this.getErrorMessageByMessageId("qtyreq");
		var errorSkuWise = this.getErrorMessageByMessageId("errattn");
		var errorMessage = "";
		if(areSkuErrors){
			errorMessage = errorSkuWise;
		} else {
			errorMessage =generalErrorPip;
		} 
		
		var prodObjGEn = dojo.byId("PageWiseErrorContainer");
		//used on the SQ
		if(prodObjGEn == undefined)
			prodObjGEn = dojo.query(".productError")[0];
		//prodObjGEn.style["height"] =20;
		prodObjGEn.innerHTML ='';
		var container = document.createElement("div");
			
		setClass(container, "errorMsg");
		container.appendChild(document.createTextNode(errorMessage));
		prodObjGEn.appendChild(container);
		self.scrollTo(0,0);
	},
	_fadeOutSkuError: function(productNumber){
		clearTimeout(this._fadeTimeout);
		this._shownSkuWiseErrorCount--;
		this._fadeTimeout = setTimeout(function(){
			var anim = dojo.fadeOut({ node: dojo.byId('SkuWiseErrorContainer_product' + productNumber), duration: 1000 }).play();
			dojo.connect(anim, "onEnd", null, function(){
				var skuWiseErrorContainer =	dojo.byId('SkuWiseErrorContainer_product' + productNumber);							   				
				removeChildren(skuWiseErrorContainer);
			
				dojo._setOpacity(skuWiseErrorContainer, "1.0");
			});
		}, 500);	
	},
	_fadeOutPageError: function(){
		if(this._shownSkuWiseErrorCount  >0){
			return;
		}
		clearTimeout(this._fadeTimeoutPageWise);
		this._fadeTimeoutPageWise = setTimeout(function(){
			var anim = dojo.fadeOut({ node: dojo.byId("PageWiseErrorContainer"), duration: 1000 }).play();
			dojo.connect(anim, "onEnd", null, function(){
			var pageWiseErrorContainer =	dojo.byId("PageWiseErrorContainer");
			removeChildren(pageWiseErrorContainer);
			dojo._setOpacity(pageWiseErrorContainer, "1.0");
			});
		}, 500);	
	},
	
	removeErrors: function() {
		var genErrorContainer = dojo.byId("PageWiseErrorContainer");
		if(genErrorContainer) {
			removeChildren(genErrorContainer);
		}
		var productList = productMap.products.productSet;
		for(prodCnt =1;prodCnt <= productList.length; prodCnt = prodCnt + 1)
		{
			var skuErrorContainer = dojo.byId("SkuWiseErrorContainer_product" + prodCnt );
			removeChildren(skuErrorContainer);
		}
	},
	_handleAddToCartGiftGiver: function(sourceElem){
		try
		{	
			
			this.removeErrors();
			var validator = new PipFormValidator(this);
			if(!validator._isFormValid(dojo.byId('pipform'))) {
				return false;
			}
			
			
			document.pipform.submit();
		}catch(err){
			console.debug("error addtoCartXML");			
		}
		return false;
	},
	setDynMonoSkuAndQunatity:function (sku, quantity){
		var products = productMap.products.productSet;
		for(productCount =0;productCount < products.length; productCount++){
			var foundAtInfo = this._productDatasetLookup.searchDataSetForSku(products, sku, 1, null,productCount);
			if((foundAtInfo["wasFound"]) && (foundAtInfo["wasFound"] == true)){
				break;
			}
		}
		if(dojo.byId("sku_product" + (productCount+ 1)) && dojo.byId("qty_product" + (productCount+1)))
		{
			dojo.byId("sku_product" + (productCount+ 1)).value =sku;
			dojo.byId("qty_product" + (productCount+ 1)).value =quantity;
			
		}
	},
	_handleAddToCart: function(sourceElem){
		try
		{
			
			this.removeErrors();
			var validator = new PipFormValidator(this);
			if(!validator._isFormValid(dojo.byId('pipform'))) {
				return false;
			}
			
			
			this._generateXMLRequestFromForm(dojo.byId('pipform'));		
			this._sendXMLToRIAService();	
		}catch(err){
			console.debug("error addtoCartXML");			
		}
		return false;
	},
	_setGiftWrapForXMLRequest: function(){
		var giftWrapCheckBoxes = dojo.query('.giftWrap');
		if(giftWrapCheckBoxes.length > 0){
			var tempCheckBox = giftWrapCheckBoxes[0];
			if(tempCheckBox.checked) 
				if(dojo.byId('triggerGiftWrapMState') && (dojo.byId('triggerGiftWrapMState').value =="1")){
					dojo.byId('giftwrap').value ='M';
				} else
				{
					dojo.byId('giftwrap').value ='X';
				}
			else
				dojo.byId('giftwrap').value ='0';
		}
	},
	/* tgilbert: commenting this out in favor of PB version below
	checkAllGiftWrap: function(srcObj, partialFldStr) {
		dojo.query('.giftWrap').forEach( 
			function(item){ 
				if(item != srcObj)
					item.checked = !item.checked;
			}
		);
	},*/
	checkAllGiftWrap: function(srcObj, partialFldStr) {
		//this._setPipFormValues(productNumber, dataSet, sku);
		var mark =  (!isEmpty(srcObj) && srcObj.checked == true) ? 1:0;
		if(!this._clickGiftWrapCheckBoxCMOnce){
			cmCreatePageElementTag('GWCheckbox', 'GiftWrap_shipto_Section'); 
			this._clickGiftWrapCheckBoxCMOnce=true;
		}
		return this.checkAllGiftWrap_Helper(mark,partialFldStr);
	},
	checkAllGiftWrap_Helper: function(checkboxState,partialFldStr){
		var triggerGiftWrapMState_value = "0";
		if(dojo.byId('triggerGiftWrapMState')){
			triggerGiftWrapMState_value =dojo.byId('triggerGiftWrapMState').value;
		}
		if(checkboxState){
			if(triggerGiftWrapMState_value =="1"){
				dojo.byId('giftwrap').value ='M';
			} else
			{
				dojo.byId('giftwrap').value ='X';
			}
		} else {
			dojo.byId('giftwrap').value ='0';
		}
		var missingFld = new Array();
		var foundFlag = false;
		
		var productList = productMap.products.productSet;
		for (var i=0; i< productList.length; i++) {
			var fldId = partialFldStr + productList[i].id;
			if (!isEmpty(dojo.byId(fldId))) {
				dojo.byId(fldId).checked = checkboxState;
				foundFlag = true;
			}
			else {
				missingFld.push(fldId);
			}
		}
		if (!foundFlag) {
			var str = missingFld.join("\n");
			return "The following fields were not found:\n" + str;
		}
		else {
			return true;
		}
	},
	
	checkAllRegistry: function(srcObj, partialFldStr) {
		var mark =  (!isEmpty(srcObj) && srcObj.checked == true) ? 1 :0;
		this.checkAllRegistry_Helper(mark,partialFldStr,srcObj.value);
	},
	checkAllRegistry_Helper: function(radiostate,partialFldStr,value){
		dojo.byId('registry').value = value;
		var missingFld = new Array();
		
		var productList = productMap.products.productSet;
		for (var i=0; i< productList.length; i++) {
			var fldId = partialFldStr + productList[i].id;
			if (!isEmpty(dojo.byId(fldId))) {
				dojo.byId(fldId).checked = radiostate;
			}
			else {
				missingFld.push(fldId);
			}
		}
	},
	selectAllShipTo: function(srcObj, partialFldStr) {
		if(!this._clickshiptoCheckBoxCMOnce){
			cmCreatePageElementTag('shipto', 'GiftWrap_shipto_Section'); 
			this._clickshiptoCheckBoxCMOnce=true;
		}
		var selectedIndex =  (!isEmpty(srcObj)) ? srcObj.selectedIndex : 0;
		dojo.byId('shipto').value = srcObj.value;
		var missingFld = new Array();
		var foundFlag = false;
		
		var productList = productMap.products.productSet;
		for (var i=0; i< productList.length; i++) {
			var fldId = partialFldStr + productList[i].id;
			if (!isEmpty(dojo.byId(fldId))) {
				dojo.byId(fldId).selectedIndex = selectedIndex;
				foundFlag = true;
			}
			else {
				missingFld.push(fldId);
			}
		}
		
		if (!foundFlag) {
			var str = missingFld.join("\n");
			return "The following fields were not found:\n" + str;
		}
		else {
			return true;
		}
	},
	setHiddenValues: function() {
		var productArr = productMap.products.productSet;
		var formObj = dojo.byId('pipform');
		/*
		if (!isEmpty(dojo.byId("giftwrap")) && !isEmpty(dojo.byId("wrapany"))) {
			dojo.byId("wrapany").value = (dojo.byId("giftwrap").checked) ? "1" : "0";
		}
		*/
		
		if (!isEmpty(dojo.byId("pip_shipto")) && !isEmpty(dojo.byId("shipto"))) {
			dojo.byId("shipto").value = dojo.byId("pip_shipto").value;
		}
		
		if(!isEmpty(formObj["registry"]) && !isEmpty(dojo.byId("shiptooption"))) {
			var radioEl = formObj["registry"];
			var registryValue = "";
			
			if (!isEmpty(radioEl) && radioEl.length > 0) {
				for (var i=0; i<radioEl.length; i++) {
					if (radioEl[i].checked) {
						registryValue = radioEl[i].value;
						break;
					}
				}
			}
			dojo.byId("shiptooption").value = registryValue;
		}
	},
	_clearDropDownValuesAndDisable: function(selectElem){
		removeChildren(selectElem);
		selectElem.disabled = true;	
	},
	_handleRiaCloseEvent: function(evt){
		var products = productMap.products.productSet;
		var select, div;
		
		dojo.query(".shipTo").forEach("item.selectedIndex = 0;");
        dojo.query(".giftWrap").forEach("item.checked = false;");
		dojo.query(".qtyBox").forEach("item.value = '';");
		dojo.query(".attr2").forEach("item.selectedIndex = 0;");
		dojo.query(".attr3").forEach(function(selectElem) {
			this._clearDropDownValuesAndDisable(selectElem);
		}, this);
		dojo.query(".attr4").forEach(function(selectElem) {
			this._clearDropDownValuesAndDisable(selectElem);
		}, this);
		
		dojo.query(".priceHook").forEach("item.innerHTML = '';");
		dojo.query(".specialAlerts").forEach("item.innerHTML = '';");
		if (dojo.byId("h_added")) {
			dojo.byId("h_added").value ="";
   		}
	
		if (dojo.byId("h_ls")) {
			dojo.byId("h_ls").value ="";
   		}
		if (dojo.byId("shipto")) {
			dojo.byId("shipto").value ="You";
   		}
		if(dojo.byId('triggerGiftWrapMState')){
			dojo.byId('triggerGiftWrapMState').value ="0";
		}
		if(dojo.byId('giftwrap')){
			this.checkAllGiftWrap_Helper(false,'giftwrap_');
		}
		if(dojo.byId('registry')){
			this.checkAllRegistry_Helper(true,'registryNo_','');
		}
	},
	showEmailPopup: function(url){
		if(url)
			window.open(url, "emailPopup", "width=470,height=675,status=yes,resizable=no,scrollbars=yes");
	},
	showPrintPopup: function(url){
		if(url)
			window.open(url, "printPopup", "width=640,height=560,status=yes,resizable=no,scrollbars=yes"); 
	},
	_connectEventsForPriceSurchargeTooltip: function(node){
		dijit.byId('priceSurchargeTooltip')._connectNodes.push(node);
		dojo.forEach(["onMouseOver", "onMouseOut", "onFocus", "onBlur", "onHover", "onUnHover"], function(event){
			dijit.byId('priceSurchargeTooltip').connect(node, event.toLowerCase(), "_"+event);
		}, dijit.byId('priceSurchargeTooltip'));
	},
	showProductInfoTabs: function(){
		if(dojo.query('.product-info-tabs-loading').length < 1)
			return;
		dojo.query('.product-info-tabs-loading')[0].style["display"] = "none";
        if(dojo.query('.product-info-tabs').length < 1)
            return;
		dojo.query('.product-info-tabs')[0].style["opacity"] =  0;
		dojo.query('.product-info-tabs')[0].style["visibility"] =  "visible";
		dojo.fadeIn({ node: dojo.query('.product-info-tabs')[0], duration: 50}).play();
	}
});

dojo.declare("ProductDatasetLookup", null, {
	searchDataSetForSku: function(dataSet, sku, depth, foundAtInfo,prodCnt){
		if(foundAtInfo == null)
			foundAtInfo = {};
			
		if (dataSet[prodCnt].sku && (dataSet[prodCnt].sku == sku)) {
			foundAtInfo["depth" + depth + "_index"] =prodCnt + 1;
			foundAtInfo["wasFound"] = true;
					}
		else {
			if (dataSet[prodCnt]["attr" + (depth + 1)]) {
				foundAtInfo["depth" + depth + "_index"] = prodCnt + 1;
				foundAtInfo = this._searchDataSetForSkuHelper(dataSet[prodCnt]["attr" + (depth + 1)], sku, depth + 1, foundAtInfo);
			}
		}
		return foundAtInfo;
	},
	_searchDataSetForSkuHelper: function(dataSet, sku, depth, foundAtInfo){
		//if we already found our value, recurse out.
		if(foundAtInfo["wasFound"] && (foundAtInfo["wasFound"] == true))
			return foundAtInfo;
			
		for(var i = 0; i < dataSet.length; i++){
			if (dataSet[i].sku && (dataSet[i].sku == sku)) {
				foundAtInfo["depth" + depth + "_index"] = i+1;
				foundAtInfo["wasFound"] = true;
				
				break;
			}
			else {
				if (dataSet[i]["attr" + (depth + 1)]) {
					foundAtInfo["depth" + depth + "_index"] = i+1;
					foundAtInfo = this._searchDataSetForSkuHelper(dataSet[i]["attr" + (depth + 1)], sku, depth + 1, foundAtInfo);
					//if we already found our value, break out.
					if(foundAtInfo["wasFound"] && (foundAtInfo["wasFound"] == true))
					{
						
						break;
					}
				}	
			}
		}
		return foundAtInfo;
	}	
});

dojo.declare("PipFormValidator", null, {
	constructor: function(controller){
		this._controller = controller;
	},
	_controller: null, /* TODO: refactor to remove coupling here. - CS */
	// Error Handling Constants 
	NO_DROPDOWN   : 0,
	NONE_SELECTED : 1,
	ANY_SELECTED  : 2,
	ALL_SELECTED  : 3,
	
	NO_TEXTFIELD      : 0,
	EMPTY_TEXTFIELD   : 1,
	VALID_TEXTFIELD   : 2,
	INVALID_TEXTFIELD : 3,
	
	_isFormValid :function(form){
		var productList = productMap.products.productSet;
		var Skuerror= new Array();
		var skuWiseError =false;
		var anyValidRow =false;
		var registrantError =false;
		var dropDownState ="";
		var textBoxState ="";

		if(form["shipto"] || form["registry"]) {
			if(form["shipto"].value == "Registrant" && (form["registry"]) &&   form["registry"].value ==""){
				registrantError=true;
				Skuerror.push({"id": productList[0], "messageID": "shiptoregbad"});
			}		
		}		
		
		for (var i=1; i<=productList.length; i++) {
			var errorType ="";
			textBoxState = this._getTextBoxState(form,i);
			dropDownState =this._getDropDownState(form,i);
			if(this._isTextBoxStateNoTextBox(textBoxState) || (this._isTextBoxStateEmpty(textBoxState) && (this._isDropDownStateNoDropDown(dropDownState) || this._isDropDownStateNoneSelected(dropDownState))) ){
				continue;
			}
			if(this._isTextBoxStateValid(textBoxState) && (this._isDropDownStateNoDropDown(dropDownState) || this._isDropDownStateAllSelected(dropDownState)) ){
				anyValidRow = true;
				continue;	
			}
			if((this._isDropDownStateAnySelected(dropDownState) && (this._isTextBoxStateEmpty(textBoxState)  || this._isTextBoxStateInValid(textBoxState) )) || (this._isDropDownStateNoneSelected(dropDownState)  && this._isTextBoxStateInValid(textBoxState))){
				errorType ="qtyreq";
				skuWiseError=true;
			}
			if((this._isDropDownStateAllSelected(dropDownState) && (this._isTextBoxStateEmpty(textBoxState)  || this._isTextBoxStateInValid(textBoxState))) || (this._isDropDownStateNoDropDown(dropDownState)  && this._isTextBoxStateInValid(textBoxState))){
				errorType ="qtybad";
				skuWiseError=true;
			}
			if(this._isTextBoxStateValid(textBoxState) && (this._isDropDownStateNoneSelected(dropDownState) || this._isDropDownStateAnySelected(dropDownState)) ){
				errorType ="seldropdown";
				skuWiseError=true;
			}
			Skuerror.push({"id": productList[i-1], "messageID": errorType});
		}
		
		if(Skuerror.length == 1 && registrantError && !skuWiseError && !anyValidRow){
			Skuerror.push({"id": productList[0], "messageID": "qtyreq"});
		}
		if (Skuerror.length > 0 || Skuerror.length ==0 && !anyValidRow) {
			
			if(Skuerror.length >0){
				this._controller.showSkuErrors(Skuerror);
				this._controller.showGeneralError(true);
			} else {
				this._controller.showGeneralError(false);
			}
			return false;	
		}  else {
			return true;
		}
	},
	_isTextBoxStateEmpty :function(textBoxState){
		return (textBoxState == this.EMPTY_TEXTFIELD);
	},
	_isTextBoxStateNoTextBox :function(textBoxState){
		return (textBoxState == this.NO_TEXTFIELD);
	},
	_isTextBoxStateValid  :function(textBoxState){
		return (textBoxState == this.VALID_TEXTFIELD); 
	},
	_isTextBoxStateInValid  :function(textBoxState){
		return (textBoxState == this.INVALID_TEXTFIELD);
	},
	_isDropDownStateNoneSelected  :function(dropDownState){
		return (dropDownState == this.NONE_SELECTED);
	},
	_isDropDownStateNoDropDown  :function(dropDownState){
		return (dropDownState == this.NO_DROPDOWN);
	},
	_isDropDownStateAnySelected  :function(dropDownState){
		return (dropDownState == this.ANY_SELECTED);
	},
	_isDropDownStateAllSelected  :function(dropDownState){
		return (dropDownState == this.ALL_SELECTED);
	},
	_getDropDownState :function(form, productNumber){
		if(!dojo.byId('product' + productNumber + '_attr2')){
			return this.NO_DROPDOWN;
		} 
		if(dojo.byId('product' + productNumber + '_attr2').value == "")
		{
			return this.NONE_SELECTED;
		}
		
		for(var attrInteger =3 ;attrInteger  < 5; attrInteger++)
		{
			if(dojo.byId('product' + productNumber + '_attr' + attrInteger) && dojo.byId('product' + productNumber + '_attr' + attrInteger).value == ""){
				return this.ANY_SELECTED;
			} 
		}
		return this.ALL_SELECTED;
	},
	_getTextBoxState :function(form, productNumber){
		if(!dojo.byId('qty_product' + productNumber)){
			return this.NO_TEXTFIELD;
		}
		if(dojo.byId('qty_product' + productNumber).value ==""){
			return this.EMPTY_TEXTFIELD;
		}
		if(isNumeric(parseInt(dojo.byId('qty_product' + productNumber).value,10)) && parseInt(dojo.byId('qty_product' + productNumber).value,10) >0 && parseInt(dojo.byId('qty_product' + productNumber).value,10) < 100){
			return this.VALID_TEXTFIELD;
		}
		return this.INVALID_TEXTFIELD;
	},
	
	handleAltViewOnMouseOut: function(sourceNode){
		dojo.addClass(sourceNode, "altHighlight");
	},
	
	handleAltViewOnMouseOver: function(sourceNode){
			removeClass(sourceNode, "altHighlight");
	}
});
