/* 
	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 : "&",
	// 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);
	},
	
	createBreadCrumbData : function() {
		// reduce namespace
		var breadCrumb = homebase.page.breadCrumb;
		// exit if no category information found
		if (breadCrumb.URL.indexOf(breadCrumb.DELIM) == -1) return;
		
		// check for invalid chars
		if (breadCrumb.URL.indexOf("<") != -1) return;
		if (breadCrumb.URL.indexOf(homebase.comms.Url.encode("<")) != -1) return;
		
		// cater for unencoded sub delimeter
		/*gh
		if (breadCrumb.URL.indexOf(breadCrumb.SUB_DELIM) == -1) {
			breadCrumb.SUB_DELIM = homebase.comms.Url.encode(
				breadCrumb.SUB_DELIM
			);
		};
		*/
		
		// string to store URL of Mercado category parameters
		var categoryURL = "";
		// get param list from URL
		breadCrumb.paramList = breadCrumb.URL.split( breadCrumb.DELIM );
		// populate main portion of Web site URL
		breadCrumb.WCSPrefix = breadCrumb.paramList[0].replace(breadCrumb.PRODUCT_DISPLAY_CMD, breadCrumb.BROWSE_CMD );
		// get category data
		// start index at 1 because URL prefix data not needed
		for (var i = 1; i < breadCrumb.paramList.length; i++) {
			
			// get category URLs
			categoryURL = breadCrumb.paramList[ i ];
			
			//gh
			categoryURL = homebase.comms.Url.decode( 
					// remove "+" from breadcrumb text if present
					categoryURL.replace(new RegExp(/\+/ig), " "))
			
			// remove refinements
			if (categoryURL.indexOf(breadCrumb.REFINE_DELIM) != -1 || 
				categoryURL.indexOf(homebase.comms.Url.encode(
						breadCrumb.REFINE_DELIM
					)) != -1) {
				categoryURL = categoryURL.substring(0,
						( categoryURL.indexOf( breadCrumb.REFINE_DELIM ) -1 ) 
					);
			}
			
			/*  
				-- Recap on constants --
				CAT_ROOT_DELIM : "category_root"
				DELIM : "c_"
				SUB_DELIM : "|"
				REFINE_DELIM : "r_"
				AMPERSAND : "&"
			*/
			
			// add DELIM back in
			// create adhoc hashtable keys from URL for category links
			breadCrumb.categoryURL[ breadCrumb.DELIM + 
				categoryURL.substring(0,1) ] = breadCrumb.DELIM + categoryURL;
			
			// create adhoc hashtable keys from URL for breadcrumb text
			// get breadcrumb text only and clean up URL encoding
			/* GH remove
			breadCrumb.crumbText[ breadCrumb.DELIM + 
				categoryURL.substring(0,1) ] = homebase.comms.Url.decode( 
					// remove "+" from breadcrumb text if present
					categoryURL.replace(new RegExp(/\+/ig), " ").split(
							breadCrumb.SUB_DELIM
						)[breadCrumb.splitIndex] 
				);	// assigns breadcrumb text section within delimetered string
			*/
			breadCrumb.crumbText[ breadCrumb.DELIM + 
				categoryURL.substring(0,1) ] = categoryURL.split(
							breadCrumb.SUB_DELIM
						)[breadCrumb.splitIndex] ;				
			
			
		}
		
	},
	
	render : function(pageContext) {
		
		// render breadcrumb based on page context
		if ( pageContext == "productdetails" ) {
			// reduce namespace
			var breadCrumb = homebase.page.breadCrumb;
			// 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>';
			
			// build breadcrumb heirarchy
			// use breadcrumb url and text hashtables to populate links
			// by calling the category keys in order
			for (var i = 1; i <= breadCrumb.categoryURL.size(); i++) {
				// call hash keys in order
				// concatenate params to build up category heirarchy links
				urlCateogories += breadCrumb.categoryURL[breadCrumb.DELIM + i];
				
				// clean off last link ampersand
				if ( urlCateogories.lastIndexOf(breadCrumb.AMPERSAND) != -1 ) { 
					urlCateogories = urlCateogories.substring(
						0, urlCateogories.lastIndexOf(breadCrumb.AMPERSAND)
					); 
				}
			
				// 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>';
				// add ampersand between each category link
				urlCateogories += breadCrumb.AMPERSAND;
				
			}// 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;
};