/*jsl:option explicit*/

/* partMap defines getters and setters for the fields that are part of the search state */

	function PartMap(partMap){
		this.getSearchParts = function(){
			var spec = {};
			for(var p in partMap){
				if(partMap[p].selId) spec[partMap[p].prN] = getOptId(partMap[p].selId);
				else if(partMap[p] && partMap[p].get) spec[(partMap[p]).prN] = partMap[p].get();
			}
			return spec;
		};
		this.setSearchParts = function(spec){
			for(var p in partMap){
				if(partMap[p].selId) $("#"+ partMap[p].selId).val(spec[partMap[p].prN]);
				else partMap[p].set(spec[partMap[p].prN]);
			}
		};
	}

	var partMap = new PartMap(([
		{prN:'catid', selId:'categories'},
		{prN:'parentid', selId:'parentItems'}]).concat(searchGroups).concat([{prN:'page', get:function(){return $("#srchPage").val() || 1;}, set:function(v){$("#srchPage").val(v);}},
		{prN:'pagesize', get:function(){return $("select.searchSize").eq(0).val() || 12;}, set:function(v){ $("select.searchSize").val(v ||12);}}]));


	function showItemPrice()
	{
		var itemId = this.form.elements['buyid'].value;
		var frmItemId = itemId;
		var target = $("#listingPrice_"+ itemId);
		var viewStockMsg = $("#viewStockStatus_"+ itemId);		
	
		var qty = this.value ? (parseInt(this.value, 10) || 0) : 0;

		if(!qty){
			target.empty();
			viewStockMsg.empty();
			
			return;
		}

		function showPrice(prices){
			var rate = prices[0].price;
			for(var i = 1; i< prices.length; i++)
			{
				if(prices[i].minQty <= qty) 
					rate = prices[i].price; 
				else
					break;
			}
			target.html("$"+ rate +" ea");
			var qtystock =  showItemStockQtyStatus(qty,frmItemId);
		}

		if(target.data('prices')){
			showPrice(target.data('prices'));
			return;
		}
		doQuery({stage:'itemprice', itemid:itemId, levelid:qn_priceLevel}, function(jResp){
			if(jResp.success && jResp.prices){
				target.data('prices', jResp.prices);
				showPrice(target.data('prices'));
			}else target.html('unable to show price');
		});
	}
	
	function showItemStockQtyStatus(userQty,frmItemId)
	{
		if(userQty!=="")
		{
			var viewStockMsg = $("#viewStockStatus_"+ frmItemId);
			var qtystock=0;
			
			if(frmItemId!="")
			{
				$.ajax({
				   type: "GET",
				   url: "/app/site/hosting/scriptlet.nl?script=14&deploy=1&itemid="+frmItemId,
				   async: false,
				   processData: true,
				   cache: false,
				   success: function(msg){
						var posqty 		= msg.indexOf('qtystock=');
						var qtystock 	= msg.substr(posqty+9,6);
						 	qtystock	= qtystock.match(/[\d\.]+/g);
							
							if(userQty>qtystock)
								viewStockMsg.html("<span class='spanstock_ship'>Will Ship in 2-3 Days</spam>");
							else	
								viewStockMsg.html("<span class='spanstock_stock'>In Stock</spam>");			
					   }
				});	
			}
		}
	}	


	jQuery(document).ready(function(){
		var $ = jQuery;

		(function(){
			// add filter link to left nav
			var template = $("table.fmw_leftnav td.textboldnolink,table.fmw_leftnav td.smalltext").closest('tr').eq(0);
			var target = template.clone().insertBefore(template);
			target.find("a").addClass('searchLabel').each(function(){
				this.setAttribute('href', 'javascript:toggleFilter(), void 0;');
				$(this).text('Search by Drop-Down');
			});
		})();


		$("#filteredItems").delegate("input[name='qty']", 'change', showItemPrice).delegate("input[name='qty']", 'keypress', showItemPrice);

		// load any independent drop downs.

		doQuery({stage:'cat'}, function(mkResp){
			(listLoader('categories'))(mkResp);

			// install hashchange
			$(window).bind( "hashchange", function(e) {
				var parts = getHashParts();
				if(parts){
					$("table.unfilteredItems,div.unfilteredItems").hide();
					// need some text substitution to hide built in pager. $("span.stdProductCounter").closest('table').hide();
					showPager();
					doSearch(parts);
				}else{
					clearFilter();
				}
			});

			var parts = getHashParts();
			if(parts){
				partMap.setSearchParts(parts);
				loadSubFilters(parts);
				toggleFilter();
				$(window).trigger( "hashchange" );
			}else{
				$("#categories option").each(function(){
					if($(this).text().toLowerCase() == qn_catName){
						this.selected = true;
						$("#categories").change();
						return false;
					}
				});
			}
		});
	});

	function loadSubFilters(parts){
		var params = {stage:'subfilter',catid:getOptId('categories'), parentid:getOptId('parentItems')};
		hidePager();
		$("#filteredItems").empty();
		doQuery(params, function(mkResp){
			if(mkResp.parentItems){
				var sel = document.getElementById('parentItems');
				sel.options.length = 1;
				$.each(mkResp.parentItems, function(){
					addOpt(sel, this.id, this.name, params.parentid);
				});
			}
			if(mkResp.groups){
				var target = $("#searchFiltersWrap");
				target.find("div.filterGroup").remove();
				var template = $("#filterTemplate");
				$.each(mkResp.groups, function(){
					var group = this;
					$("#filterTemplate").clone(true).each(function(){
						this.setAttribute('id', 'group_wrap_'+ group.id);
						var filterWrap = $(this);
						filterWrap.addClass('filterGroup');
						filterWrap.find('label').attr('for', filterWrap.attr('id')).text(group.name);
						filterWrap.find('select').each(function(){
							$("option",this).eq(0).text("Select "+ group.name + "...");
							var sel = this;
							this.setAttribute('id', 'group_'+ group.id);
							var defVal = parts ? parts['group_'+ group.id] : null;
							$.each(group.opts, function(idx, val){addOpt(sel, val, val, defVal);});
						});
					}).appendTo(target);
				});
			}

		});
	}


	function clearFilter(){
		$("table.unfilteredItems,div.unfilteredItems").show();
		hidePager();
		$("#filteredItems").empty();
		$("div.filterGroup").remove();
		$("#parentItems").each(function(){this.selectedIndex = 0; this.options.length = 1;});
		$("#categories").attr("selectedIndex", 0);
		$.bbq.removeState([searchStateId]);
	}

	function clearGroup(target){
		var sel = $(target).closest('div').find('select');
		sel.get(0).selectedIndex = 0;
		sel.change();
	}

	function toggleFilter(){
		$("#searchFiltersWrap,#filteredItemsWrap").toggleClass('initHide');
		 clearFilter();
		 hidePager();
	}


	function addOpt(targetSel, optId, optName, defaultId){
		var opt = new Option(optName, optId);
		if(optId == defaultId) opt.selected = true;
		targetSel.options[targetSel.options.length] = opt;
	}

	function doQuery(params, cb){
		var custId = "<%=getCurrentAttribute('customer', 'internalid', '')%>";
		if(custId){
			var temp = params;
			params = {custid: custId};
			for(var p in temp) params[p] = temp[p];
		}
		$.ajax({
			url: searchHelp +"&" +$.param(params) +"&jsoncallback=?",
			cache:true,
			dataType:'json',
			success: function(jResp){
				if(!jResp.success){ if(jResp.message)alert(jResp.message);}
				else cb(jResp);
			}});
	}

	function getOptId(selectId){
		var select = document.getElementById(selectId);
		if(!select || select.selectedIndex == -1 || select.selectedIndex >= select.options.length) return null;
		return select.options[select.selectedIndex].value;
	}

	function listLoader(targetId, deps){
		return function(jResp){
			var sel = document.getElementById(targetId);
			sel.options.length = 1;
			if(jResp.opts) $.each(jResp.opts, function(idx, opt){addOpt(sel, opt.id, opt.name);});
			sel.disabled = (sel.options.length <= 1) ;
			if(deps && deps.length){
				for(var i = 0; i< deps.length; i++){
					var depSel = document.getElementById(deps[i]);
					if(depSel){
						depSel.options.length = 1;
						depSel.selectedIndex = 0;
					}
				}
			}
		};
	}


	var searchStateId = "ss";


	function getHashParts(){
		return $.bbq.getState( searchStateId ) || null;
	}

	function invokeSearch(parts){
		var ss = {};
		ss[searchStateId] = parts || getSearchParts();
		$.bbq.pushState(ss);
	}

	function getSearchParts() {
		return partMap.getSearchParts();
	}

	function goNumberedPage(pageNum){
		var parts = getSearchParts();
		parts.page = pageNum;
		invokeSearch(parts);
	}


	function doSearch(sParts){
		var qParts = sParts || getSearchParts();
		var parts = copyObj(qParts);
		parts['stage'] = 'items';
		hidePager();
		$("#searchWaiting").css("display", "block");
		doQuery(parts,
		function(jResp){
			var target = $("#filteredItems").empty();
			//set up the pager
			showPager();
			$("#searchWaiting").css("display", "none");
			setupPages(jResp.pager);

 			if(jResp.items){
 				var redirLocation = document.location.toString().replace(/[?&]whence=[^#&]?/, "").replace(new RegExp("http://[^/]+"), "");
				$.each(jResp.items, function(idx, rec){
					$(rec.itemHtml).appendTo(target).each(function(){
						var preset = jResp.presets[idx];
						var custSpec = $.param(preset.colspecs);
						$("a[class='listingName']", this).attr('href', function(idx, href){ return href + (href.indexOf("?") == -1 ? "?" : "&") + custSpec;});

					});
				});
			}
			if(jResp.groups){
				$.each(jResp.groups, function(idx, group){
					var sel = document.getElementById('group_'+ group.id);
					if(sel){
						var currVal = sel.selectedIndex > 0 ?  sel.options[sel.selectedIndex].value : null;
						sel.options.length = 1;
						$.each(group.opts, function(idx, val){addOpt(sel, val, val, currVal);});
					}
				});
			}
		});
		return parts;
	}

	function copyObj(src){
		var target = {};
		for(var f in src) target[f] = src[f];
		return target;
	}
	

