
var ecatBaseUrl = '/templates/products/search/ecat.tmpl?search=';

var ecatResultsWrapperId = 'ecat-result-wrapper';
var ecatBestSellerWrapperId = 'ecat-bestseller-results';

var ecatContainerId = 'ecat-products-container';
var ecatContentsId  = 'ecat-content-container';
var ecatPagingTopId = 'ecat-pagination-top';
var ecatPagingBotId = 'ecat-pagination-bottom';
var ecatBestSellerId = 'ecat-bestseller-container';


// We have two search forms, one at the top of the page,
// and one at the bottom.  Typically, only one will be visible
// at a time.
var ecatSearchFormTopId = 'ecat-search-form-top';
var ecatSearchFormBotId = 'ecat-search-form-bottom';

// Some constants we want readily available:
var c_ProductRecsPerPage = 5;
var c_ContentRecsPerPage = 5;
var c_ProductViewAllRecs = 1000;
var c_ContentViewAllRecs = 1000;
var c_MaxReSearches      = 5;

// This is our default args that we mixin to the EndecaQuery object.
var g_DefaultEQArgs = {
	brand:				'CLUS',
	rollupId:			'p_PRODUCT_ID',
	computePhrasings:	true,
	searchMatchMode:	'matchallpartial',
	didYouMean:			1,
	sessionId:			0,
	recsPerPage:		c_ProductRecsPerPage
};


// Global objects for Product and Content data.
// These get created when we get back data from Endeca.
var g_eCatalog = null; // EndecaCatalog - products
var g_eContent = null; // EndecaCatalog - content
var g_eCatalogMeta = null; // EndecaMeta - products
var g_eContentMeta = null; // EndecaMeta - content
var g_eBestSellers = null; // EndecaCatalog - best seller products

var g_eProductQuery = null;
var g_eContentQuery = null;
var g_eBestSellerQuery = null;


// Template file for content section
var g_contentTemplate = templatefactory.get('content-thumb');


// See if user entered a search term.
// If so, return it.  Else return empty string.
var getInputSearchTerm = function() {

	var searchterm = $(ecatSearchFormTopId).visible() ? 
						$F('ecat-search-input-top') :
						$F('ecat-search-input-bottom');
	searchterm = searchterm.strip();
	return searchterm;
}

// Get the search term from the url.
// ** there is actually a global "search" var defined in /templates/includes/head/js.tmpl **
var getUrlSearchTerm = function() {
	return search;
}

// Get the "N" parameter from the url.
// For grins, our version of "N" is "enrec" to avoid potential conflicts, etc.
var getUrlNRec = function() {
	 var nrec = uri.queryKey['enrec'];
	 return ( nrec ? nrec : '' );
}

// Recs Per Page flag
var getUrlPageRecs = function() {
	var enpg = uri.queryKey['enrppg'];
	return ( enpg ? enpg : '' );
}

// Page Number
var getUrlPageNum = function() {
	var enpg = uri.queryKey['enpg'];
	return ( enpg ? enpg : '' );
}

// Session id for this user
// (Note - i'm actually taking care of this now in EndecaQuery.)
var __session_id = 0;
var getSessionId = function() {
	if ( !__session_id ) {
		var cval = Cookie.get('ngglobal');
		if ( cval ) {
			__session_id = cval;
		} else {
			__session_id = Math.floor(Math.random()*999999)+1;
		}
	}
	return __session_id;
}

document.observe("dom:loaded", function() {
	
	//g_DefaultEQArgs.sessionId = getSessionId();

	// Bind the search buttons
	var btnTop = $('ecat-submit-btn-top');
	var btnBot = $('ecat-submit-btn-bottom');
	if ( btnTop ) {
		Event.observe(btnTop,'click',function(evt){
			var sterm = $F('ecat-search-input-top');
			var hurl = makeEcatSearchUrl(sterm);
			document.location.href = hurl;
			evt.stop();
		});
	}
	if ( btnBot ) {
		Event.observe(btnBot,'click',function(evt){
			var sterm = $F('ecat-search-input-bottom');
			var hurl = makeEcatSearchUrl(sterm);
			document.location.href = hurl;
			evt.stop();
		});
	}

	// Point the GlobalCatProd object to our cat
	g_externCatLookup  = function(catid)  { 
		var catObj = ( g_eCatalog ? g_eCatalog.getCategory(catid) : null );
		if ( !catObj && g_eBestSellers )
			catObj = g_eBestSellers.getCategory(catid);
		return catObj;
	}
	
	g_externProdLookup = function(prodid) { 
		var prodObj = ( g_eCatalog ? g_eCatalog.getProduct(prodid) : null ); 
		if ( !prodObj && g_eBestSellers )
			prodObj = g_eBestSellers.getProduct(prodid);
		return prodObj;
	}
	
	g_externSkuLookup  = function(skuid)  { 
		var skuObj = ( g_eCatalog ? g_eCatalog.getSku(skuid) : null ); 
		if ( !skuObj &&  g_eBestSellers )
			skuObj = g_eBestSellers.getSku(skuid);
		return skuObj;
	}

	// Save re-search terms every time we load
	setupResearches();
	
	// Fire off the initial query based on the users search info
	MakeEndecaQuery();
});

var MakeEndecaQuery = function(queryString,argsCat,argsTips) {
	
	// Never do a query if there is already one outstanding
	if ( g_eProductQuery || g_eContentQuery || g_eBestSellerQuery )
		return;
	
	//$(ecatContainerId).update(SpinnerHtml);
	//$(ecatContentsId).update(SpinnerHtml);
	//$(ecatPagingTopId).update('');
	//$(ecatPagingBotId).update('');
	
	//var searchterm = getInputSearchTerm();
	var searchterm = getUrlSearchTerm();
	var enrec = getUrlNRec();
	var enrppg = getUrlPageRecs();
	var enpg = getUrlPageNum();
	
	// If this flag is set on the query string,
	// we'll change the default search so it shows all products.
	// This just helps us in development to see the whole dimension hierarchy.
	var showAllDefault = uri.queryKey['showalldefault'];
	
	// If there is no query string and no search term,
	// just display the best sellers and let the user move on.
	if ( !queryString && !searchterm && !showAllDefault ) {
		ecatCmBeginProcessing();
		setupSummary(true);
		showBestSellers();
		showCustomerHelp(false);
		loadBestSellers();
		ecatCmFinishProcessing();
		return;
	}
	
	g_eCatalog = null;
	g_eContent = null;
	g_eCatalogMeta = null;
	g_eContentMeta = null;
	
	loadProductCatalog ( argsCat, queryString, searchterm, enrec, enrppg, enpg );
	loadContentCatalog ( argsTips, searchterm );
}

var loadProductCatalog = function(argsCat,queryString,searchterm,enrec,enrppg,enpg) {
	
	if ( !g_eProductQuery ) {
		$(ecatContainerId).update(SpinnerHtml);
		$(ecatPagingTopId).update('');
		$(ecatPagingBotId).update('');
		
		enrppg = ( enrppg ? enrppg : c_ProductRecsPerPage );
		enOffset = ( enpg ? (enpg - 1) * enrppg : 0 );

		var eqCatArgs = Object.extend({
			queryString: queryString,
			searchTerm: queryString ? '' : searchterm,
			NRecordId: queryString ? 0 : enrec ? enrec.split('+') : 0,
			filterProducts: true,
			recsPerPage: enrppg,
			//sessionId: getSessionId(),
			NaoRecordId: enOffset
			},
			argsCat);
	
	
		g_eProductQuery = new EndecaQuery (
			Object.extend( eqCatArgs, {
				callbackCompleted: function() {
					g_eCatalog     = new EndecaCatalog({jsonResult: g_eProductQuery.jsonResult});
					g_eCatalogMeta = new EndecaMeta({jsonResult: g_eProductQuery.jsonResult});
					
					g_eProductQuery = null;
					
					handleEndecaData();
			  	}		
			})
		);
		
		g_eProductQuery.makeRequest();
	}
}

var loadContentCatalog = function(argsTips,searchterm) {

	if ( !g_eContentQuery ) {
		$(ecatContentsId).update(SpinnerHtml);
		
		var showAllTips = uri.queryKey['showalltips'] ? true : false;

		// Query for content.
		// Ignore the query string, since that's just for browsing/paging products.
		// If no search term, fabricate one.
		var eqTipsArgs = Object.extend({
			queryString: '', //queryString,
			searchTerm: searchterm ? searchterm : showAllTips ? '' : 'trend',
			//searchMatchMode: 'matchallany',
			//sessionId: getSessionId(),
			filterContent: true,
			rollupProducts: false,
			recsPerPage: showAllTips ? c_ContentViewAllRecs : c_ContentRecsPerPage
			},
			argsTips);
	
		g_eContentQuery = new EndecaQuery (
			Object.extend( eqTipsArgs, {
				callbackCompleted: function() {
					g_eContent     = new EndecaCatalog({jsonResult: g_eContentQuery.jsonResult});
					g_eContentMeta = new EndecaMeta({jsonResult: g_eContentQuery.jsonResult});
					
					g_eContentQuery = null;
					
					handleEndecaData();
			  	}
			})
		);
		
		g_eContentQuery.makeRequest();
	}

}

// If we got both data objects, go do something.
var handleEndecaData = function () {
	
	// First check if there is a keyword redirect.
	// If so, we don't need to go any further.
	if ( g_eCatalogMeta && g_eCatalogMeta.keywordRedirect ) {
		// Do the redirect.
		// TODO: need CM calls.
		document.location.href = g_eCatalogMeta.keywordRedirect;
		return;
	}
	
	if ( g_eCatalog && g_eContent ) {
		
		ecatCmBeginProcessing();
		
		if ( g_eCatalogMeta && g_eContentMeta ) {
			ecatCmSetSearchTerm(g_eCatalogMeta.searchTerm);
			ecatCmResultCount(g_eCatalogMeta.totalRecords,g_eContentMeta.recordsReturned);
			//ecatCmResultCount(g_eCatalogMeta.totalRecords,g_eContentMeta.totalRecords);
		}
		
		// Did our search return anything?
		if ( g_eCatalogMeta.totalRecords + g_eContentMeta.totalRecords > 0 ) {
			// Yes.  Go load it all up.
			showProductResults();
			setupSummary();
			showCustomerHelp(true);
			showResearches();
			
			setupPagingLinks(g_eCatalogMeta,g_eCatalog);
			setupBreadcrumbLinks(g_eCatalogMeta);
			setupRefinementLinks(g_eCatalogMeta);
			
			// Do the products last...
			setupFeaturedProducts(g_eCatalogMeta);
			setupProducts(g_eCatalog,g_eCatalogMeta);
			setupContent(g_eContent);
		} else {
			// No results returned.  Just show best sellers.
			setupSummary();
			showBestSellers();
			showCustomerHelp(false);
			hideResearches();
			loadBestSellers();
		}
		
		ecatCmFinishProcessing();
	}
}

var loadBestSellers = function() {
	// If we don't yet have a best sellers list, get that too
	if ( !g_eBestSellerQuery && !g_eBestSellers ) {
		
		$(ecatBestSellerId).update(SpinnerHtml);
		
		var eqBestArgs = {
			queryString: '',
			searchTerm: 'CATEGORY2836',
			searchKey: 'p_ALL_CAT_IDS',
			sortKey: 'p_DISPLAY_ORDER',
			filterProducts: true,
			recsPerPage: 9
			};

		g_eBestSellerQuery = new EndecaQuery (
			Object.extend( eqBestArgs, {
				callbackCompleted: function() {
					g_eBestSellers = new EndecaCatalog({jsonResult: g_eBestSellerQuery.jsonResult});
					
					g_eBestSellerQuery = null;
					
					handleBestSellers();
			  	}		
			})
		);
		
		g_eBestSellerQuery.makeRequest();
	}
}

var handleBestSellers = function() {
	if ( g_eBestSellers ) {
	    var args = {
	        containerID: ecatBestSellerId,
			tableData: g_eBestSellers.getProducts(),
	        maxItems: g_eBestSellers.productCount(),
	        startIndex: 0,
	        cellsPerRow: 3,
	        mode: 1,
	        showShadeTable: 0
	    };
		
		// Build the product table
		var myTable = new productPage.ProductsTable(args);
		
		setupSummary(true);
		showBestSellers();
		showCustomerHelp(false);
	}
}

var showBestSellers = function() {
	$(ecatSearchFormTopId).show();
	$(ecatSearchFormBotId).hide();
	
	$(ecatResultsWrapperId).hide();
	$(ecatBestSellerWrapperId).show();
}

var showProductResults = function() {
	$(ecatSearchFormTopId).hide();
	$(ecatSearchFormBotId).show();

	$(ecatResultsWrapperId).show();
	$(ecatBestSellerWrapperId).hide();
}

// Show either the livechat "overlay" OR the customer help module,
// but not both.  Flag indicates which one to do.
var showCustomerHelp = function(useOverlay) {
	if ( useOverlay ) {
		$('ecat-livechat-module').show();
		$('ecat-customer-help').hide();
	} else {
		$('ecat-livechat-module').hide();
		$('ecat-customer-help').show();
	}
}

var makePagingLink = function ( linkText, linkHref, linkClass, argsCat, argsTips ) {
    var el = new Element('a', {
    	"class" : ( linkClass ? linkClass : "" ),
    	"href"  : "#"
    });
	el.innerHTML = ' '+linkText+' ';

    //el.onclick = loadProductCatalog.bind(el,argsCat,linkHref);	
    el.onclick = clickPageLink.bind(el,argsCat,linkHref);	
    
    return el;
}

var makeFilterLink = function ( linkText, linkHref, linkClass, argsCat, argsTips ) {
    var el = new Element('a', {
    	"class" : ( linkClass ? linkClass : "" ),
    	"href"  : "#"
    });
	el.innerHTML = ' '+linkText+' ';

    //el.onclick = loadProductCatalog.bind(el,argsCat,linkHref);	
    el.onclick = clickPageLink.bind(el,argsCat,linkHref);	
    
    return el;
}

var clickPageLink = function ( argsCat, linkHref ) {
	// Make a query object to parse the href query string,
	// mixing in the argsCat stuff (if any).
	// We can then use this to put stuff we care about on our href query string.
	argsCat = Object.extend(g_DefaultEQArgs, argsCat);
	var tmpQ = new EndecaQuery(argsCat);
	tmpQ.parseQueryString(linkHref);
	
	// Get the base url for this search term
	var hurl = makeEcatSearchUrl(tmpQ.searchTerm);
	
	// Add filter record id's
	if ( tmpQ.NRecordId ) {
		var enrec = $A(tmpQ.NRecordId).join('+');
		hurl += '&enrec=' + enrec;
	}
	
	// Recs per page
	var enrppg = tmpQ.recsPerPage || c_ProductRecsPerPage;
	if ( enrppg != c_ProductRecsPerPage ) {
		hurl += '&enrppg='+enrppg;
	}
	
	// Is there a record offset?  If so, compute page number
	if ( tmpQ.NaoRecordId && enrppg > 0 ) {
		var enpg = ( tmpQ.NaoRecordId / enrppg ) + 1;
		hurl += '&enpg='+enpg;
	}
	
	// Now just send us there
	document.location.href = hurl;
}

var toggleAccordionLink = function() {
	if ( this.hasClassName('accordion_toggle_active') ) {
		this.removeClassName('accordion_toggle_active');
		$(this.contentID).hide();		
	} else {
		this.addClassName('accordion_toggle_active');
		$(this.contentID).show();
	}
}

var makeAccordionLink = function ( linkText, linkContentID ) {
	
	// By default, let's start with content open
	var hdrClass = "accordion_toggle accordion_toggle_active";
	var elHdr = new Element('h2', { "class" : hdrClass });
	elHdr.contentID = linkContentID;
	var elA = new Element('a');
	elA.innerHTML = linkText;
	elA.onclick = toggleAccordionLink.bind(elHdr);
	elHdr.insert(elA);
	
	return elHdr;
}

var makePageElementLink = function ( linkText, targetId ) {
	var elA = new Element('a');
	elA.innerHTML = linkText;
	elA.href = '#' + targetId;
	
	return elA;
}

var setupProducts = function ( eCatalog, eMeta ) {
	
	if ( eCatalog.productCount() > 0 ) {
	    var args = {
	        containerID: ecatContainerId,
			tableData: eCatalog.getProducts(),
	        maxItems: eCatalog.productCount(),
	        startIndex: 0,
	        cellsPerRow: 1,
	        mode: 3,
	        maxShades: 4,
	        showShadeTable: 1,
	        swatchWidth: 70,
	        swatchHeight: 17,
	        sortDisplayOrder: false,
	        productImages: []
	    };
		
		// Build the product table
		var myTable = new productPage.ProductsTable(args);
	} else {
		var stDiv = new Element('div',{'class':'ecat-products-noitems'});
		stDiv.insert ( 'No products found matching "<span class="user-search-term">' + 
						eMeta.searchTerm + '</span>".' );
		$(ecatContainerId).update(stDiv);
	}
}

var setupContent = function ( eCatalog ) {
	// For now, just loop thru and print the links
	
	var contentContainer = $(ecatContentsId);
	contentContainer.update('');
	
	var contentHash = $H(eCatalog.contentList);
	var listLength = contentHash.size();
	var i = 0;
	
	contentHash.each( function(contentRec) {
		
		// Init a default object
		var obj = {
			'p_THUMBNAIL_IMAGE': '/images/global/clinlogo_thumb.jpg',
			'LINK_COPY' : 'Learn more'
		};
		obj = Object.extend( obj, contentRec.value.Properties );
		obj = Object.extend( obj, contentRec.value.Dimensions ); // ??
		
		var ulClass = 'content-thumb-row';
		if ( ++i == listLength ) {
			ulClass += ' lastrow';
		}
		var ul = new Element("ul", {'class': ulClass});
		ul.fillin ( { template: g_contentTemplate, position: 'replace', object: obj } );
		
		contentContainer.insert(ul);
	}, eCatalog);
	
	var contentPaging = $('ecat-content-pagination-bottom');
	contentPaging.update( makePageElementLink('Back to Top','') );
	
	// show/hide...
	if ( i > 0 ) $('ecat-content-results').show();
	else         $('ecat-content-results').hide();
}

var setupSummary = function(showPrompt) {
	var elSummary = $('search-summary');
	elSummary.update('');
	
	if ( g_eCatalogMeta ) {
		// If there is a merch window to display, load it up.
		if ( g_eCatalogMeta.mwBannerTop ) {
			new Ajax.Updater ( 'search-merch', g_eCatalogMeta.mwBannerTop );
		}
		
		var recsProd  = g_eCatalogMeta.totalRecords;
		var recsCont  = g_eContentMeta.recordsReturned;
		//var recsCont  = g_eContentMeta.totalRecords;
		var recsTotal = recsProd + recsCont;
		
		if ( recsTotal > 0 ) {
			var resultText = ( g_eCatalogMeta.searchCorrected || recsTotal == 0 ? "0 results" :
							   recsTotal == 1 ? "1 result" :
							   recsTotal + " results" );
			
			if ( g_eCatalogMeta.searchTerm ) {
				var stDiv = new Element('div');
				
				stDiv.insert ( 'Your search for "<span class="user-search-term">' + 
								g_eCatalogMeta.searchTerm + '</span>"' +
								' returned ' + resultText + '.' );
				
				if ( g_eCatalogMeta.didYouMean ) {
					var dymEl = new Element('span', {'class': 'dym-term'});
					dymEl.insert ( ' (Did you mean ' );
					dymEl.insert ( makePagingLink ( g_eCatalogMeta.didYouMean, g_eCatalogMeta.didYouMeanLink ) );
					dymEl.insert ( '?)' );
					stDiv.insert ( dymEl );
				}
					
				elSummary.insert ( stDiv );
			}
			
			if ( g_eCatalogMeta.searchCorrected ) {
				resultText = ( recsTotal == 0 ? "0 results" :
								   recsTotal == 1 ? "1 result" :
								   recsTotal + " results" );
				var corrText = 'However, "<span class="user-search-term">' + g_eCatalogMeta.searchCorrected + '</span>" returned ' + resultText + '.';
				elSummary.insert ( new Element('div').insert( corrText ) );
			}
			
			var productText = 'Showing ' +
				( g_eCatalogMeta.numberOfPages > 1 ? g_eCatalogMeta.startingRecord + ' to ' + g_eCatalogMeta.endingRecord + ' of ' : '' ) +
		        ( g_eCatalogMeta.totalRecords == 1  ? 'one product.' : g_eCatalogMeta.totalRecords + ' products.' );
		
		
			// Make the product/article links
			var productLinkText = ( recsProd == 1  ? '1 Product' : recsProd + ' Products' );
			var contentLinkText = ( recsCont == 1  ? '1 Expert Tip' : recsCont + ' Expert Tips' );
			var linkHeading = new Element('h3');
			linkHeading.insert ( makePageElementLink ( productLinkText, 'ecat-products-heading' ) );
			if ( recsCont > 0 ) {
				linkHeading.insert ( ', ' );
				linkHeading.insert ( makePageElementLink ( contentLinkText, 'ecat-content-heading' ) );
			}
			
			elSummary.insert ( linkHeading );
		} else {
			var txt =
				'<p>' +
				'No items found matching "' + g_eCatalogMeta.searchTerm + '".' +
				'</p><p>' +
				'We suggest you check for typos, broaden your search and enter the type of product you need.' +
				'</p>' +
				'';
			
			elSummary.insert ( txt );
		}
	} else if ( showPrompt ) {
		var txt = 'Please enter a keyword in the search box below and click SEARCH.';
		elSummary.insert ( txt );
	}
}

var setupPagingLinks = function ( eMeta, eCatalog ) {
	
	var ecatPagingTop = $(ecatPagingTopId);
	var ecatPagingBot = $(ecatPagingBotId);
	var ecatShowing = $('ecat-products-showing');
	ecatPagingTop.update('');
	ecatPagingBot.update('');
	ecatShowing.update('');
	
	var pagingHtml = '';
					 
	ecatPagingTop.insert(pagingHtml);
	ecatPagingBot.insert(pagingHtml);
	
	var spacer = '&nbsp;<div class="ecat-spacer-bar">&nbsp;</div>';
	var leftImg = '<img src="/images/global/buttons/arrow-search-left-btn.gif" />';
	var rightImg = ' <img src="/images/global/buttons/arrow-search-right-btn.gif" />';
	
	//leftImg = '< ';
	//rightImg = ' >';
	
	if ( eMeta.numberOfPages > 1 ) {
		
		ecatCmPageNumber ( eMeta.numberOfCurrentPage, eMeta.numberOfPages );

		var showingText = '(Showing ' + eMeta.startingRecord + ' to ' + eMeta.endingRecord +
						  ' of ' + eMeta.totalRecords + ' products)';
		ecatShowing.update(showingText);

		ecatPagingTop.insert ( makeFilterLink ( '<span class="view-all-link">View all</span>', eMeta.directPageLinks[0], '', {recsPerPage:c_ProductViewAllRecs} ) );
		ecatPagingBot.insert ( makeFilterLink ( '<span class="view-all-link">View all</span>', eMeta.directPageLinks[0], '', {recsPerPage:c_ProductViewAllRecs} ) );

		if ( eMeta.prevPageLink ) {
			ecatPagingTop.insert ( makePagingLink ( leftImg, eMeta.prevPageLink ) );
			ecatPagingBot.insert ( makePagingLink ( leftImg, eMeta.prevPageLink ) );
		}
		
		var iPg = eMeta.directPageLinkStart;
		eMeta.directPageLinks.each( function(lnk) {
			if ( iPg == eMeta.numberOfCurrentPage ) {
				// Just print current page number (no link)
				var strPg = ' <b>'+iPg+'</b> ';
				ecatPagingTop.insert ( strPg );
				ecatPagingBot.insert ( strPg );
			} else {
				// Make the direct page link
				ecatPagingTop.insert ( makePagingLink ( iPg, lnk ) );
				ecatPagingBot.insert ( makePagingLink ( iPg, lnk ) );
			}
			iPg++;
		});

		if ( eMeta.nextPageLink ) {
			ecatPagingTop.insert ( makePagingLink ( rightImg, eMeta.nextPageLink ) );
			ecatPagingBot.insert ( makePagingLink ( rightImg, eMeta.nextPageLink ) );
		}

	}
}

var setupFeaturedProducts = function ( eMeta ) {
	var elDiv = $('ecat-featured-products');
	var elCnt = $('ecat-featured-products-container');
	
	if ( g_eCatalogMeta.arFeaturedProducts.length > 0 ) {
		elDiv.show();
		elCnt.update('');
		
		var prods = [];
		var featcount = g_eCatalogMeta.arFeaturedProducts.size();
		
		g_eCatalogMeta.arFeaturedProducts.each(function(prodSpec){
			var pq = new EndecaQuery ({
				queryString: '',
				searchTerm: '',
				recordSpecId: prodSpec,
				
				callbackCompleted: function() {
					var ecat = new EndecaCatalog({jsonResult: pq.jsonResult});
					prods = prods.concat(ecat.getProducts());
					
					if ( prods.length >= featcount ) {
						callbackFeaturedProducts(prods);
					}
				}
			});
			
			pq.makeRequest();
		});
		
		
		
	} else {
		elDiv.hide();
	}
}

var callbackFeaturedProducts = function(prods) {

    var args = {
        containerID: 'ecat-featured-products-container',
		tableData: prods,
        maxItems: prods.length,
        startIndex: 0,
        cellsPerRow: 2,
        mode: 1,
        //maxShades: 4,
        //showShadeTable: 1,
        //swatchWidth: 70,
        //swatchHeight: 17,
        sortDisplayOrder: false,
        productImages: []
    };
	
	// Build the product table
	var myTable = new productPage.ProductsTable(args);
	
}

var makeRemoveLink = function ( lnkText, lnkLink, addImg ) {
	
	var elText   = lnkText;
	var elRmText = ( addImg ? ' <img src="/images/global/buttons/delete_ex.jpg" />' : '' );
	var el = new Element('div', {
	});
	
	el.insert( makeFilterLink ( elText + elRmText, lnkLink ) );
	//el.insert( makePagingLink ( elText + elRmText, lnkLink ) );

	return el;
}

var setupBreadcrumbLinks = function ( eMeta ) {
	
	var bcAccDiv = $('breadcrumb_accordion');
	var bcContent = (bcAccDiv ? bcAccDiv.down('#breadcrumb_content') : null );
	if ( !bcContent ) return;
	bcAccDiv.hide();
	bcContent.update('');

	var bcRemoveAll = $('ecat-clear-all-filters');
	bcRemoveAll.update('');
	
	eMeta.breadcrumbs.each( function(bcHash) {
		var bcType = bcHash["Type"];

		if ( bcType == "Search" ) {
			var searchTerm = bcHash["Search Term"];
			var searchRemove = bcHash["Removal Link"];
			var searchText = "Search Term: " + searchTerm;
			
			/* Don't show search term link....
			bcAccDiv.show();
			bcContent.insert(
				new Element('div', {
				}).insert( makeRemoveLink ( searchText, searchRemove ) )
			);
			*/
		} else if ( bcType == "Navigation" ) {
			var dimName = bcHash["Dimension Name"];
			var dimRemoveDim = bcHash["Dimension Removal Link"];
			var dimText = dimName;
			
			if ( dimRemoveDim && bcRemoveAll ) {
				// Use this to fabricate a remove-all link.  All we need to do is
				// parse the query string, then remove the N params.
				var tmpQ = new EndecaQuery();
				tmpQ.parseQueryString(dimRemoveDim);
				tmpQ.NRecordId = 0;
				dimRemoveDim = tmpQ.buildQueryString();
				bcRemoveAll.insert( makeRemoveLink ( 'Clear all', dimRemoveDim, false ) );
				bcRemoveAll = null;
			}
			
			var arDimVals = $H(bcHash).get("Dimension Values");
			if ( arDimVals ) {
				//var elContent = new Element('div', { "class" : "accordion_content" });
				//refAccDiv.insert( elContent );
				
				$A(arDimVals).each( function(dvHash) {
					var dvName   = dvHash["Dim Value Name"];
					var dvRemove = dvHash["Removal Link"];
					var dvText   = dimText + ': ' + dvName;
					
					ecatCmAddFilter(dimText,dvName);
					
					bcAccDiv.show();
					bcContent.insert(
						new Element('div', {
						}).insert( makeRemoveLink ( dvText, dvRemove, true ) )
					);
				});
			}
		}
	});
}
	
var setupRefinementLinks = function ( eMeta ) {
	
	var refAccDiv = $('refinement_accordion');
	var refContent = (refAccDiv ? refAccDiv.down('#refinement_content') : null );
	if ( !refContent ) return;
	refAccDiv.hide();
	refContent.update('');
	
	eMeta.refinements.each( function(refinementHash) {
		var arDims = $H(refinementHash).get("Dimensions");
		if ( arDims ) {
			$A(arDims).each( function(dimHash) {
				// Get fields we want
				var dimName   = dimHash["Dimension Name"];
				var dimExpand = dimHash["Expansion Link"];
				var dimRemove = dimHash["Contraction Link"];
				var dimValsAr = dimHash["Dimension Values"];
				
				// Create an id out of the dim name
				var re = /\W/g;
				var dimContentID = dimName;
				dimContentID = dimContentID.replace(re,"") + '-content';
				
				refAccDiv.show();
				refContent.insert( makeAccordionLink ( dimName, dimContentID ) );
				
				var elContent = new Element('div', {
						"id": dimContentID, 
						"class": "accordion_content" 
				});
				refContent.insert(elContent);
					
				if ( dimValsAr ) {
					$A(dimValsAr).each( function(dimValHash) {
						var dvRecs = dimValHash["Number of Aggregate Records"];
						var dvLink = dimValHash["Selection Link"];
						var dvName = dimValHash["Dim Value Name"];
						var dvLinkClass = "grey-arrow";
						var dvDivClass = "";
						
						if ( dvName == "More..." ) {
							dvDivClass = "show-all-link";
							dvName = 'Show All...';
						}
						
						var dvText = dvName;
						if ( dvRecs )
							dvText += ' ('+dvRecs+')';
						
						refAccDiv.show();
						elContent.insert(
							new Element('div', {
								'class': dvDivClass
							}).insert( makeFilterLink ( dvText, dvLink, dvLinkClass ) )
						);
					});
				}
			});
		}
	});
}


var setupResearches = function() {
	
	// Get previous searches
	var cval = Cookie.get('researches');
	var arSearches = ( cval ? String(cval).split(":::") : [] );
	var searchterm = getInputSearchTerm();
	if ( searchterm ) arSearches.unshift(searchterm);
	searchterm = getUrlSearchTerm();
	if ( searchterm ) arSearches.unshift(searchterm);
	
	// Eliminate dups
	var haTmp = $H();
	var arTmp = [];
	var maxLen = c_MaxReSearches; // limit number of items we keep
	$A(arSearches).each(function(el){ 
		if ( !haTmp.get(el) && arTmp.length < maxLen ) {
			arTmp[arTmp.length] = el;
			haTmp.set(el,1); 
		}
	});
	arSearches = arTmp;
	
	if ( arSearches.length > 0 ) {
		Cookie.set('researches', arSearches.join(":::"));
		var elList = $('research_content');
		elList.update('');
		
		arSearches.each( function(sterm) {
			var hurl = makeEcatSearchUrl(sterm);
			var elA = new Element('a', {
						"class": "grey-arrow",
						"href" : hurl
			});
			elA.update(sterm);
			
			elList.insert( new Element('div',{ }).insert(elA) );
		});
	}
}

var showResearches = function() {
	var elWrapper = $('research_accordion');
	elWrapper.show();
}

var hideResearches = function() {
	var elWrapper = $('research_accordion');
	elWrapper.show();
}

var makeEcatSearchUrl = function(sterm) {
	var sparm = sterm.split(" ").join("+");
	var hurl = ecatBaseUrl+sparm;
	return hurl;
}

