function makeValidName(name)
{
	var s = name;
	s = s.replace(/^([^A-Za-z0-9])*/, '');
	s = s.replace(/([^A-Za-z0-9])+/g, "-");
	while (s.length > 80)
	{
		s = s.substring(0, s.lastIndexOf("-"));
	}
	return s;
}

var _tmplCache = {}
function tmpl(str, data)
{
    /// <summary>
    /// Client side template parser that uses &lt;%= %&gt; and &lt;% code %&gt; expressions.
    /// and % % code blocks for template expansion.
    /// NOTE: chokes on single quotes in the document in some situations
    ///       use &amp;rsquo; for literals in text and avoid any single quote
    ///       attribute delimiters.
    /// </summary>    
    /// <param name="str" type="string">The text of the template to expand</param>    
    /// <param name="data" type="var">
    /// Any data that is to be merged. Pass an object and
    /// that object's properties are visible as variables.
    /// </param>    
    /// <returns type="string" />  
    var err = "";
    var func = _tmplCache[str];
    if (!func) {
        var strFunc =
        "var p=[],print=function(){p.push.apply(p,arguments);};" +
                    "with(obj){p.push('" +
        //                        str
        //                  .replace(/[\r\t\n]/g, " ")
        //                  .split("<%").join("\t")
        //                  .replace(/((^|%>)[^\t]*)'/g, "$1\r")
        //                  .replace(/\t=(.*?)%>/g, "',$1,'")
        //                  .split("\t").join("');")
        //                  .split("%>").join("p.push('")
        //                  .split("\r").join("\\'") + "');}return p.join('');";

        str.replace(/[\r\t\n]/g, " ")
           .replace(/'(?=[^%]*%>)/g, "\t")
           .split("'").join("\\'")
           .split("\t").join("'")
           .replace(/<%=(.+?)%>/g, "',$1,'")
           .split("<%").join("');")
           .split("%>").join("p.push('")
           + "');}return p.join('');";

        //alert(strFunc);
        func = new Function("obj", strFunc);
        _tmplCache[str] = func;
    }
    return func(data);
}

function getRecommendations(userName, cookie, command, paramName, param, skus, recommenderName, maxRecos, tableBuilder)
{
	try
	{
		var csObj = new csRR('099da05e91884aa0', command);
		if (command != 'order_confirmation')
		{
			var splits = skus.split(',');
			for (var i = 0; i < splits.length; i++)
			{
				if (splits[i].lastIndexOf("/") == -1)
				{
					splits[i] = splits[i] + "/";
				}
			}
		}

		if (cookie != '')
		{
			csObj.setParameter('cookie_id', cookie); // 1st party cookie, 1+ yr expiration 
		}

		if (userName != '')
		{
			csObj.setParameter('user_id', hex_md5(userName)); // logged in user ID, set only if available
		}

		if (command != 'order_confirmation')
		{
			var recoObj = new csAny.GetRecos(recommenderName);
			recoObj.setAppcontext(recommenderName + ' recommendations');
		}

		if (command === 'product_detail')
		{
			csObj.addItem(param);
			recoObj.setParameter('item_ids', param);
		}
		else if (paramName != '' && param != '')
		{
			csObj.setParameter(paramName, param);
		}

		if (command === 'search' || command === 'watch_page')
		{
			if (command === 'search')
			{
				var limit = Math.min(splits.length, 5);

				for (var i = 0; i < limit; i++)
				{
					csObj.addItem(splits[i]);
				}
			}
			else if (command === 'watch_page')
			{
				csObj.addActivity('item_watcher', {item_id: skus});
			}

			recoObj.setParameter('item_ids', splits.slice(0, 5).join('&'));

			if (splits.length > 5)
			{
				recoObj.setParameter('blacklist', splits.slice(5).join('&'));
			}
		}
		else	// command != 'search' && command != 'watch_page'
		{
			if (command === 'order_confirmation')
			{
				for (var lineItem in skus)
				{
					csObj.addItem(lineItem, {'unit_price': skus[lineItem].amount, 'quantity': skus[lineItem].quantity});
				}
			}
			if (command != "product_detail" && command != "order_confirmation")
			{
				recoObj.setParameter('blacklist', splits.join('&'));
			}
		}

		if (command != 'order_confirmation')
		{
			var reqObj = csObj.getRequest();
			reqObj.addGetRecos(recoObj);
	
			reqObj.setSuccessCallback(function(resp)
			{
				var respStatus = resp.getStatus();
	
				if (respStatus.getCode() === 0)
				{
					var numRecoSets = resp.getNumRecoSets();
	
					// No need to loop over reco_sets since only one per request... might want to revisit this setup if using multiple zones in the future
					if (numRecoSets === 1)
					{
						var recoSet = resp.getRecoSet(0);
						recoStatus = recoSet.getStatus();
	
						if (recoStatus.getCode() === 0)
						{
							var numRecos = recoSet.getNumRecos();
							var auctionIDs = [];
	
							for (var i = 0; i < numRecos; i++)
							{
								var reco = recoSet.getReco(i);
								auctionIDs.push(reco.getAttribute('c_auction_id'));
							}
	
							//LK: we are keeping this block for quick testing
	    					if (numRecos == 0)
	    					{
	    						auctionIDs.push('59434017');
	    						auctionIDs.push('59434018');
	    						auctionIDs.push('59420017');
	    						//auctionIDs.push('59420000');
	    					}
	
							jQuery.get('/bzJApp/AuctionDetails.action', 'auct_ids=' + auctionIDs.join(), function(xml)
							{
								var docs = jQuery(parseXMLString(xml)).find("result doc");
								var cells = [];
	
								docs.each(function(index)
								{
									if (index < maxRecos)
									{
										var doc = this;
										cells[index] = tmpl(jQuery('#auction_tmpl').html(), { 'doc': doc });
										var auctionID = jQuery(doc).find("str[name='id']").text();
										var imageURLs = jQuery(doc).find("arr[name='imageurls'] str");
	
										imageURLs.each(function(index)
										{
											var imageUrl = jQuery(this).text();
											addToThumblistCollection('g_thumblist_' + auctionID + '_' + index, auctionID, 'http://' + 'llthumb.bidz.com' + imageUrl, jQuery(doc).find("arr[name='brandname'] str").text(), imageURLs.length, 'g_thumblist_' + auctionID);
											addToGlobalImageCollection('g_image_' + auctionID + '_' + index, auctionID, 'http://' + 'llfull.bidz.com/graphics' + imageUrl, makeValidName(jQuery(doc).find("arr[name='title'] str").text()) + '/' + auctionID, jQuery(doc).find("arr[name='brandname'] str").text());
										});
	
										LBClient.addListing(auctionID, updateShowcaseView);
									}
								});
	
								if (cells.length > 0)
								{
									jQuery(function()
									{
										jQuery('#recommendations_div').append(tableBuilder(cells));
										LBClient.start();
	
										recoSet.trackClicksByClass('reco_anchor'); 
										recoSet.trackClicksByClass('reco_input');
										recoSet.trackClicksByClass('reco_button');
									});
								}
							}, 'XML');	// jQuery.get(...);
						}	// recoStatus.getCode() === 0
					}	// numRecoSets === 1
				}	// respStatus.getCode() === 0
			});	// reqObj.setSuccessCallback(...);
		} // command != 'order_confirmation'

		csObj.send();
	}	// try
	catch (err)
	{
		// This space intentionally left blank
	}
}

function twoRowsOfThree(cells)
{
	var recommendationsTable = jQuery("<table class='contentarea'><tbody><tr><td colspan='3'><h3>Auctions we would Recommend...</h3></td></tr></tbody></table>");
	var tableBody = recommendationsTable.children(":first");
	var separator = jQuery("<tr><td colspan='4'><hr size='1' noshade='noshade' color='#cccccc' align='center' width='97%'></td></tr>");
	var recommendationRow;
	for (var i = 0; i < cells.length; i++)
	{
		if (i % 3 == 0)
		{
			if (i == 3)
			{
				tableBody.append(separator);
			}
			recommendationRow = document.createElement("tr");
			tableBody.append(recommendationRow);
		}
		jQuery(recommendationRow).append(cells[i]);
	}
	jQuery(tableBody).append("<tr colspan='4'><br/></tr>");
	return recommendationsTable;
}

function oneRowOfThree(cells)
{
	var recommendationsTable = jQuery("<table class='contentarea'><tbody><tr><td colspan='3'><h3>Auctions we would Recommend...</h3></td></tr></tbody></table>");
	var tableBody = recommendationsTable.children(":first");
	var recommendationRow = document.createElement("tr");
	for (var i = 0; i < cells.length; i++)
	{
		jQuery(recommendationRow).append(cells[i]);		
	}
	tableBody.append(recommendationRow);
	jQuery(tableBody).append("<tr colspan='4'><br/></tr>");
	return recommendationsTable;
}
