function getElementsByClassName(node, classname){
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}

var colorArray = new Array();
var commonImages = new Array();
var currItemBackordered = false;
var gebc = getElementsByClassName;

commonImages[0] = new Image();
commonImages[0].src = '/anf/images/buttons/B-itemAdded-' + CONSTANTS.IMGLANGSUFFIX + '.gif';
commonImages[1] = new Image();
commonImages[1].src = '/anf/images/buttons/B-processing-' + CONSTANTS.IMGLANGSUFFIX + '.gif';     
commonImages[2] = new Image();
commonImages[2].src = '/anf/images/buttons/B-qtyUnavailable-' + CONSTANTS.IMGLANGSUFFIX + '.gif';
commonImages[3] = new Image();
commonImages[3].src = '/anf/images/buttons/B-viewBag-' + CONSTANTS.IMGLANGSUFFIX + '.gif';
commonImages[4] = new Image();
commonImages[4].src = '/anf/images/buttons/B-addToBag-' + CONSTANTS.IMGLANGSUFFIX + '.gif';


function hasClass(el, className) {
	var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
    return re.test(el.className);
}
function addClass(el, className) {
	if (hasClass(el, className)) { return; } // already present
	el.className = [el.className, className].join(' ');
}
function removeClass(el, className){
    var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', 'g');
	if (!hasClass(el, className)) {
		return; // not present
	}                 
	var c = el.className;
    el.className = c.replace(re, ' ');
    if ( hasClass(el, className) ) { // in case of multiple adjacent
        removeClass(el, className);
    }
}
function colorObj(seq,name,oprice,lprice,copy,image,skus){  
	this.seq = seq;  
	this.name = name; 
	this.oprice = oprice; 
	this.lprice = lprice; 
	this.copy = copy;
	this.image = image;
	this.skus = skus
}
function skuObj(sku,catentry,size,seq,backdate,backordered){  
	this.sku = sku;  
	this.catentry = catentry; 
	this.size = size; 
	this.seq = seq;
	this.backdate = backdate;
	this.backordered = backordered;
}
function customSort(a,b){
   return(a.seq-b.seq);
}
function customSizeSort(a,b){
    if(a.sizeseq > b.sizeseq){return 1}
    if(a.sizeseq < b.sizeseq){return -1}
    return 0
}
var productObject = function(o) {
	this.colorArray = o.colorArray || null;
	this.template = o.template || null;
	this.view = o.view || null;
	this.productCopy = o.productCopy || null;
	this.productId = o.productId || null;
	this.collection = o.collection || null;
	this.selectedColor = o.selectedColor || '01';
	this.price = o.price || null;
	this.viewLarger = o.viewLarger || null;
	this.highlightSwatch = null;
	this.oneSize = o.oneSize || null;
	this.sizeChart = o.sizeChart || '0';
	
	this.chngColor = function(e, po){
		var t = e.target || e.srcElement;
		if(t.tagName.toUpperCase().indexOf('SELECT') > -1){
			if(t.name.indexOf('sizelist') > -1){
				po.selectedColor = t.options[t.selectedIndex].value;
				po.setColor(po);
			}else{
				//po.getVBImg(po);
			}

			$("#AddToBag").css('cursor','pointer').attr('src',commonImages[4].src);
			//gebc(po.pn, 'AddToBag')[0].style.cursor = 'pointer';
			//gebc(po.pn, 'AddToBag')[0].src = commonImages[4].src;
		}
	}	
	this.clickHandler = function(e){
		var t = e.target || e.srcElement, po = null, pn = t.parentNode;
		while(pn.tagName.toLowerCase() != 'body'){
			if(hasClass(pn, 'productDiv')){
				po = pn.po;
				break;
			}else{
				pn = pn.parentNode
			}
		}
		
		if(hasClass(t,'colorSwatch')){
			po.selectedColor = t.id.split('_')[2];
			po.setColor(po);
		}else if(hasClass(t, 'AddToBag')){
			po.addToBag(po);
		}else if(hasClass(t, 'addToWishLink')){
			po.addToWishList(po);
		}else if(hasClass(t, 'sizeChartLink')){
			po.openSizeChart(po);
		}else if(hasClass(t, 'emailAFriendImg')){
			po.emailAFriend(po);
		}else{
			return true;
		}
	}	
	this.addToBag = function(po){
		$("#productDiv_"+po.productId).find("#bagAddError").html(' ');
		var f = po.form, currItemBackordered = false;
		if((!po.oneSize) && (f.size.options && f.size.selectedIndex == 0)) {
			$("#productDiv_"+po.productId).find("#bagAddError").html(CONSTANTS.PRODUCT_ERROR_PLEASESELECTSIZE);
			return false;
		} else if((template == 'v') && (f.sizelist && f.sizelist.value == '')){
			$("#productDiv_"+po.productId).find("#bagAddError").html(CONSTANTS.PRODUCT_ERROR_PLEASESELECTSTYLE);		
			return false;
		} else if ( $("#AddToBag").attr('src') == commonImages[2].src || $("#AddToBag").attr('src') == commonImages[0].src) {
			return;
		} else {
			var catentry = f.size.value;
			for(var y = 0; y != po.colorArray.length; y++){
				if(po.colorArray[y].name == f.color.value){
					for(var t = 0; t != po.colorArray[y].skus.length; t++){
						if (po.colorArray[y].skus[t].catentry == catentry){
							f.partnumber.value = po.colorArray[y].skus[t].sku;
							currItemBackordered = po.colorArray[y].skus[t].backordered;
							break;
						}
					}
				}
			}
	        
			f.catEntryId.value = catentry;
			f.URL.value = '/anf/onlinestore/html/blank1.html';
			$("#AddToBag").attr('src',commonImages[1].src);
			//gebc(po.pn,'AddToBag')[0].src = commonImages[1].src; // Processing ...
	       	
	       	if (po.oneSize){
	   			var oiSize = f.size.value;
			} else {
				var oiSize = f.size[f.size.selectedIndex].text;
			}
	       	
	       	var params = {
	       		"storeId":globalStoreId,
	       		"langId":-1,
	       		"catalogId":globalCatalogId,
	       		"URL":'OrderCalculate?calculationUsageId=-1&URL=ShopRestrict',
	       		"catEntryId":f.catEntryId.value,
	       		"partnumber":f.partnumber.value,
	       		"color":f.color.value,
	       		"quantity":1,
	       		"size":oiSize
	       		};

			$.ajax({
				url: '/webapp/wcs/stores/servlet/OrderItemAdd',
				data: params,
				dataType: "xml",
				method: f.method,
				success: function(response) {
	       			if($(response).find("wasItemAdded").text() === 'true'){
			            $.ajax({
			            	url: '/webapp/wcs/stores/servlet/MiniOrderItemDisplay',
			       			dataType: "xml",
			            	success: function(r) { 	xmlDoc = r; makeCart('add'); }
			            });
			        }else{
			        	alert($(response).find("statusMsg").text());
			        	$("#AddToBag").attr('src',commonImages[2].src);
						//gebc(po.pn,'AddToBag')[0].src=commonImages[2].src; // Failed to bag the item(s) ...
			        }
			    }
	       	});	       	
		}
	}		
	this.openSizeChart = function(po){
		var newString = new String(po.colorArray[0].skus[0].sku)
		var skuDept = parseInt(newString.substr(1,2))
		window.open('/anf/onlinestore/html/sizechart2.html?sizeChartCode=' + po.sizeChart,'sizechart','scrollbars=no,width=470,height=450')
	}	
	this.openZoom = function(po){
		var alphaList = '', colorName = '', coll = po.collection;
		for(var u = 0; u != po.colorArray.length; u++){
			alphaList += parseInt(po.colorArray[u].seq) + ':';
			colorName += po.colorArray[u].name + ':';
		}
		colorName = colorName.replace('&','and');
		colorName = colorName.replace('\'',' ');
		
		if(po.template == 'h'){
			window.open('/anf/onlinestore/html/zoom2.html?alphaList=' + alphaList + '&attrTemplate=' + po.template + '&prnbr=' + coll + '&colors=' + colorArray.length + '&zoom=' + po.view + '&colorName=' + colorName + '&current=' + parseInt(po.selectedColor,10) + '&formSuffix=_' + po.productId + '','product','scrollbars=no,width=625,height=700,top=0,screenY=0,left=0,screenX=0');
		} else {
			window.open('/anf/onlinestore/html/zoom2.html?alphaList=' + alphaList + '&attrTemplate=' + po.template + '&prnbr=' + coll + '&colors=1&zoom=' + po.view + '&colorName=' + colorName + '&current=1&formSuffix=_' + po.productId,'product','scrollbars=no,width=625,height=700,top=0,screenY=0,left=0,screenX=0');
		}
	}		
	this.getVBImg = function(po){
		var cartNum = readCookie('myCart');
		var cartParts = cartNum ? cartNum.split(",") : null;
		var num = cartParts ? cartParts[0] : null;
		if(num != '0' && cartNum != null){
			var pds = gebc(document.body, 'productDiv');
			for(var x=0; x<pds.length; x++){
				var imgSpan = gebc(pds[x],'vbimg')[0], link = document.createElement('a');
				imgSpan.innerHTML = '';
				link.href = 'javascript:getTopNavLink(globalTopNavLink9)';
				link.innerHTML = '<img src="' + commonImages[3].src + '" class="viewBag" \/>';
				imgSpan.appendChild(link);
			}
		}else{
			return;
		}
	}
	
	this.addToWishList= function(po){
		$("#bagAddError").html(' ');	
		var f = po.form, storeId = globalStoreId, catalogId = globalCatalogId, collection = po.collection, sequence = po.selectedColor;
		if((!po.onesize) && (f.size.selectedIndex == 0)) {
			$("#bagAddError").html(CONSTANTS.PRODUCT_ERROR_PLEASESELECTSIZE);
		} else if((template == 'v') && (document.forms[0].sizelist.value == '')){
			$("#bagAddError").html(CONSTANTS.PRODUCT_ERROR_PLEASESELECTSTYLE);
		} else {
			f.action = '/webapp/wcs/stores/servlet/InterestItemAdd';
			f.URL.value = 'InterestItemDisplay';
			if (po.onesize){
	        	catentry = f.size.value;
	        } else {
	        	catentry = f.size.options[f.size.selectedIndex].value;
	        }
			for(var y = 0; y != po.colorArray.length; y++){
				if(po.colorArray[y].name == f.color.value){
					for(var t = 0; t != po.colorArray[y].skus.length; t++){
						if (po.colorArray[y].skus[t].catentry == catentry){
							f.partnumber.value = po.colorArray[y].skus[t].sku;
							break;
						}
					}
				}
			}
	        f.catEntryId.value = catentry;
			
			$.ajax({
	   			type: "POST",
	   			url: "/webapp/wcs/stores/servlet/InterestItemAdd",
	   			data: $(f).serialize(),
	   			dataType: "xml",
	   			success: function(response) {
	   				if($(response).find('wasItemAdded').text() === 'true') {
			   			window.location = '/webapp/wcs/stores/servlet/InterestItemDisplay';
				    }else{
						$("#bagAddError").html($(response).find('statusMsg').text());
					}
				}				
			});  
		}			
	}	
	this.highlightSwatch = function(po,s){
		if(!s || !po){ return; }
		var sws = gebc(po.pn, 'colorSwatch');
		for(var x = 0; x < sws.length; x++){
			if(sws[x].id == s.id){ addClass(sws[x],'swatchHighlight'); }
			else{ removeClass(sws[x],'swatchHighlight'); }
		}
	}	
	this.setColor = function(po){
		var seq = po.selectedColor, seqPrefix = '', f=po.form;
		if(typeof(seq) != 'string' && seq < 10){ seqPrefix = '0'; }
		
		po.highlightSwatch(po, $old('swatch_'+po.productId+'_'+seq));
		
		for(var y = 0; y < po.colorArray.length; y++){
			if(po.colorArray[y].seq == seq){
				if (po.template != 'v'){
					gebc(po.pn,'productImage')[0].src = po.colorArray[y].image.src;
				}
				var color = po.colorArray[y].name, price = po.colorArray[y].oprice;
				f.color.value = color;
				
				var copy = po.productCopy;
				if (po.colorArray[y].copy != 'null' && po.colorArray[y].copy != ''){
					copy = po.colorArray[y].copy;
				}
				
				if(f.size.tagName.toLowerCase() == 'select'){
					f.size.options.length = 0;
					f.size.options[0] = new Option(CONSTANTS.PRODUCT_SELECTSIZE);
				}
				
				for(var t = 0; t < po.colorArray[y].skus.length; t++){
					if (po.colorArray[y].skus[t].backordered){
						var shipDate = po.colorArray[y].skus[t].backdate, today = new Date(), month = today.getMonth() +1, day = today.getDate();
						if(month <10){ month = "0"+month; }
						if(day<10){ day = "0"+day; }
						var now = today.getFullYear() +""+ month +""+ day;
					}
					if (po.colorArray[y].skus[t].size == 'ONE SIZE'){
						po.oneSize = true;
						var html = '<input type="hidden" name="size" value="'+po.colorArray[y].skus[t].catentry+'" />';
				        if(po.colorArray[y].skus[t].backordered == true){
				        	if(shipDate <= now){ 
				        		html += CONSTANTS.PRODUCT_BACKORDERED + '<br/>'; 
				        	}else{ 
								shipStr = shipDate.substring(4,6) + "/" + shipDate.substring(6,8) + "/" + shipDate.substring(2,4);
				        		html += '<font class="backorder">' + CONSTANTS.PRODUCT_WILLSHIP(shipStr) + '</font><br/>'; 
				        	}
				        }
				        gebc(po.pn,'sizeBox')[0].innerHTML = html;
					} 
					if(!po.oneSize){
						//Set Sizes 
						if (po.colorArray[y].skus[t].backordered){
							if(shipDate <= now){
								f.size.options[f.size.options.length] = new Option((po.colorArray[y].skus[t].size) + " - " + CONSTANTS.PRODUCT_BACKORDERED,po.colorArray[y].skus[t].catentry);
							}else{
								shipStr = shipDate.substring(4,6) + "/" + shipDate.substring(6,8) + "/" + shipDate.substring(2,4);
								f.size.options[f.size.options.length] = new Option((po.colorArray[y].skus[t].size) + " - " + CONSTANTS.PRODUCT_WILLSHIP(shipStr),po.colorArray[y].skus[t].catentry);
							}
						} else {
							f.size.options[f.size.options.length] = new Option((po.colorArray[y].skus[t].size),po.colorArray[y].skus[t].catentry);
						}
					}
				}
				var pcol = gebc(po.pn,'prodColor')[0], poff = gebc(po.pn,'prodOff')[0], pcpy = gebc(po.pn,'prodCopy')[0];
				if(pcol){ pcol.innerHTML = color; }
				if(poff){ poff.innerHTML = price; }
				if(pcpy){ pcpy.innerHTML = copy; }
				gebc(po.pn, 'AddToBag')[0].style.cursor = 'pointer';
				gebc(po.pn, 'AddToBag')[0].src = commonImages[4].src;
			}
		}
	}		
	this.init = function(po){
		return function(e){
			var pn = $old('productDiv_' + po.productId);
			if(!pn){ return; }			
			pn.po = po;
			po.pn = pn;
			po.form = $old('OrderItemUpdate_'+ po.productId);
			//add event handlers for elements in parent node (pn)
			var ss = gebc(pn,'size')[0], sls = gebc(pn,'sizelist')[0] || null, sws = gebc(pn,'colorSwatch'), zg = gebc(pn,'zoomGraphic')[0], xlzg = gebc(pn,'xlZoomGraphic')[0]; 			
			//size select - getVBImg, change AddToBag img src to _green version
			addEvent(ss, 'change', function(po){ return function(e){ po.chngColor(e,po); }; }(po), false);			
			//OrderItemUpdate form - on submit should return results of setBagon('submit')
			addEvent(po.form, 'submit', function(e){ return false; }, false);			
			//if sizelist select exists add on change handler to setColor
			if(sls){
				addEvent(sls, 'change', function(po){ return function(e){ po.chngColor(e,po); }; }(po), false);
			}			
			if(zg){
				addEvent(zg, 'click', function(po){ return function(e){ po.openZoom(po); }; }(po),false);
			}			
			if(xlzg){
				addEvent(xlzg, 'click', function(po){ return function(e){ po.openXLZoom(po); }; }(po),false);
			}			
			//pn - click - if target was a swatch, fire set color for appropriate sequence
			addEvent(pn, 'click', po.clickHandler, false);			
			//po.getVBImg(po);			
			po.setColor(po);
		};
	}
	addEvent(window, 'load', this.init(this), false);
}

function ajaxCall(url, params, cb, m, rt, as) {
	this.url = url;
	this.parameters = params;
	this.callback = cb;
	this.method = m ? m : 'get';
	this.responseType = rt ? rt : 'text/xml';
	this.async = as ? as : true;
	this.response = null;
}
ajaxCall.prototype.parseForm = function(form){
	var formObj = null;
	if(typeof(form) == 'string'){
		if(document.forms[form]) formObj = document.forms[form]
		else if(document.getElementById(form)) formObj = document.getElementById(form)
	}else if (typeof(form) == 'object') formObj = form

	if(!formObj) return
}

ajaxCall.prototype.makeRequest = function(){
	var urlString = this.url;
	if(this.parameters){
		urlString += '?'
		for(p in this.parameters) urlString += p + '=' + this.parameters[p] + '&';
	}
	if (window.XMLHttpRequest) { 
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) 
			http_request.overrideMimeType(this.responseType);
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!http_request) return false;
	var ajaxObj = this;
	http_request.onreadystatechange = function() {ajaxObj.getContents(http_request)};
	http_request.open(this.method, urlString, this.async);
	http_request.send('');
}

ajaxCall.prototype.getContents = function(http_request){
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
        	this.response = http_request.responseText;
        	this.callback(http_request)       	
        } else {
        }
    } else {
    }
}