
var productWallRecords;
var oos;  // Out of stock message set in ClickQuickOrder
var partnerlink;

// Inventory check singleton
var invcheck = new function() {
    this.pranainv = 0;
    this.p2pinv = 0;
    this.ats = '';
    this.clear = function() {
		this.pranainv = 0;
		this.p2pinv = 0;
		this.ats = '';
    };
}

function disableSelectScroll() {
	$$('select.select').each(function(el){
			el.addEvents({	
				'wheelup': function(e) {
				e = new Event(e); e.stop();
			},
				'wheeldown': function(e) {
				e = new Event(e); e.stop();
			}
		});
	});
}

//AJAX
function updateFilter(){
	var fader;
	fader = new Fx.Style('pw', 'opacity', {duration: 400, transition:Fx.Transitions.Quart.easeIn, wait: true, onComplete: loadData});
	fader.start(100);
}

function loadData(){
	load();
	var category = $('hdStyle').value;
	var start = $('hdPage').value;
	var f1 = $defined($('ddFilter1')) ? $('ddFilter1').options[$('ddFilter1').selectedIndex].value : -1;
	var f2 = $defined($('ddFilter2')) ? $('ddFilter2').options[$('ddFilter2').selectedIndex].value : -1;
	var f3 = $defined($('ddColor')) ? $('ddColor').options[$('ddColor').selectedIndex].value : -1;
	var f4 = $defined($('ddSize')) ? $('ddSize').options[$('ddSize').selectedIndex].value : -1;
	var url = 'data.aspx?' + 'p1=pw&p2='+ category + '&p3=' + f1 + '&p4=' + f2 + '&p5=' + start + '&p6=' + $('hdRecords').value + '&p7=' + $('hdSale').value + '&p8=' + f3 + '&p9=' + f4;
	var request = new Request.JSON({url: url,
		noCache: true,
		onSuccess: function(jsonObj) {
			hide();
			addImages(jsonObj.wall, jsonObj.color);
			addPager(jsonObj.pager,jsonObj.wall);
			fader = new Fx.Style('pw', 'opacity', {duration: 750, transition:Fx.Transitions.Quart.easeIn});
			fader.start(100);
		},
		onFailure: function() {
			hide();
		}
	}).send();
}

var addImages = function(images,colors) {
	var available;
	var quickview;
	var gallery = $('pw');
	gallery.innerHTML = '';
	if (images.length==0) {
		var el = new Element('div').setHTML('No Products Found...');
		$(el).addClass('notfound');
		el.injectInside(gallery);
	} else {
		for (var jp=0;jp<images.length;jp++) {
			var rndimg;
			var bsimg;
			var startcolor;
			var image = images[jp];
			var productcolor = colors[jp].color;
			var el = new Element('div');
			if (!(Browser.Engine.trident && !navigator.appVersion.contains('MSIE 8.0'))) el.fade('hide');
			$(el).addClass('item');
			$(el).addClass('pwitem');
			var a = new Element('a').injectInside(el);
			$(a).setProperty('href', '00' + image.uid + '-' + cleanCharacters(image.name) + '.aspx');
			var img = new Element('img').injectInside(a);
			rndimg = Math.floor(Math.random()*.999*productcolor.length);
			if (($defined($('ddColor')) ? $('ddColor').options[$('ddColor').selectedIndex].value : -1)==-1) { //no color selected
				startcolor = productcolor[rndimg];
			} else { //set color from filter
				productcolor.each(function(citem) {
					if (citem.name==$('ddColor').options[$('ddColor').selectedIndex].text) startcolor = citem;
				});
			}
			bsimg = startcolor.image;
			bsimg = bsimg.substr(0,bsimg.length-4) + "_S.png";
			img.setProperties({
				src: bsimg,
				title: image.name,
				rel: ((startcolor.backimage) ? "T" : "F") + "|" + startcolor.image + "|" + startcolor.uid + "|" + image.uid
			});
			img.addClass("p");
			if (window.ie6) img.addClass("FixImg");
			img.addEvents({
				"mouseenter" : showBackQuick,
				"mouseleave" : hideBackQuick,
				"click" : productDetail,
				'load': function() {
					if (!(Browser.Engine.trident && !navigator.appVersion.contains('MSIE 8.0'))) this.fade('in');
				}.bind(el)
			});
			var aa = new Element('a').injectAfter(a);
			$(aa).setProperty('href', '00' + image.uid + '-' + cleanCharacters(image.name) + '.aspx');
			var name = new Element('h6').setHTML(image.name + '<br>' + image.price).injectInside(aa);
			name.addEvents({
				"click" : productDetail
			});
			if (image.pranainv>0) { // No quick if PanaInv = 0
				var qck = new Element('img').injectAfter(img);
				qck.setProperties({
					src: "resources/images/buttons/quickOrder.gif"
				});
				qck.addClass("qck");
				qck.addEvents({
					"click" : clickQuickOrder,
					"mouseover" : function(){this.style.display="inline";}
				});
			}
			var jc = productcolor.length;
			for (var jc=0;jc<productcolor.length;jc++) {
				bsimg = productcolor[jc].image;
				bsimg = bsimg.substr(0,bsimg.length-4) + "_C.png";
				var clr = new Element('img').injectBefore(aa);
				clr.setProperties({
					src: bsimg,
					title: productcolor[jc].name,
					rel: ((productcolor[jc].backimage) ? "T" : "F") + "|" + productcolor[jc].image + "|" + productcolor[jc].uid + "|" + image.uid
				});
				clr.addClass("sw");
				clr.addEvents({
					"click" : clickSwatch 
				});
			}
			el.injectInside(gallery);
			if (jp%4==3 && jp>0) { //Clear div after every 4th to fix extended color products
				el = new Element('div');
				el.addClass('clear');
				el.injectInside(gallery);
			}
		}
	}
	function /* internal */ clickSwatch(){
		e = new Event(arguments[0]);
		e.stop();
		var img = this.getParent().getElement(".p"); // "this" is color swatch
		img.attributes.rel.value = this.attributes.rel.value;
		var t = this.attributes.rel.value.split("|");
		var n = t[1].substr(0,t[1].length-4) + "_S.png";
		img.setProperties({
			src: n
		}); 
	}
	function /* internal */ productDetail(){
		e = new Event(arguments[0]);
		e.stop();
		var img = this.getParent().getParent().getElement("img.p");  // "this" is product image or product name
		var t = img.attributes.rel.value.split("|");
		var n = img.attributes.title.value;
		var l = '00' + t[3] + '-' + cleanCharacters(n) + '.aspx?colorid=' + t[2];
		window.location.href = l;
	}
	function /* internal */ showBackQuick(){
		if (this.attributes.rel.value.substr(0,1)=="T"){ // "this" is product image
			// back image exists - show it:
			var t = this.attributes.rel.value.split("|");
			var n = t[1].substr(0,t[1].length-4) + "_BACK_S.png";
			this.setProperties({
				src: n
			}); 
		}
		// Hide quicks
		$$('.qck').each(function(el){el.setStyle("display","none");});
		var qck = this.getParent().getElement(".qck");
		if ($defined(qck)) qck.setStyle("display","inline");
	}
	function /* internal */ hideBackQuick(){
		if (this.attributes.rel.value.substr(0,1)=="T"){ // "this" is product image
			// back image exists - hide it:
			var t = this.attributes.rel.value.split("|");
			var n = t[1].substr(0,t[1].length-4) + "_S.png";
			this.setProperties({
				src: n
			}); 
		}
		var qck = this.getParent().getElement(".qck");
		if ($defined(qck)) qck.setStyle("display","none");
	}
	function /* internal */ hideQuick(){
		e = new Event(arguments[0]);
		e.stop();
		var qck = this.getElement(".qck"); // "this" is product element
		if ($defined(qck)) qck.setStyle("display","none");
	}
	function /* internal */ clickQuickOrder(){
		e = new Event(arguments[0]);
		e.stop();
		var productElement = this.getParent().getParent();  // "this" is quick view image
		var t = productElement.getElement("img.p").attributes.rel.value.split("|");
		var url = 'data.aspx?' + 'p1=qv&p2='+ t[3];
		var l = productElement.getElements("a")[0] + '?online=show'; //OOS Message
		oos = '<span style="color: #F00;">Out of stock.</span>';
		partnerlink = '<br />Please visit one of our <a id="partnerlink" href="' + l + '" title="online partners">online partners</a>';
		pageTracker._trackPageview('/QUICKVIEW/'+t[1].replace('.png','').replace('images/products/','')); //Track click
		var request = new Json.Remote(url, {
			onComplete: function(jsonObj) {
				// show details: build color and sizes, then open smoothbox
				available = jsonObj;
				showQuickView(productElement);
			},
			onFailure: function() {
				// don't show details
			}
		}).send();
	}
	function showQuickView(productElement){
		//alert(available.qck[0].code);
		if (available.qck.length<=0) return;
		if (available.onsale=="0") oos += partnerlink;
		//selectedSize = 0;
		//selectedColor = 0;
		//TB_show('','#TB_inline?inlineId=quickview&height=420&width=500','');
		Mediabox.stopKeys = false;
		Mediabox.open('#mb_quickview', '', '552 502');
		quickorder = $("mbCenter"); //$("TB_window");
		var f = quickorder;
		productElement.getElement(".qck").style.display = "none";
		var img = productElement.getElement("img.p"); 
		var hdr = productElement.getElement("h6");
		var t = img.attributes.rel.value.split("|");
		var n = img.attributes.title.value;
		var p = hdr.innerHTML.toLowerCase().split("<br>");
		
		f.getElement("div.code").innerHTML = available.code;
		f.getElement("div.n").innerHTML = n;
		f.getElement("div.p").innerHTML = p[1];
		// change product image
		var iii = f.getElement("img.i");
		var theimg = new Asset.image(t[1], {
			onload: function() {
				if (!window.ie6) iii.src = theimg.src;
				if (window.ie6) iii.setStyle('filter', 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + theimg.src + '", sizingMethod="scale")');
				$(iii).setStyles({
					width: this.width,
					height: this.height
				});
			}
		});
		var a = f.getElement("a.d");
		//a.setProperty('href', '00' + t[3] + '-' + cleanCharacters(n) + '.aspx?colorid=' + t[2]);
		a.href = '00' + t[3] + '-' + cleanCharacters(n) + '.aspx?colorid=' + t[2];

		// sizes:
		var szxcnt = 0;
		var lastsize = 0;
		var sizeid;
		var divsizes = f.getElement("div.s");
		for (var js=0;js<available.qck.length;js++) {
			sizeid = available.qck[js].sizeid;
			if (lastsize!=sizeid){
				lastsize = sizeid;
				var szx = new Element('span').setHTML(available.qck[js].size).injectAfter(divsizes.lastChild);
				szx.setProperty("rel", sizeid + "|" + available.size);
				szx.addEvents({
					"click" : clickSize 
				});
				szxcnt += 1;
			}
		}

		// colors:
		var productcolor = productElement.getElements("img.sw");
		var divcolors = f.getElement("div.c");
		for (var jc=0;jc<productcolor.length;jc++) {
			var bsimg = productcolor[jc].attributes.src.value;
			var bsrel = productcolor[jc].attributes.rel.value + "|" + available.color;
			var bstitle = productcolor[jc].attributes.title.value;
			var clr = new Element('img').injectAfter(divcolors.lastChild);
			clr.setProperties({
				src: bsimg,
				title: bstitle,
				rel: bsrel
			});
			clr.addEvents({
				"click" : clickColor 
			});
			// set initial color selection
			var tc = bsrel.split("|");
			if(tc[2]==t[2]){
				clr.addClass("selected");
				f.getElement("div.s").getElements("span").each(function(szx){
					if(szx.attributes.rel){
						var s = szx.attributes.rel.value.split("|");
						//Check Inventory - If pranainv = 0 set outofstoock
						inventoryCheck(t[2],s[0]);
						if (invcheck.pranainv == 0) {
							szx.addClass("outofstock");
						}
					}
				});
			}
		}
		
		// default size if only 1
		if (szxcnt==1) szx.fireEvent('click');
	}
	function /* internal */ clickColor(){
		if(this.hasClass("selected")) return;
		hideErrorMessage();
		var f = quickorder;
		var ats;
		
		this.getParent().getElements(".selected").each(function(el){
			el.removeClass("selected");
		});
		
		this.addClass("selected");
		
		// also need inventory check for selected color and all sizes
		var c = this.attributes.rel.value.split("|");
		
		//If no sizes selected show Out Of Stock
//		if ($(document.body).getElement('div.s').getElements('span.selected').length==0) {
//			/* HIDE ADD To Cart */
//			f.getElement('a.b').setStyle('display', 'none');
//			f.getElement('a.w').setStyle('display', 'none');
//			f.getElement("div.ats").innerHTML = oos;
//		}
		
		f.getElement("div.s").getElements("span").each(function(szx){
			if(szx.attributes.rel){
				var s = szx.attributes.rel.value.split("|");
				// Inventory Check
				inventoryCheck(c[2],s[0]);
				if (invcheck.pranainv > 0) {
					/* IN STOCK PRANA */
					/* SHOW Add To Cart */
//					f.getElement('a.b').setStyle('display', 'block');
//					f.getElement('a.w').setStyle('display', 'inline');
					if(szx.hasClass("outofstock")){
						szx.removeClass("outofstock");
					}
					if(szx.hasClass("selected")){
						f.getElement("div.ats").innerHTML = invcheck.ats;
					}
				} else {
					/* OUT OF STOCK PRANA */
					if(szx.hasClass("selected")){ /* this is now possible due to P2P check*/
						/* HIDE ADD To Cart */
//						f.getElement('a.b').setStyle('display', 'none');
//						f.getElement('a.w').setStyle('display', 'none');
//						szx.removeClass("selected");
						f.getElement("div.ats").innerHTML = oos;
					} 
					if(!szx.hasClass("outofstock")){
						szx.addClass("outofstock");
					}
				}
			}
		});
		
		if (this.hasClass("outofstock")) {
			f.getElement("div.ats").innerHTML = oos;
		}
		
		// change product image
		var t = this.attributes.rel.value.split("|");
		var iii = f.getElement("img.i");
		var theimg = new Asset.image(t[1], {
			onload: function() {
				if (!window.ie6) iii.src = theimg.src;
				if (window.ie6) iii.setStyle('filter', 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + theimg.src + '", sizingMethod="scale")');
				$(iii).setStyles({
					width: this.width,
					height: this.height
				});
			}
		});
		// change product detail link
		var a = f.getElement("a.d");
		var h = a.href.split("=");
		a.href = h[0] + "=" + t[2];
	}
	function /* internal */ clickSize(){
		var f = quickorder;
		var ats;
		if(this.hasClass("selected")) return;
		hideErrorMessage();
		this.getParent().getElements(".selected").each(function(el){
			el.removeClass("selected");
		});
		
		this.addClass("selected");
		
		// also need inventory check for selected size and all colors
		var s = this.attributes.rel.value.split("|");
		f.getElement("div.c").getElements("img").each(function(clx){
			if(clx.attributes.rel){
				var c = clx.attributes.rel.value.split("|");
				inventoryCheck(c[2],s[0]);
				if (invcheck.pranainv > 0) {
					/* SHOW Add To Cart */
//					f.getElement('a.b').setStyle('display', 'block');
//					f.getElement('a.w').setStyle('display', 'inline');
					if(clx.hasClass("outofstock")){
						clx.removeClass("outofstock");
					}
					if(clx.hasClass("selected")){
						f.getElement("div.ats").innerHTML = invcheck.ats;
					}
				} else{
					if(clx.hasClass("selected")){ /* this is now possible due to P2P check*/
						/* HIDE ADD To Cart */
//						f.getElement('a.b').setStyle('display', 'none');
//						f.getElement('a.w').setStyle('display', 'none');
//						clx.removeClass("selected");
						f.getElement("div.ats").innerHTML = oos;
					} 
					if(!clx.hasClass("outofstock")){
						clx.addClass("outofstock");
					}
				}
			}
		});
		if (this.hasClass("outofstock")) {
			f.getElement("div.ats").innerHTML = oos;
			return;
		}
	}
	function /* internal */ inventoryCheck(color,size){
		invcheck.clear();
		for(var ii=available.qck.length-1; ii>=0; ii--){
			if(available.qck[ii].colorid==color && available.qck[ii].sizeid==size) {
				invcheck.pranainv = available.qck[ii].pranainv;
				invcheck.p2pinv = available.qck[ii].p2pinv;
				invcheck.ats = available.qck[ii].ats;
				return;
			}
		}
		return;
	}
	function /* internal */ hideErrorMessage(){
		quickorder.getElement("div.e").style.visibility = "hidden";
		quickorder.getElement("div.ats").innerHTML = "";
	}
}

function pageWall(page) {
	$('hdPage').value = page;
	updateFilter();
}	

function addPager(pager,images) {
	var s='';
	s= buildPagination(parseInt(pager[0].count), parseInt($('hdRecords').value), '', 0, '');
	if (images.length==0) s='';
	$('pgTop').innerHTML = s;
	$('pgBottom').innerHTML = s;
	    
}


/**
 *  Create a pagination DOM or String as needed
 *  @param  count {Integer} the number of results
 *  @param  resultsPerPage {Integer} the maximum per page
 *  @param  uri {String} the uri for the pagination
 *  @param  offset {String} OPTIONAL: the offset of the current page
 *  @param  sClass {String} OPTIONAL: the selected page class
 *  @return {String} the DOM string or empty string when DOM object is passed
 */
function buildPagination(count, resultsPerPage, uri, offset, sClass) {
	if (! offset || 0 > offset) {offset=0;}
	if (count<=resultsPerPage) return '';
	if (index==-1) resultsPerPage=count;
	sClass = '';
	var str = [],
		maxPages = 10,
		halfMax = maxPages / 2,
		numpages = Math.ceil(count / resultsPerPage),
		index = parseInt($('hdPage').value),
		findex = index - halfMax,
		lindex = index + halfMax;

	// validate index
	if (numpages - 1 < lindex) {
		lindex = numpages - 1;
	} else if (lindex < maxPages) {
		lindex = maxPages - 1;
	}
	if (numpages<lindex) lindex=numpages-1;
	if (0 > findex || index < maxPages - 1) {
		findex = 0;
	} else {
		findex = index - halfMax;
	}
	if (0 > index && index != -1) {
		index = findex;
	}
	if (numpages < index) {
		index = lindex;
	}
	if (index==-1) {
		findex = 0;
		lindex = numpages - 1;
		if (lindex>maxPages) lindex = maxPages - 1;
	}
	
	str.push('<ul class="paginator">');

	// if the first index is not 0 then the pagination view does not include page 1, so display first
	if (findex) {
		// logic to create the 'first' link
		str.push('<li><a href="');
		str.push('javascript:pageWall(0);');
		str.push('" rel="0" class="first">First</a></li>');
	}

	// if the index is not 0 then we are not on the first page, so display previous
	if (index>0) {
		// logic to create the 'previous' link
		str.push('<li><a href="');
		str.push('javascript:pageWall(' + (parseInt($('hdPage').value)-1) + ');');
		str.push('" rel="');
		str.push(offset - resultsPerPage);
		str.push('" class="previous">Prev</a></li>');
	}

	// if there are more than 2 pages, then show page numbers, otherwise, just next/prev for simplicity
	if (1 < numpages) {
		for (var i=findex; i<=lindex; i++) {
			// logic to create the page '#' link
			if (i != index) {
				str.push('<li><a href="');
				str.push('javascript:pageWall(' + i + ');');
				str.push('" rel="');
				str.push(offset);
				str.push('">');
				str.push(i+1);
				str.push('</a></li>');
			}
			else {
				if (parseInt($('hdPage').value)==-1 && i == 0) {
					str.push('<li><a href="');
					str.push('javascript:pageWall(' + i + ');');
					str.push('" rel="');
					str.push(offset);
					str.push('">');
					str.push(i+1);
					str.push('</a></li>');
				} else {
					str.push('<li class="');
					str.push('active');
					str.push('">');
					str.push(i+1);
					str.push('</li>');
				}
			}
		}
	}

	// if the index is equal to the last index then we are not on the last page, so display next
	if (lindex != index && index != -1) {
		// logic to create the 'next' link
		str.push('<li><a href="');
		str.push('javascript:pageWall(' + (parseInt($('hdPage').value)+1) + ');');
		str.push('" rel="');
		str.push(offset + resultsPerPage);
		str.push('" class="next">Next</a></li>');
	}

	// if the last index is equals to (maxPages - 1) then the pagination view does not include the last page, so display last
	if (lindex == maxPages-1) {
		// logic to create the 'last' link
		str.push('<li><a href="');
		str.push('javascript:pageWall(' + Math.ceil(count/parseInt($('hdRecords').value)-1) + ');');
		str.push('" rel="');
		str.push((numpages - 1) * resultsPerPage);
		str.push('" class="last">Last</a></li>');
	}

	if (parseInt($('hdPage').value)==-1) {
		str.push('<li><a href="#" class="active">View All</a></li>');
	} else {
		str.push('<li><a href="javascript:pageWall(-1);"title="view all">View All</a></li>');
	}	
	return str.join('');
}


window.onresize=function(){ 
	load_position();
}  
	
function load () {
	var container = $('pw');
	//container.innerHTML='';
	//$('pgTop').innerHTML = '';
	//$('pgBottom').innerHTML = '';
	new Element('div').setProperty('id', 'img_load').injectInside(document.body);
		$('img_load').innerHTML = "<img src='images/loading.gif' />";
		load_position();
}
		
function load_position() {
	if ($("img_load")) { $("img_load").setStyles({left: ($('pw').getPosition().x + ($('pw').getSize().x - 56)/2)+'px', top: ($('pw').getPosition().y + (($('pw').getSize().y-20)/2))+'px', display:"block"}); }
}

function hide() {
	if ($('img_load')) $('img_load').remove();
}

function buy(){
	var url = makeQuickOrderUrl();
	if(url){
		//TB_remove();
		Mediabox.close();
		var request = new Ajax(url+"shoppingcart" + "&z=" + new Date().valueOf(), {
			method: "get", 
			onComplete: refreshCartDisplay
		}).request();
	}
	function refreshCartDisplay(){
		var cartdisplayurl = "data.aspx?p1=displaycart" + "&z=" + new Date().valueOf();
		var updatecart = new Ajax(cartdisplayurl, {
			method: "get", 
			update: $("Topbanner2_CartList1_cart_container"),
			onComplete: function() {
				initCart();
				var cnt = $("cart_items").getChildren("div.left").length - 1;
				scrollCartEnd(cnt);
			}
		}).request();
	}
}

function wish(){
	var url = makeQuickOrderUrl();
	if(url){
		var request = new Ajax(url+"wishlist" + "&z=" + new Date().valueOf(), {
			method: "get", 
			onComplete: function() {
				// redirect to savedcart.aspx - problem - adds new item but doesn't display it
				location.href="savedcart.aspx" //?z=' + new Date().valueOf();
			},
			onFailure: function() {
				//
			}
		}).request();
	}
}

function makeQuickOrderUrl(){
	var f = $("mbImage");
	var e = f.getElement("div.e");
	var color = f.getElement("div.c").getElement(".selected");
	var size = f.getElement("div.s").getElement(".selected");
	var qtybox = f.getElement("div.q").getElement("input");
	var q = getQuantity();
	if(color && size && q && (q>0) && !color.hasClass("outofstock")){
		var cp = color.attributes.rel.value.split("|");
		var sp = size.attributes.rel.value.split("|");
		var qry = "data.aspx?p1=addtocart&p8=" + q;
		qry += "&p3=" + cp[3]; // productid
		qry += "&p4=" + cp[2]; // colorid
		qry += "&p5=" + cp[4]; // colorattributeid
		qry += "&p6=" + sp[0]; // sizeid
		qry += "&p7=" + sp[1]; // sizeattributeid
		qry += "&p2=";
		return qry;
	}
	if(!color){
		e.innerHTML = " Color not selected";
		showMessage();
	}
	if(!size){
		e.innerHTML = " Size not Selected";
		showMessage();
	}
	if(!q || !(q>0)){
		e.innerHTML = " Quantity isn't a Number";
		showMessage();
	}
	if(color.hasClass("outofstock")){
		e.innerHTML = " Out of stock";
		showMessage();
	}
	function getQuantity(){
		var isnumber = /^[0-9]+$/;
		if(isnumber.test(qtybox.value.trim())){
			return qtybox.value.trim();
		}
	}
	function showMessage(){
		e.style.visibility = "visible";
	}
}
