//*************************************************
//***** COPYRIGHT 2007, PRACTICAL DATA, INC. ******
//***** - UNAUTHORIZED USE IS PROHIBITED **********
//*************************************************

//***************************************************************************
//********************* INITIALIZE PAGING VARIABLES *************************
//***************************************************************************

var pd_itemsPerPage = "";
var pd_pagesToDisplay = "";
var pd_itemsPerRow = "";
var pd_sortBy = "";
var pd_gridViewTableWidth = "";
var pd_yahooStoreId = "";
var pd_debugFlag = "";
var pd_noItemsFoundMessage = "";

var pd_lastSection = "";
var pd_currentSection = "";
var pd_currentPageNumber = 1;
var pd_viewAll = false;

var pd_refreshId = "";
var pd_searchFirstRun = true;
var pd_sortMethod = "name"
var pd_filterSearchDelay = 650;
var pd_pagingDisplayMode = "";
var pd_pagingDisplayModeDefault = "grid";
var pd_searchText = "";
var pd_brandSelected = "";
var pd_sizeSelected = "";
var pd_colorSelected = "";
var pd_materialSelected = "";
var pd_categorySelected = "";
var pd_priceRange = "";
var pd_filterBy = "";
var pd_filterByStoneButton = "";
var pd_filterByNonStoneButton = "";
var pd_searchTextFirstLoad = "Enter Keyword(s):";

var pd_sortTemp = "";

var pd_displayList = new Array();
var pd_filteredDisplayList = new Array();

//*************************
//*** INITIALIZE PAGING ***
//*************************
function pdPagingInitialize() {
debug("pdPagingInitialize()");

	if(isBlank(pd_itemsPerPage)) pd_itemsPerPage = 25;
	if(isBlank(pd_pagesToDisplay)) pd_pagesToDisplay = 8;
	if(isBlank(pd_itemsPerRow)) pd_itemsPerRow = 1;
	if(isBlank(pd_sortBy)) pd_sortBy = getCurrentSortBy();
	if(isBlank(pd_gridViewTableWidth)) pd_gridViewTableWidth = "100%";
	if(isBlank(pd_yahooStoreId)) pd_yahooStoreId = "";
	if(isBlank(pd_debugFlag)) pd_debugFlag = false;
	if(isBlank(pd_noItemsFoundMessage)) pd_noItemsFoundMessage = "No Items Found.";
	if(isBlank(pd_pagingDisplayMode)) pd_pagingDisplayMode = getPagingDisplayMode();
	else setPagingDisplayMode(pd_pagingDisplayMode);
	if(isBlank(pd_filterByStoneButton)) pd_filterByStoneButton = false;
	if(isBlank(pd_filterByNonStoneButton)) pd_filterByNonStoneButton = false;
	
	pd_displayList = parseDisplayList();

	performSort();
	renderControlPanelFilters();
	renderControlPanelSortLinks();
	renderControlPanelFilterButtons();
	performFilter(true);
	return true;
}

//***************************************************************************
//********* FILTER BY KEYWORD/ SEARCH WHILE TYPING FUNCTIONS ****************
//***************************************************************************
function filterProductArrayBySearchTerm(searchText) {
debug("filterProductArrayBySearchTerm(" + searchText + ")");
	pd_filteredDisplayList = getFilteredDisplayList(searchText);
	pd_currentPageNumber = 1;
	var success = displayProductArray();
	return false;
}

function getFilteredDisplayList(searchTermString) {
debug("getFilteredDisplayList");
	var productArray = pd_filteredDisplayList;
	searchTermString = String(searchTermString).toLowerCase();
	searchTermString = String(searchTermString).replace(/,/g, " ");
	var searchTermList = String(searchTermString).split(" ");
	var filteredHash = new Array();
	var item = new Object();
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			var found = true;
			for(item2 in searchTermList) {
				if(searchTermList.hasOwnProperty(item2)) {
					if(!isBlank(searchTermList[item2])) {
						if(productArray[item].searchIndex.indexOf(searchTermList[item2]) == -1) found = false;
					}
				}
			}
			if(found == true) {
				filteredHash[productArray[item].id] = productArray[item];
			}
		}
	}
	var filteredList = convertHashToArray(filteredHash);
	return filteredList;
}



function performFilter(noResetPageNumber) {
debug("performFilter()");

	//*****************************************************************
	//*** LOAD FILTERED DISPLAY LIST WITH COPY OF FULL PRODUCT LIST ***
	//*****************************************************************
	pd_filteredDisplayList = pd_displayList;

	//*************************
	//*** RESET PAGE NUMBER ***
	//*************************
	if(noResetPageNumber == true) {
	//**** DO NOTHING
	}else{
		resetPageNumber();
	}
	
	//************************************
	//*** LOAD FILTERS VALUES FROM GUI ***
	//************************************
	//alert("pd_searchText=" + pd_searchText);
	loadFilters();
	//alert("pd_searchText=" + pd_searchText);
	
	//***********************
	//*** PERFORM FILTERS ***
	//***********************
	if(!isBlank(pd_brandSelected)) pd_filteredDisplayList = getFilteredDisplayListByFullStringMatch("brand", pd_brandSelected);
	debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	if(!isBlank(pd_materialSelected)) pd_filteredDisplayList = getFilteredDisplayListBySubStringMatch("material", pd_materialSelected);
	debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	if(!isBlank(pd_sizeSelected)) pd_filteredDisplayList = getFilteredDisplayListBySubStringMatch("size", pd_sizeSelected);
	debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	if(!isBlank(pd_colorSelected)) pd_filteredDisplayList = getFilteredDisplayListBySubStringMatch("color", pd_colorSelected);
	debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	if(!isBlank(pd_categorySelected)) pd_filteredDisplayList = getFilteredDisplayListByFullStringMatch("category", pd_categorySelected);
	debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	if(!isBlank(pd_priceRange)) pd_filteredDisplayList = getFilteredDisplayListByNumericRange("price", pd_priceRange);
	debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	
	/*
	if(pd_filterByStoneButton == false && pd_filterByNonStoneButton == false) {
		pd_filteredDisplayList = getFilteredDisplayListByBooleanMatch("hasStone", false);
		pd_filteredDisplayList = getFilteredDisplayListByBooleanMatch("hasStone", true);
	} else if(pd_filterByStoneButton == false && pd_filterByNonStoneButton == true) {
		pd_filteredDisplayList = getFilteredDisplayListByBooleanMatch("hasStone", false);
	} else if(pd_filterByStoneButton == true && pd_filterByNonStoneButton == false) {
		pd_filteredDisplayList = getFilteredDisplayListByBooleanMatch("hasStone", true);
	} else if(pd_filterByStoneButton == true && pd_filterByNonStoneButton == true) {
		//**** FILTER NOTHING
	}
	*/
	
	debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	
	//**************************************************************************
	//*** IGNORE "SEARCH AS YOU TYPE" FILTER IF IT CONTAINS PLACEHOLDER TEXT ***
	//**************************************************************************
//alert(pd_searchText + "==" + pd_searchTextFirstLoad);
	if(pd_searchText != pd_searchTextFirstLoad){
		pd_filteredDisplayList = getFilteredDisplayListBySubStringMatch("searchIndex", pd_searchText);
		//alert(pd_searchText);
		debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	}
	
	//***************************
	//**** REDISPLAY RESULTS ****
	//***************************	
	var success = displayProductArray();
	
	//********************************************
	//*** RESET CURSOR FOCUS TO KEYWORD FILTER ***
	//********************************************
	if(document.getElementById("pdPagingFilterByKeyword")){
		document.getElementById("pdPagingFilterByKeyword").focus();
		document.getElementById("pdPagingFilterByKeyword").value = pd_searchText;
		displaySearchCancelButton();
	}

	return false;
}

function resetFilters() {
debug("resetFilters()");
	try {document.getElementById("pdPagingFilterByBrand").options.selectedIndex = -1;} catch(e) {}
	try {document.getElementById("pdPagingFilterBySize").options.selectedIndex = -1;} catch(e) {}
	try {document.getElementById("pgPagingFilterByColor").options.selectedIndex = -1;} catch(e) {}
	try {document.getElementById("pgPagingFilterByMaterial").options.selectedIndex = -1;} catch(e) {}
	try {document.getElementById("pgPagingFilterByPriceRange").options.selectedIndex = -1;} catch(e) {}
	try {document.getElementById("pgPagingFilterByKeyword").value = "";} catch(e) {}
	
	pd_searchText = "";	//*** MUST SET HERE
	pdSetCookie("V2pd_filterSettings", "", "", "", "");
	
	return false;
}

function loadSavedFilters() {
debug("loadSavedFilters()");

	var filterString = pdGetCookie("V2pd_filterSettings");
	if(!isBlank(filterString)) {
		var filterPairs = filterString.split("&");
		for(var i=0;i<filterPairs.length;i++) {
			var pair = filterPairs[i].split("=");
			if(pair[0] == "brandSelected") pd_brandSelected = pair[1];
			else if(pair[0] == "sizeSelected") pd_sizeSelected = pair[1];
			else if(pair[0] == "colorSelected") pd_colorSelected = pair[1];
			else if(pair[0] == "materialSelected") pd_materialSelected = pair[1];
			else if(pair[0] == "priceRange") pd_priceRange = pair[1];
			else if(pair[0] == "searchText") pd_searchText = pair[1];		
		}
		setDropdownValue("pdPagingFilterByBrand", pd_brandSelected);
		setDropdownValue("pdPagingFilterBySize", pd_sizeSelected);
		setDropdownValue("pdPagingFilterByColor", pd_colorSelected);
		setDropdownValue("pdPagingFilterByMaterial", pd_materialSelected);
		setDropdownValue("pdPagingFilterByPriceRange", pd_priceRange);
		try { document.getElementById("pdPagingFilterByKeyword").value = pd_searchText;} catch(e) {}				
	}
	return false;
}

function setDropdownValue(elementId, value) {
	var dropdown = document.getElementById(elementId);
	if(dropdown != null) {	
		for(var i=0;i<dropdown.options.length;i++) {
			if(dropdown.options[i].value == value) dropdown.selected = true;
		}
	}
	return false;	
}


function loadFilters() {
debug("loadFilters()");
	try {pd_brandSelected = document.getElementById("pdPagingFilterByBrand").options[document.getElementById("pdPagingFilterByBrand").selectedIndex].value;} catch(e){}
	try {pd_sizeSelected = document.getElementById("pdPagingFilterBySize").options[document.getElementById("pdPagingFilterBySize").selectedIndex].value;} catch(e){}
	try {pd_colorSelected = document.getElementById("pdPagingFilterByColor").options[document.getElementById("pdPagingFilterByColor").selectedIndex].value;} catch(e){}
	try {pd_materialSelected = document.getElementById("pdPagingFilterByMaterial").options[document.getElementById("pdPagingFilterByMaterial").selectedIndex].value;} catch(e){}
	try {pd_priceRange = document.getElementById("pdPagingFilterByPriceRange").options[document.getElementById("pdPagingFilterByPriceRange").selectedIndex].value;} catch(e){}	
	
//alert("pd_searchText1=" + pd_searchText);
/*
	try {pd_searchText = document.getElementById("pdPagingFilterByKeyword").value;} catch(e) {}	//*** IGNORE
*/
//alert("pd_searchText2=" + pd_searchText);
	
	//************************
	//*** REMEMBER FILTERS ***
	//************************
	var filterList = new Array();
	if(!isBlank(pd_brandSelected)) filterList.push("brandSelected=" + pd_brandSelected);
	if(!isBlank(pd_sizeSelected)) filterList.push("sizeSelected=" + pd_sizeSelected);
	if(!isBlank(pd_colorSelected)) filterList.push("colorSelected=" + pd_colorSelected);
	if(!isBlank(pd_materialSelected)) filterList.push("materialSelected=" + pd_materialSelected);
	if(!isBlank(pd_priceRange)) filterList.push("priceRange=" + pd_priceRange);
	if(!isBlank(pd_searchText)) filterList.push("searchText=" + pd_searchText);
	var filterString = filterList.join("&");
	pdSetCookie("V2pd_filterSettings", filterString, "", "", "");
	
//alert("pd_searchText4b=" + pd_searchText);
	
	return false;
}

function searchWhileTyping() {
debug("searchWhileTyping()");
	pd_searchText = String(document.getElementById("pdPagingFilterByKeyword").value);
	displaySearchCancelButton();	
	window.clearTimeout(pd_refreshId);
	pd_refreshId = window.setTimeout("performFilter()", pd_filterSearchDelay);
	return false;
}

function noEnter(e){
  	var keycode;
  	if (window.event) keycode = window.event.keyCode;
  	else if (e) keycode = e.which;

	if(keycode == 13){
		return false;
	}else{
		return true;
	}
}

function displaySearchCancelButton() {
debug("displaySearchCancelButton");
	var pdPagingFilterByKeywordCancelButton = document.getElementById("pdPagingFilterByKeywordCancelButton");
	var pdPagingFilterByKeywordCancelButtonActive = document.getElementById("pdPagingFilterByKeywordCancelButtonActive");
	pdPagingFilterByKeywordCancelButtonActive.className = "showDiv";
	pdPagingFilterByKeywordCancelButton.className = "hideDiv";
	try {pdRemoveEvent(pdPagingFilterByKeywordCancelButtonActive,"click", clearSearch);} catch(e) {}
	pdAddEvent(pdPagingFilterByKeywordCancelButtonActive,"click", clearSearch);
	return false;	
}

function clearFirstTimeSearchText() {
debug("clearFirstTimeSearchText()");
	if(pd_searchFirstRun) {
		document.getElementById("pdPagingFilterByKeyword").value = "";
		pd_searchFirstRun = false;
	}
	return false;
}

function clearSearch() {
debug("clearSearch");
	var searchFieldValue = document.getElementById("pdPagingFilterByKeyword").value;
	if(searchFieldValue != pd_searchTextFirstLoad){
		searchFieldValue = pd_searchTextFirstLoad;
	}
	clearSearchBox();
	setPageNumber(1);
	resetFilters();
	performFilter();
	return false;
}

function clearSearchBox() {
debug("clearSearchBox");
	//document.getElementById("pdPagingFilterByKeywordCancelButtonActive").innerHTML = '<img src="' + pd_imageUrl + 'spacer.gif">';
	document.getElementById("pdPagingFilterByKeywordCancelButtonActive").className = "hideDiv";
	document.getElementById("pdPagingFilterByKeywordCancelButton").className = "showDiv";
	
	document.getElementById("pdPagingFilterByKeyword").value = "";
	return false;
}

//***************************************************************************
//****** END FILTER BY KEYWORD/ SEARCH WHILE TYPING FUNCTIONS ***************
//***************************************************************************

//***********************************************
//********* PAGINATION FUNCTIONS ****************
//***********************************************

function parseDisplayList() {

	//******************
	//*** INITIALIZE ***
	//******************
	pd_lastSection = pdGetCookie("V2pd_lastSection");
	setCurrentSection(MD5.hex(location.href));
	pd_currentPageNumber = getCurrentPageNumber();
	loadSavedFilters();
	
	//***********************************************
	//***** BUILD JS ARRAY OF PRODUCT ELEMENTS ******
	//***********************************************
	var i = 0;
	var displayList = new Array();
	
	//*******************************************
	//*** ONLY LOAD IF PRODUCT WRAPPER EXISTS ***
	//*******************************************
	var productIdString = "";
	var dataWrapper = "";
	try {
		dataWrapper = document.getElementById("productDataWrapper");
	} catch(e) {
		//*** IGNORE
	}
		
	if(!isBlank(dataWrapper)) {
	
		if(dataWrapper.firstChild) { // check for children
			var oChild = dataWrapper.firstChild;
			while(oChild) {
			
			    if(oChild.nodeType==1 && String(oChild.id).indexOf("productData") > -1) { 
					displayList[i] = new Object();
					displayList[i].id = oChild.id;
										
					displayList[i].html = document.getElementById(oChild.id).innerHTML;
		
					//**************************************************
					//**** PARSE PRODUCT ATTRIBUTES (2 levels deep) ****
					//**************************************************
					var subChild = oChild.firstChild;
					while(subChild) {
						if(subChild.nodeType==1) {
							displayList[i][subChild.id] = String(subChild.title).replace(/&quot;/g, '"');
						}
						subChild = subChild.nextSibling;
					}
					
					//******************************
					//*** CREATE DEFAULT SORT ID ***
					//******************************
					displayList[i].defaultSortId = i;
					
					//**************************
					//*** BUILD SEARCH INDEX ***
					//**************************
					displayList[i].searchIndex = "";
					if(displayList[i].itemId) displayList[i].searchIndex += " " + String(displayList[i].itemId).toLowerCase();
					if(displayList[i].name) displayList[i].searchIndex += " " + String(displayList[i].name).toLowerCase();
					if(displayList[i].brand) displayList[i].searchIndex += " " + String(displayList[i].brand).toLowerCase();
					
					//***********************************************************
					//**** BUILD PRODUCT ID STRING ******************************
					//**** - LIMIT TO 200 TO PREVENT OVERFLOWING COOKIE LIMIT ***
					//***********************************************************
					if(displayList[i].id && i < 200) productIdString += displayList[i].id + ",";
					
				 	i++;
				 }
			  oChild = oChild.nextSibling;
		   }
		}
		
		//*******************************************
		//**** TURN OFF DISPLAY OF DATA ELEMENTS ****
		//*******************************************
		turnOffDisplayOfDataElements();
		
	} else {
		displayList = false;
	}
	
	//*******************************
	//**** SAVE productIdString *****
	//*******************************
	if(!isBlank(productIdString)) {
		productIdString = String(productIdString).substring(0, productIdString.length -1);	//*** TRIM TRAILING COMMA
		pdSetCookie("V2pd_currentProductList", productIdString, "", "", "");
	}
	
	//*******************************************
	//*** SAVE INITIAL FILTERED PRODUCT ARRAY ***
	//*******************************************
	pd_filteredDisplayList = displayList;
	
	//****************
	//**** RETURN ****
	//****************
	return displayList;	
}

function renderProductArray() {
	debug("renderProductArray");
	var productArray = pd_filteredDisplayList;
	var html = "";
	var pageNumber = 1;
	var i = 1;
	var item = new Object();
	var tempHtml = "";
	var tempProductHtml = "";
	var rowItemCount = 1;
	var isOpen = false;
	var productIdList = "";
	var shade = true;
	debug("pd_currentPageNumber render = " + pd_currentPageNumber);	

	// RESET PRODUCT WRAPPER HTML TO FIX ISSUE WHEN CHANGING DISPLAY STYLES
	document.getElementById("productWrapper").innerHTML = "";
		
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
		
			productIdList += productArray[item].id;
			tempHtml = '';
			
			if(pageNumber == pd_currentPageNumber || pd_currentPageNumber == "all") {
		
				//var pd_pagingDisplayMode = pdGetCookie("V2pd_pagingDisplayMode");
				//if(isBlank(pd_pagingDisplayMode)){pd_pagingDisplayMode = "list";}
				
				//**************************************
				//****** GENERATE GRID VIEW HTML *******
				//**************************************
				if(pd_pagingDisplayMode == "grid"){
					var cellWidth = pd_gridViewTableWidth / pd_itemsPerRow;
	
					if(rowItemCount == 1) {
						tempHtml += '<table border="0" cellpadding="0" cellspacing="0" width="' + pd_gridViewTableWidth + '">';
						tempHtml += '<tr valign="top">\r\n';
						isOpen = true;
					}
					tempHtml += '<td align="center">';
					//tempHtml += '<td width="' + Math.floor(cellWidth) + '" align="center">';
					tempHtml += '<div class="displayDivGCellWidth"><img src="' + pd_imageUrl + 'spacer.gif" height="1" width="' + Math.floor(cellWidth) + '"></div>';
					tempHtml += '<div class="displayDivGCellWidth" class="" id="' + productArray[item].id + '">';
					tempHtml += genProductHtmlGrid(productArray[item].id);
					tempHtml += '</div></td>';
					rowItemCount++;
					
					if(rowItemCount > pd_itemsPerRow) {
						tempHtml += '</tr></table>';
						tempHtml += '<div class="displayDivGBar"><img src="' + pd_imageUrl + 'spacer.gif" height="1"></div>';
						rowItemCount = 1;
						isOpen = false;
					}		
					
					
				//*************************************************
				//*************** GENERATE LIST VIEW HTML *********
				//*************************************************					
				} else {
					tempHtml += '<div id="' + productArray[item].id;
					if(!shade) {
						tempHtml += '" class="displayDivLOn">';
					} else {
						tempHtml += '" class="displayDivL">';
					}
					tempHtml += genProductHtmlList(productArray[item].id);
					tempHtml += '</div>';
					
					shade = !shade;
				}
	
			}
			i++;
			pageNumber = Math.ceil(i / pd_itemsPerPage);
			tempHtml += '<img src="' + pd_imageUrl + 'spacer.gif" width="1" height="1">';
			html += tempHtml;
		}
	}

	return html;
}

//***********************************************
//******** VIEW PRODUCT ARRAY AS GRID ***********
//***********************************************
function genProductHtmlGrid(item){
	var displayDiv = new String(item);
	var dataDiv = displayDiv.replace(/Display/g, 'Data');
	var childElem = document.getElementById(dataDiv).childNodes; 
	
	//*** DEFINE ITEM DATA ***
	var itemData = new Object();
	
	for(i=0;i<childElem.length;i++){
		itemData[childElem[i].id] = String(childElem[i].title);
	}
	//*** PRICE DISPLAY LOGIC ***
	var priceReg = itemData["priceReg"] - 0;
	var priceSale = itemData["priceSale"] - 0;
	if(!priceSale) priceSale = priceReg;	
	var priceDisplay = '';
	if(priceReg > priceSale){
		priceDisplay = '<div class="pagedPriceDiv"><span class="pagedPrice">Retail Price: <strike>' + formatCurrency(priceReg) + '</strike></span><br><span class="pagedPriceSale">Our Price: ' + formatCurrency(itemData["price"]-0) + '</span></div>';
	}else if(priceReg > 0){
		priceDisplay = '<div class="pagedPriceDiv"><span class="pagedPriceSale">' + formatCurrency(itemData["price"]-0) + '</span></div>';
	}

	var linkHtml = '<a href="' + itemData["itemId"] + '.html" class="pagedLink">';
	var html = '';
	html += '<table border="0" cellpadding="0" cellspacing="0" width="99%"><tr valign="top"><td align="center">';
	html += linkHtml + '<img src="' + itemData["image"] + '" hspace="4" vspace="5" border="0"></a><br>';
	html += linkHtml + itemData["name"] + '</a>' + priceDisplay;
	/*
	html += '<div style="padding-top:5px;">';
	html += '<form method="POST" style="display:inline;" action="https://order.store.yahoo.net/cgi-bin/wg-order?' + pd_yahooStoreId + '+' + itemData["itemId"] + '">';
	html += '<input name="vwitem" type="hidden" value="' + itemData["itemId"] + '">';
	html += '<input name="vwcatalog" type="hidden" value="' + pd_yahooStoreId + '">';
	html += '<table border="0"><tr><td><span class="qtyText">Qty: </span><input type="text" name="vwquantity" value="1" size="2" style="width:30px;"></td><td>';
	html += '<input type="image" src="' + pd_imageUrl + 'addToCartSm.gif" border="0"></td></tr></table>';
	html += '</form>';
	html += '</div>';
	*/
	html += '</td></tr></table>';

	return html;
}
//***********************************************
//******** VIEW PRODUCT ARRAY AS LIST ***********
//***********************************************
function genProductHtmlList(item){
	var displayDiv = new String(item);
	var dataDiv = displayDiv.replace(/Display/g, 'Data');
	var displayHtml = document.getElementById(dataDiv).innerHTML; 
	return displayHtml;
}

//***********************************************
//*** END NEW DISPLAY STYLE FUNCTIONALITY *******
//***********************************************

function displayProductArray() {
	debug("displayProductArray");

	//*************************************
	//**** TEST FOR NOTHING TO DISPLAY ****
	//*************************************
	if(!pd_filteredDisplayList) return false;
		
	//**********************************
	//**** REMEMBER GLOBAL SETTINGS ****
	//**********************************
	pdSetCookie("V2pd_pagingSortBy", pd_sortBy);
	
	//*******************************
	//**** RENDER PAGE ELEMENTS *****
	//*******************************		
	if(isBlank(pd_currentPageNumber)) {
		debug("could not find pd_currentPageNumber " + pd_currentPageNumber + ": setting = 1");
		pd_currentPageNumber = 1;
	}
	
	//*********************************************
	//*** POPULATE RESULTS INTO PRODUCT WRAPPER ***
	//*********************************************
	if(pd_filteredDisplayList.length >0) {
		document.getElementById("productWrapper").innerHTML = renderProductArray();
	} else {
		document.getElementById("productWrapper").innerHTML = '<div class="noProductsFound">' + pd_noItemsFoundMessage + '</b></div>';
	}
	
	//**********************************************************
	//*** TURN ON HEADER CONTROL PANEL AND POPULATE ELEMENTS ***
	//**********************************************************
	document.getElementById("pdPagingControlPanel").className = "pagingControlPanelShow";
	document.getElementById("pageInfo").innerHTML = renderPageInfo(pd_filteredDisplayList.length);
	document.getElementById("pageInfoBottom").innerHTML = renderPageInfo(pd_filteredDisplayList.length);
	document.getElementById("pageNumberLinks").innerHTML = renderPageNumberLinks(pd_filteredDisplayList.length);
	document.getElementById("pageNumberLinksBottom").innerHTML = renderPageNumberLinks(pd_filteredDisplayList.length);

	//**************
	//*** RETURN ***
	//**************
	return false;
}


function renderControlPanelSortLinks() {

	//********************************
	//**** SORT BY DEFAULT BUTTON ****
	//********************************
	var pdPagingSortByDefaultButton = document.getElementById("pdPagingSortByDefaultButton");

	var pdPagingSortByDefaultButtonActive = document.getElementById("pdPagingSortByDefaultButtonActive");
	if(pdPagingSortByDefaultButton != null && pdPagingSortByDefaultButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByDefaultButton,"click", sortAndDisplayByDefault);} catch(e) {}
		pdPagingSortByDefaultButton.className = "hiddenElem";
		pdPagingSortByDefaultButtonActive.className = "hiddenElem";
		if(pd_sortBy == "default") pdPagingSortByDefaultButtonActive.className = "sortLinkActive";
		else pdPagingSortByDefaultButton.className = "sortLink";
		pdAddEvent(pdPagingSortByDefaultButton,"click", sortAndDisplayByDefault);
	}

	//******************************
	//**** SORT BY BRAND BUTTON ****
	//******************************
	var pdPagingSortByBrandButton = document.getElementById("pdPagingSortByBrandButton");
	var pdPagingSortByBrandButtonActive = document.getElementById("pdPagingSortByBrandButtonActive");
	if(pdPagingSortByBrandButton != null && pdPagingSortByBrandButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByBrandButton,"click", sortAndDisplayByBrand);} catch(e) {}
		pdPagingSortByBrandButton.className = "hiddenElem";
		pdPagingSortByBrandButtonActive.className = "hiddenElem";
		if(pd_sortBy == "brand") pdPagingSortByBrandButtonActive.className = "sortLinkActive";
		else pdPagingSortByBrandButton.className = "sortLink";
		pdAddEvent(pdPagingSortByBrandButton,"click", sortAndDisplayByBrand);
	}
		
	//******************************
	//**** SORT BY NAME BUTTON ****
	//******************************	
	var pdPagingSortByNameButton = document.getElementById("pdPagingSortByNameButton");
	var pdPagingSortByNameButtonActive = document.getElementById("pdPagingSortByNameButtonActive");
	if(pdPagingSortByNameButton != null && pdPagingSortByNameButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByNameButton,"click", sortAndDisplayByName);} catch(e) {}
		pdPagingSortByNameButton.className = "hiddenElem";
		pdPagingSortByNameButtonActive.className = "hiddenElem";
		if(pd_sortBy == "name") pdPagingSortByNameButtonActive.className = "sortLinkActive";
		else pdPagingSortByNameButton.className = "sortLink";
		pdAddEvent(pdPagingSortByNameButton,"click", sortAndDisplayByName);	
	}
	
	//*****************************
	//**** SORT BY SIZE BUTTON ****
	//*****************************	
	var pdPagingSortBySizeButton = document.getElementById("pdPagingSortBySizeButton");
	var pdPagingSortBySizeButtonActive = document.getElementById("pdPagingSortBySizeButtonActive");
	if(pdPagingSortBySizeButton != null && pdPagingSortBySizeButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortBySizeButton,"click", sortAndDisplayBySize);} catch(e) {}
		pdPagingSortBySizeButton.className = "hiddenElem";
		pdPagingSortBySizeButtonActive.className = "hiddenElem";
		if(pd_sortBy == "size") pdPagingSortBySizeButtonActive.className = "sortLinkActive";
		else pdPagingSortBySizeButton.className = "sortLink";
		pdAddEvent(pdPagingSortBySizeButton,"click", sortAndDisplayBySize);	
	}
		
	//******************************
	//**** SORT BY PRICE BUTTON ****
	//******************************	
	var pdPagingSortByPriceButton = document.getElementById("pdPagingSortByPriceButton");
	var pdPagingSortByPriceButtonActive = document.getElementById("pdPagingSortByPriceButtonActive");
	if(pdPagingSortByPriceButton != null && pdPagingSortByPriceButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByPriceButton,"click", sortAndDisplayByPrice);} catch(e) {}
		pdPagingSortByPriceButton.className = "hiddenElem";
		pdPagingSortByPriceButtonActive.className = "hiddenElem";
		if(pd_sortBy == "price") pdPagingSortByPriceButtonActive.className = "sortLinkActive";
		else pdPagingSortByPriceButton.className = "sortLink";
		pdAddEvent(pdPagingSortByPriceButton,"click", sortAndDisplayByPrice);	
	}
	
	//***************************************
	//**** SORT BY CASE PACK SIZE BUTTON ****
	//***************************************
	var pdPagingSortByCasePackSizeButton = document.getElementById("pdPagingSortByCasePackSizeButton");
	var pdPagingSortByCasePackSizeButtonActive = document.getElementById("pdPagingSortByCasePackSizeButtonActive");
	if(pdPagingSortByCasePackSizeButton != null && pdPagingSortByCasePackSizeButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByCasePackSizeButton,"click", sortAndDisplayByCasePackSize);} catch(e) {}
		pdPagingSortByCasePackSizeButton.className = "hiddenElem";
		pdPagingSortByCasePackSizeButtonActive.className = "hiddenElem";
		if(pd_sortBy == "casePackSize") pdPagingSortByCasePackSizeButtonActive.className = "sortLinkActive";
		else pdPagingSortByCasePackSizeButton.className = "sortLink";
		pdAddEvent(pdPagingSortByCasePackSizeButton,"click", sortAndDisplayByCasePackSize);	
	}
	
	//******************************
	//**** SORT BY SCORE BUTTON ****
	//******************************
	var pdPagingSortByScoreButton = document.getElementById("pdPagingSortByScoreButton");
	var pdPagingSortByScoreButtonActive = document.getElementById("pdPagingSortByScoreButtonActive");
	if(pdPagingSortByScoreButton != null && pdPagingSortByScoreButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByScoreButton,"click", sortAndDisplayByScore);} catch(e) {}
		pdPagingSortByScoreButton.className = "hiddenElem";
		pdPagingSortByScoreButtonActive.className = "hiddenElem";
		if(pd_sortBy == "score") pdPagingSortByScoreButtonActive.className = "sortLinkActive";
		else pdPagingSortByScoreButton.className = "sortLink";
		pdAddEvent(pdPagingSortByScoreButton,"click", sortAndDisplayByScore);	
	}
	
	//***********************************
	//**** SORT BY BESTSELLER BUTTON ****
	//***********************************
	var pdPagingSortByBestsellerButton = document.getElementById("pdPagingSortByBestsellerButton");
	var pdPagingSortByBestsellerButtonActive = document.getElementById("pdPagingSortByBestsellerButtonActive");
	if(pdPagingSortByBestsellerButton != null && pdPagingSortByBestsellerButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByBestsellerButton,"click", sortAndDisplayByBestseller);} catch(e) {}
		pdPagingSortByBestsellerButton.className = "hiddenElem";
		pdPagingSortByBestsellerButtonActive.className = "hiddenElem";
		if(pd_sortBy == "bestseller") pdPagingSortByBestsellerButtonActive.className = "sortLinkActive";
		else pdPagingSortByBestsellerButton.className = "sortLink";
		pdAddEvent(pdPagingSortByBestsellerButton,"click", sortAndDisplayByBestseller);	
	}	
	
	//*************************************
	//**** VIEW ALL ITEMS / PAGED VIEW ****
	//*************************************
	var pdPagingViewAllButton = document.getElementById("pdPagingViewAllButton");
	var pdPagingViewAllButtonActive = document.getElementById("pdPagingViewAllButtonActive");
	if(pdPagingViewAllButton != null && pdPagingViewAllButtonActive != null) {
		try {pdRemoveEvent(pdPagingViewAllButton,"click", toggleViewAll);} catch(e) {}
		try {pdRemoveEvent(pdPagingViewAllButtonActive,"click", toggleViewAll);} catch(e) {}
		pdPagingViewAllButton.className = "hiddenElem";
		pdPagingViewAllButtonActive.className = "hiddenElem";
		if(pd_currentPageNumber == "all") pdPagingViewAllButtonActive.className = "displayModeActive";
		else pdPagingViewAllButton.className = "displayMode";
		pdAddEvent(pdPagingViewAllButton,"click", toggleViewAll);
		pdAddEvent(pdPagingViewAllButtonActive,"click", toggleViewAll);
	}

	//*****************************
	//**** DISPLAY GRID BUTTON ****
	//*****************************
	var pdPagingDisplayGridButton = document.getElementById("pdPagingDisplayGridButton");
	var pdPagingDisplayGridButtonActive = document.getElementById("pdPagingDisplayGridButtonActive");
	if(pdPagingDisplayGridButton != null && pdPagingDisplayGridButtonActive != null) {
		try {pdRemoveEvent(pdPagingDisplayGridButtonActive,"click", togglePagingDisplayMode);} catch(e) {}
		pdPagingDisplayGridButton.className = "hiddenElem";
		pdPagingDisplayGridButtonActive.className = "hiddenElem";
		if(pd_pagingDisplayMode == "list") pdPagingDisplayGridButtonActive.className = "displayMode";
		else pdPagingDisplayGridButton.className = "displayModeActive";
		pdAddEvent(pdPagingDisplayGridButtonActive,"click", togglePagingDisplayMode);	
	}
	
	//*****************************
	//**** DISPLAY LIST BUTTON ****
	//*****************************
	var pdPagingDisplayListButton = document.getElementById("pdPagingDisplayListButton");
	var pdPagingDisplayListButtonActive = document.getElementById("pdPagingDisplayListButtonActive");
	if(pdPagingDisplayListButton != null && pdPagingDisplayListButtonActive != null) {
		try {pdRemoveEvent(pdPagingDisplayListButtonActive,"click", togglePagingDisplayMode);} catch(e) {}	
		pdPagingDisplayListButton.className = "hiddenElem";
		pdPagingDisplayListButtonActive.className = "hiddenElem";
		if(pd_pagingDisplayMode == "grid") pdPagingDisplayListButtonActive.className = "displayMode";
		else pdPagingDisplayListButton.className = "displayModeActive";
		pdAddEvent(pdPagingDisplayListButtonActive,"click", togglePagingDisplayMode);	
	}
	
	
	return true;
}

function renderControlPanelFilters() {

	//*****************************
	//***** FILTER BY KEYWORD *****
	//*****************************
	var pdPagingFilterByKeyword = document.getElementById("pdPagingFilterByKeyword");
	if(pdPagingFilterByKeyword != null) {
		try {pdRemoveEvent(pdPagingFilterByKeyword,"click", clearFirstTimeSearchText);} catch(e) {}
		pdPagingFilterByKeyword.value = pd_searchTextFirstLoad;	
		pdAddEvent(pdPagingFilterByKeyword,"click", clearFirstTimeSearchText);
		pdAddEvent(pdPagingFilterByKeyword,"keyup", searchWhileTyping);
	}

	//*************************
	//**** FILTER BY BRAND ****
	//*************************
	var pdPagingFilterByBrand = document.getElementById("pdPagingFilterByBrand");
	if(pdPagingFilterByBrand != null) {
		try {pdRemoveEvent(pdPagingFilterByBrand, "change", performFilter);} catch(e) {}
		var filterList = generateFilterList("brand");
		if(filterList.length == 0) pdPagingFilterByBrand.className = "hideDiv";
		else {
			pdPagingFilterByBrand.className = "showDivInline";
			populateSelectOptions(pdPagingFilterByBrand, filterList, pd_brandSelected);
			pdAddEvent(pdPagingFilterByBrand,"change", performFilter);
		}
	}
	
	//************************
	//**** FILTER BY SIZE ****
	//************************
	var pdPagingFilterBySize = document.getElementById("pdPagingFilterBySize");
	if(pdPagingFilterBySize != null) {
		try {pdRemoveEvent(pdPagingFilterBySize, "change", performFilter);} catch(e) {}
		var filterList = generateFilterList("size");
		if(filterList.length == 0) pdPagingFilterBySize.className = "hideDiv";
		else {
			pdPagingFilterBySize.className = "showDivInline";
			populateSelectOptions(pdPagingFilterBySize, filterList, pd_sizeSelected);
			pdAddEvent(pdPagingFilterBySize,"change", performFilter);
		}
	}
		
	//*************************
	//**** FILTER BY COLOR ****
	//*************************
	var pdPagingFilterByColor = document.getElementById("pdPagingFilterByColor");
	if(pdPagingFilterByColor != null) {
		try{pdRemoveEvent(pdPagingFilterByColor, "change", performFilter);} catch(e) {}
		var filterList = generateFilterList("color");
		if(filterList.length == 0) pdPagingFilterByColor.className = "hideDiv";
		else {
			pdPagingFilterByColor.className = "showDivInline";
			populateSelectOptions(pdPagingFilterByColor, filterList, pd_colorSelected);
			pdAddEvent(pdPagingFilterByColor,"change", performFilter);
		}
	}
	
	//****************************
	//**** FILTER BY MATERIAL ****
	//****************************
	var pdPagingFilterByMaterial = document.getElementById("pdPagingFilterByMaterial");
	if(pdPagingFilterByMaterial != null) {
		try {pdRemoveEvent(pdPagingFilterByMaterial, "change", performFilter);} catch(e) {}
		var filterList = generateFilterList("material");
		if(filterList.length == 0) pdPagingFilterByMaterial.className = "hideDiv";
		else {
			pdPagingFilterByMaterial.className = "showDivInline";
			populateSelectOptions(pdPagingFilterByMaterial, filterList, pd_materialSelected);
			pdAddEvent(pdPagingFilterByMaterial,"change", performFilter);
		}
	}
	
	//****************************
	//**** FILTER BY CATEGORY ****
	//****************************
	var pdPagingFilterByCategory = document.getElementById("pdPagingFilterByCategory");
	if(pdPagingFilterByCategory != null) {
		try {pdRemoveEvent(pdPagingFilterByCategory, "change", performFilter);} catch(e) {}
		var filterList = generateFilterList("category");
		if(filterList.length == 0) pdPagingFilterByCategory.className = "hideDiv";
		else {
			pdPagingFilterByCategory.className = "showDivInline";
			populateSelectOptions(pdPagingFilterByCategory, filterList, pd_categorySelected);
			pdAddEvent(pdPagingFilterByCategory,"change", performFilter);
		}
	}
	
	//*******************************
	//**** FILTER BY PRICE RANGE ****
	//*******************************
	var pdPagingFilterByPriceRange = document.getElementById("pdPagingFilterByPriceRange");
	if(pdPagingFilterByPriceRange != null) {
		try {pdRemoveEvent(pdPagingFilterByPriceRange,"change", performFilter);} catch(e) {}
		pdAddEvent(pdPagingFilterByPriceRange,"change", performFilter);
	}

	return false;
}

function renderControlPanelFilterButtons() {
debug("renderControlPanelFilterButtons()");

	//*********************************
	//**** FILTER BY STONE BUTTONS ****
	//*********************************
	var pdPagingFilterStoneButton = document.getElementById("pdPagingFilterStoneButton");
	var pdPagingFilterStoneButtonActive = document.getElementById("pdPagingFilterStoneButtonActive");
	if(pdPagingFilterStoneButton != null && pdPagingFilterStoneButtonActive != null) {
		try {pdRemoveEvent(pdPagingFilterStoneButtonActive, "click", setAndPerformFilterByStoneButton);} catch(e) {}
		try {pdRemoveEvent(pdPagingFilterStoneButton, "click", setAndPerformFilterByStoneButton);} catch(e) {}
		if(pd_filterByStoneButton == true) {
			pdPagingFilterStoneButton.className = "hiddenElem";
			pdPagingFilterStoneButtonActive.className = "sortLinkActive";
		} else {
			pdPagingFilterStoneButtonActive.className = "hiddenElem";
			pdPagingFilterStoneButton.className = "sortLinkActive";
		}
		pdAddEvent(pdPagingFilterStoneButton,"click", setAndPerformFilterByStoneButton);
		pdAddEvent(pdPagingFilterStoneButtonActive,"click", setAndPerformFilterByStoneButton);
	}
	
	//*************************************
	//**** FILTER BY NON STONE BUTTONS ****
	//*************************************
	var pdPagingFilterNonStoneButton = document.getElementById("pdPagingFilterNonStoneButton");
	var pdPagingFilterNonStoneButtonActive = document.getElementById("pdPagingFilterNonStoneButtonActive");
	if(pdPagingFilterNonStoneButton != null && pdPagingFilterNonStoneButtonActive != null) {
		try {pdRemoveEvent(pdPagingFilterNonStoneButtonActive, "click", setAndPerformFilterByNonStoneButton);} catch(e) {}
		try {pdRemoveEvent(pdPagingFilterNonStoneButton, "click", setAndPerformFilterByNonStoneButton);} catch(e) {}
		if(pd_filterByNonStoneButton == true) {
			pdPagingFilterNonStoneButton.className = "hiddenElem";
			pdPagingFilterNonStoneButtonActive.className = "sortLinkActive";
		} else {
			pdPagingFilterNonStoneButtonActive.className = "hiddenElem";
			pdPagingFilterNonStoneButton.className = "sortLinkActive";
		}
		pdAddEvent(pdPagingFilterNonStoneButton,"click", setAndPerformFilterByNonStoneButton);
		pdAddEvent(pdPagingFilterNonStoneButtonActive,"click", setAndPerformFilterByNonStoneButton);
	}

	return false;
}



//*********************************************************************
//****** DISPLAY PAGE ELEMENTS RELATED TO SORTING AND FILTERING *******
//*********************************************************************

function clearFilter() {
debug("clearFilter");
	pd_currentPageNumber = 1;
	performFilter();
	return false;
}

function renderPageNumberLinks(productCount) {

debug("renderPageNumberLinks(productCount)");

	var pageCount = Math.ceil(productCount/pd_itemsPerPage);
	if(pageCount == 1) return "";	
	var html = "";

	if(pd_currentPageNumber != "all") {
	
		var pagesToDisplay = pd_pagesToDisplay;
		var extraPages = 0;

		var firstPageNumberToDisplay = pd_currentPageNumber - Math.floor(pagesToDisplay / 2);
		if(firstPageNumberToDisplay < 1) {
			extraPages = Math.abs(firstPageNumberToDisplay) + 1;
			firstPageNumberToDisplay = 1;
		}

		var lastPageNumberToDisplay = (pd_currentPageNumber - 0) + Math.floor(pagesToDisplay / 2) + extraPages;
		if(lastPageNumberToDisplay > pageCount) {
			firstPageNumberToDisplay -= lastPageNumberToDisplay - pageCount;
			lastPageNumberToDisplay = pageCount;
			if(firstPageNumberToDisplay < 1) firstPageNumberToDisplay = 1;
		}		
		html += '<table border="0" cellpadding="0" cellspacing="1"><tr>';
		
		//**********************
		//*** PREVIOUS ARROW ***
		//**********************		
		if(pd_currentPageNumber != "all") {	
			if(pd_currentPageNumber > 1) {
				var previousPage = pd_currentPageNumber - 1;
				html += '<td><a href="#" onClick="return(setPageNumberAndDisplayProductArray(' + previousPage + '))" class="pageArrow"><img src="' + pd_imageUrl + 'pagingprevious.gif" border="0" hspace="3" class="imgBlock"></a></td>';
			} else {
				html += '';
			}
		}
			
		for(var i=firstPageNumberToDisplay;i<=lastPageNumberToDisplay;i++) {
			if(pd_currentPageNumber == i) {
				html += '<td><div class="pageNumBgOn">' + i + '</div></td>';
				if(i < lastPageNumberToDisplay) html += '';
			} else {
				html += '<td><div class="pageNumBg" onClick="return(setPageNumberAndDisplayProductArray(' + i + '))"><a href="#" class="pageNum" onClick="return(setPageNumberAndDisplayProductArray(' + i + '))">' + i + '</a></div></td>';
				if(i < lastPageNumberToDisplay) html += '';
			}
		}
		
		//******************
		//*** NEXT ARROW ***
		//******************	
		if(pd_currentPageNumber != "all") {	
			var nextPage = pd_currentPageNumber + 1;
			if(nextPage <= pageCount) {
				html += '<td onClick="setPageNumberAndDisplayProductArray(' + nextPage + ')"><a href="#" onClick="return(setPageNumberAndDisplayProductArray(' + nextPage + '))" class="pageArrow"><img src="' + pd_imageUrl + 'pagingnext.gif" border="0" hspace="3" class="imgBlock"></a></td>';
			} else {
				html += '';
			}
		}
		
		html += '</tr></table>';
	}	
	return html;
}


function renderPageInfo(productCount) {

debug("renderPageInfo");

	var pageCount = Math.ceil(productCount/pd_itemsPerPage);
	if(pageCount == 1 || pageCount == 0) return "";
	var html = "";
	
	if(pd_currentPageNumber != "all") {
		html += '<span class="pageInfo"><nobr>Page ' + pd_currentPageNumber + ' of ' + pageCount + '&nbsp; &nbsp;</nobr></span>';
	}
	
	return html;
}

function toggleViewAll() {
debug("toggleViewAll()");
	//*************************
	//*** TOGGLE pd_viewAll ***
	//*************************
	if(pd_currentPageNumber != "all") setPageNumber("all");
	else setPageNumber(1);
	
	//*****************
	//*** REDISPLAY ***
	//*****************
	renderControlPanelSortLinks();
	displayProductArray();

	//**************
	//*** RETURN ***
	//**************
	return false;
}

function togglePagingDisplayMode() {
debug("togglepagingDisplayMode()");
	//***********************************
	//*** TOGGLE pd_pagingDisplayMode ***
	//***********************************
	if(pd_pagingDisplayMode == "list") setPagingDisplayMode("grid");
	else setPagingDisplayMode("list");

	//*****************
	//*** REDISPLAY ***
	//*****************
	renderControlPanelSortLinks();
	displayProductArray();

	//**************
	//*** RETURN ***
	//**************
	return false;
}


function viewPage(pageNumber) {
	debug("viewPage, setting pageNumber = " + pageNumber);
	setPageNumber(pageNumber);
	displayProductArray();
	return false;
}

function populateSelectOptions(selectElement, optionList, selected) {
	var optionCount = 0;
	var item = new Object();
	for(item in optionList) {
		if(optionList.hasOwnProperty(item)) {
			optionCount++;
			selectElement.options[optionCount] = new Option(optionList[item].name, optionList[item].name);
			if(selected == optionList[item].name) selectElement.options[optionCount].selected = true;
		}
	}
	return false;
}

function renderSelectOptions(list, defaultOptionName, defaultOptionValue, optionSelected) {
	debug("renderSelectOptions(list, defaultOptionName, defaultOptionValue, optionSelected)");

	var html = "";
	html += '<option value="' + defaultOptionValue + '">' + defaultOptionName + '</option>';
	var item = new Object();
	for(item in list) {
		if(list.hasOwnProperty(item)) {
			html += '<option value="' + list[item].name + '"';
			if(list[item].name == optionSelected) html += ' SELECTED';
			html += '>' + list[item].name + '</option>';
		}
	}
	return html;
}

function renderBestsellerFilterLink() {
	var html = '';
	if(pd_filterBy != 'bestseller'){
		html += '<nobr><img src="' + pd_imageUrl + 'arrowSmall.gif"><a href="#" class="filterLink"  onClick="return(filterProductArrayByBestseller(\'bestseller\'))">Show Bestsellers</a></nobr>';
	}else{	
		html += '<div class="filterLinkDOn"><nobr><img src="' + pd_imageUrl + 'arrowSmallW.gif" hspace="4"><a href=" " class="filterLinkOn"  onClick="return(filterProductArrayByBestseller(\'all\'))"><b>Show All Items</b></a></nobr></div>';
	}
	return html;
}

/*
function renderSortByDropdown() {
	var html = '';
	html += '<form style="display:inline;margin:0;padding:0;">';
	html += '<table border="0" cellpadding="0" cellspacing="0"><tr><td align="center">';
	html += '<select name="sortBy" id="sortBy" onChange="return(doSortBy(this.options[this.selectedIndex].value,\'sortBy\'))" class="sortDDMenu">';
	html += '<option>Sort Results By</option>';

	html += '<option value="title"';
	if(pd_sortBy == "title") html += ' SELECTED';
	html += '>Name</option>';

	html += '<option value="brand"';
	if(pd_sortBy == "brand") html += ' SELECTED';
	html += '>Brand</option>';

	html += '<option value="price"';
	if(pd_sortBy == "price") html += ' SELECTED';
	html += '>Price</option>';

	html += '<option value="bestseller"';
	if(pd_sortBy == "bestseller") html += ' SELECTED';
	html += '>Top Sellers</option>';
		
	html += '<option value="costPerServing"';
	if(pd_sortBy == "costPerServing") html += ' SELECTED';
	html += '>Cost Per Serving</option>';
	
	html += '</select></td></tr>';
	html += '<tr><td align="center"><img src="' + pd_imageUrl + 'upArrowOff.gif" border="0" id="sortArrow"></td></tr>';
	html += '</table></form>';
	
	return html;
	resetMenuHighlight();
}
*/

function doSortBy(sortBy,elem) {
debug("doSortBy(sortBy, elem)");
	pd_sortBy = sortBy;
	var result = displayProductArray();
	return false;
}

function filterProductArrayByBrand(brand) {
debug("filterProductArrayByBrand:" + brand);
	pd_brandSelected = brand;
	pd_filteredDisplayList = getFilteredDisplayListByBrand(brand);
	pd_currentPageNumber = 1;
	var success = displayProductArray();
	return false;
}

//*********************************************
//********* FILTER BESTSELLER ITEMS ***********
//*********************************************
function filterProductArrayByBestseller(filterBy) {
debug("filterProductArrayByBestseller()");
	if(filterBy == 'bestseller'){
		pd_filterBy = 'bestseller';
		pd_filteredDisplayList = getFilteredDisplayListByBestseller();
		pd_currentPageNumber = 1;
		var success = displayProductArray();
	}else{
		pd_filterBy = 'all';
		return(clearFilter());
	}	
	return false;
}

function getFilteredDisplayListByBestseller() {
debug("getFilteredDisplayListByBestseller");
	var productArray = pd_filteredDisplayList;
	var filteredHash = new Array();
	var item = new Object();
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			var isBestseller = productArray[item].bestseller;
			if(isBestseller == "Yes"){
				filteredHash[productArray[item].id] = productArray[item];
			}
		}
	}	
	var filteredList = convertHashToArray(filteredHash);
	return filteredList;
}
//*********************************************
//****** END FILTER BESTSELLER ITEMS **********
//*********************************************

function getFilteredDisplayListByFullStringMatch(filterName, filterValue) {
debug("getFilteredDisplayListByFullStringMatch(" + filterName + "," + filterValue + ")");
	var productArray = pd_filteredDisplayList;
	filterValue = String(filterValue).toLowerCase();	//*** LOWERCASE VALUE FOR CASE INSENSITIVE COMPARISON
	var filteredHash = new Array();
	var item = new Object();
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			var found = true;
			if(String(productArray[item][filterName]).toLowerCase() != filterValue && filterValue != "") found = false;
			if(found == true) filteredHash[productArray[item].id] = productArray[item];
		}
	}
	var filteredList = convertHashToArray(filteredHash);
	return filteredList;
}

function getFilteredDisplayListByBooleanMatch(filterName, filterValue) {
debug("getFilteredDisplayListByBooleanMatch(" + filterName + "," + filterValue + ")");
	var productArray = pd_filteredDisplayList;
	filterValue = String(filterValue).toLowerCase();	//*** LOWERCASE VALUE FOR CASE INSENSITIVE COMPARISON
	var filteredHash = new Array();
	var item = new Object();
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			var found = true;
			if(parseBoolean(productArray[item][filterName]) != parseBoolean(filterValue)) found = false;
			if(found == true) filteredHash[productArray[item].id] = productArray[item];
		}
	}
	var filteredList = convertHashToArray(filteredHash);
	return filteredList;

}


function getFilteredDisplayListBySubStringMatch(filterName, filterValue) {
debug("getFilteredDisplayListBySubStringMatch(" + filterName + "," + filterValue + ")");
	var productArray = pd_filteredDisplayList;
	filterValue = String(filterValue).toLowerCase();	//*** LOWERCASE VALUE FOR CASE INSENSITIVE COMPARISON
	var filteredHash = new Array();
	var item = new Object();
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			var found = false;
			if(String(productArray[item][filterName]).toLowerCase().indexOf(filterValue) > -1) found = true;		
			if(filterValue == "") found = true;	//*** ALWAYS FIND A BLANK SEARCH
			if(found == true) filteredHash[productArray[item].id] = productArray[item];
		}
	}
	var filteredList = convertHashToArray(filteredHash);
	return filteredList;
}

function getFilteredDisplayListBySize(size) {
debug("getFilteredDisplayListBySize");
	var productArray = pd_filteredDisplayList;
	debug("productArray.length = " + productArray.length);
	size = String(size).toLowerCase();
	var filteredHash = new Array();
	var item = new Object();
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			var found = false;
			var tempArray = productArray[item].sizeList.split(",");
			var item2 = new Object();
			for(item2 in tempArray) {
				if(tempArray.hasOwnProperty(item2)) {
					if(String(tempArray[item2]).toLowerCase() == size) found = true;
					if(isBlank(size)) found = true;
				}
			}
			if(found == true) {
				filteredHash[productArray[item].id] = productArray[item];
			}
		}
	}
	var filteredList = convertHashToArray(filteredHash);
	return filteredList;
}

function getFilteredDisplayListByNumericRange(attributeName, numericRange) {
debug("getFilteredDisplayListByNumericRange(" + numericRange + ")");
	var productArray = pd_filteredDisplayList;
	var numericRangeComponents = numericRange.split(":");
	var low = numericRangeComponents[0];
	var high = numericRangeComponents[1];
	
	var filteredList = new Array();
	var item = new Object();
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			var found = false;
			if((productArray[item][attributeName]-0) >= (low-0) && (productArray[item][attributeName]-0) <= (high-0)) found = true;
			if(found == true) filteredList.push(productArray[item]);
		}
	}
	return filteredList;
}


function getFilteredDisplayListByTitleFirstLetterIsNumber() {
debug("getFilteredDisplayListByTitleFirstLetterIsNumber");
	var productArray = pd_displayList;
	var filteredList = new Array();
	var item = new Object();
	var i = 0;
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			if(startsWithNumber(productArray[item].name)) {
				filteredList[i] = productArray[item];
				i++;
			}
		}
	}
	return filteredList;
}

function getFilteredDisplayListByBrandFirstLetterIsNumber() {
debug("getFilteredDisplayListByBrandFirstLetterIsNumber");
	var productArray = pd_displayList;
	var filteredList = new Array();
	var item = new Object();
	var i = 0;
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			if(startsWithNumber(productArray[item].brand)) {
				filteredList[i] = productArray[item];
				i++;
			}
		}
	}
	return filteredList;
}

function getFilteredDisplayListByTitleFirstLetter(firstLetter) {
debug("getFilteredDisplayListByTitleFirstLetter");
	var productArray = pd_displayList;
	var filteredList = new Array();
	var item = new Object();
	var i = 0;
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			if((String(productArray[item].name).substring(0, 1)).toLowerCase() == String(firstLetter).toLowerCase()) {
				filteredList[i] = productArray[item];
				i++;
			}
		}
	}
	return filteredList;
}

function getFilteredDisplayListByBrandFirstLetter(firstLetter) {
debug("getFilteredDisplayListByBrandFirstLetter");
	var productArray = pd_displayList;
	var filteredList = new Array();
	var item = new Object();
	var i = 0;
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			if((String(productArray[item].brand).substring(0, 1)).toLowerCase() == String(firstLetter).toLowerCase()) {
				filteredList[i] = productArray[item];
				i++;
			}
		}
	}
	return filteredList;
}

function getFirstLetterListByBrand() {
debug("getFirstLetterListByBrand");
	var productArray = pd_displayList;
	var firstLetterHash = new Array();
	var item = new Object();
	var firstLetter = "";
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			firstLetter = (String(productArray[item].brand).substring(0,1)).toUpperCase();
			firstLetterHash[firstLetter] = firstLetter;
		}
	}
	return firstLetterHash;
}

function getFirstLetterListByTitle() {
debug("getFirstLetterListByTitle");
	var productArray = pd_displayList;
	var firstLetterHash = new Array();
	var item = new Object();
	var firstLetter = "";
	for(item in productArray) {
		if(productArray.hasOwnProperty(item)) {
			firstLetter = (String(productArray[item].name).substring(0,1)).toUpperCase();
			firstLetterHash[firstLetter] = firstLetter;
		}
	}
	return firstLetterHash;
}


function generateFilterList(listType) {
debug("generateFilterList(" + listType + ")");
	var productArray = pd_displayList;
	var filteredHash = new Array();
	var tempName = "";
	var item = new Object();
	var item2 = new Object();
	for(item in productArray) {
				
		if(productArray.hasOwnProperty(item)) {
	
			var tempArray = String(productArray[item][listType]).split(",");
			for(item2 in tempArray) {	
				tempName = String(tempArray[item2]).toLowerCase();
				if(!isBlank(tempName)) {	
					if(!filteredHash[tempName]) {
						filteredHash[tempName] = new Object();
						filteredHash[tempName].name = tempArray[item2];
						filteredHash[tempName].count = 1;
					} else {
						filteredHash[tempName].count++;
					}
				}
			}
		}
	}
	
	var filteredList = convertHashToArray(filteredHash);
	
	//************************
	//*** SORT BY listType ***
	//************************
	pd_sortTemp = "name";
	filteredList.sort(compareGeneric);
	return filteredList;
}

function startsWithNumber(input) {
	if(	String(input).substring(0, 1) == "0" ||
		String(input).substring(0, 1) == "1" ||
		String(input).substring(0, 1) == "2" ||
		String(input).substring(0, 1) == "3" ||
		String(input).substring(0, 1) == "4" ||
		String(input).substring(0, 1) == "5" ||
		String(input).substring(0, 1) == "6" ||
		String(input).substring(0, 1) == "7" ||
		String(input).substring(0, 1) == "8" ||
		String(input).substring(0, 1) == "9") {
		return true;
	} else {
		return false;
	}
}


function getCurrentPageNumber() {
	debug("initialize : getCurrentPageNumber");
	var pageNumber = 1;
	if(pd_lastSection == pd_currentSection) {
		pageNumber = pdGetCookie("V2pd_currentPageNumber");
	}

	setPageNumber(pageNumber);
	setLastSection(pd_currentSection);
	
	if(isBlank(pageNumber)) pageNumber = 1;
	return pageNumber;	
}
//*******************************************************************
//*********** END DISPLAY PAGE ELEMENTS RELATED TO SORTING **********
//*******************************************************************

//*******************************************************************
//****************** COMPARE AND SORT FUNCTIONS *********************
//*******************************************************************
function performSort() {
debug("performSort()");
	if(pd_sortBy == "default") sortProductArrayByNumeric("defaultSortId");
	else if(pd_sortBy == "name") sortProductArrayByGeneric("name");
	else if(pd_sortBy == "brand") sortProductArrayByGeneric("brand");
	else if(pd_sortBy == "price") sortProductArrayByNumeric("price");
	else if(pd_sortBy == "casePackSize") sortProductArrayByGeneric("casePackSize");
	else if(pd_sortBy == "bestseller") sortProductArrayByNumericDescending("bestseller");
	else if(pd_sortBy == "sizeForm") sortProductArrayByGeneric("sizeForm");
	else if(pd_sortBy == "size") sortProductArrayBySize();
	else if(pd_sortBy == "score") sortProductArrayByNumericDescending("score");
	return false;
}

function getCurrentSortBy() {
	debug("initialize : getCurrentSortBy");
	var pd_sortBy = "";
	pd_currentSection = "";
	if(pd_lastSection == pd_currentSection) {
		pd_sortBy = pdGetCookie("V2pd_pagingSortBy");
	}
	if(isBlank(pd_sortBy)) pd_sortBy = "";
	return pd_sortBy;	
}

function sortProductArrayByGeneric(sortBy) {
debug("sortProductArrayByGeneric");
	pd_sortTemp = "id";
	pd_filteredDisplayList = pd_filteredDisplayList.sort(compareGeneric);
	pd_sortTemp = sortBy;
	pd_filteredDisplayList = pd_filteredDisplayList.sort(compareGeneric);
	return false;
}

function sortProductArrayByNumeric(sortBy) {
debug("sortProductArrayByNumeric(" + sortBy + ")");
	pd_sortTemp = "id";
	pd_filteredDisplayList = pd_filteredDisplayList.sort(compareGeneric);
	pd_sortTemp = sortBy;
	pd_filteredDisplayList = pd_filteredDisplayList.sort(compareNumeric);
	return false;
}

function sortProductArrayByNumericDescending(sortBy) {
debug("sortProductArrayByNumericDescending(" + sortBy + ")");
	pd_sortTemp = "id";
	pd_filteredDisplayList = pd_filteredDisplayList.sort(compareGeneric);
	pd_sortTemp = sortBy;
	pd_filteredDisplayList = pd_filteredDisplayList.sort(compareNumericDescending);
	return false;
}


function compareGeneric(item1, item2) {
	if(String(item1[pd_sortTemp]).toUpperCase() > String(item2[pd_sortTemp]).toUpperCase()) return 1;
	else if(String(item1[pd_sortTemp]).toUpperCase() < String(item2[pd_sortTemp]).toUpperCase()) return -1;
	else return 0;
}

function compareNumeric(item1, item2) {
	if((item1[pd_sortTemp]-0) > (item2[pd_sortTemp]-0)) return 1;
	else if((item1[pd_sortTemp]-0) < (item2[pd_sortTemp]-0)) return -1;
	else return 0;
}
function compareNumericDescending(item1, item2) {
	if((item1[pd_sortTemp]-0) < (item2[pd_sortTemp]-0)) return 1;
	else if((item1[pd_sortTemp]-0) > (item2[pd_sortTemp]-0)) return -1;
	else return 0;
}

function compareSize(item1, item2) {
	if(getSizeSortValue(item1.size) > getSizeSortValue(item2.size)) return 1;
	else if(getSizeSortValue(item1.size) < getSizeSortValue(item2.size)) return -1;
	else return 0;
}

function getSizeSortValue(size) {
	size = size.toUpperCase();
	if(size == "XS" || size == "X-SMALL" || size == "EXTRA SMALL") sizeScore = 0;
	else if(size == "S" || size == "SMALL") sizeScore = 2;
	else if(size == "M" || size == "MEDIUM") sizeScore = 6;
	else if(size == "L" || size == "LARGE") sizeScore = 8;
	else if(size == "XL" || size == "EXTRA LARGE" || size == "X-LARGE") sizeScore = 10;
	else if(size - 0 == size) sizeScore = size;
	else sizeScore = 999;
	return sizeScore;
}
//*******************************************************************
//************** END COMPARE AND SORT FUNCTIONS *********************
//*******************************************************************

function debug(message) {
	if(pd_debugFlag == true) {
		alert(message);
	}
	return false;
}

function getElementsByClassName(classname, node)  {
    if(!node) node = document.getElementsByTagName("body")[0];
    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;
}


function turnOffDisplayOfDataElements() {
	var elementArray = getElementsByClassName("displayDiv");
	var item = new Object();
	for(item in elementArray) {
		if(elementArray.hasOwnProperty(item)) {
			elementArray[item].className = "displayDivHide";
		}
	}
	return true;
}

function setPageNumber(pageNumber) {
	pd_currentPageNumber = pageNumber;
	pdSetCookie("V2pd_currentPageNumber", pageNumber);
	return true;
}

function resetPageNumber() {
	if(pd_currentPageNumber != "all") setPageNumber(1);
	return true;
}

function getPagingDisplayMode() {
	var pagingDisplayMode = pdGetCookie("V2pd_pagingDisplayMode");
	if(isBlank(pagingDisplayMode)) pagingDisplayMode = pd_pagingDisplayModeDefault;
	if(isBlank(pagingDisplayMode)) pagingDisplayMode = "list";
	setPagingDisplayMode(pagingDisplayMode);
	return pagingDisplayMode;
}

function setPagingDisplayMode(pagingDisplayMode) {
	pd_pagingDisplayMode = pagingDisplayMode;
	pdSetCookie("V2pd_pagingDisplayMode", pagingDisplayMode);
	return true;
}

function setCurrentSection(section) {	
	pd_currentSection = section;	
	pdSetCookie("V2pd_currentSection", section);
	return true;
}

function setLastSection(section) {	
	pd_lastSection = section;	
	pdSetCookie("V2pd_lastSection", section);
	return true;
}

function convertHashToArray(hash) {
	var tempArray = new Array();
	var item = new Object();
	for(item in hash) {
		if(hash.hasOwnProperty(item)) {
			tempArray.push(hash[item]);
		}	
	}
	return tempArray;
}

function setPageNumberAndDisplayProductArray(pageNumber) {
	setPageNumber(pageNumber);

	//SCROLL TO TOP OF PAGING
	var pagingTop = document.getElementById('pagingTop');
	pagingTop.scrollIntoView();

	displayProductArray();
	return false;
}

//**************************************
//*** CONCATENATED FUNCTION WRAPPERS ***
//**************************************
function sortAndDisplayByDefault() {
	resetPageNumber();
	pd_sortBy = "default";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByBrand() {
	resetPageNumber();
	pd_sortBy = "brand";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByName() {
	resetPageNumber();
	pd_sortBy = "name";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByPrice() {
	resetPageNumber();
	pd_sortBy = "price";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByCasePackSize() {
	resetPageNumber();
	pd_sortBy = "casePackSize";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayBySize() {
	resetPageNumber();
	pd_sortBy = "size";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByScore() {
	resetPageNumber();
	pd_sortBy = "score";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByBestseller() {
	resetPageNumber();
	pd_sortBy = "bestseller";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}

//************************
//**** BUTTON FILTERS ****
//************************
function setAndPerformFilterByStoneButton() {
debug("setAndPerformFilterByStoneButton()");
	pd_filterByStoneButton = !pd_filterByStoneButton;
	renderControlPanelFilterButtons();
	performFilter();
}
function setAndPerformFilterByNonStoneButton() {
debug("setAndPerformFilterByNonStoneButton()");
	pd_filterByNonStoneButton = !pd_filterByNonStoneButton;
	renderControlPanelFilterButtons();
	performFilter();
}
