//*************************************************
//***** COPYRIGHT 2007, PRACTICAL DATA, INC. ******
//***** - UNAUTHORIZED USE IS PROHIBITED **********
//*************************************************

//***************************************************************************
//********************* INITIALIZE PAGING VARIABLES *************************
//***************************************************************************
var pd_itemsPerPage = "";
var pd_pagesToDisplay = "";
var pd_itemsPerRow = "";
var pd_itemsCount = 0;
var pd_sortBy = "";
var pd_gridViewTableWidth = 600;
var pd_gridViewTableSpacer = 6;
var pd_yahooStoreId = "";
var pd_debugFlag = false;
var pd_noItemsFoundMessage = "";
var pd_regPriceText = "";
var pd_salePriceText = "";
var pd_myAccountPricingText = "";
var pd_sortByDefault = "default"; 
var pd_sortByDefaultUseOrderCount = true; // Set to "true" to use new PD Core "pd-order-count" variable field to order contents

var pd_showGridViewAddToCart = false;

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 = "list";
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 = "Filter Items By Keyword(s):";
var pd_myAccountPricingNoDiscountForSaleItems = "";
//***** SHOW ABSTRACT BELOW NAME LINK
var pd_showAbstractText = true;

var pd_sortTemp = "";

var pd_displayList = new Array();
var pd_filteredDisplayList = new Array();

//*************************
//*** INITIALIZE PAGING ***
//*************************
function pdPagingInitialize() {
debug("pdPagingInitialize()");

	if(isBlank(pd_regPriceText)) pd_regPriceText = "Regular Price:";
	if(isBlank(pd_salePriceText)) pd_salePriceText = "Sale Price:";
	if(isBlank(pd_myAccountPricingText)) pd_myAccountPricingText = "Your Price:";
	
	if(isBlank(pd_showGridViewAddToCart)) pd_showGridViewAddToCart = false;

	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_sortByDefault)) pd_sortBy = "default";
	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;
	if(isBlank(pd_myAccountPricingEnabled)) pd_myAccountPricingEnabled = false;
	if(isBlank(pd_myAccountPricingNoDiscountForSaleItems)) pd_myAccountPricingNoDiscountForSaleItems = false;
	pd_displayList = parseDisplayList();
	pd_itemsCount = pd_displayList.length;

	performSort();
	renderControlPanelFilters();
	renderSortByDropdown();
	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 ***
	//************************************
	loadFilters();
	
	//***********************
	//*** 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 ***
	//**************************************************************************
	if(pd_searchText != pd_searchTextFirstLoad){
		pd_filteredDisplayList = getFilteredDisplayListBySubStringMatch("searchIndex", pd_searchText);
		debug("pd_filteredDisplayList.length=" + pd_filteredDisplayList.length);
	}
	
	//***************************
	//**** REDISPLAY RESULTS ****
	//***************************	
	var success = displayProductArray();
	
	//********************************************
	//*** RESET CURSOR FOCUS TO KEYWORD FILTER ***
	//********************************************
	if(document.getElementById("pdPagingFilterByKeyword")){
		var pdPagingFilterByKeyword = document.getElementById("pdPagingFilterByKeyword");
		pdPagingFilterByKeyword.focus();
		if(pdPagingFilterByKeyword.value == pd_searchTextFirstLoad){
			//** DO NOTHING **
		}else if(isBlank(pdPagingFilterByKeyword.value)){
			pdPagingFilterByKeyword.value = pd_searchTextFirstLoad;
		}else{
			pdPagingFilterByKeyword.value = pd_searchText;
		}
	}
	
	//****************************************************************
	//*** SHOW SEARCH CANCEL BUTTON IF THE SEARCH BOX IS POPULATED ***
	//****************************************************************
	var pdPagingFilterByKeyword = document.getElementById("pdPagingFilterByKeyword");
	if(pdPagingFilterByKeyword){
		if(pdPagingFilterByKeyword.value != pd_searchTextFirstLoad && !isBlank(pdPagingFilterByKeyword.value)){
			displaySearchCancelButton();
		}
	}
	
	return false;
}

function resetFilters() {
debug("resetFilters()");
	try {document.getElementById("pdPagingFilterByBrand").options.selectedIndex = 0;} 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) {
debug("loadSavedFilters()");
	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){}	
	
	//************************
	//*** 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("&");
	
	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 pdPagingFilterByKeyword = document.getElementById("pdPagingFilterByKeyword");
	var pdPagingFilterByKeywordCancelButton = document.getElementById("pdPagingFilterByKeywordCancelButton");
	var pdPagingFilterByKeywordCancelButtonActive = document.getElementById("pdPagingFilterByKeywordCancelButtonActive");
	pdPagingFilterByKeywordCancelButtonActive.className = "pdFilterItemsByKeywordClose";
	pdPagingFilterByKeywordCancelButton.className = "pdHideDiv";
	try {pdRemoveEvent(pdPagingFilterByKeywordCancelButtonActive,"click", clearSearch);} catch(e) {}
	pdAddEvent(pdPagingFilterByKeywordCancelButtonActive,"click", clearSearch);
	pdAddEvent(pdPagingFilterByKeyword,"click", clearFirstTimeSearchText);
	return false;	
}

function clearFirstTimeSearchText() {
	var pdPagingFilterByKeyword = document.getElementById("pdPagingFilterByKeyword");

debug("clearFirstTimeSearchText()");
	if(pd_searchFirstRun) {
		pdPagingFilterByKeyword.value = "";
		pd_searchFirstRun = false;
	}
	if(pdPagingFilterByKeyword.value == pd_searchTextFirstLoad) {
		pdPagingFilterByKeyword.value = "";
	}
	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 = "pdHideDiv";
	document.getElementById("pdPagingFilterByKeywordCancelButton").className = "pdShowDiv";
	
	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));
	if(pd_lastSection != pd_currentSection) {
		pd_sortBy = pd_sortByDefault;
	}
	pd_currentPageNumber = getCurrentPageNumber();
	loadSavedFilters();
	
	//***********************************************
	//***** BUILD JS ARRAY OF PRODUCT ELEMENTS ******
	//***********************************************
	var i = 0;
	var displayList = new Array();
	
	//*******************************************
	//*** ONLY LOAD IF PRODUCT WRAPPER EXISTS ***
	//*******************************************
	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();
					if(displayList[i].keywords) displayList[i].searchIndex += " " + String(displayList[i].keywords).toLowerCase();
					
				 	i++;
				 }
			  oChild = oChild.nextSibling;
		   }
		}
		
		//*******************************************
		//**** TURN OFF DISPLAY OF DATA ELEMENTS ****
		//*******************************************
		turnOffDisplayOfDataElements();
		
	} else {
		displayList = false;
	}
	
	//*******************************************
	//*** SAVE INITIAL FILTERED PRODUCT ARRAY ***
	//*******************************************
	pd_filteredDisplayList = displayList;
	
	//****************
	//**** RETURN ****
	//****************
	return displayList;	
}

function renderProductArray() {
	debug("renderProductArray");
	var productArray = pd_filteredDisplayList;
	var productArrayLen = productArray.length;
	var html = "";
	var tempHtml = "";
	var tempProductHtml = "";
	var tempHtmlTable = "";
	
	var pageNumber = 1;
	var i = 1;
	var item = new Object();
	var rowItemCount = 1;
	var isOpen = false;
	var productIdList = "";
	var shade = true;
	
	//*** GRID TABLE VARIABLES ***				
	var pd_gridViewTableSpacerTotalWidth = (pd_gridViewTableSpacer * pd_itemsPerRow) - pd_gridViewTableSpacer;
	var cellWidth = ((pd_gridViewTableWidth - pd_gridViewTableSpacerTotalWidth) / pd_itemsPerRow);
	
	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"){
					
					if(rowItemCount == 1) {
						tempHtml += '<tr valign="top">\r\n';
						isOpen = true;
					}
					tempHtml += '<td align="center" width="' + Math.floor(cellWidth) + '" class="item">';
					tempHtml += '<div class="pdDisplayGridItemWrapper" id="' + productArray[item].id + '">';
					tempHtml += genProductHtmlGridItem(productArray[item].id);
					tempHtml += '</div></td>';

					if(rowItemCount != pd_itemsPerRow){
						tempHtml += '<td width="' + pd_gridViewTableSpacer + '"><img src="' + pd_imageUrl + 'spacer.gif" width="' + pd_gridViewTableSpacer + '"></td>';
					}
					
					rowItemCount++;
					
					if(rowItemCount > pd_itemsPerRow) {
						tempHtml += '</tr><tr><td colspan="' + ((pd_itemsPerRow * 2) - 1) + '" class="pdDisplayGridWrapperSpacer"></td></tr>';
						rowItemCount = 1;
						isOpen = false;
					}		
					
				//*************************************************
				//*************** GENERATE LIST VIEW HTML *********
				//*************************************************					
				} else {
					tempHtml += '<div id="' + productArray[item].id;
					if(!shade) {
						tempHtml += '" class="pdDisplayDivListOn">';
					} else {
						tempHtml += '" class="pdDisplayDivList">';
					}
					tempHtml += genProductHtmlList(productArray[item].id);
					tempHtml += '</div><div class="pdDisplayDivListBar"></div>';
					
					shade = !shade;
				}
	
			}
			i++;
			pageNumber = Math.ceil(i / pd_itemsPerPage);
			
			html += tempHtml;
		}
	}
	//***** ADD GUIDE ROW FOR GRID VIEW *******
	var guideRow = '';
	for (i=1;i<=pd_itemsPerRow;i++){
		guideRow += '<td width="' + Math.floor(cellWidth) + '"><img src="' + pd_imageUrl + 'spacer.gif" width="' + Math.floor(cellWidth) + '" height="1"></td>';
		if(i != pd_itemsPerRow){
			guideRow += '<td width="' + pd_gridViewTableSpacer + '"><img src="' + pd_imageUrl + 'spacer.gif" width="' + pd_gridViewTableSpacer + '" height="1"></td>';
		}
	}
	//*** ADD TABLE WRAP IF GRID DISPLAY ****
	tempHtmlTable += '<div class="pdDisplayGridWrapper"><table border="0" cellpadding="0" cellspacing="0" width="' + pd_gridViewTableWidth + '">';
	//tempHtmlTable += '<div class="pdDisplayGridWrapper"><table border="0" cellpadding="0" cellspacing="0" width="100%">';
	tempHtmlTable += html;
	tempHtmlTable += '<tr>' + guideRow + '</tr>';
	tempHtmlTable += '</table></div>';
	
	if(pd_pagingDisplayMode == "grid"){
		html = tempHtmlTable;
	}
	
	return html;
}

//***********************************************
//******** VIEW PRODUCT ARRAY AS GRID ***********
//***********************************************
function genProductHtmlGridItem(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(var 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 = '';
	var onSale = true;
	if(priceReg > priceSale){
		priceDisplay = '<div class="pagedPriceDiv"><div class="pagedPrice">' + pd_regPriceText + '<strike>' + ' ' + pdPagingFormatCurrency(priceReg,true) + '</strike></div><div class="pagedPriceSale">' + pd_salePriceText + ' ' + pdPagingFormatCurrency(itemData["price"]-0,true) + '</div></div>';
		onSale = true;
	}else if(priceReg > 0){
		priceDisplay = '<div class="pagedPriceDiv"><span class="pagedPriceSale">' + pdPagingFormatCurrency(itemData["price"]-0,true) + '</span></div>';
		onSale = false;
	}
	

	//**** LINK/PRICE DISPLAY ****
	var linkHtml = '<a href="' + itemData["itemId"] + '.html" class="pagedLink">';

	
	//*****************************************
	//*** QUICK SHOP ENABLED FOR THIS ITEM? ***
	//*****************************************
	var pd_quickShopApplies = false;
	if((!isBlank(priceReg) || !isBlank(priceSale)) && pd_quickShopEnabled == true) pd_quickShopApplies = true;
	//*** USE BLANK TITLE IF QUICK SHOP DOES NOT APPLY TO THIS ITEM ***
	var tempTitle = itemData["itemId"];
	if(pd_quickShopApplies == false){tempTitle = "";}

	var html = '';
	html += '<div class="pagingItemImgGrid" title="' + tempTitle +'">' + linkHtml + '<img src="' + itemData["image"] + '" border="0"></a></div>';
	html += linkHtml + itemData["name"] + '</a>';
	
	//html += '<div class="pagingAbstract">' + itemData["abstract"] + '</div>';

	//******* RATING DISPLAY ******
	var rating = itemData["rating"] - 0;
	var ratingCount = itemData["ratingCount"] - 0;
	var ratingCountS = '';
	if(ratingCount > 1){ratingCountS = 's'}
	
	if(rating  > 0){
		html += '<div class="pdPagingRating">';
		html += '<img src="' + pd_imageUrl + 'rating/' + rating + '.gif" border="0">';
		if(ratingCount > 0 && pd_enableRatingCount == true ){
			html += '<span>(' + ratingCount + ' rating' + ratingCountS + ')</span>';
		}
		html += '</div>';
	}
	
	//**** PRICE DISPLAY *********
	html += priceDisplay;
	
	
	//********************************************************
	//*** RETRIEVE DISCOUNT AND CALCULATE DISCOUNTED PRICE ***
	//********************************************************
	var discountPercentage = 0;
	var discountOption = "";
	if(pd_myAccountPricingEnabled && (pd_myAccountPricingNoDiscountForSaleItems == false || (pd_myAccountPricingNoDiscountForSaleItems == true && onSale == false))) {	//*** RESTRICT DISCOUNT TO ONSALE ITEMS
		try {
			discountPercentage = getDiscountPercentage(itemData["itemId"]);
			var pipeIndex = String(discountPercentage).indexOf("|");
			if(pipeIndex > -1) discountPercentage = String(discountPercentage).substring(0, pipeIndex) - 0;	//*** IGNORE QTY PRICING
		} catch(e) {
			//*** IGNORE IF NOT AVAILABLE 
		}
	}
	if(discountPercentage > 0) {
		var discountedPrice = priceSale - (priceSale * (discountPercentage/100));		
		html += '<div class="pagedPriceYourPrice">';
		html += pd_myAccountPricingText + pdPagingFormatCurrency(discountedPrice, true);
		html += "<div>";
		
		var discountAmount = Math.round((priceSale - discountedPrice) * 100)/100;
		discountOption = '<input type="hidden" name="Discount" value="(- ' + pdPagingFormatCurrency(discountAmount) + ')">';		
	}

	//****************************************************************************************//
	//**** DISPLAY ADD TO CART BUTTON IF ITEM IS ORDERABLE/ DOES NOT HAVE OPTIONS ************//
	//****************************************************************************************//
	if(pd_showGridViewAddToCart){
		html += '<div style="margin-top:6px;">';
		if((!isBlank(itemData["priceReg"]) || !isBlank(itemData["priceSale"])) && itemData["orderable"] == "T" && itemData["hasOptions"] != "T"){
			html += '<form method="POST" style="display:inline;" action="http://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 += discountOption;		
			html += '<input type="image" src="' + pd_imageUrl + 'pagingAddCart.gif" border="0">';
			html += '</form>';
		} else if((!isBlank(itemData["priceReg"]) || !isBlank(itemData["priceSale"])) && itemData["orderable"] == "T") {
			html += linkHtml + '<img src="' + pd_imageUrl + 'pagingMoreInfo.gif" border="0">' + '</a>';
		} else if(itemData["orderable"] != "T") {
			html += linkHtml + '<img src="' + pd_imageUrl + 'pagingOutOfStock.gif" border="0">' + '</a>';
		}
		html += '</div>';
	}	
	
	return html;
}
//***********************************************
//******** VIEW PRODUCT ARRAY AS LIST ***********
//***********************************************
function genProductHtmlList(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(var 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 = '';
	var onSale = true;
	if(priceReg > priceSale){
		onSale = true;
	} else if(priceReg > 0){
		onSale = false;
	}
	
	//***** LINK HTML ******
	var linkHtml = '<a href="' + itemData["itemId"] + '.html" class="pagedLink">';

	var displayHtml = document.getElementById(dataDiv).innerHTML;
	
	//***********************
	//**** DISPLAY IMAGE ****
	//***********************
	var imageHtml = '<img src="' + itemData["image"] + '" border="0">';
	
	displayHtml = displayHtml.replace("<!-" + "- pdImageDisplay -" + "->", imageHtml);

	
	
	//********************************************************
	//*** RETRIEVE DISCOUNT AND CALCULATE DISCOUNTED PRICE ***
	//********************************************************
	var discountPercentage = 0;
	if(pd_myAccountPricingEnabled && (pd_myAccountPricingNoDiscountForSaleItems == false || (pd_myAccountPricingNoDiscountForSaleItems == true && onSale == false))) {	//*** RESTRICT DISCOUNT TO ONSALE ITEMS
		try {
			discountPercentage = getDiscountPercentage(itemData["itemId"]);
			var pipeIndex = String(discountPercentage).indexOf("|");
			if(pipeIndex > -1) discountPercentage = String(discountPercentage).substring(0, pipeIndex) - 0;	//*** IGNORE QTY PRICING	
		} catch(e) {
			//*** IGNORE IF NOT AVAILABLE 
		}
	}
	if(discountPercentage > 0) {
		var discountedPrice = priceSale - (priceSale * (discountPercentage/100));
		var html = '<div class="pagingMyAccountPrice">';	
		html += pd_myAccountPricingText + pdPagingFormatCurrency(discountedPrice, true);
		html += '</div>';
		displayHtml = displayHtml.replace("<!-" + "- pdPricingDisplay -" + "->", html);
		
		var discountAmount = Math.round((priceSale - discountedPrice) * 100)/100;
		var discountOption = '<input type="hidden" name="Discount" value="(- ' + pdPagingFormatCurrency(discountAmount) + ')">';
		displayHtml = displayHtml.replace(/<\/form>/i, discountOption + "</form>");
	}
		
	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="pdFilterNoProductsFound">' + 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);
	
	var pageCount = Math.ceil(pd_filteredDisplayList.length/pd_itemsPerPage);
	if(pageCount > 1) {	
		document.getElementById("pageNumberBar").className = "pdPagingNumberBarWrap";
		document.getElementById("pageNumberBarBottom").className = "pdPagingNumberBarFooterWrap";
		document.getElementById("pageNumberLinks").innerHTML = renderPageNumberLinks(pd_filteredDisplayList.length);
		document.getElementById("pageNumberLinksBottom").innerHTML = renderPageNumberLinks(pd_filteredDisplayList.length);
	} else {
		document.getElementById("pageNumberBar").className = "pagingControlPanelHide";
		document.getElementById("pageNumberBarBottom").className = "pagingControlPanelHide";
	}
	//*****************************
	//*** ADD QUICKSHOP BUTTONS ***
	//*****************************
	//if(pd_quickShopEnabled == true) pdDeferUntilLoaded(pdQsButtons,"pdQuickShopDisplayWindow");

	if(pd_quickShopEnabled == true){pdQsButtons();}

	
	//**************
	//*** RETURN ***
	//**************
	return false;
}


function renderControlPanelSortLinks() {

	//****************************************
	//**** SORT BY DEFAULT/POPULAR 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 = "pdHiddenElem";
		pdPagingSortByDefaultButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "default") pdPagingSortByDefaultButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByDefaultButton.className = "pdSortLink";
		pdAddEvent(pdPagingSortByDefaultButton,"click", sortAndDisplayByDefault);
	}

	//*******************************************************
	//**** SORT BY DEFAULT/POPULAR - MULTI ACTION BUTTON ****
	//*******************************************************
	var pdPagingSortByDefaultButtonAscDesc = document.getElementById("pdPagingSortByDefaultButtonAscDesc");
	var pdPagingSortByDefaultButtonAsc = document.getElementById("pdPagingSortByDefaultButtonAsc");
	var pdPagingSortByDefaultButtonDesc = document.getElementById("pdPagingSortByDefaultButtonDesc");

	if(pdPagingSortByDefaultButtonAscDesc != null && pdPagingSortByDefaultButtonAsc != null && pdPagingSortByDefaultButtonDesc != null) {
		try {pdRemoveEvent(pdPagingSortByDefaultButtonAscDesc,"click", sortAndDisplayByDefault);} catch(e) {}
		pdPagingSortByDefaultButtonAscDesc.className = "pdHiddenElem";
		pdPagingSortByDefaultButtonAsc.className = "pdHiddenElem";
		pdPagingSortByDefaultButtonDesc.className = "pdHiddenElem";
		if(pd_sortBy == "defaultDesc"){
			pdPagingSortByDefaultButtonDesc.className = "pdSortLinkActiveDesc";
			pdAddEvent(pdPagingSortByDefaultButtonDesc,"click", sortAndDisplayByDefault);	
		}else if(pd_sortBy == "default"){
			pdPagingSortByDefaultButtonAsc.className = "pdSortLinkActive";
			pdAddEvent(pdPagingSortByDefaultButtonAsc,"click", sortAndDisplayByDefaultDesc);	
		}else{
			pdPagingSortByDefaultButtonAscDesc.className = "pdSortLink";
			pdAddEvent(pdPagingSortByDefaultButtonAscDesc,"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 = "pdHiddenElem";
		pdPagingSortByBrandButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "brand") pdPagingSortByBrandButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByBrandButton.className = "pdSortLink";
		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 = "pdHiddenElem";
		pdPagingSortByNameButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "name") pdPagingSortByNameButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByNameButton.className = "pdSortLink";
		pdAddEvent(pdPagingSortByNameButton,"click", sortAndDisplayByName);	
	}
	
	//********************************************
	//**** SORT BY NAME - MULTI ACTION BUTTON ****
	//********************************************
	var pdPagingSortByNameButtonAscDesc = document.getElementById("pdPagingSortByNameButtonAscDesc");
	var pdPagingSortByNameButtonAsc = document.getElementById("pdPagingSortByNameButtonAsc");
	var pdPagingSortByNameButtonDesc = document.getElementById("pdPagingSortByNameButtonDesc");
	if(pdPagingSortByNameButtonAscDesc != null && pdPagingSortByNameButtonAsc != null && pdPagingSortByNameButtonDesc != null) {
		try {pdRemoveEvent(pdPagingSortByNameButtonAscDesc,"click", sortAndDisplayByName);} catch(e) {}
		pdPagingSortByNameButtonAscDesc.className = "pdHiddenElem";
		pdPagingSortByNameButtonAsc.className = "pdHiddenElem";
		pdPagingSortByNameButtonDesc.className = "pdHiddenElem";
		if(pd_sortBy == "nameDesc"){
			pdPagingSortByNameButtonDesc.className = "pdSortLinkActiveDesc";
			pdAddEvent(pdPagingSortByNameButtonDesc,"click", sortAndDisplayByName);	
		}else if(pd_sortBy == "name"){
			pdPagingSortByNameButtonAsc.className = "pdSortLinkActive";
			pdAddEvent(pdPagingSortByNameButtonAsc,"click", sortAndDisplayByNameDesc);	
		}else{
			pdPagingSortByNameButtonAscDesc.className = "pdSortLink";
			pdAddEvent(pdPagingSortByNameButtonAscDesc,"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 = "pdHiddenElem";
		pdPagingSortBySizeButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "size") pdPagingSortBySizeButtonActive.className = "pdSortLinkActive";
		else pdPagingSortBySizeButton.className = "pdSortLink";
		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 = "pdHiddenElem";
		pdPagingSortByPriceButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "price") pdPagingSortByPriceButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByPriceButton.className = "pdSortLink";
		pdAddEvent(pdPagingSortByPriceButton,"click", sortAndDisplayByPrice);	
	}
	
	//***********************************
	//**** SORT BY PRICE DESC BUTTON ****
	//***********************************
	var pdPagingSortByPriceDescButton = document.getElementById("pdPagingSortByPriceDescButton");
	var pdPagingSortByPriceDescButtonActive = document.getElementById("pdPagingSortByPriceDescButtonActive");
	if(pdPagingSortByPriceDescButton != null && pdPagingSortByPriceDescButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByPriceDescButton,"click", sortAndDisplayByPriceDesc);} catch(e) {}
		pdPagingSortByPriceDescButton.className = "pdHiddenElem";
		pdPagingSortByPriceDescButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "priceDesc") pdPagingSortByPriceDescButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByPriceDescButton.className = "pdSortLink";
		pdAddEvent(pdPagingSortByPriceDescButton,"click", sortAndDisplayByPriceDesc);	
	}

	//**********************************************************************
	//**** SORT BY PRICE BUTTON MULTI ACTION BUTTON - LOW/HIGH HIGH/LOW ****
	//**********************************************************************
	var pdPagingSortByPriceButtonAscDesc = document.getElementById("pdPagingSortByPriceButtonAscDesc");
	var pdPagingSortByPriceButtonActiveAsc = document.getElementById("pdPagingSortByPriceButtonActiveAsc");
	var pdPagingSortByPriceButtonActiveDesc = document.getElementById("pdPagingSortByPriceButtonActiveDesc");
	if(pdPagingSortByPriceButtonAscDesc != null && pdPagingSortByPriceButtonActiveAsc != null && pdPagingSortByPriceButtonActiveDesc != null) {
		try {pdRemoveEvent(pdPagingSortByPriceButtonAscDesc,"click", sortAndDisplayByPrice);} catch(e) {}
		pdPagingSortByPriceButtonAscDesc.className = "pdHiddenElem";
		pdPagingSortByPriceButtonActiveAsc.className = "pdHiddenElem";
		pdPagingSortByPriceButtonActiveDesc.className = "pdHiddenElem";
		if(pd_sortBy == "priceDesc"){
			pdPagingSortByPriceButtonActiveDesc.className = "pdSortLinkActiveDesc";
			pdAddEvent(pdPagingSortByPriceButtonActiveDesc,"click", sortAndDisplayByPrice);	
		}else if(pd_sortBy == "price"){
			pdPagingSortByPriceButtonActiveAsc.className = "pdSortLinkActive";
			pdAddEvent(pdPagingSortByPriceButtonActiveAsc,"click", sortAndDisplayByPriceDesc);	
		}else{
			pdPagingSortByPriceButtonAscDesc.className = "pdSortLink";
			pdAddEvent(pdPagingSortByPriceButtonAscDesc,"click", sortAndDisplayByPrice);	
		}
	}	
	
	//*************************************************
	//**** SORT BY RATING BUTTON **********************
	//*************************************************
	var pdPagingSortByRatingButton = document.getElementById("pdPagingSortByRatingButton");
	var pdPagingSortByRatingButtonActive = document.getElementById("pdPagingSortByRatingButtonActive");
	if(pdPagingSortByRatingButton != null && pdPagingSortByRatingButtonActive != null) {
		try {pdRemoveEvent(pdPagingSortByRatingButton,"click", sortAndDisplayByRatingDesc);} catch(e) {}
		pdPagingSortByRatingButton.className = "pdHiddenElem";
		pdPagingSortByRatingButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "ratingDesc") pdPagingSortByRatingButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByRatingButton.className = "pdSortLink";
		pdAddEvent(pdPagingSortByRatingButton,"click", sortAndDisplayByRatingDesc);	
	}

	//**********************************************************************
	//**** SORT BY RATING BUTTON MULTI ACTION BUTTON - LOW/HIGH HIGH/LOW ****
	//**********************************************************************
	var pdPagingSortByRatingButtonAscDesc = document.getElementById("pdPagingSortByRatingButtonAscDesc");
	var pdPagingSortByRatingButtonActiveAsc = document.getElementById("pdPagingSortByRatingButtonActiveAsc");
	var pdPagingSortByRatingButtonActiveDesc = document.getElementById("pdPagingSortByRatingButtonActiveDesc");
	if(pdPagingSortByRatingButtonAscDesc != null && pdPagingSortByRatingButtonActiveAsc != null && pdPagingSortByRatingButtonActiveDesc != null) {
		try {pdRemoveEvent(pdPagingSortByRatingButtonAscDesc,"click", sortAndDisplayByRating);} catch(e) {}
		pdPagingSortByRatingButtonAscDesc.className = "pdHiddenElem";
		pdPagingSortByRatingButtonActiveAsc.className = "pdHiddenElem";
		pdPagingSortByRatingButtonActiveDesc.className = "pdHiddenElem";
		if(pd_sortBy == "ratingDesc"){
			pdPagingSortByRatingButtonActiveDesc.className = "pdSortLinkActive";
			pdAddEvent(pdPagingSortByRatingButtonActiveDesc,"click", sortAndDisplayByRating);	
		}else if(pd_sortBy == "rating"){
			pdPagingSortByRatingButtonActiveAsc.className = "pdSortLinkActiveDesc";
			pdAddEvent(pdPagingSortByRatingButtonActiveAsc,"click", sortAndDisplayByRatingDesc);	
		}else{
			pdPagingSortByRatingButtonAscDesc.className = "pdSortLink";
			pdAddEvent(pdPagingSortByRatingButtonAscDesc,"click", sortAndDisplayByRatingDesc);	
		}
	}	
		
	//***************************************
	//**** 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 = "pdHiddenElem";
		pdPagingSortByCasePackSizeButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "casePackSize") pdPagingSortByCasePackSizeButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByCasePackSizeButton.className = "pdSortLink";
		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 = "pdHiddenElem";
		pdPagingSortByScoreButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "score") pdPagingSortByScoreButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByScoreButton.className = "pdSortLink";
		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 = "pdHiddenElem";
		pdPagingSortByBestsellerButtonActive.className = "pdHiddenElem";
		if(pd_sortBy == "bestseller") pdPagingSortByBestsellerButtonActive.className = "pdSortLinkActive";
		else pdPagingSortByBestsellerButton.className = "pdSortLink";
		pdAddEvent(pdPagingSortByBestsellerButton,"click", sortAndDisplayByBestseller);	
	}	
	
	//*************************************
	//**** VIEW ALL ITEMS / PAGED VIEW ****
	//*************************************
	var pdPagingViewAllButton = document.getElementById("pdPagingViewAllButton");
	var pdPagingViewAllButtonActive = document.getElementById("pdPagingViewAllButtonActive");
	if(pd_itemsCount > pd_itemsPerPage) {
		if(pdPagingViewAllButton != null && pdPagingViewAllButtonActive != null) {
			try {pdRemoveEvent(pdPagingViewAllButton,"click", toggleViewAll);} catch(e) {}
			try {pdRemoveEvent(pdPagingViewAllButtonActive,"click", toggleViewAll);} catch(e) {}
			pdPagingViewAllButton.className = "pdHiddenElem";
			pdPagingViewAllButtonActive.className = "pdHiddenElem";
			if(pd_currentPageNumber == "all") pdPagingViewAllButtonActive.className = "pdPagingViewAllButtonActive";
			else pdPagingViewAllButton.className = "pdPagingViewAllButton";
			pdAddEvent(pdPagingViewAllButton,"click", toggleViewAll);
			pdAddEvent(pdPagingViewAllButtonActive,"click", toggleViewAll);
		}
	}else{
			pdPagingViewAllButton.className = "pdHiddenElem";
			pdPagingViewAllButtonActive.className = "pdHiddenElem";
	}

	//*****************************
	//**** 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 = "pdHiddenElem";
		pdPagingDisplayGridButtonActive.className = "pdHiddenElem";
		if(pd_pagingDisplayMode == "list") pdPagingDisplayGridButtonActive.className = "pdDisplayModeGrid";
		else pdPagingDisplayGridButton.className = "pdDisplayModeGridActive";
		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 = "pdHiddenElem";
		pdPagingDisplayListButtonActive.className = "pdHiddenElem";
		if(pd_pagingDisplayMode == "grid") pdPagingDisplayListButtonActive.className = "pdDisplayModeList";
		else pdPagingDisplayListButton.className = "pdDisplayModeListActive";
		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 = "pdHideDiv";
		else {
			pdPagingFilterByBrand.className = "pdShowDivInline";
			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 = "pdHideDiv";
		else {
			pdPagingFilterBySize.className = "pdShowDivInline";
			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 = "pdHideDiv";
		else {
			pdPagingFilterByColor.className = "pdShowDivInline";
			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 = "pdHideDiv";
		else {
			pdPagingFilterByMaterial.className = "pdShowDivInline";
			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 = "pdHideDiv";
		else {
			pdPagingFilterByCategory.className = "pdShowDivInline";
			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 = "pdHiddenElem";
			pdPagingFilterStoneButtonActive.className = "pdSortLinkActive";
		} else {
			pdPagingFilterStoneButtonActive.className = "pdHiddenElem";
			pdPagingFilterStoneButton.className = "pdSortLinkActive";
		}
		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 = "pdHiddenElem";
			pdPagingFilterNonStoneButtonActive.className = "pdSortLinkActive";
		} else {
			pdPagingFilterNonStoneButtonActive.className = "pdHiddenElem";
			pdPagingFilterNonStoneButton.className = "pdSortLinkActive";
		}
		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="0"><tr valign="top">';
		
		//**********************
		//*** PREVIOUS ARROW ***
		//**********************		
		if(pd_currentPageNumber != "all") {	
			if(pd_currentPageNumber > 1) {
				var previousPage = pd_currentPageNumber - 1;
				html += '<td><div class="pdPageArrowPrev" onClick="return(setPageNumberAndDisplayProductArray(' + previousPage + '))"></div></td>';
			} else {
				html += '';
			}
		}
			
		for(var i=firstPageNumberToDisplay;i<=lastPageNumberToDisplay;i++) {
			if(pd_currentPageNumber == i) {
				html += '<td><div class="pdPageNumBgOn">' + i + '</div></td>';
				if(i < lastPageNumberToDisplay) html += '';
			} else {
				html += '<td><div class="pdPageNumBg" onClick="return(setPageNumberAndDisplayProductArray(' + i + '))">' + i + '</div></td>';
				if(i < lastPageNumberToDisplay) html += '';
			}
		}
		
		//******************
		//*** NEXT ARROW ***
		//******************	
		if(pd_currentPageNumber != "all") {	
			var nextPage = pd_currentPageNumber + 1;
			if(nextPage <= pageCount) {
				html += '<td><div class="pdPageArrowNext" onClick="return(setPageNumberAndDisplayProductArray(' + nextPage + '))"></div></td>';
			} else {
				html += '';
			}
		}
		
		html += '</tr></table>';
	}	
	return html;
}


function renderPageInfo(productCount) {
debug("renderPageInfo");

	var html = "";

	/*** CHANGE DISPLAY TO PAGE COUNT OR ITEM COUNT ***/
	if(pd_enableItemCountResults == true){
		/** SET SHOWING RESULTS ITEM START COUNT **/
		if(pd_currentPageNumber == 1){
			pd_showingItemsFirstValCount = 1;
		}else{
			pd_showingItemsFirstValCount = (pd_currentPageNumber * pd_itemsPerPage) - pd_itemsPerPage;
		}
		/** SET SHOWING RESULTS ITEM LAST COUNT **/
		pd_showingItemsLastValCount = ((pd_currentPageNumber * pd_itemsPerPage) - pd_itemsPerPage) + pd_itemsPerPage;
		if(pd_showingItemsLastValCount > pd_itemsCount){pd_showingItemsLastValCount = pd_itemsCount;}
		
		/** SHOW APPROPRIATE DISPLAY IF ITEM COUNT IS LESS THAN PER PAGE COUNT **/
		if(pd_itemsCount > pd_itemsPerPage && pd_currentPageNumber != 'all'){
			html += 'Showing ' + pd_showingItemsFirstValCount + ' - ' + pd_showingItemsLastValCount + ' of ' + pd_itemsCount + ' Items';
		}else{
			html += 'Showing ' + pd_itemsCount + ' Items';
		}
	}else{
		var pageCount = Math.ceil(productCount/pd_itemsPerPage);
		if(pageCount == 1 || pageCount == 0) return "";
		
		if(pd_currentPageNumber != "all") {
			html += '<nobr>Page ' + pd_currentPageNumber + ' of ' + pageCount + '&nbsp; &nbsp;</nobr>';
		}
	}
	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="pdFilterLink"  onClick="return(filterProductArrayByBestseller(\'bestseller\'))">Show Bestsellers</a></nobr>';
	}else{	
		html += '<div class="pdFilterLinkDOn"><nobr><img src="' + pd_imageUrl + 'arrowSmallW.gif" hspace="4"><a href=" " class="pdFilterLinkOn"  onClick="return(filterProductArrayByBestseller(\'all\'))"><b>Show All Items</b></a></nobr></div>';
	}
	return html;
}

function renderSortByDropdown() {
	var pdPagingSortByDropDown = document.getElementById("pdPagingSortByDropDown");
	if(pdPagingSortByDropDown){

		var html = '';
		
		html += '<form style="display:inline;">';
		html += '<table border="0" cellpadding="0" cellspacing="0">';
		html += '<tr>';
		html += '<td>Sort by: </td>';
		html += '<td>';
		html += '<select name="sortBy" id="sortBy" onChange="return(doSortBy(this.options[this.selectedIndex].value,\'sortBy\'))" class="sortDDMenu">';
	
		/*** SORT BY BESTSELLER ***/
		html += '<option value="default"';
		if(pd_sortBy == "default") html += ' SELECTED';
		html += '>Bestselling</option>';
	
		/*** SORT BY NAME ***/
		html += '<option value="name"';
		if(pd_sortBy == "name") html += ' SELECTED';
		html += '>Name</option>';
		
		/*** SORT BY PRICE LOW TO HIGH ***/
		html += '<option value="price"';
		if(pd_sortBy == "price") html += ' SELECTED';
		html += '>Price (Low to High)</option>';
	
		/*** SORT BY PRICE HIGH TO LOW ***/
		html += '<option value="priceDesc"';
		if(pd_sortBy == "priceDesc") html += ' SELECTED';
		html += '>Price (High to Low)</option>';
	
		/*** SORT BY RATING ***/
		html += '<option value="ratingDesc"';
		if(pd_sortBy == "ratingDesc") html += ' SELECTED';
		html += '>Rating</option>';
		
		/*** SORT BY BRAND ***/
		/*
		html += '<option value="brand"';
		if(pd_sortBy == "brand") html += ' SELECTED';
		html += '>Brand</option>';
		*/
		
		html += '</select>';
		html += '</td></tr>';
		html += '</table></form>';
		
		pdPagingSortByDropDown.innerHTML = html;
		//resetMenuHighlight();
		return true;
	}
}

function doSortBy(sortBy) {
debug("doSortBy(sortBy)");
	resetPageNumber();
	pd_sortBy = sortBy;
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}

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) {	
				if(tempArray.hasOwnProperty(item2)) {
					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") {
		if(pd_sortByDefaultUseOrderCount){
			//*** USE ORDER COUNT TO SORT
			sortProductArrayByNumericDescending("orderCount");
		}else{
			sortProductArrayByNumeric("defaultSortId");
		}
	} else if(pd_sortBy == "defaultDesc") {
		if(pd_sortByDefaultUseOrderCount){
			//*** USE ORDER COUNT TO SORT
			sortProductArrayByNumeric("orderCount");
		}else{
			sortProductArrayByNumericDescending("defaultSortId");
		}
	} 
	else if(pd_sortBy == "name") sortProductArrayByGeneric("name");
	else if(pd_sortBy == "nameDesc") sortProductArrayByGenericDescending("name");
	else if(pd_sortBy == "brand") sortProductArrayByGeneric("brand");
	else if(pd_sortBy == "price") sortProductArrayByNumeric("price");
	else if(pd_sortBy == "priceDesc") sortProductArrayByNumericDescending("price");
	else if(pd_sortBy == "rating") sortProductArrayByNumeric("rating");
	else if(pd_sortBy == "ratingDesc") sortProductArrayByNumericDescending("rating");
	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 = pd_sortByDefault;
	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 sortProductArrayByGenericDescending(sortBy) {
debug("sortProductArrayByGenericDescending");
	pd_sortTemp = "id";
	pd_filteredDisplayList = pd_filteredDisplayList.sort(compareGenericDescending);
	pd_sortTemp = sortBy;
	pd_filteredDisplayList = pd_filteredDisplayList.sort(compareGenericDescending);
	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 compareGenericDescending(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;
}

/*	"getElementsByClassName"
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

function turnOffDisplayOfDataElements() {
	var elementArray = getElementsByClassName("displayDiv", "div");
	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 sortAndDisplayByDefaultDesc() {
	resetPageNumber();
	pd_sortBy = "defaultDesc";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByBrand() {
	resetPageNumber();
	pd_sortBy = "brand";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByName() {
	resetPageNumber();
	pd_sortBy = "name";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByNameDesc() {
	resetPageNumber();
	pd_sortBy = "nameDesc";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByPrice() {
	resetPageNumber();
	pd_sortBy = "price";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByPriceDesc() {
	resetPageNumber();
	pd_sortBy = "priceDesc";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByRating() {
	resetPageNumber();
	pd_sortBy = "rating";
	renderControlPanelSortLinks();
	performSort();
	displayProductArray();
}
function sortAndDisplayByRatingDesc() {
	resetPageNumber();
	pd_sortBy = "ratingDesc";
	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();
}


function pdPagingFormatCurrency(num, includeDollarSign) {
	num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
	num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
	cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	
	var returnValue = (((sign)?'':'-') + num + '.' + cents);
	if(includeDollarSign == true) returnValue = "$" + returnValue;	
	return returnValue;
}

