/* 
	Homebase breadcrumb generator
	Rozario Chivers : 17/01/2008
	reads Mercado parameters from URL
	builds links and text into a ordered list for product details pages
	also can be called to generate breadcrumb for customer services pages
	e.g. homebase.page.breadCrumb.init("productdetails");
	e.g. homebase.page.breadCrumb.init("customerservices");
*/

// set up Homebase namespace
if (!homebase) var homebase = {};

// page utility methods
if (!homebase.page) homebase.page = {};
// add breadcrumb object
homebase.page.breadCrumb = {
	// browser URL
	URL : window.location.href,
	// domain name ( read from first list link in breadcrumb )
	// e.g. "http://<sitename>/"
	SITE_URL : "",
	// WebSphere Commerce prefix ( read from URL )
	// e.g. "http://<sitename>/webapp/wcs/stores/servlet/Browse?storeId=..."
	WCSPrefix : "",
	// browse display command
	BROWSE_CMD : "Browse",
	// product display command
	PRODUCT_DISPLAY_CMD : "ProductDisplay",
	// search parameter
	SEARCH_PARAM : "Trail=searchtext",
	// caegory root delimeter
	CAT_ROOT_DELIM : "category_root",
	// category delimeter
	DELIM : "c_",
	// category id and name delimeter
	SUB_DELIM : "|",
	// refinement delimeter
	REFINE_DELIM : "r_",
	// ampersand for URL NVPs
	AMPERSAND : "&",
	//Query string separator
	QUERY_DELIM:"?",
	//Store Id
	STORE_ID:"storeId",
	//Language id
	LANG_ID:"langId",
	//Name of the root category for site catalyst helper, added as part of SEO changes
	ROOT_CATNAME:"",
	// partNumber param name
	PARAM_PARTNUMBER :"partNumber", 
	
	//partNumbe value
	PARTNUMBER:"",
	
	// parameters for Mercado
	paramList : [],
	// hashtable of Mercado Category URLs
	// contains runtime properties based on DELIM - used a keys
	categoryURL : {	 
		// method that returns the number of keys in hash 
		size : function() { 
				var len = 0;
				for ( var i in this ) {
					// only count string data members - ignore size method
					if ( typeof this[i] == 'string' ) len++;
				}	
				return len; 
			}
	},
	
	// hashtable of Category breadcrumb text
	// contains runtime properties based on DELIM - used a keys
	crumbText : {},
	// index to split out breadcrumb text
	splitIndex : 2,
	
	init : function(pageContext) {
		homebase.page.breadCrumb.render(pageContext);
	},
	
	init : function(pageContext,partNumber) {
		homebase.page.breadCrumb.PARTNUMBER = partNumber;		
		homebase.page.breadCrumb.render(pageContext);
	},
	
	createBreadCrumbData : function() {
		// reduce namespace
		var breadCrumb = homebase.page.breadCrumb;
		// exit if no category information found
		if (breadCrumb.URL.indexOf(breadCrumb.DELIM) == -1) return;
 	
		// string to store URL of Mercado category parameters
		var categoryURL = "";
		
		//SEO:START
		var urlParts = breadCrumb.URL.split(breadCrumb.QUERY_DELIM);
		breadCrumb.paramList = urlParts[1].split(breadCrumb.AMPERSAND);
		
		var paramDetails;
		var paramName;
		var paramValue;
		var storeId;
		var langId;
		var flag = 0;
		
		// populate main portion of Web site URL
		breadCrumb.WCSPrefix = urlParts[0].replace(breadCrumb.PRODUCT_DISPLAY_CMD, breadCrumb.BROWSE_CMD );
		var paramListLength =  breadCrumb.paramList.length;
		// get category data		
		for (var i = 0; i < paramListLength; i++) {			
			categoryURL = breadCrumb.paramList[i];			
			categoryURL = homebase.comms.Url.decode(categoryURL.replace(new RegExp(/\+/ig), " "))
			
			// exclude refinements
			if (categoryURL.indexOf(breadCrumb.REFINE_DELIM) == -1
				&& categoryURL.indexOf(homebase.comms.Url
						.encode(breadCrumb.REFINE_DELIM)) == -1) {
				
				// check for invalid chars
				if (categoryURL.indexOf("<") != -1 
						|| categoryURL.indexOf(homebase.comms.Url.encode("<")) != -1){ 
					flag =1;
					break;
				}
				
				paramDetails = categoryURL.split("=");
				paramName = paramDetails[0];
				paramValue = paramDetails[1];
			
				if(paramName == breadCrumb.STORE_ID){
					storeId = paramValue;
				} else if(paramName == breadCrumb.LANG_ID){
					langId = paramValue;
				} else  if(paramName == breadCrumb.PARAM_PARTNUMBER){
					
				} else if(paramName.indexOf(breadCrumb.DELIM) != -1){
					breadCrumb.categoryURL[paramName] = categoryURL;
					breadCrumb.crumbText[paramName] = paramValue.split(breadCrumb.SUB_DELIM)[breadCrumb.splitIndex];
				}
			}
				
		}
		if(flag == 1) return;
		
		breadCrumb.WCSPrefix = breadCrumb.WCSPrefix + breadCrumb.QUERY_DELIM +  breadCrumb.STORE_ID+"="+storeId+"&"+breadCrumb.LANG_ID+"="+langId;
		breadCrumb.ROOT_CATNAME = breadCrumb.crumbText["c_1"];
		
	},
	
	render : function(pageContext) {		
		// render breadcrumb based on page context
		if ( pageContext == "productdetails" ) {
			// reduce namespace
			var breadCrumb = homebase.page.breadCrumb;
			
			//SEO 
			var breadCrumbURL;	
			var partNumberDetails = breadCrumb.PARAM_PARTNUMBER+"="+breadCrumb.PARTNUMBER;
			
			if(breadCrumb.URL.indexOf(breadCrumb.PRODUCT_DISPLAY_CMD) != -1) {				
				breadCrumbURL = homebase.comms.Url.decode(Get_Cookie('BreadCrumbCookie'));	
				if(breadCrumbURL.indexOf(partNumberDetails) != -1){//value will be taken from cookie					
				} else {
					breadCrumbURL = breadCrumb.URL;
				}
				
			}else {
				breadCrumbURL = breadCrumb.URL;
			}
						
			// deal with encoded pound sign issue
			breadCrumb.URL = breadCrumbURL.replace(/%A3/gi,"&pound;");		
			
			// concatenate each category parameter list as it's found
				
			// exit if no category information found
			if (breadCrumb.URL.indexOf(breadCrumb.DELIM) == -1) return;
			
			// intialise breadcrumb data
			// populate categoryURL and crumbText
			breadCrumb.createBreadCrumbData();
			// sting of params to build up category heirarchy links
			var urlCateogories = "";
			// idenfy if previous page was a search
			var fromSearchPage = (breadCrumb.WCSPrefix.indexOf(breadCrumb.SEARCH_PARAM) !=-1) ? true : false;
			
			// get a reference to the breadcrumb div	
			var breadCrumbDiv = document.getElementById("subheader").getElementsByTagName("DIV")[0];
			// get defensive - if breadcrumb does not exist do not run
			if (!breadCrumbDiv) return;
			// set up string for HTML chunk
			var breadCrumbHTML = "";
			
			// read first link to homepage from page and save for later 
			breadCrumb.SITE_URL = document.getElementById("subheader").getElementsByTagName("A")[0];
				
			// re-build start of breadcrumb and homepage link
			breadCrumbHTML = 	'<span>You are in: </span>' +
							 	'<ol>' +
			 					'<li class="first">' +
									'<a href="' + 
									breadCrumb.SITE_URL + 
									'" title="Return to homepage">Home</a>' +
								'</li>';			
			
			for (var i = 1; i <= breadCrumb.categoryURL.size(); i++) {
				// call hash keys in order
				// concatenate params to build up category heirarchy links
				urlCateogories += breadCrumb.AMPERSAND;
				urlCateogories += breadCrumb.categoryURL[breadCrumb.DELIM + i];
							
				// build breadcrumb list				
				var breadCrumbURL = breadCrumb.WCSPrefix + urlCateogories;
				if (fromSearchPage) {
					breadCrumbURL += "&q=" + breadCrumb.getSearchText();
				} 
				
				breadCrumbHTML += 	'<li>' + 
										'<a href="' + breadCrumbURL +
										'">' + 
											breadCrumb.crumbText[
													breadCrumb.DELIM + i
												] + 
										'</a>' +
									'</li>';
							
									
			}// end for loop
			
			// append the product name to the breadcrumb
			var breadCrumbList = document.getElementById("subheader").getElementsByTagName("OL")[0].getElementsByTagName("LI");
			var productName = breadCrumbList[breadCrumbList.length-1].getElementsByTagName("STRONG")[0].innerHTML;
			
			
			breadCrumbHTML += 	'<li class="last"><strong>' + productName.replace(/\&amp;#39;/ig, "'") + '</strong></li>';
			
			// close breadcrumb ordered list
			breadCrumbHTML += '</ol>';
			
			// render HTML string into breadcrumb
			// use innerHTML - renders much more quickly than DOM methods
			breadCrumbDiv.innerHTML = breadCrumbHTML;		
				
		} // end if pageContext == "productdetails"
		
		if ( pageContext == "customerservices" ) {
	
			// get a reference to the breadcrumb div	
			var breadCrumbDiv = document.getElementById("subheader").getElementsByTagName("DIV")[0];
			// get a reference to the customer services breadcrumb div	
						
			var customerServicesBreadCrumbDiv = document.getElementById("customerservicesbreadcrumb");
	
			// get defensive
			if (!breadCrumbDiv || !customerServicesBreadCrumbDiv) return;
			// populate breadcrumb with one from content area
			breadCrumbDiv.innerHTML = customerServicesBreadCrumbDiv.innerHTML;
			
		} // end if pageContext == "customerservices"
	},
	
	/**
	 * Get the search text from the url parameter "Trail". 
	 * The search text is embeded as part of the Trail value, prefixed with "searchtext>".
	 */
	getSearchText : function() {
		var searchText;
		var searchParam = "Trail";  // parameter that stores the search value, can be configured
		var SEARCH_TRAIL = "Trail";  // search trail used for search param, search text is a partial trail value
		
		var searchTerm = homebase.comms.Url.getParameter(homebase.page.breadCrumb.URL, searchParam);
		if (searchTerm) { // search value found
			if (SEARCH_TRAIL === searchParam) { // search trail found, extract search text
				var prefix = (searchTerm.indexOf(">") !=-1 ) ? "searchtext>" : "searchtext%3E";
				var prefixIndex = searchTerm.indexOf(prefix);
	
				if (prefixIndex != -1) { // search text param found
					var searchTextStart = prefixIndex + prefix.length;
					searchText = searchTerm.substring(searchTextStart); // get search text
				}
			} else { // set search text
				searchText = searchTerm;
			}
			
			searchText = searchText.replace(/\+/ig, " ");
		}

		return searchText;
	}
	
} // end homebase.page.breadCrumb


	
/**
	Popupate the value for Site Satalyst tags: 
		s.pageName, s.channel, s.prob4
		s.eVar3, s.eVar21, s.eVar22 and s.eVar23
	Tag values depend on its default data (if any) and the breadcrumb data.
*/
var scPrefix	= 'hb:cat';
var sChannel	= scPrefix + ':';
var sPageName	= scPrefix;

function doSiteCatalystTags() {
	s.pageName	= sPageName;
	s.channel	= sChannel;	
	
	var PATH_DELIM = ">"; 
	var TAG_DELIM = ":";
	
	// define tag values from the breadcrumb data
	var breadCrumb = homebase.page.breadCrumb;
	if (breadCrumb) {
		// only 3 levels from the breadcrumb data is used (as of live).
		var item1 = breadCrumb.crumbText[breadCrumb.DELIM + 1];
		var item2 = breadCrumb.crumbText[breadCrumb.DELIM + 2];
		var item3 = breadCrumb.crumbText[breadCrumb.DELIM + 3];
		
		if (item1) {
			s.eVar21 = item1;
			s.eVar3	= item1;
			s.pageName += TAG_DELIM + item1.replace(/\s/g, "");
		}
		
		if (item2) {
			s.eVar22 = item2;
			s.eVar3	+= PATH_DELIM + item2;
			s.pageName += TAG_DELIM + item2.replace(/\s/g, "");
		}
		
		if (item3) {
			s.eVar23 = item3;
			s.eVar3	+= PATH_DELIM + item3;
			s.pageName += TAG_DELIM + item3.replace(/\s/g, "");
		}
		
		
	}
	s.pageName += ':product:';
	s.prop4	= s.pageName;
	//Setting the s.prop44 (previously it was set in the page) to resolve caching issue
	//Added as part of SEO changes(URL standardization)
	if(homebase.page.breadCrumb.ROOT_CATNAME != "" && homebase.page.breadCrumb.ROOT_CATNAME != null){
		s.prop44 = homebase.page.breadCrumb.ROOT_CATNAME+':product:';
	}
};
