
/* *******************************************************************************************************
 * PRIVATE NUSYSTEMS CODE
 * tracking.00.non_cm.base.src.js
 *******************************************************************************************************/

//var pagetitle = document.title; //INSERT CUSTOM PAGE NAME IN QUOTES
//var scriptlocation = "http://www.nusystems.co.uk/otsstats/track.asp";
//var pagedata = 'mtpt=' + escape(pagetitle) + '&mtr=' + escape(document.referrer) + '&mtt=2&mts=' + window.screen.width + 'x' + window.screen.height + '&mti=1&mtz=' + Math.random();
//document.write('<img height="1" width="1" vspace="0" hspace="0" style="display:none" src="' + scriptlocation + '?' + pagedata + '">');

/* *******************************************************************************************************
 * PRIVATE NUSYSTEMS CODE ENDS
 * tracking.00.non_cm.base.src.js
 *******************************************************************************************************/ 
 
 
 
 
/* *******************************************************************************************************
 * PRIVATE GOOGLE CODE
 * tracking.00.non_cm.base.src.js
 * 
 * code to hack usage of googles adword conversion tracker
 * now called from within the code below which wraps coremetrics
 *******************************************************************************************************/
			
var iframe;
var google_complete_location = "/google_convert.html";
			
function completeOrder(orderValue, orderid, quantity) { 
	if (!iframe) {
		iframe = document.createElement('iframe');
		iframe.setAttribute('width','0');
		iframe.setAttribute('height','0');
		iframe.setAttribute('frameborder','0');
		document.body.appendChild(iframe);
	};
	iframe.setAttribute('src',google_complete_location+"?"+orderValue + "&" + orderid + "&" + quantity);
};

/* *******************************************************************************************************
 * PRIVATE GOOGLE CODE ENDS
 * tracking.00.non_cm.base.src.js
 *******************************************************************************************************/




/* ******************************************************************************************************
 * PRIVATE CONSTANTS USED TO AVOID 'MAGIC' VARS, PARTICULARLY AT NAMES
 * SHOULD MATCH CDF FILE FOR CATEGORY NAMES
 * tracking.01.cm.constants.src.js    
 *******************************************************************************************************/

// used to create cm_re params
var const_gnVersion 						= (window.siteRelease)? window.siteRelease : 1;

// used to delimit & split strings
var const_gnCartDelim						= "||";
var const_gnCartItemDelim					= ";";
var const_gnCM_REDelim						= "-_-";
var const_gnItemDelim						= " : ";
var const_gnLinkCMDelim						= "?cm_re=";
var const_gnNoLink							= "noLink";
var const_gnEmptyString						= "";

var const_gnReportConfirmCart				= true;
var const_gnTrackFeatureHygieneSections		= true;
var const_gnThrowManualImpressions			= false;


// constant categories, should match up with flash core.coreMetricsController & the cdf file


var const_gnCategoryName_Home				= "HOME";
var const_gnCategoryName_HomeIntro 			= "HOME:INTRO";
var const_gnCategoryName_HomeNews 			= "HOME:NEWS";
var const_gnCategoryName_HomeBanner 		= "HOME:BANNER";
var const_gnCategoryName_HomeKit 			= "HOME:KIT";

var const_gnCategoryName_Search		 		= "SEARCH"; 
var const_gnCategoryName_DirectLink 		= "DIRECTLINK";  			// to be used with direct link values of prodId and imgvarId in URL
var const_gnCategoryName_CatalogueRelated 	= "CATALOGUERELATED";  		// when clicking on related products in the Catalogue
var const_gnCategoryName_ProdRelated 		= "PRODRELATED";  			// when clicking on related products from a product view

var const_gnCategoryName_Forms				= "FORMS";
var const_gnCategoryName_Checkout			= "FORMS:CHECKOUT";


var const_gnCategoryName_Blog		 		= "FEATURES:BLOG";



var const_gnMenuItemName					= "menuItem";
var const_gnMenuItemName_FeatureSub			= "featurePage MenuItem";
var const_gnMenuItemName_HygieneSub			= "hygienePage MenuItem";



var const_gnMenuName_Checkout				= "checkout";
var const_gnMenuName_Checkout1				= "1. Sign-in/Create Account";
var const_gnMenuName_Checkout2				= "2. Select/Enter Billing Info";
var const_gnMenuName_Checkout3				= "3. Select/Shipping Billing Info";
var const_gnMenuName_Checkout4				= "4. Shipping Options &amp; Review";
var const_gnMenuName_Checkout5				= "5. Enter Payment Details";

var const_gnMenuType_Catalogue				= "catalogue"; // included catalogue & brochure in case of naming issues
var const_gnMenuType_Brochure				= "brochure";
var const_gnMenuType_Product				= "shop";
var const_gnMenuType_Feature				= "feature";
var const_gnMenuType_Hygiene				= "hygiene"; // included mis-spelling
var const_gnMenuType_Hygene					= "hygene";
var const_gnMenuType_Form					= "form";
var const_gnPageType_Checkout				= "checkout";




var const_gnElementName_MoreInfo 			= "moreInfo";
var const_gnElementName_FormButton 			= "formButton";

var const_gnElementName_ProductListItem		= "productListItem";
var const_gnElementName_Product				= "product";

var const_gnElementName_wishListItem		= "wishListItem";
var const_gnElementName_guestWishListItem	= "guestWishListItem";

var const_gnElementName_homeKit				= "homeKit";
var const_gnElementName_homePanel			= "homePanel";
var const_gnElementName_homeBanner			= "homeBanner";
var const_gnElementName_homeCatalogue		= "homeCatalogueStamp";

var const_gnElementName_ProductCombo		= "productCombo";
var const_gnElementName_RelatedProduct		= "relatedProduct";

var const_gnElementName_CatalogueImage			= "catalogueImage";
var const_gnElementName_CatalogueImageProduct 	= "catalogueImageProduct";

var const_gnElementName_CloseButton			= "closeButton";
var const_gnElementName_SectionMenu			= "subSectionMenu";

var const_gnElementName_FeatureSection		= "featurePageSubSection";
var const_gnElementName_HygieneSection		= "hygienePageSubSection";

var const_gnElementName_HygieneSectionImg	= "hygienePageSubSectionImage";
var const_gnElementName_FeatureSectionImg	= "featurePageSubSectionImage";


var const_gnPageType_Home					= "home";
var const_gnPageType_Product 				= "product";
var const_gnPageType_ProductList			= "productList";
var const_gnPageType_Catalogue 				= "catalogue";
var const_gnPageType_Form	 				= "form";
var const_gnPageType_Checkout	 			= "checkout";
var const_gnPageType_Feature				= "feature";
var const_gnPageType_Hygiene				= "hygiene";


var const_gnPageName_Home	 				= "homePage";
var const_gnPageName_Catalogue 				= "cataloguePage";
var const_gnPageName_Product 				= "productPage";
var const_gnPageName_ProductList 			= "productListPage";
var const_gnPageName_Form		 			= "formPage";



var const_gnPageName_Checkout				= "checkoutPage"; 			// all the Checkout pages have "Checkout" as the page title, then are differentiated with page & form keys
var const_gnPageName_Feature 				= "featurePage";
var const_gnPageName_News	 				= "newsPage";
var const_gnPageName_Hygiene				= "hygienePage";
var const_gnPageName_OrderComplete			= "orderCompletePage";

var const_gnPageName_CatalogueRequest		= "catalogueRequest";		// currently an email!!!


var const_gnPageTitle_Checkout				= "Checkout"; 

var const_gnOverlayFormKeys					= ["register","sendWishList","forgotten"]; // because these forms aren't associated to a menu item, they don't replace the page content, and therefore closing doesn't go home
var const_gnClickReadKeys					= [const_gnSendButton, const_gnSignUpButton];



var const_gnPanelName_Account 				= "accountPanel";
var const_gnPanelName_Cart 					= "cartPanel";
var const_gnPanelName_Wishlist 				= "wishlistPanel";
var const_gnPanelName_GuestWishlist 		= "guestWishlistPanel";

var const_gnPanelName_Menu			 		= "menuPanel";

var const_gnPanelTab_Account 				= "accountPanelTab";
var const_gnPanelTab_Cart 					= "cartPanelTab";
var const_gnPanelTab_Wishlist 				= "wishlistPanelTab";
var const_gnPanelTab_GuestWishlist 			= "guestWishlistPanelTab";

var const_gnPanelTab_Menu		 			= "menuPanelTab";

var const_gnCheckoutButton					= "checkoutButton";	// special case of a form button
var const_gnCheckoutForm					= "Checkout";

var const_gnShippingCombo					= "shippingCombo";	// special case of a combo box

var const_gnRegisterButton					= "register user";	// special case of a form button
var const_gnForgottenButton					= "forgotten password";
var const_gnSendWishListButton				= "Send WishList";
var const_gnSendButton						= "Send";
var const_gnSignUpButton					= "Sign Up";

var const_gnForgottenForm					= "Forgotten Password";	// special case of a form button
var const_gnRegisterForm					= "Register";
var const_gnSendWishListForm				= "Send WishList";	// special case of a form button



var const_gnConstantItem_Logo	 			= "logo";


var const_gnNewsletterName					= "newsLetter";



var const_gnSkuParts_Default				= 4;
var const_gnSkuParts_ShopItem				= 4;




var const_gnTimeoutDuration					= 400;

var global_pageViewTimeoutID				= null;
var global_isLoggedIn						= false;	// need to know to determine whether to throw impression for email button on wishlist

var global_orderItemQuatity                 = 0; //total number of items in order (razorfish)

/* ******************************************************************************************************
 * GLOBAL VARS (STATIC) USED TO AVOID 'MAGIC' VARS, PARTICULARLY AT NAMES ENDS
 * tracking.01.cm.constants.src.js      
 *******************************************************************************************************/






/* *******************************************************************************************************
 * PRIVATE COREMETRICS DIRECT WRAPPING CODE
 * tracking.02.cm.base.src.js
 * 
 * The following are direct wrappers for the available CM code, contains boolean value to allow easy switch on/off
 * Treat as private, should only be called by the 'flash logic' functions
 * Shouldn't ever need editing
 *******************************************************************************************************/

function gnSetProduction() {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("gnSetProduction", processArguments(arguments) );
	if (coremetricsOnFlag) cmSetProduction();
};

function gnCreatePageviewTag(cmPageID, cmCatId, cmSearchTerm, cmSearchResults) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreatePageviewTag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreatePageviewTag(cmPageID, cmCatId, cmSearchTerm, cmSearchResults);
};

function gnCreateProductviewTag(cmProdID, cmProdName, cmCatID) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreateProductviewTag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreateProductviewTag(cmProdID, cmProdName, cmCatID);
};

function gnCreateShop5Tag(cmProdID, cmProdName, cmProdQuantity, cmProdUnitPrice, cmCatID) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreateShopAction5Tag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreateShopAction5Tag(cmProdID, cmProdName, cmProdQuantity, cmProdUnitPrice, cmCatID);
};

function gnDisplayShop5s() {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmDisplayShop5s" );
	if (coremetricsOnFlag) cmDisplayShop5s();
};

function gnCreateShop9Tag(cmProdID, cmProdName, cmProdQuantity, cmProdUnitPrice, cmCustID, cmOrderID, cmOrderSub, cmCatID) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreateShopAction9Tag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreateShopAction9Tag(cmProdID, cmProdName, cmProdQuantity, cmProdUnitPrice, cmCustID, cmOrderID, cmOrderSub, cmCatID);
};

function gnDisplayShop9s() {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmDisplayShop9s" );
	if (coremetricsOnFlag) cmDisplayShop9s();
};

function gnCreateOrderTag(cmOrderID, cmOrderSub, cmOrderShipping, cmCustID, cmCustCity, cmCustState, cmCustZip) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreateOrderTag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreateOrderTag(cmOrderID, cmOrderSub, cmOrderShipping, cmCustID, cmCustCity, cmCustState, cmCustZip);
};

function gnCreateRegistrationTag(cmCustID, cmCustEmail, cmCustCity, cmCustState, cmCustZip, cmNewsName, cmNewsSub) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreateRegistrationTag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreateRegistrationTag(cmCustID, cmCustEmail, cmCustCity, cmCustState, cmCustZip, cmNewsName, cmNewsSub);
};

function gnCreatePageElementTag(cmElemID, cmElemCat, cmPageID, cmCatID, cmElemLoc) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreatePageElementTag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreatePageElementTag(cmElemID, cmElemCat, cmPageID, cmCatID, cmElemLoc);
};

function gnCreateConversionEventTag(cmEventID, cmActionType, cmEventCatID, cmPoints) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreateConversionEventTag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreateConversionEventTag(cmEventID, cmActionType, cmEventCatID, cmPoints);
};

function gnCreateManualLinkClickTag(cmLinkToName, cmLinkObjectName, cmPageID) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreateManualLinkClickTag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreateManualLinkClickTag(cmLinkToName, cmLinkObjectName, cmPageID);
};

function gnCreateManualImpressionTag(cmPageID, cmSpecialPromoCode, cmRealEstateCode) {
	clearTimer();
	if (debugCoremetricsOnFlag) trackCMCall("cmCreateManualImpressionTag", processArguments(arguments) );
	if (coremetricsOnFlag) cmCreateManualImpressionTag(cmPageID, cmSpecialPromoCode, cmRealEstateCode);
};

/* *******************************************************************************************************
 * PRIVATE COREMETRICS DIRECT WRAPPING CODE ENDS
 * tracking.02.cm.base.src.js
 *******************************************************************************************************/





/* ******************************************************************************************************
 * PRIVATE 'LOGIC' FUNCTIONS
 * tracking.02.cm.base.src.js
 * 
 *******************************************************************************************************/

var trackArgDelimter = " | ";

function trace(str,type) {
	if (!document.all && console) {
		theType = (type)? type : "log";
		switch(theType) {
			
			case "warn":
				console.warn(str);
				break;
			
			case "error":
				console.error(str);
				break;
			
			case "info":
				console.info(str);
				break;
			
			case "log":
			default:
				console.log(str);
				break;
		}
		
	}
};


function trackCMCall(cmFunction, passedArgs) {
	trace("Calling "+cmFunction+" with arguments: "+passedArgs,"info");
};

function processArguments() {
	var str = "";
	var args = arguments[0];
	for(var i=0; i<args.length; i++) {
		str += new String(args[i]);
		if (i<args.length-1) str+=trackArgDelimter;
	};
    return  str;
};


/* MenuItem 'constructor' 
 * 
 *******************************************************************************************************/
function MenuItem(args) { //0 pagekey, 1 menuName, 2 menuType, 3 coremetricsCategory, 4 parentMenuName
	this.pageKey 	= args[0];
	this.label 		= args[1];
	this.type 		= args[2];
	this.category 	= args[3];
	this.parentName = args[4];
};

/* createMenuItems
 * 
 *******************************************************************************************************/
function createMenuItems(arrMenuItems) {
		
 	if (!arrMenuItems || arrMenuItems==null || arrMenuItems=="null" || arrMenuItems=="undefined") return [];
	var mItmArray = new Array();

    for(ii = 0; ii < arrMenuItems.length; ii++) {
        var mItm =  new MenuItem(arrMenuItems[ii]); 
		mItmArray.push(mItm);
    };
	return mItmArray;
};



function shopItemProp(checkVal,defaultVal) {
	return (checkVal && checkVal!="undefined")? checkVal : defaultVal;
};


/* shopItem 'constructor' for a shopItem - takes:
 * 
 * @param strListOfProps:String
 *          semicolon separated on item info
 *          "SKU123;product name;categoryid;qty;unit price"
 *******************************************************************************************************/
function shopItem(strListOfProps) { // 0 sku, 1 name, 2 price,  3 line price, 4, line tax, 5 catID, 6 quantity
		var arItemInfo = strListOfProps.split(const_gnCartItemDelim);
		this.prodID 		= shopItemProp( formatSKU(arItemInfo[0], const_gnSkuParts_ShopItem), const_gnEmptyString );
		this.prodName 		= shopItemProp( arItemInfo[1], const_gnEmptyString );
		this.prodUnitPrice 	= shopItemProp( arItemInfo[2], const_gnEmptyString );
		this.linePrice 		= shopItemProp( arItemInfo[3], const_gnEmptyString );
		this.lineTax 		= shopItemProp( arItemInfo[4], const_gnEmptyString );
		this.catID 			= shopItemProp( arItemInfo[5], const_gnEmptyString );
		this.prodQuantity 	= shopItemProp( arItemInfo[6], "1" );	
};



/* createShopItems
 * 
 * @param strListOfItems:String
 * 			double delimited list:
 *          comma separated on cart items
 *          semicolon separated on item info
 *          "SKU123;product name;qty;unit price;categoryid,SKU124;product name 2;qty;unit price;categoryid"
 *******************************************************************************************************/
function createShopItems(strListOfItems) {
 	if (!strListOfItems || strListOfItems==null || strListOfItems=="null" || strListOfItems=="undefined") return [];
	var sItmArray = new Array();
    var arItems = strListOfItems.split(const_gnCartDelim);
    for(ii = 0; ii < arItems.length; ii++) {
        var sItm =  new shopItem(arItems[ii]); 
		sItmArray.push(sItm);
    };
	return sItmArray;
};


/* gnProcessCartItems
 * 
 * @param strListOfItems:String
 * 			double delimited list:
 *          comma separated on cart items
 *          semicolon separated on item info
 *          "SKU123;product name;qty;unit price;categoryid,SKU124;product name 2;qty;unit price;categoryid"
 *******************************************************************************************************/
function gnProcessCartItems(strListOfItems) {
    var arItems = createShopItems(strListOfItems);
	if (arItems.length<1) return;
    for(ii = 0; ii < arItems.length; ii++)
    {
		gnCreateShop5Tag(arItems[ii].prodID.toString(), arItems[ii].prodName.toString(), arItems[ii].prodQuantity.toString(), arItems[ii].linePrice.toString(), arItems[ii].catID.toString());
    };
    gnDisplayShop5s();
	delete arItems;
};


/* gnProcessOrderItems
 * 
 * @param strListOfItems:String
 * 			double delimited list:
 *          comma separated on cart items
 *          semicolon separated on item info
 *          "SKU123;product name;qty;unit price;categoryid,SKU124;product name 2;qty;unit price;categoryid"
 *******************************************************************************************************/
function gnProcessOrderItems(strListOfItems, custID, orderID, orderSub) {

    var total = 1; 
    var arItems = createShopItems(strListOfItems);
    for(ii = 0; ii < arItems.length; ii++)
    {
		gnCreateShop9Tag(arItems[ii].prodID, arItems[ii].prodName, arItems[ii].prodQuantity, arItems[ii].linePrice, custID, orderID, orderSub, arItems[ii].catID);

		//totalling of items in order
		global_orderItemQuatity = total++;
    };
    gnDisplayShop9s();
	delete arItems;
};





function gnProcessMenuItems(mitmArray) {
	// loop though array and create

	var shopLink = false;
	for (var i=0; i<mitmArray.length; i++) {
		
		var mItm = mitmArray[i];
		var mLink = new ManualLink( formatMenuName(mItm),formatMenuLink(mItm) );
		
		switch(mItm.type) {
			case const_gnMenuType_Catalogue:
			case const_gnMenuType_Brochure:
			case const_gnMenuType_Product:
				global_Tracker.addShopLink(mLink);
				shopLink = true;
				break;
				
			default:
				global_Tracker.addManualLink(mLink);
				break;
		};

	};
	if (shopLink) {
		gnMenuImpressions();
	} else {
		global_Tracker.manualMenusAdded++;
		if (global_Tracker.manualMenusAdded>1) gnManualImpressions();
	};
};



/* gnPageView
 * 
 * Proxy for gnCreatePageView, takes details from the global tracker and creates a pageView
 */
function gnPageView() {
	var cInf = global_Tracker.getCurrent();
	gnCreatePageviewTag(cInf.page, cInf.category);
	gnPageImpressions();
}

/* gnSearchPageView
 * 
 * Proxy for gnCreatePageView, takes details from the global tracker and creates a pageView
 */
function gnSearchPageView() {
	var cInf = global_Tracker.getCurrent();
	gnCreatePageviewTag(cInf.page, cInf.category, cInf.search, cInf.results);
	gnPageImpressions();
}

function gnPageViewClose() {
	var nextObj = getClosedLinkObj();
	gnManualLinkClick(nextObj.page,const_gnElementName_CloseButton);
	timeReleasePageView(nextObj);
}

/* gnPageImpressions
 * 
 *******************************************************************************************************/
function gnPageImpressions() {
	if (global_Tracker.getCurrent().pageType != const_gnPageType_Home) gnCloseButtonImpression();
	gnPanelImpression();
	gnManualImpressions();
	gnMenuImpressions();
	gnSubMenuImpressions();
};



/* gnCloseButtonImpression
 * 
 *******************************************************************************************************/
function gnCloseButtonImpression() {
	var closePage = getClosedLinkObj().page;
	gnManualImpression(const_gnElementName_CloseButton, closePage);
};


/* gnManualImpressions
 * 
 *******************************************************************************************************/
function gnManualImpressions() {
	var linksArray = global_Tracker.getManualLinks();
	for (var i=0; i<linksArray.length; i++) {
		gnManualImpression(linksArray[i].name, linksArray[i].link);
	};
};


/* gnMenuImpressions
 * 
 *******************************************************************************************************/
function gnMenuImpressions() {
	var linksArray = global_Tracker.getShopLinks();
	for (var i=0; i<linksArray.length; i++) {
		gnManualImpression(linksArray[i].name, linksArray[i].link);
	};
};

/* gnSubMenuImpressions
 * 
 *******************************************************************************************************/
function gnSubMenuImpressions() {
	var linksArray = global_Tracker.getSubLinks();
	for (var i=0; i<linksArray.length; i++) {
		gnManualImpression(linksArray[i].name, linksArray[i].link);
	};
};


/* gnPanelImpression
 * 
 *******************************************************************************************************/
function gnPanelImpression() {
	var linksArray = global_Tracker.getCurrentPanel().links;
	for (var i=0; i<linksArray.length; i++) {
		gnManualImpression(linksArray[i].name, linksArray[i].link);
	};
};


/* gnPanelTabImpression
 * 
 * @param panelName:String
 * @param cmCategory:String
 *******************************************************************************************************/
function gnPanelTabImpression(panelTabName) {
/* not nav so no function */
};


/* gnMenuImpression
 * 
 * @param menuName:String
 * @param cmCategory:String
 *******************************************************************************************************/
function gnMenuImpression(menuName,cmCategory) {
	gnManualImpression(menuName,const_gnNoLink);
};

/* gnFormImpression
 * 
 * @param menuName:String
 * @param cmCategory:String
 *******************************************************************************************************/
function gnFormImpression(formName,cmCategory) {
	gnManualImpression(formName,const_gnNoLink);
};

/* gnManualImpression
 * 
 */
function gnManualImpression(itemName,itemLink) {
	if (const_gnThrowManualImpressions) gnCreateManualImpressionTag(global_Tracker.getCurrent().page, null, formatCM_RE(itemName,itemLink) );
};



/* gnManualLinkClick
 * 
 */
function gnManualLinkClick(href,linkName) {
	var theHref = href;
	if (const_gnThrowManualImpressions) theHref += const_gnLinkCMDelim + formatCM_RE(linkName,href);
	gnCreateManualLinkClickTag(theHref, linkName, global_Tracker.getCurrent().page);
}



function clearTimer() {
	window.clearTimeout(global_pageViewTimeoutID);
};

function timeReleasePageView(prevInfoObj) {
	
	clearTimer();
	
	var timeoutPageView = function() {
		
		clearTimer();
		
		var thepage 	= (prevInfoObj.page)? 		prevInfoObj.page 		: const_gnEmptyString;
		var thecategory = (prevInfoObj.category)? 	prevInfoObj.category 	: const_gnEmptyString;
		var thetype 	= (prevInfoObj.type)? 		prevInfoObj.type 		: const_gnEmptyString;
		var thesku 		= (prevInfoObj.sku)? 		prevInfoObj.sku 		: const_gnEmptyString;
		var thesearch	= (prevInfoObj.search)? 	prevInfoObj.search 		: const_gnEmptyString;
		var theresults	= (prevInfoObj.results)? 	prevInfoObj.results 	: const_gnEmptyString;
		
		global_Tracker.setPage(thepage);
		global_Tracker.setCategory(thecategory);
		global_Tracker.setSKU(thesku);
		global_Tracker.setPageType(thetype);
		global_Tracker.setSearchTerm(thesearch);
		global_Tracker.setSearchResults(theresults);
		
		if (thesearch) {
			gnSearchPageView();
		} else {
			gnPageView();
		}

	};
	
	global_pageViewTimeoutID = window.setTimeout(timeoutPageView,const_gnTimeoutDuration);
	
};


function formatSKU(SKU,skuParts) {
	var skuParts = (skuParts)? skuParts : const_gnSkuParts_Default; // this MAY be switched on usage, for the moment standard is const_gnSkuParts_Default (4)
	var skuSrcArray = SKU.split("-").slice(0,skuParts);
	return skuSrcArray.join("-");
};

function formatCM_RE(area,link) {
	return const_gnVersion + const_gnCM_REDelim + area + const_gnCM_REDelim + link;
};

function formatMenuName(mItm){
	return const_gnMenuItemName + " : " + mItm.parentName + " - " + mItm.label
}

function formatMenuLink(mItm) {
	var pageName="";
	var isForm = false;
	
	switch(mItm.type) {
		
		case const_gnMenuType_Brochure:
		case const_gnMenuType_Catalogue:
			pageName = const_gnPageName_Catalogue + " : ";
			break;
			
		case const_gnMenuType_Product:
			pageName = const_gnPageName_ProductList + " : ";
			break;
		
		case const_gnMenuType_Feature:
			pageName = const_gnPageName_Feature + " : ";
			break;
		
		case const_gnMenuType_Hygiene:
		case const_gnMenuType_Hygene:
			pageName = const_gnPageName_Hygiene + " : ";
			break;
			
		case const_gnMenuType_Form:
			isForm = true;
			pageName = const_gnPageName_Form + " : ";
			break;
			
		default:
			break;
	}
	
	if (isForm) {
		switch (mItm.label) {
			case const_gnMenuName_Checkout1:
			case const_gnMenuName_Checkout2:
			case const_gnMenuName_Checkout3:
			case const_gnMenuName_Checkout4:
			case const_gnMenuName_Checkout5:
				pageName = const_gnPageName_Checkout + " : ";
				break;
		}
	}
	
	pageName += mItm.label;

	if (mItm.pageKey == const_gnPageName_Home) pageName = const_gnPageName_Home;
	
	return pageName;
};


function getClosedLinkObj() {

	var currInfo = global_Tracker.getCurrent();
	var nextInfo;
	var homeLink = false;

	switch (currInfo.pageType) {
		
		case const_gnPageType_Form:	
		case const_gnPageType_Hygiene:
			nextInfo = getTrackerObj([currInfo.pageType]);
			break;
		
		case const_gnPageType_Product: // not another product, not a form, not a hygiene
			nextInfo = getTrackerObj([const_gnPageType_Product, const_gnPageType_Form, const_gnPageType_Hygiene]);
		
		case const_gnPageType_Checkout:
		case const_gnPageType_Catalogue:
		case const_gnPageType_ProductList:
		case const_gnPageType_Feature:
		default:
			homeLink = true;
			break;
	};
	
	if (homeLink) {
		nextInfo = {
			page: const_gnPageName_Home,
			pageType: const_gnPageType_Home, 
			category: const_gnCategoryName_Home, 
			SKU: "", 
			search: "",
			results: ""
		};
	};

	return nextInfo;
	
};

function getTrackerObj(notTypeArray) {
	var i=1;
	var nextInfo = global_Tracker.getAtIndex(i);
	while (	isInArray( nextInfo.pageType, notTypeArray) ) {
		i++;
		nextInfo = global_Tracker.getAtIndex(i);
	};
	return nextInfo;
};

function isInArray(item,arr) {
	for (var i=0; i<arr.length; i++) {
		if (typeof(item).toLowerCase() == 'string' ) {
			if (new String(arr[i]).toLowerCase()==item.toLowerCase()) return true;
		};
		if (arr[i]==item) return true;
	};
	return false;
};


function gnLogin() {
	global_isLoggedIn=true;

	global_AccountPanel.removeLink(const_gnForgottenButton);
	global_AccountPanel.removeLink(const_gnRegisterButton);
	
	global_WishlistPanel.addLink( global_wishListEmailLink );
	
	if (global_Tracker.currentPanel == global_WishlistPanel) gnPanelImpression();
}


/* ManualLink
 * 
 * Pseudo constructor for links to throw manual impressions for
 */
function ManualLink(name,href) {
	this.name = name;
	this.link = href;
} 

function Panel(name,linksArray) {
	this.name = name;
	this.links = new Array();
	
	if (linksArray) {
		for (var i=0; i<linksArray.length; i++) {
			this.links.push(linksArray[i]);
		};
	};
	
	this.addLink = function(newLink) {
		this.links.push(newLink);
	};
	
	this.removeLink = function(linkName) {
		for (var i=0; i<this.links.length; i++) {
			if (this.links[i].name==linkName) {
				this.links.splice(i,1);
				break;
			};
		};
	};
}


function Tracker() {
	
	this.pageHistory 			= new Array();
	this.categoryHistory 		= new Array();
	this.skuHistory 			= new Array();
	this.pageTypeHistory		= new Array();
	this.searchTermHistory		= new Array();
	this.searchResultHistory 	= new Array();
	
	this.panels					= new Array();
	this.currentPanel			= null;
	
	
	this.manualMenusAdded		= 0;
	this.manualLinks			= new Array();
	this.shopMenuLinks			= new Array();
	this.subMenuLinks			= new Array();
	
	
	this.addPanel=function(newPanel) {
		this.panels.push(newPanel);
	};
	
	this.setCurrentPanel=function(panelName) {
		var newPanel = this.getPanel(panelName);
		if (newPanel && this.currentPanel != newPanel) {
			this.currentPanel = newPanel;
			gnPanelImpression();
		};
	};
	
	this.getPanel=function(panelName) {
		for (var i=0; i<this.panels.length; i++) {
			if (this.panels[i].name==panelName) return this.panels[i];
		};
		return null;
	};
	
	this.getCurrentPanel=function() {
		return this.currentPanel;
	};
	
	
	this.addShopLink=function(newManualLink) {
		this.shopMenuLinks.push(newManualLink);
	};
	
	this.getShopLinks=function() {
		return this.shopMenuLinks;
	};
	
	this.clearShopLinks=function() {
		this.shopMenuLinks = new Array();
	};
	
	
	this.addSubLink=function(newManualLink) {
		this.subMenuLinks.push(newManualLink);
	};
	
	this.getSubLinks=function() {
		return this.subMenuLinks;
	};
	
	this.clearSubLinks=function() {
		this.subMenuLinks = new Array();
	};
	
	
	this.addManualLink=function(newManualLink) {
		this.manualLinks.push(newManualLink);
	};
	
	this.getManualLinks=function() {
		return this.manualLinks;
	};
	
	this.setPage=function(newPage) {
		var theNewPage = (newPage)? newPage : this.pageHistory[0];
		this.pageHistory.unshift(theNewPage);
	};
	
	this.setCategory=function(newCat) {
		var theNewCategory = (newCat)? newCat : this.categoryHistory[0];
		this.categoryHistory.unshift(theNewCategory);
	};
	
	this.setSKU=function(newSKU) {
		var theNewSKU = (newSKU)? newSKU : this.skuHistory[0];
		this.skuHistory.unshift(theNewSKU);
	};
	
	this.setPageType=function(newPageType) {
		var theNewPageType = (newPageType)? newPageType : this.pageTypeHistory[0];
		this.pageTypeHistory.unshift(theNewPageType);
	};
	
	this.setSearchTerm=function(newTerm) {
		var theNewTerm = (newTerm)? newTerm : const_gnEmptyString;
		this.searchTermHistory.unshift(theNewTerm);
	};
	
	this.setSearchResults=function(newResults) {
		var theNewResults = (newResults)? newResults : const_gnEmptyString;
		this.searchResultHistory.unshift(theNewResults);
	};
	
	this.getCurrent=function() {
		return this.getAtIndex(0);
	};
	
	this.getPrevious=function(negIndex) {
		return this.getAtIndex(1);
	};
	
	this.getAtIndex=function(index) {
		return {page:this.pageHistory[index], category:this.categoryHistory[index], sku:this.skuHistory[index], pageType:this.pageTypeHistory[index], search:this.searchTermHistory[index], results:this.searchResultHistory[index]};
	};
	
	this.report=function() {
		for (var i=0; i<this.pageHistory.length; i++) {
			trace("---- Global Tracer.report("+i+") - page: "+this.pageHistory[i]+"; pageType: "+this.pageTypeHistory[i]+"; category: "+this.categoryHistory[i]+"; SKU: "+this.skuHistory[i]+"; search: "+this.searchTermHistory[i]+"; results: "+this.searchResultHistory[i]);
		};
	};
	
};

var global_Tracker = new Tracker();

var global_Logo = new ManualLink(const_gnConstantItem_Logo,const_gnPageName_Home);
global_Tracker.addManualLink(global_Logo);

var global_accountForgotLink 	= new ManualLink(const_gnForgottenButton, const_gnPageName_Form +const_gnItemDelim+ const_gnForgottenForm);
var global_accountRegisterLink 	= new ManualLink(const_gnRegisterButton, const_gnPageName_Form +const_gnItemDelim+ const_gnRegisterForm);
var global_cartCheckoutLink 	= new ManualLink(const_gnCheckoutButton, const_gnPageName_Form +const_gnItemDelim+ const_gnCheckoutForm);
var global_wishListEmailLink 	= new ManualLink(const_gnSendWishListButton, const_gnPageName_Form +const_gnItemDelim+ const_gnSendWishListForm);

var global_AccountPanel = new Panel(const_gnPanelName_Account,[
					 	  global_accountForgotLink,
						  global_accountRegisterLink 
						  ]);
global_Tracker.addPanel(global_AccountPanel);




var global_CartPanel = new Panel(const_gnPanelName_Cart,[
					 	  global_cartCheckoutLink
						  ]);
global_Tracker.addPanel(global_CartPanel);


var global_WishlistPanel = new Panel(const_gnPanelName_Wishlist);
global_Tracker.addPanel(global_WishlistPanel);			


var global_GWishlistPanel = new Panel(const_gnPanelName_GuestWishlist);
global_Tracker.addPanel(global_GWishlistPanel);		


/* ******************************************************************************************************
 * 'LOGIC' FUNCTIONS ENDS
 * tracking.02.cm.base.src.js
 * 
 *******************************************************************************************************/






/*******************************************************************************************************
 * PUBLIC FORM FUNCTIONS CALLED FROM FLASH
 * tracking.03.cm.forms.src.js 
 *******************************************************************************************************/


/** gnFlashFormPageView
 * 
 * CALLED WHENEVER A FORM 'PAGE' IS DISPLAYED
 * MAY CONTAIN MORE THAN ONE 'FORM' eg the 1st step of checkout contains the sign in & register pages
 * 
 * @param {Object} pageTitle:String
 * @param {Object} pageKey:String
 * @param {Object} formKeys:String - ; delimited list of the 'forms' inside the page
 *******************************************************************************************************/
function gnFlashFormPageView(args) { // 0pageTitle, 1pageKey, 2formKeys
	
	var pageIDString = const_gnPageName_Form + " : " + args[0] + " : " + args[1];
	global_Tracker.setPage(pageIDString);
	
	var cmCat = (args[0] == const_gnPageTitle_Checkout)? const_gnCategoryName_Checkout : const_gnCategoryName_Forms;
	global_Tracker.setCategory(cmCat);
	
	var cmTyp = (args[0] == const_gnPageTitle_Checkout)? const_gnPageType_Checkout : const_gnPageType_Form;
	global_Tracker.setPageType(cmTyp);
	
	global_Tracker.setSKU(const_gnEmptyString);
	global_Tracker.setSearchResults(const_gnEmptyString);
	global_Tracker.setSearchTerm(const_gnEmptyString);
	

	gnPageView();
	
	//var forms = args[2].split(";");
  //  for(i = 0; i < forms.length; i++) {
  //     gnFormImpression(forms[i]);
   // };
};
			
/** gnFlashFormPageViewClose
 * 
 * CALLED WHENEVER THE CLOSE BUTTON IN A FORM 'PAGE' IS CLICKED	
 * 
 * @param {Object} pageTitle:String
 * @param {Object} pageKey:String
 * @param {Object} formKeys:String
 *******************************************************************************************************/
function gnFlashFormPageViewClose(args) { // 0pageTitle, 1pageKey, 2formKeys
	gnPageViewClose();
};
			
/** gnFlashFormButtonClick
 * 
 * @param {Object} formKey:String
 * @param {Object} buttonName:String
 *******************************************************************************************************/
function gnFlashFormButtonClick(args) { // 0 formKey, 1 buttonName
	// throw manualLinkClick
	
	var formName = args[0];
	var buttonName = args[1];

	var nameIsConst = isInArray( new String(buttonName), const_gnClickReadKeys );
	trace("nameIsConst "+nameIsConst);
	
	var formIsOverlay = isInArray( new String(formName), const_gnOverlayFormKeys );
	trace("formIsOverlay "+formIsOverlay);
	
	var currInfo = global_Tracker.getCurrent();
	var linkObj = {};
	
	if (args[0] == const_gnPanelName_Account) {
		
		if (args[1] == const_gnForgottenButton) linkObj = global_accountForgotLink;
		if (args[1] == const_gnRegisterButton) 	linkObj = global_accountRegisterLink;
		
	} else if ( formIsOverlay  &&  nameIsConst ) {
		currObj = getTrackerObj([currInfo.pageType,const_gnPageType_Hygiene]);
		linkObj.link = currObj.page;
		linkObj.name = const_gnElementName_FormButton + const_gnItemDelim +  buttonName;
	};
	
	trace("linkObj.link "+linkObj.link);
	trace("linkObj.name "+linkObj.name);
	
	gnManualLinkClick(linkObj.link,linkObj.name);

};
			
			/** gnFlashFormLinkClick
			 * 
			 * @param {Object} formKey:String
			 * @param {Object} linkName:String
			 *******************************************************************************************************/
			function gnFlashFormLinkClick(formKey, linkName) {
				// throw manualLinkClick?
			};

			/**
			 * 
			 * @param {Object} pageTitle:String
			 * @param {Object} pageKey:String
			 * @param {Object} formKey:String
			 * @param {Object} valid:Boolean
			 *******************************************************************************************************/
			function gnFlashFormComplete(pageTitle, pageKey, formKey, valid) {
				// do nothing
			};
	
	
			/** gnFlashFormFieldFocus
			 * 
			 * @param {Object} formKey:String
			 * @param {Object} fieldName:String
			 * @param {Object} currentValue:String
			 *******************************************************************************************************/
			function gnFlashFormFieldFocus(formKey, fieldName, currentValue) {
				// do nothing
			};
	
			/** gnFlashFormComboFocus
			 * 
			 * @param {Object} formKey:String
			 * @param {Object} comboName:String
			 * @param {Object} currentValue:String
			 *******************************************************************************************************/
			function gnFlashFormComboFocus(formKey, comboName, currentValue) {
				// do nothing
			};
		
			/** gnFlashFormComboChange
			 * 
			 * @param {Object} formKey:String
			 * @param {Object} comboName:String
			 * @param {Object} currentValue:String
			 *******************************************************************************************************/
			function gnFlashFormComboChange(formKey, comboName, currentValue) {
				// do nothing
			};
	
	
			/** gnFlashCheckboxValueToggle
			 * 
			 * @param {Object} formKey:String
			 * @param {Object} checkboxName:String
			 * @param {Object} value:Boolean
			 *******************************************************************************************************/
			function gnFlashCheckboxValueToggle(formKey, checkboxName, value ) {
				// do nothing
			};
		
			/** gnFlashRadioButtonValueChange
			 * 
			 * @param {Object} formKey:String
			 * @param {Object} radiobuttonName:String
			 * @param {Object} value:Boolean
			 *******************************************************************************************************/
			function gnFlashRadioButtonValueChange(formKey, radiobuttonName, value ) {
				// do nothing
			};
		
			/** gnFlashFormItemValidationFail
			 * 
			 * @param {Object} itemType:String
			 * @param {Object} formKey:String
			 * @param {Object} fieldName:String
			 * @param {Object} currentValue:String
			 * @param {Object} validators:String
			 *******************************************************************************************************/
			function gnFlashFormItemValidationFail(itemType, formKey, fieldName, currentValue, validators) {
				// do nothing
			};

/*******************************************************************************************************
 * FORM FUNCTIONS CALLED FROM FLASH ENDS
 * tracking.03.cm.forms.src.js  
 *******************************************************************************************************/







/*******************************************************************************************************
 * PUBLIC GENERAL/MISC CORE METRICS FUNCTIONS CALLED FROM FLASH
 * tracking.04.cm.panels.src.js 
 *******************************************************************************************************/

/** gnFlashLogoClick
 *  called by clicking the logo
 *  create a manualClick to 'homePage' from logo, on the CUI page
 *  
 * 	@param NONE
 *******************************************************************************************************/
function gnFlashLogoClick() {
	gnManualLinkClick(const_gnPageName_Home, const_gnConstantItem_Logo);
};

/*******************************************************************************************************
 * GENERAL/MISC CORE METRICS FUNCTIONS CALLED FROM FLASH ENDS
 * tracking.04.cm.panels.src.js  
 *******************************************************************************************************/






/******************************************************************************************************
 * PUBLIC SHOPPING CART PANEL  FUNCTIONS
 * tracking.04.cm.panels.src.js
 *******************************************************************************************************/

/** gnFlashCartPanelView
 * 
 *  called by the cartPanel, whenever it is displayed
 *  throw a manualImpression via gnPanelImpression, then process the cartDetails
 *  
 * 	@param strListOfItemsInCart:String - double delimited list:
 *          comma separated on cart items
 *          semicolon separated on item info
 *          "SKU123;product name;qty;unit price;categoryid,SKU124;product name 2;qty;unit price;categoryid"
 *******************************************************************************************************/
function gnFlashCartPanelView(args) { // strListOfItemsInCart
	global_Tracker.setCurrentPanel(const_gnPanelName_Cart);
	if (args[0]) gnProcessCartItems(args[0]);
};


/**	gnFlashCartPanelTabClick
 * 
 * 	called by clicking the UI tab
 * 	@param NONE
 *******************************************************************************************************/
function gnFlashCartPanelTabClick() {
	// gnManualLinkClick(const_gnPanelName_Cart, const_gnPanelTab_Cart);
	/* as not a nav process, don't need to do anything */
};

/**	gnFlashCartPanelTabView
 * 
 * 	called by the UI tab
 * 	@param NONE
 *******************************************************************************************************/
function gnFlashCartPanelTabView() {
	/* as not a nav process, don't need to do anything */
};


		/** gnFlashCartPanelShippingComboFocus
		 * 
		 * called when someone clicks on, or focuses the combo box in the cart panel
		 * @param currentCountryName:String
		 *******************************************************************************************************/
		function gnFlashCartPanelShippingComboFocus(currentCountryName) {
			// for now, do nothing - route through normal forms?
		};


		/**	gnFlashCartPanelShippingComboChange
		 * 
		 * 	@param countryName:String
		 *******************************************************************************************************/
		function gnFlashCartPanelShippingComboChange(countryName) {
			// for now, do nothing - route through normal forms?
		};


/**	gnFlashCartPanelCheckoutClick
 * 
 * throw a manualClick, formView will handle pageView
 * think important to pull from normal form handling
 * 
 * 	@param NONE
 *******************************************************************************************************/
function gnFlashCartPanelCheckOutClick() {
	gnManualLinkClick(const_gnCheckoutForm, const_gnCheckoutButton);
};



/**	gnFlashCartItemAdded
 * 
 * called when a new item is added to the cart
 * process item - throws a shop5 + a display
 * !!!!!! could have passed the full cart? or called another page impression?
 * 
 * @param itemDetails:String
 * @param cartDetails:String
 *******************************************************************************************************/
function gnFlashCartItemAdded(args) { // 0itemDetails, 1cartDetails){
	// not going to call this one, as quantity change gets called anyway, and until server round trip we don't know inc tax prices etc
	// if (args[1]) gnProcessCartItems(args[1]);
};


/**	gnFlashCartItemQuantityChangegnFlashCartItemQuantityChange
 * 
 * @param itemDetails:String
 * @param cartDetails:String
 *******************************************************************************************************/
function gnFlashCartItemQuantityChange(args) { // 0 item details, 1 cart details
	if (args[1]) {
		if (global_Tracker.getCurrent().pageType != const_gnPageType_Checkout) {
			gnProcessCartItems(args[1]);
		} else if (const_gnReportConfirmCart) {
			gnProcessCartItems(args[1]);
		}
	};
};


/**	gnFlashCartItemRemoveClick
 * 
 * @param itemDetails:String
 * @param cartDetails:String
 *******************************************************************************************************/
function gnFlashCartItemRemoveClick(args) { // 0 item details, 1 cart details
	// if (args[1]) gnProcessCartItems(args[1]);
};

/******************************************************************************************************
 * SHOPPING CART PANEL  FUNCTIONS ENDS
 * tracking.04.cm.panels.src.js
 *******************************************************************************************************/





/******************************************************************************************************
 * PUBLIC ACCOUNT PANEL FUNCTIONS
 * tracking.04.cm.panels.src.js
 * The contained forms activity is routed through the form functions
 *******************************************************************************************************/

/** gnFlashAccountPanelView
 * 
 * called whenever account panel displayed
 * 
 * @param userLoggedIn:Boolean
 *******************************************************************************************************/
function gnFlashAccountPanelView() { // userLoggedIn
	global_Tracker.setCurrentPanel(const_gnPanelName_Account);
};

/** gnFlashAccountPanelTabClick
 * 
 * @param NONE
 *******************************************************************************************************/
function gnFlashAccountPanelTabClick() {
	/* as not a nav process, don't need to do anything */
};

/** gnFlashAccountPanelTabClick
 * 
 * @param NONE
 *******************************************************************************************************/
function gnFlashAccountPanelTabView() {
	/* as not a nav process, don't need to do anything */
};

/******************************************************************************************************
 * ACCOUNT PANEL FUNCTIONS ENDS
 * tracking.04.cm.panels.src.js
 *******************************************************************************************************/





/******************************************************************************************************
 * PUBLIC WISHLIST/GUESTWISHLIST PANEL FUNCTIONS
 * tracking.04.cm.panels.src.js
 * The contained forms activity is routed through the form functions
 *******************************************************************************************************/

/** gnFlashWishlistPanelView
 * 
 * @param  wishlistDetails:String
 *******************************************************************************************************/
function gnFlashWishlistPanelView(args) { // wishlistDetails
	global_Tracker.setCurrentPanel(const_gnPanelName_Wishlist);
};

/** gnFlashWishlistPanelTabClick
 * 
 *******************************************************************************************************/
function gnFlashWishlistPanelTabClick() {
	//gnManualLinkClick(const_gnPanelName_Wishlist, const_gnPanelTab_Wishlist);
};

/** gnFlashWishlistPanelTabView
 * 
 *******************************************************************************************************/
function gnFlashWishlistPanelTabView() {

};

		/** gnFlashWishlistItemAdded
		 * 
		 * @param  itemDetails:String
		 * @param  wishlistDetails:String
		 *******************************************************************************************************/
		function gnFlashWishlistItemAdded(itemDetails, wishlistDetails) {
			// throw a manualImpression or a cmCreateConversionEventTag?
		};

/** gnFlashWishlistItemAddToCartClick
 * 
 * throw a manual click - pass cart as destination, SKU for src item, cat is wishlist
 * 
 * @param  itemDetails:String
 *******************************************************************************************************/
function gnFlashWishlistItemAddToCartClick(args) { // 0itemDetails
	/* as not a nav process no link click thrown */
};

			/** gnFlashWishlistItemRemoveClick
			 * 
			 * @param  itemDetails:String
			 * @param  wishlistDetails:String
			 *******************************************************************************************************/
			function gnFlashWishlistItemRemoveClick(itemDetails, wishlistDetails) {
				// do nothing
			};
			
			/** gnFlashWishlistItemStockReminderToggle
			 * 
			 * @param  itemDetails:String
			 * @param  remind:Boolean
			 *******************************************************************************************************/
			function gnFlashWishlistItemStockReminderToggle(itemDetails, remind) {
				// do nothing
			};
			
			/** gnFlashWishlistEmailClicked
			 * 
			 * @param  wishlistDetails:String
			 * @param  wishlistID:Number
			 * @param  recipientEmail:String
			 *******************************************************************************************************/
			function gnFlashWishlistEmailClicked(wishlistDetails, wishlistID, recipientEmail) {
				// do nothing
			};



/** gnFlashGuestWishlistPanelView
 * 
 * @param  wishlistDetails:String
 * @param  wishlistID:Number
 *******************************************************************************************************/
function gnFlashGuestWishlistPanelView(args) { // 0wishlistDetails, 1wishlistID
	global_Tracker.setCurrentPanel(const_gnPanelName_GuestWishlist);
};

/** gnFlashGuestWishlistPanelTabClick
 * 
 *******************************************************************************************************/
function gnFlashGuestWishlistPanelTabClick(){
	//gnManualLinkClick(const_gnPanelName_GuestWishlist, const_gnPanelTab_GuestWishlist);
};

/** gnFlashGuestWishlistPanelTabView
 * 
 *******************************************************************************************************/
function gnFlashGuestWishlistPanelTabView(){
	
};

/** gnFlashGuestWishlistItemAddToCartClick
 * 
 * throw a manual click - pass cart as destination, concat wishlist & SKU for src item, cat is guestwishlist
 * 
 * @param  itemDetails:String
 *******************************************************************************************************/
function gnFlashGuestWishlistItemAddToCartClick(args) { // 0itemDetails
	//var sItm = new shopItem(args[0]);
	//gnManualLinkClick(const_gnPanelName_Cart, const_gnElementName_guestWishListItem + " : " + sItm.prodID);
	/* as not a nav process, no lick click */
};

/******************************************************************************************************
 * WISHLIST/GUESTWISHLIST PANEL FUNCTIONS ENDS
 * tracking.04.cm.panels.src.js
 *******************************************************************************************************/





/******************************************************************************************************
 * PUBLIC MENU FUNCTIONS
 * tracking.05.cm.menus.src.js
 *******************************************************************************************************/

/** gnFlashMenuPanelView
 * 
 * Called when a new menu panel shown - currently we only have one 'shop' menu panel, but there is support for multiple
 * throw a manualImpression
 * 
 * @param  shopMenuPanelName
 * @param  coremetricsCategory
 *******************************************************************************************************/
function gnFlashMenuPanelView(args) { // 0shopMenuPanelName, 1coremetricsCategory) {
	//gnPanelImpression( const_gnPanelName_Menu + " : " +args[0] );
};

/** gnFlashMenuPanelTabClick
 * 
 * Called by clicking the tab on a menu panel
 * throw a manualLinkClick
 * 
 * @param  shopMenuPanelName
 * @param  coremetricsCategory
 *******************************************************************************************************/
function gnFlashMenuPanelTabClick(args) { // 0shopMenuPanelName, 1coremetricsCategory) 
	/* not a nav process */
};


/** gnFlashFeatureMenuView
* 
*  
* 
* @param  menuName
* @param  coremetricsCategory
*******************************************************************************************************/
function gnFlashFeatureMenuView(args) { // 0 menuName, 1 category, 2 itemsArray
	// create ManualLinks for all the menu Items and add to the trackers manual links
 	var menuItems = createMenuItems(args[2]);
	gnProcessMenuItems(menuItems);
};

/** gnFlashHygieneMenuView
* 
* @param  menuName
* @param  coremetricsCategory
*******************************************************************************************************/
function gnFlashHygieneMenuView(args) { // 0 menuName, 1 category, 2 itemsArray
	var menuItems = createMenuItems(args[2]);
	gnProcessMenuItems(menuItems);
};

/** gnFlashMenuAccordianView
* 
* Called when a menu accordian opened - ie OTS SS08, Other Brands SS08 etc
*  
* 
* @param  menuName
* @param  coremetricsCategory
*******************************************************************************************************/
function gnFlashMenuAccordionView(args) { // 0 menuName, 1 category, 2 itemsArray
	var menuItems = createMenuItems(args[2]);
	gnProcessMenuItems(menuItems);
	
};


/** gnFlashMenuAccordianTabClick
* 
* @param  menuName
* @param  coremetricsCategory
*******************************************************************************************************/
function gnFlashMenuAccordionTabClick(args) { // 0menuName, 1coremetricsCategory) {
	global_Tracker.clearShopLinks();
};

/** gnFlashMenuItemClick
 * 
 * Called when a menu item is clicked
 * throw manualLickClick
 * 
 * @param  pagekey
 * @param  menuName
 * @param  menuType
 * @param  coremetricsCategory
 *******************************************************************************************************/
function gnFlashMenuItemClick(args) { // 0 pagekey, 1 menuName, 2 menuType, 3 coremetricsCategory, 4 parentMenuName
	
	var mItm = new MenuItem(args);
	
	var pageName=formatMenuLink(mItm);
	var menuItemName=formatMenuName(mItm);
	
	gnManualLinkClick(pageName, menuItemName);
};

/** gnFlashExternalMenuItemClick
 * 
 * Called when a menu item, which links to an external URL, is clicked
 * throw manualLickClick
 * 
 * @param  URL
 * @param  menuName
 * @param  menuType
 * @param  coremetricsCategory
 *******************************************************************************************************/
function gnFlashExternalMenuItemClick(args) { // URL, menuName, menuType, coremetricsCategory
	var mItm = new MenuItem(args);
	
	var pageName=formatMenuLink(mItm);
	var menuItemName=formatMenuName(mItm);
	
	gnManualLinkClick(pageName, menuItemName);
};

/** gnFlashCheckoutMenuView
 * 
 * Called when the checkout menu replaces the cart/account/wishlist panel group
 * !!!!!!! decided to throw this as a panelImpression, as currently it replaces the 'user' panel
 *******************************************************************************************************/
function gnFlashCheckoutMenuView() {
	//gnPanelImpression( const_gnMenuName_Checkout, const_gnCategoryName_Checkout );
};

			/** gnFlashCheckoutMenuItemClick
			 * 
			 * @param  pagekey
			 *******************************************************************************************************/
			function gnFlashCheckoutMenuItemClick(pagekey) {
				// not being called - routed through the normal click as the same MenuItemView used for all menuItems
			};

			/** gnFlashSearchPanelView
			 * 
			 *******************************************************************************************************/
			function gnFlashSearchPanelView() {
				// not implimented 
			};
			
/******************************************************************************************************
 * MENU FUNCTIONS ENDS
 * tracking.05.cm.menus.src.js
 *******************************************************************************************************/





/******************************************************************************************************
 * PUBLIC HOME/INTRO FUNCTIONS
 * tracking.06.cm.home.src.js
 *******************************************************************************************************/

/** gnFlashHomeView
 * 
 * Called whenever the 'homepage' is displayed
 * Throw pageView
 *******************************************************************************************************/
function gnFlashHomeView() {
	global_Tracker.setPage(const_gnPageName_Home);
	global_Tracker.setCategory(const_gnCategoryName_Home);
	global_Tracker.setPageType(const_gnPageType_Home);
	
	global_Tracker.setSKU(const_gnEmptyString);
	global_Tracker.setSearchResults(const_gnEmptyString);
	global_Tracker.setSearchTerm(const_gnEmptyString);
	
	global_Tracker.clearSubLinks();
	
	gnPageView();
};

/** gnFlashIntroPanelView
 * 
 * Called whenever a new 'intro panel' (the main homepage image) is diplayed
 * Throw a manual Impression
 * 
 * @param  panelName
 *******************************************************************************************************/
function gnFlashIntroPanelView(args) { // panelName
	gnManualImpression(const_gnElementName_homePanel,const_gnNoLink);
};

/** gnFlashIntroPanelToProductClick
 * 
 * @param  SKU:String
 * @param  productName:String
 *******************************************************************************************************/
function gnFlashIntroPanelToProductClick(args) { // 0 SKU, 1 productName)
	gnManualLinkClick( const_gnPageName_Product + const_gnItemDelim + formatSKU(args[0]) , const_gnCategoryName_HomeIntro);
};

/** gnFlashIntroPanelClick
 * 
 * @param  pageKey:String
 *******************************************************************************************************/
function gnFlashIntroPanelClick(args) { // 0 pageKey) {
	gnManualLinkClick( args[0], const_gnElementName_homePanel );
};

			/** gnFlashIntroKitView
			 * 
			 * Called when new intro kit item displayed 
			 * !!!!! not implimented
			 * 
			 * @param  SKU:String
			 * @param  productName:String
			 *******************************************************************************************************/
			function gnFlashIntroKitView(SKU, productName) {
				// currently do nothing
			};

/** gnFlashIntroKitClick
 * 
 * @param  SKU:String
 * @param  productName:String
 *******************************************************************************************************/
function gnFlashIntroKitClick(args) { // SKU, productName
	gnManualLinkClick(const_gnPageName_Product + const_gnItemDelim + formatSKU(args[0]), const_gnElementName_homeKit + const_gnItemDelim + formatSKU(args[0]) );
};

			/** gnFlashIntroBannerView
			 * 
			 * Called whenever a new banner is displayed
			 * !!!!!!! not implimented
			 * 
			 * @param  pageKey:String
			 *******************************************************************************************************/
			function gnFlashIntroBannerView(pageKey) {
				// currently do nothing
			};

/** gnFlashIntroBannerClick
 * 
 * @param  pageKey:String
 *******************************************************************************************************/
function gnFlashIntroBannerClick(args) { // 0pageKey
	gnManualLinkClick(const_gnPageName_ProductList + const_gnItemDelim + args[1],const_gnCategoryName_HomeBanner);
};

/** gnFlashIntroBannerClick
 * 
 * @param  pageKey:String
 *******************************************************************************************************/
function gnFlashIntroRssNewsClick(args) { // 0title 1url
	gnManualLinkClick(args[1]);
};

/** gnFlashIntroBannerClick
 * 
 * @param  pageKey:String
 *******************************************************************************************************/
function gnFlashIntroRssNewsPageView(args) { // 0title 1url
	gnCreatePageviewTag(args[1],const_gnCategoryName_Blog);
};

				/** gnFlashIntroNewsView
				 * 
				 * Called with each news item loaded on the homepage
				 * !!!!!!! not implimented
				 * 
				 * @param  newsTitle:String
				 * @param  newsCategory:String
				 * @param  newsID:Number
				 *******************************************************************************************************/
				function gnFlashIntroNewsView(newsTitle, newsCategory, newsIDs) {
					// currently do nothing
				};

/** gnFlashIntroCatalogueRequestClick
 * 
 *******************************************************************************************************/
function gnFlashIntroCatalogueRequestClick() {
	gnManualLinkClick(const_gnPageName_CatalogueRequest,const_gnElementName_homeCatalogue);
};

/******************************************************************************************************
* HOME/INTRO FUNCTIONS ENDS
* tracking.06.cm.home.src.js
*******************************************************************************************************/







/******************************************************************************************************
* PUBLIC SHOP FUNCTIONS
* tracking.07.cm.shop.src.js
*******************************************************************************************************/


/** gnFlashProductListFromSearchView
 * 
 * @param  searchTerms:String
 * @param  productDetails:String
 *******************************************************************************************************/
function gnFlashProductListFromSearchView(args) { // 0searchTerms, 1productDetails) {
	
	var productsArray = createShopItems(args[1]);
	var pageIDString = (productsArray.length>0)? const_gnPageName_ProductList + " : Successful Search" : const_gnPageName_ProductList +" : Unsuccessful Search";
	
	global_Tracker.setPage(pageIDString);
	global_Tracker.setCategory(const_gnCategoryName_Search);
	
	global_Tracker.setSKU(const_gnEmptyString);
	
	global_Tracker.setPageType(const_gnPageType_ProductList);
	
	global_Tracker.setSearchResults(productsArray.length);
	global_Tracker.setSearchTerm(args[0]);
	
	global_Tracker.clearSubLinks();
	
	
	gnSearchPageView();
	
	delete productsArray;
};

/** gnFlashProductListView
 * 
 * @param  pageName:String
 * @param  coremetricsCategory:String
 * @param  productDetails:String
 *******************************************************************************************************/
function gnFlashProductListView(args) { // 0pageName, 1coremetricsCategory, 2productDetails
	
	var pageIDString = const_gnPageName_ProductList + " : " + args[0];
	global_Tracker.setPage(pageIDString);
	
	var categoryIDString = (args[1])? args[1] : global_Tracker.getCurrent().category;
	global_Tracker.setCategory(args[1]);
	
	global_Tracker.setPageType(const_gnPageType_ProductList);
	
	global_Tracker.setSKU(const_gnEmptyString);
	global_Tracker.setSearchResults(const_gnEmptyString);
	global_Tracker.setSearchTerm(const_gnEmptyString);
	
	global_Tracker.clearSubLinks();
	
	gnPageView();
};


/** gnFlashProductListViewClose
 * 
 * Called when close button clicked on product list view - can only go home
 * 
 * @param  pageName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashProductListViewClose(args) { // 0pageName, 1coremetricsCategory
	gnPageViewClose();
};
			
			/** gnFlashProductListViewChange
			 * 
			 * @param  viewType:String
			 *******************************************************************************************************/
			function gnFlashProductListViewChange(viewType) {
				// need a manual Click
			};
			
			/** gnFlashProductListImageVarView
			 * 
			 * @param  SKU:String
			 * @param  pageName:String
			 * @param  coremetricsCategory:String
			 *******************************************************************************************************/
			function gnFlashProductListImageVarView(SKU, pageName, coremetricsCategory) {
				// need a manual Impression
			};


/** gnFlashProductListImageVarSelect
 * 
 * Called when an a Product is selected (clicked on) in the List page
 * 
 * @param  SKU:String
 * @param  pageName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashProductListImageVarSelect(args) { // 0 SKU, 1 pageName, 2 coremetricsCategory
	gnManualLinkClick( const_gnPageName_Product + const_gnItemDelim + formatSKU(args[0]), const_gnElementName_ProductListItem + const_gnItemDelim + formatSKU(args[0]));
};




/** gnFlashProductView
 * 
 * @param  SKU:String
 * @param  productName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashProductView(args) { // 0SKU, 1productName, 2coremetricsCategory) {

	global_Tracker.setPage(const_gnPageName_Product + " : " + formatSKU(args[0]) );
	
	var categoryIDString = (args[2])? args[2] : global_Tracker.getCurrent().category;
	global_Tracker.setCategory(categoryIDString);
	
	global_Tracker.setSKU( formatSKU(args[0]) );
	
	global_Tracker.setPageType(const_gnPageType_Product);
	
	global_Tracker.setSearchResults(const_gnEmptyString);
	global_Tracker.setSearchTerm(const_gnEmptyString);
	
	global_Tracker.clearSubLinks();
	
	gnCreateProductviewTag(formatSKU(args[0]), args[1], global_Tracker.getCurrent().category);
	gnPageImpressions();
};

/** gnFlashProductViewClose
 * 
 * Called when the close button on a product view clicked
 * can go back to product list, brochure, home (if direct link, or from home kit) (or news - for the moment)
 * 
 * @param  SKU:String
 * @param  productName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashProductViewClose(args) { // 0SKU, 1productName, 2coremetricsCategory) {
	gnPageViewClose();
};

		/** gnFlashProductComboFocus
		 * 
		 * @param  currentSKU:String
		 * @param  productName:String
		 * @param  coremetricsCategory:String
		 *******************************************************************************************************/
		function gnFlashProductComboFocus(currentSKU, productName, coremetricsCategory) {
			// not implimented
		};

/** gnFlashProductComboChange
 * 
 * Called when the value on the Product Combo box changes - results in a change to a different colourway
 * 
 * @param  newSKU:String
 * @param  newProductName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashProductComboChange(args) { // 0newSKU, 1newProductName, 2coremetricsCategory
	var currInfo = global_Tracker.getCurrent(); // grab current page info from the global
	gnManualLinkClick(const_gnPageName_Product + const_gnItemDelim + formatSKU(args[0]), const_gnElementName_ProductCombo);
};

/** gnFlashProductAddToCartClick
 * 
 * @param  SKU:String
 * @param  productName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashProductAddToCartClick(args) { // 0SKU, 1productName, 2coremetricsCategory
	// var cmCat = (args[2])? args[2] : global_Tracker.getCurrent().category;
	// gnManualLinkClick(const_gnPanelName_Cart, const_gnElementName_Product + const_gnItemDelim + formatSKU(args[0]));
	/* as this is a 'background' process rather than a nav one, it doesn't need to call a linkClick */
};

/** gnFlashProductAddToWishlistClick
 * 
 * @param  SKU:String
 * @param  productName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashProductAddToWishlistClick(args) { // 0SKU, 1productName, 2coremetricsCategory
	// gnManualLinkClick( const_gnPanelName_Wishlist, const_gnElementName_ProductListItem + const_gnItemDelim + formatSKU(args[0]) );
	/* as this is a 'background' process rather than a nav one, it doesn't need to call a linkClick */
};

/** gnFlashProductInfoToggle
 * 
 * @param  display:Boolean
 * @param  SKU:String
 * @param  productName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashProductInfoToggle(args) { // 0 display, 1 SKU, 2 productName, 3 coremetricsCategory
	//if (args[0]) {
	//	gnManualImpression(const_gnElementName_MoreInfo, const_gnNoLink);
	//};
	/* as this is isn't a nav process it doesn't need to call a linkClick */
};

				/** gnFlashProductZoomClick
				 * 
				 * @param  zoomImageSRC:String
				 * @param  SKU:String
				 * @param  productName:String
				 * @param  coremetricsCategory:String
				 *******************************************************************************************************/
				function gnFlashProductZoomClick(zoomImageSRC, SKU, productName, coremetricsCategory) {
					// not implimented
				};

				/** gnFlashProductZoomPanelTabClick
				 * 
				 * @param  panelDisplay:Boolean
				 *******************************************************************************************************/
				function gnFlashProductZoomPanelTabClick(panelDisplay) {
					// not implimented
				};

/** gnFlashRelatedProductClick
 * 
 * @param  newSKU:String
 * @param  newProductName:String
 * @param  coremetricsCategory:String
 *******************************************************************************************************/
function gnFlashRelatedProductClick(args) { // 0 newSKU, 1 newProductName, 2 coremetricsCategory
	gnManualLinkClick(const_gnPageName_Product + const_gnItemDelim + formatSKU(args[0]), const_gnElementName_RelatedProduct + const_gnItemDelim + formatSKU(args[0]));
};

/******************************************************************************************************
* PUBLIC SHOP FUNCTIONS
* tracking.07.cm.shop.src.js
*******************************************************************************************************/




/******************************************************************************************************
* PUBLIC ZOOM FUNCTIONS
* tracking.08.zoom.src.js
*******************************************************************************************************/


				/** gnFlashZoomInClick
				 * 
				 * @param  pageID:String
				 *******************************************************************************************************/
				function gnFlashZoomInClick(pageID) {
					// not implimented
				};
				
				/** gnFlashZoomOutClick
				 * 
				 * @param  pageID:String
				 *******************************************************************************************************/
				function gnFlashZoomOutClick(pageID) {
					// not implimented
				};
				
				/** gnFlashZoomImageView
				 * 
				 * @param  pageID:String
				 * @param  zoomImageSRC:String
				 * @param  SKU:String
				 * @param  productName:String
				 * @param  coremetricsCategory:String
				 *******************************************************************************************************/
				function gnFlashZoomImageView(pageID, zoomImageSRC, SKU, productName, coremetricsCategory) {
					// not implimented
				};
				
				/** gnFlashZoomImageClick
				 * 
				 * @param  pageID:String
				 * @param  zoomImageSRC:String
				 * @param  zoompercent:Number
				 *******************************************************************************************************/
				function gnFlashZoomImageClick(pageID, zoomImageSRC, zoompercent) {
					// not implimented
				};
				
				/** gnFlashZoomImageChange
				 * 
				 * @param  pageID:String
				 * @param  zoomImageSRC:String
				 * @param  zoompercent:Number
				 *******************************************************************************************************/
				function gnFlashZoomImageChange(pageID, zoomImageSRC, zoompercent) {
					// not implimented
				};
				
				/** gnFlashZoomImagePan
				 * 
				 * @param  pageID:String
				 * @param  zoomImageSRC:String
				 * @param  zoompercent:Number
				 *******************************************************************************************************/
				function gnFlashZoomImagePan(pageID, zoomImageSRC, zoompercent) {
					// not implimented
				};
				
/******************************************************************************************************
* PUBLIC ZOOM FUNCTIONS
* tracking.08.zoom.src.js
*******************************************************************************************************/



/******************************************************************************************************
* PUBLIC CATALOGUE FUNCTIONS
* tracking.09.cm.catalogue.src.js
*******************************************************************************************************/

/** gnFlashCatalogueView
 * 
 * Called when a new catalogue view (ie knitwear) is displayed
 * 
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashCatalogueView(args) { // 0pageName, 1coremetricsCategory
	
	var pageIDString = const_gnPageName_Catalogue + " : " + args[0];
	global_Tracker.setPage(pageIDString);
	
	var categoryIDString = (args[1])? args[1] : global_Tracker.getCurrent().category;
	global_Tracker.setCategory(args[1]);

	global_Tracker.setPageType(const_gnPageType_Catalogue);
	
	global_Tracker.setSKU(const_gnEmptyString);
	global_Tracker.setSearchResults(const_gnEmptyString);
	global_Tracker.setSearchTerm(const_gnEmptyString);
	
	global_Tracker.clearSubLinks();
	
	gnPageView();
};


/** gnFlashCatalogueViewClose
 * 
 * Called when catalogue closes, can only return to homepage
 * 
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashCataloguePageViewClose(args) { // pageName, coremetricsCategory
	gnPageViewClose();
};

				
				/** gnFlashCatalogueInfoToggle
				 * 
				 * @param  display:Boolean
				 * @param  currentItem:String
				 * @param  productName:String
				 * @param  coremetricsCategory:String
				 */
				function gnFlashCatalogueInfoToggle(args) { // 0 display, 1 currentItem, 2 productName, 3 coremetricsCategory 
					
				};

/** gnFlashCatalogueImageView
 * 
 * Called 'on display' of a new catalogue image - ie when the page 1st loads, then whenever a scroll causes a new image
 * 
 * @param  productName:String
 * @param  coremetricsCategory:String
 */
function gnFlashCatalogueImageView(args) { // 0productName, 1coremetricsCategory
	var imgName = const_gnElementName_CatalogueImage +" : "+ args[0];
	gnManualImpression( imgName, const_gnNoLink );
};

				/** gnFlashCatalogueImageVarView
				 * 
				 * Called 'on display' for each of the products alongside a catalogue image
				 * 
				 * @param  SKU:string
				 * @param  pageName:String
				 * @param  coremetricsCategory:String
				 */
				function gnFlashCatalogueImageVarView(args) { // 0SKU, 1imgName, 2coremetricsCategory)
					//var imgName = const_gnElementName_CatalogueImageProduct +" : "+ formatSKU(args[0]);
					//gnCreateManualImpressionTag(global_Tracker.getCurrent().page, null, imgName);
				};

/** gnFlashCatalogueImageVarSelect
 * 
 * Called when a product (imageVar) is selected from the items alongside a catalogue image
 * 
 * @param  SKU:string
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashCatalogueImageVarSelect(args) { // 0SKU, 1pageName, 2coremetricsCategory
	gnManualLinkClick(const_gnPageName_Product + const_gnItemDelim + formatSKU(args[0]), const_gnElementName_CatalogueImageProduct + const_gnItemDelim + formatSKU(args[0]))
};

/******************************************************************************************************
* PUBLIC CATALOGUE FUNCTIONS
* tracking.09.cm.catalogue.src.js
*******************************************************************************************************/





/******************************************************************************************************
* PUBLIC FEATURE & HYGIENE FUNCTIONS
* tracking.10.cm.feature.src.js
*******************************************************************************************************/

/** gnFlashFeatureView
 * 
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashFeatureView(args) { // 0pageName, 1coremetricsCategory
	
	var pageIDString = const_gnPageName_Feature + const_gnItemDelim + args[0];
	global_Tracker.setPage(pageIDString);
	
	var categoryIDString = (args[1])? args[1] : global_Tracker.getCurrent().category;
	global_Tracker.setCategory(categoryIDString);

	global_Tracker.setPageType(const_gnPageType_Feature);
	
	global_Tracker.setSKU(const_gnEmptyString);
	global_Tracker.setSearchResults(const_gnEmptyString);
	global_Tracker.setSearchTerm(const_gnEmptyString);
	
	global_Tracker.clearSubLinks();
	
	var currInfo = global_Tracker.getCurrent();
	timeReleasePageView(currInfo); // do as time release incase section supercedes
};

/** gnFlashFeatureViewClose
 * 
 * Called by pressing close btn on the feature page - can only go to home
 * 
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashFeatureViewClose(args) { // 0pageName, 1coremetricsCategory
	gnPageViewClose();
};

/** gnFlashHygieneView
 * 
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashHygieneView(args) { // 0pageName, 1coremetricsCategory

	var pageIDString = const_gnPageName_Hygiene + const_gnItemDelim + args[0];
	global_Tracker.setPage(pageIDString);
	
	var categoryIDString = (args[1])? args[1] : global_Tracker.getCurrent().category;
	global_Tracker.setCategory(categoryIDString);
	
	global_Tracker.setPageType(const_gnPageType_Hygiene);
	
	global_Tracker.setSKU(const_gnEmptyString);
	global_Tracker.setSearchResults(const_gnEmptyString);
	global_Tracker.setSearchTerm(const_gnEmptyString);
	
	global_Tracker.clearSubLinks();
	
	var currInfo = global_Tracker.getCurrent();
	timeReleasePageView(currInfo); // do as time release incase section supercedes

};

/** gnFlashHygieneViewClose
 * 
 * Called by pressing close btn on a hygiene page - will go to previous page, so grab from tracker Obj
 * 
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashHygieneViewClose(args) { // 0pageName, 1coremetricsCategory
	gnPageViewClose();
};

/** gnFlashSectionView
 * 
 * @param  sectionName:String
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashSectionView(args) { // 0sectionName, 1pageName, 2coremetricsCategory -- category will be wrong for hygiene items

	if (const_gnTrackFeatureHygieneSections) {
		var currInfo = global_Tracker.getCurrent();
	
		var sectionPageName = (currInfo.pageType == const_gnPageType_Feature)? const_gnPageName_Feature : const_gnPageName_Hygiene;
		sectionPageName += const_gnItemDelim + args[0];
		if (args[1]) sectionPageName += const_gnItemDelim + args[1];

		global_Tracker.setPage(sectionPageName);
			
		global_Tracker.setCategory(currInfo.category);
		global_Tracker.setPageType(currInfo.pageType);
			
		global_Tracker.setSKU(const_gnEmptyString);
		global_Tracker.setSearchResults(const_gnEmptyString);
		global_Tracker.setSearchTerm(const_gnEmptyString);
			
		gnPageView();
	};
};

/** gnFlashSectionImageView
 * 
 * @param  imageSRC:String
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashSectionImageView(args) { // 0imageSRC, 1pageName, 2coremetricsCategory

};

/** gnFlashSectionMenuView
 * 
 * @param  imageSRC:String
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashSectionMenuView(args) { // 0pagename, 1sectionName, 2coremetricsCategory

	var currInfo = global_Tracker.getCurrent();
	var sectionMenuName = (currInfo.pageType == const_gnPageType_Feature)? const_gnMenuItemName_FeatureSub : const_gnMenuItemName_HygieneSub;
	
	var sectionPageName = (currInfo.pageType == const_gnPageType_Feature)? const_gnPageName_Feature : const_gnPageName_Hygiene;
		sectionPageName += const_gnItemDelim + args[0];
		if (args[1]) sectionPageName += const_gnItemDelim + args[1];
	
	var subLink = new ManualLink(sectionMenuName, sectionPageName);
	global_Tracker.addSubLink(subLink);

	// don't call now, section will cause pageView immediately after
};

/** gnFlashSectionMenuClick
 * 
 * Called by clicking an 'in page' menu
 * 
 * @param  sectionName:String
 * @param  pageName:String
 * @param  coremetricsCategory:String
 */
function gnFlashSectionMenuClick(args) { // 0sectionName, 1pageName, 2coremetricsCategory

	var currInfo = global_Tracker.getCurrent();
	var sectionMenuName = (currInfo.pageType == const_gnPageType_Feature)? const_gnMenuItemName_FeatureSub : const_gnMenuItemName_HygieneSub;
	
	var sectionPageName = (currInfo.pageType == const_gnPageType_Feature)? const_gnPageName_Feature : const_gnPageName_Hygiene;
		sectionPageName += const_gnItemDelim + args[0];
		if (args[1]) sectionPageName += const_gnItemDelim + args[1];

	gnManualLinkClick(sectionPageName, sectionMenuName);

};

/******************************************************************************************************
* PUBLIC FEATURE & HYGIENE FUNCTIONS
* tracking.10.cm.feature.src.js
*******************************************************************************************************/



/******************************************************************************************************
* PUBLIC MISC FUNCTIONS
* tracking.11.cm.misc.src.js
*******************************************************************************************************/

			/** gnFlashScrollbarScroll
			 * 
			 * @param  pageID:String
			 * @param  endPercentage:Number
			 */
			function gnFlashScrollbarScroll(pageID, endPercentage) {
				// not implimented	
			};
			
			/** gnFlashScrollPreviousClick
			 * 
			 * @param  pageID:String
			 */
			function gnFlashScrollPreviousClick(pageID) {
				// not implimented
			};
			
			/** gnFlashScrollNextClick
			 * 
			 * @param  pageID:String
			 */
			function gnFlashScrollNextClick(pageID) {
				// not implimented
			};



/** gnFlashRegistrationComplete
 * 
 * @param  custID:String
 * @param  custEmail:String
 * @param  custCity:String
 * @param  custState:String
 * @param  custZip:String
 * @param  newsSubscribed:Boolean
 */
function gnFlashRegistrationComplete(args) { // 0custID, 1custEmail, 2custCity, 3custState, 4custZip, 5newsSubscribed
	gnLogin();
	gnCreateRegistrationTag(args[0], args[1], args[2], args[3], args[4], const_gnNewsletterName, args[5]);
};
 
/** gnFlashLoginSuccess
 * 
 * @param  custID:String
 * @param  custEmail:String
 * @param  custCity:String
 * @param  custState:String
 * @param  custZip:String
 * @param  newsSubscribed:Boolean
 */
function gnFlashLoginSuccess(args) { // 0custID, 1custEmail, 2custCity, 3custState, 4custZip, 5newsSubscribed
	gnLogin();
	gnCreateRegistrationTag(args[0], args[1], args[2], args[3], args[4], const_gnNewsletterName, args[5]);
};

/** gnFlashLoginFail
 * 
 */
function gnFlashLoginFail() {
	// for now do nothing
};

/** gnFlashOrderComplete
 * 
 * @param  success:Boolean
 * @param  orderID:String
 * @param  custID:String
 * @param  orderSubTotal:String
 * @param  orderShipping:String
 * @param  custCity:String
 * @param  custState:String
 * @param  custZip:String
 * @param  cartDetails:String
 */
function gnFlashOrderComplete(args){ //0success, 1orderID, 2custID, 3orderTotal, 4orderSubTotal, 5orderShipping, 6custCity, 7custState, 8custZip, 9cartDetails)
	trace("---- gnFlashOrderComplete");
	if (args[0]) {

		global_Tracker.setPage(const_gnPageName_OrderComplete);
		global_Tracker.setCategory(const_gnCategoryName_Checkout);
		global_Tracker.setPageType(const_gnPageType_Checkout);
		
		global_Tracker.setSKU(const_gnEmptyString);
		global_Tracker.setSearchResults(const_gnEmptyString);
		global_Tracker.setSearchTerm(const_gnEmptyString);
		
		gnPageView();


		gnProcessOrderItems(args[9],args[2],args[1],args[4]);
		gnCreateOrderTag(args[1], args[4], args[5], args[2], args[6], args[7], args[8]);

		// call to google code
		//completeOrder(args[3]);
		completeOrder(args[3], args[1], global_orderItemQuatity);
	};
};

/******************************************************************************************************
* PUBLIC MISC FUNCTIONS
* tracking.11.cm.misc.src.js
*******************************************************************************************************/

