/**
 * @author timharwood
 * 
 * These are a selection of js files, to be called by Flash's ExternalInteface
 * the idea is that they mirror the types of events/logic of the flash app, 
 * then convert the info passed to appropriate coremetrics function
 * 
 * J Wright 29 May 2008 +
 *
 * From CoreMetrics docs:
 *      cmCreatePageviewTag("pageID","catID");
 *      cmCreateManualLinkClickTag("HREF","NAME","pageID");
 *      cmCreateManualImpression("pageID","cm_sp_parameter","cm_re_parameter");
 *      These three tags contain a pageID parameter.  The pageID uniquely identifies each page on the site.  
 *      In Flash, it is possible to have several “page equivalents” visible at one time.  
 *      The Link Click and Impression tags are associated to the Pageview tag by the pageID.
 *
 * Ordering of code in this document, to aid navigation and understanding.
 * Editing should only conists of "wiring up" the Flash internal names and object types with 
 * the hash table in the code a bit later on, and double-checking that the clicks and impressions
 * are being sent where and when we want them to.
 * Funcs with "gnFlash" as name root, are designed to be called from inside Flash,
 * these will call other functions based on any logic in the functions
 * 
 * Generic UI
 *      gnUIItemClick
 *      gnPanelImpression
 *      gnPageView
 * Menu specific 
 *      gnFlashMenuAccordionClick 
 *      gnFlashMenuItemClick 
 *      gnFlashMenuImpression 
 * Intro page specific
 *      gnFlashIntroPanelClick 
 *      gnFlashIntroKitClick 
 *      gnFlashIntroNewsClick 
 *      gnFlashIntroBannerClick 
 * Products - product list view and individual products
 *      gnProductView
 *      gnProductViewClick
 *      gnImgVarViewClick
 
 *      gnFlashProductListScrollbar 
 *      gnFlashProductListBack 
 *      gnFlashProductListSize 
 *      gnFlashProductListViewAll 
 *      gnFlashProductListViewNormal 
 
 *      gnFlashProductZoomIn 
 *      gnFlashProductZoomOut 
 *      gnFlashProductColourStyle 
 *      gnFlashProductSize 
 *      gnFlashProductAddToWishlist 
 *      gnFlashProductMoreInfo 
 *      gnFlashProductLessInfo
 *      gnFlashProductBack 
 
 *      gnFlashViewProductFromList   -- view a prod from a list of products
 *      gnFlashViewProductDirectURL  -- view a product by direct URL control (prodId, imgVarId etc)
 *      gnFlashViewProductHomeKit    -- clicking on product in  'casual tailor selection' in 'home page'
 *      gnFlashViewProductCatRelated  -- clicking on product displayed beside catalogue image
 *      gnFlashViewProductProdRelated  -- clicking on product in  related product display from previous product
 * Shopping cart specific
 *      gnViewCartPanel
 *      gnCartAction
 *      gnFlashFlashAddCartItem 
 *      gnFlashDelCartItem 
 *      gnFlashEditCartItem 
 *      gnFlashViewCart 
 *      gnFlashAbandonCheckout 
 *      gnFlashChooseShipping 
 *      gnFlashStartCheckoutProcess 
 * User Account specific
 *      gnFlashViewAccountPanel 
 *      gnAccountAction
 *      gnFlashStartLoginProcess 
 *      gnFlashStartRegisterProcess 
 *      gnFlashRegisterProcessCompleted 
 *      gnFlashUserSignOut 
 *      gnFlashForgotPassword 
 *      gnFlashChoosePreferences
 * Wishlist specific
 *      gnWishlistAction
 *      gnFlashViewWishlistPanel 
*       gnFlashWishlistDelWishlistItem 
*       gnFlashWishlistAddWishlistItem 
*       gnFlashWishlistAddWishlistItemToCart 
*       gnFlashWishlistEmailWishlist 
*       gnFlashWishlistEmailWishlistItemInStock 
 * Catalogue specific
 *      gnCatalogueAction
 *      gnFlashCataloguePageView 
 *      gnFlashCatalogueMoreInfo
 *      gnFlashCatalogueLessInfo
 *      gnFlashCatalogueZoomIn
 *      gnFlashCatalogueZoomOut
 *      gnFlashCatalogueBack
 *      gnFlashCatalogueScrollbar
 *      gnFlashCatalogueProductClick
*/
// Global variables

var g_gnCategoryNameHomeIntro = "HOMEINTRO";
var g_gnCategoryNameHomeNews = "HOMENEWS";
var g_gnCategoryNameHomeBanner = "HOMEBANNER";
var g_gnCategoryNameHomeKit = "HOMEKIT";
var g_gnCategoryNameDirectLink = "DIRECTLINK";  // to be used with direct link values of prodId and imgvarId in URL
var g_gnCategoryNameCatRelated = "CATRELATED";  // when clicking on related products in the Catalogue
var g_gnCategoryNameProdRelated = "PRODRELATED";  // when clicking on related products from a product view
var g_gnCategoryNameWishlist = "WISHLIST";      // not implemented yet - when clicking on a link in the wishlist
var g_gnCategoryNameCart = "CART";      // not implemented yet - when clicking on a link in the shopping cart

var g_gnPageNameCatalogue = "CataloguePage";
var g_gnPageNameProduct = "productPage";
var g_gnPageNameProductList = "productListPage";

var g_gnPanelNameAccount = "accountPanel";
var g_gnPanelNameCart = "cartPanel";
var g_gnPanelNameWishlist = "wishlistPanel";

var g_gnCategoryConstantUI = "CUI"; 

// flashUIObjectInfo: button names and types, for ease of use, create a pseudo-class like this
function flashUIObjectInfo(objId, objType)
{
    this.objectId = objId;
    this.objectType = objType;
}

// and a hash table implementation
function Hash()
{
	this.length = 0;
	this.items = new Array();
	for (var i = 0; i < arguments.length; i += 2) {
		if (typeof(arguments[i + 1]) != 'undefined') {
			this.items[arguments[i]] = arguments[i + 1];
			this.length++;
		}
	}
   
	this.removeItem = function(in_key)
	{
		var tmp_value;
		if (typeof(this.items[in_key]) != 'undefined') {
			this.length--;
			var tmp_value = this.items[in_key];
			delete this.items[in_key];
		}
	   
		return tmp_value;
	}

	this.getItem = function(in_key) {
		return this.items[in_key];
	}

	this.setItem = function(in_key, in_value)
	{
		if (typeof(in_value) != 'undefined') {
			if (typeof(this.items[in_key]) == 'undefined') {
				this.length++;
			}

			this.items[in_key] = in_value;
		}
	   
		return in_value;
	}

	this.hasItem = function(in_key)
	{
		return typeof(this.items[in_key]) != 'undefined';
	}
}

// now it's easy to create the hash, and get the flash object name and type without
// hundreds of variables flying around. 
// we have a name as referenced in the javascript code, then a new object (as defined above)
// which holds the UI object's internal name, or what we pass to coremetrics, and it's object type

var flashUIObjectList = new Hash(
    "CartViewCart", new flashUIObjectInfo("cartPanelTab", "com.goodnorth.controls.[xx]"),
    "CartDelCartItem", new flashUIObjectInfo("[cart_delcartitem]", "com.goodnorth.controls.[xx]"),
    "CartEditCartItem", new flashUIObjectInfo("[cart_editcartitem]", "com.goodnorth.controls.[xx]"),
    "CartShipping", new flashUIObjectInfo("shippingCombo", "com.goodnorth.controls.[xx]"),
    "CartCheckout", new flashUIObjectInfo("checkoutButton", "com.goodnorth.controls.[xx]"),
    
    "CheckoutAbandon", new flashUIObjectInfo("[abandon checkout]", "com.goodnorth.controls.[xx]"),

    "AccountViewPanel", new flashUIObjectInfo("accountPanelTab", "com.goodnorth.controls.[xx]"),
    "AccountSignIn", new flashUIObjectInfo("signInButton", "com.goodnorth.controls.[xx]"),
    "AccountSignOut", new flashUIObjectInfo("[signOutButton]", "com.goodnorth.controls.[xx]"),
    "AccountForgotPwd", new flashUIObjectInfo("forgotPwdButton", "com.goodnorth.controls.[xx]"),
    "AccountRegisterUser", new flashUIObjectInfo("registerButton", "com.goodnorth.controls.[xx]"),
    "AccountSizeChange", new flashUIObjectInfo("sizeGrpNameCombo", "com.goodnorth.controls.[xx]"),
    
    "WishlistViewPanel", new flashUIObjectInfo("wishlistPanelTab", "com.goodnorth.controls.[xx]"),
    "WishlistAddItem", new flashUIObjectInfo("wishlistItem", "com.goodnorth.controls.[xx]"),
    "WishlistDelWishlistItem", new flashUIObjectInfo("wishlistItem", "com.goodnorth.controls.[xx]"),
    "WishlistAddItemToCart", new flashUIObjectInfo("wishlistItem", "com.goodnorth.controls.[xx]"),
    "WishlistEmailStock", new flashUIObjectInfo("wishlistItem", "com.goodnorth.controls.[xx]"),
    "WishlistEmailList", new flashUIObjectInfo("emailListButton", "com.goodnorth.controls.[xx]"),
    
    "ProductListScrollBar", new flashUIObjectInfo("[productlist_scrollbar]", "com.goodnorth.controls.[xx]"),
    "ProductListBack", new flashUIObjectInfo("shopCloseButton", "com.goodnorth.controls.[xx]"),
    "ProductListSize", new flashUIObjectInfo("sizeGroupNameCombo", "com.goodnorth.controls.[xx]"),
    "ProductListViewAll", new flashUIObjectInfo("[productlist_viewall]", "com.goodnorth.controls.[xx]"),
    "ProductListViewNormal", new flashUIObjectInfo("[productlist_viewnormal]", "com.goodnorth.controls.[xx]"),
    
    "ProductZoomIn", new flashUIObjectInfo("zoomInButton", "com.goodnorth.controls.[xx]"),
    "ProductZoomOut", new flashUIObjectInfo("zoomOutButton", "com.goodnorth.controls.[xx]"),
    "ProductColourStyle", new flashUIObjectInfo("styleGroupCombo", "com.goodnorth.controls.[xx]"),
    "ProductSize", new flashUIObjectInfo("sizeGroupNameCombo", "com.goodnorth.controls.[xx]"),
    "ProductAddToCart", new flashUIObjectInfo("cartButton", "com.goodnorth.controls.[xx]"),
    "ProductAddToWishlist", new flashUIObjectInfo("wishlistButton", "com.goodnorth.controls.[xx]"),
    "ProductMoreInfo", new flashUIObjectInfo("moreInfoButton", "com.goodnorth.controls.[xx]"),
    "ProductLessInfo", new flashUIObjectInfo("[product_lessinfo]", "com.goodnorth.controls.[xx]"),
    "ProductBack", new flashUIObjectInfo("[product_back]", "com.goodnorth.controls.[xx]"),
    
    "CatalogueMoreInfo", new flashUIObjectInfo("[Catalogue_moreinfo]", "com.goodnorth.controls.[xx]"),
    "CatalogueLessInfo", new flashUIObjectInfo("[Catalogue_lessinfo]", "com.goodnorth.controls.[xx]"),
    "CatalogueZoomIn", new flashUIObjectInfo("[Catalogue_zoomin]", "com.goodnorth.controls.[xx]"),
    "CatalogueZoomOut", new flashUIObjectInfo("[Catalogue_zoomout]", "com.goodnorth.controls.[xx]"),
    "CatalogueBack", new flashUIObjectInfo("[Catalogue_goback]", "com.goodnorth.controls.[xx]"),
    "CatalogueScrollBar", new flashUIObjectInfo("[Catalogue_scrollbar]", "com.goodnorth.controls.[xx]"),
    "CatalogueProductClick", new flashUIObjectInfo("[Catalogue_productclickarea]", "com.goodnorth.controls.[xx]")
);

// support function wrappers: get internal flash name and type or null if doesn't exist
function getFlashUIObjectName(strLookingFor)
{
    if(flashUIObjectList.hasItem(strLookingFor))
        return (flashUIObjectList[strLookingFor]).objectId;
    return null;
}
function getFlashUIObjectType(strLookingFor)
{
    if(flashUIObjectList.hasItem(strLookingFor))
        return (flashUIObjectList[strLookingFor]).objectType;
    return null;
}

// USER INTERACTION EVENTS

/******************************************************************************************************
            Generic buttons, sliders, anything that can be clicked or interacted with by user
******************************************************************************************************/

/* gnUIItemClick
* The result of clicks, drags, etc, called by any general UI item, buttons, combo boxes, etc
* eg: gnUIItemClick("cartPanel","cartPanelTab","com.goodnorth.controls.tabselector","CUI")
* Params : LinkToName - 
*          UIItemName - 
*          UIItemType - 
*          UIItemCategory - 
*******************************************************************************************************/
function gnUIItemClick(LinkToName, UIItemName, UIItemType, UIItemCategory)
{
	cmCreateManualLinkClickTag(LinkToName,UIItemName,UIItemCategory);
}

/* gnPanelImpression
* When a panel is shown or viewed
* eg: gnPanelImpression("cartPanel","CUI") 
* Params : panelName - 
*          panelCategory - 
*******************************************************************************************************/
function gnPanelImpression(panelName,panelCategory)
{
	cmCreateManualImpression(panelName, panelCategory);
}

/* gnPageView
* When a page is viewed
* eg: gnPageView("CataloguePage","SS08:JEA") 
* Params : PageId - 
*          CatagoryId - 
*******************************************************************************************************/
function gnPageView(PageId, CategoryId)
{
    cmCreatePageviewTag(PageId, CategoryId);
}



/******************************************************************************************************
            Menu specific clicks, views (impressions)
******************************************************************************************************/
/* gnFlashMenuAccordionClick
* The result of clicking on menu accordion items to expand any submenus or categories. The MenuItemCategory 
* for menu items contains their own category, for passing to sub pages, therefore probably needs truncating 
* at the last colon
* eg: gnMenuAccordianClick("CATALOGUE SS08","SHOP:CAT")
* Params : MenuItemName - 
*          MenuItemCategory - 
*******************************************************************************************************/
function gnFlashMenuAccordionClick(MenuItemName, MenuItemCategory)
{
	cmCreateManualLinkClickTag(MenuItemName,MenuItemName,MenuItemCategory);
}

/* gnFlashMenuItemClick
* The result of clicking on menu items (any type). The MenuItemCategory for menu items contains their own 
* category, for passing to sub pages, therefore probably needs truncating at the last colon
* eg: gnMenuItemClick("OTS-Catalogue-hoodies","HOODIES & SWEATS","SHOP:CAT:HOO")
* Params : LinkToName - 
*          MenuItemName - 
*          MenuItemCategory - 
*******************************************************************************************************/
function gnFlashMenuItemClick(LinkToName, MenuItemName, MenuItemCategory)
{
	cmCreateManualLinkClickTag(LinkToName, MenuItemName, MenuItemCategory);
}

/* gnFlashMenuImpression
* Menu items (any type) being displahyed.
* eg: gnMenuImpression("shopMenu","MUI:SHOP") 
* Params : menuName - 
*          menuCategory - 
*******************************************************************************************************/
function gnFlashMenuImpression(menuName,menuCategory)
{
	cmCreateManualImpression(menuName, menuCategory);
}





/******************************************************************************************************
            INTRO PANELS, BANNERS, ETC. SPECIFIC PAGE
******************************************************************************************************/
/* gnFlashIntroPanelClick
* The result of clicking on main "Intro" panels on the homepage. 
* eg: gnIntroPanelClick("OTS-Catalogue-hoodies","Some Image name")
* eg: gnIntroPanelClick("SS08-K123-ABC-SKY","Blue hoodie"), although we use the prodID & imgVar for the app, 
*       I think we'd have to record as SKU 
* items belong to the HOMEINTRO category
* Params : LinkToName_or_SKU - 
*          PanelItemName - 
*******************************************************************************************************/
function gnFlashIntroPanelClick(LinkToName_or_SKU, PanelItemName)
{
	cmCreateManualLinkClickTag(LinkToName_or_SKU, PanelItemName, g_gnCategoryNameHomeIntro);
}

/* gnFlashIntroKitClick
* The result of clicking on the Kit panel on the homepage. 
* eg: gnIntroPanelClick("SS08-K123-ABC-SKY","Blue hoodie"), although we use the prodID & imgVar for the app, 
*       I think we'd have to record as SKU 
* items belong to the HOMEKIT category
* Params : SKU - 
*          KitItemName - 
*******************************************************************************************************/
function gnFlashIntroKitClick(SKU, KitItemName)
{
	cmCreateManualLinkClickTag(SKU, KitItemName, g_gnCategoryNameHomeKit);
}


/* gnFlashIntroKitImgVarImpressions
* A string delimited list of the items that appear in the Kit List on the intro page. These throw
* Image Variation Impressions as they are generated, or as they are shown - either is possible
* This function just takes a delimited list of the SKUs and product names, no maximum so could be 3 or 30.
* The delimiting is as others in this file, comma separated items and semi-colon separated data chunks within an item.
* Obviously the SKU should be for the Image Var to be tracked, not the "parent" product
* eg: gnFlashIntroKitImgVarImpressions("SS08-K123-ABC-SKY;Blue hoodie,SS08-K123-ABC-BLK;Black hoodie")
* items belong to the HOMEKIT category
* Params : strDelimitedList - see above for desc
*******************************************************************************************************/
function gnFlashIntroKitImgVarImpressions(strDelimtedList)
{
    var arItems = strListOfItemsInCart.split(",");
    for(ii = 0; ii < arItems.length; ii++)
    {
        var arItemInfo = arItems[ii].split(";");
        gnImgVarImpression(arItemInfo[0], arItemInfo[1], g_gnCategoryNameHomeKit);
    }
}

/* gnFlashIntroNewsClick
* The result of clicking on the News panel on the homepage. 
* eg: gnIntroNewsClick("NewsItemXXX","Item(n)") 
* items belong to the HOMENEWS category
* Params : LinkToName - 
*          NewsItemName - 
*******************************************************************************************************/
function gnFlashIntroNewsClick(LinkToName, NewsItemName)
{
	cmCreateManualLinkClickTag(LinkToName, NewsItemName, g_gnCategoryNameHomeNews);
}

/* gnFlashIntroBannerClick
* The result of clicking on the intro banner panel on the homepage. 
* eg: gnIntroBannerClick("OTS-Catalogue-hoodies","Some Image name")
* eg: gnIntroBannerClick("SS08-K123-ABC-SKY","Blue hoodie"), although we use the prodID & imgVar for the app, 
*       I think we'd have to record as SKU 
* items belong to the HOMEBANNER category
* Params : LinkToName_or_SKU - 
*          BannerItemName - 
*******************************************************************************************************/
function gnFlashIntroBannerClick(LinkToName_or_SKU, BannerItemName)
{
	cmCreateManualLinkClickTag(LinkToName_or_SKU, BannerItemName, g_gnCategoryNameHomeBanner);
}




/******************************************************************************************************
            Products - product list and individual products
******************************************************************************************************/

var g_gnProductActionTagAddToCart = "addItem";              // item added from product page
var g_gnProductListScrollbar = "productListScroll";         // scrolled through product lists
var g_gnProductListBack = "homeView";                       // ended product list view
var g_gnProductListSize = "sizeCombo";                      // filtered/chosen size in product list view
var g_gnProductListViewAll = "productListViewAll";          // see all products in list, not 3 at a time
var g_gnProductListViewNormal = "productListViewNormal";    // see 3 products at a time with scrollbar

var g_gnProductZoomIn = "productZoomIn";
var g_gnProductZoomOut = "productZoomOut";
var g_gnProductColourStyle = "productColourStyle";
var g_gnProductSize = "productSize";
var g_gnProductAddToWishlist = "productAddToWishlist";
var g_gnProductMoreInfo = "productMoreInfo";
var g_gnProductLessInfo = "productLessInfo";
var g_gnProductBack = "productBack";

/* gnProductViewClick
* eg: gnProductClick("SS08-K123-ABC-SKY","A Blue Hoodie","SHOP:OTS:HOO") 
* Params : SKU - 
*          KitItemName - 
*          CurrentCategory -
*******************************************************************************************************/
function gnProductViewClick(SKU, KitItemName, CurrentCategory)
{
	cmCreateManualLinkClickTag(SKU, KitItemName, CurrentCategory);
}

/* gnImgVarViewClick
* eg: gnImgVarClick("SS08-K123-ABC-SKY","A Blue Hoodie","OTS:HOO") 
* Params : ImgVarViewSKU - 
*          Product - 
*          CurrentCategory -
*******************************************************************************************************/
function gnImgVarViewClick(ImgVarViewSKU, Product, CurrentCategory)
{
	cmCreateManualLinkClickTag(ImgVarViewSKU, Product, CurrentCategory);
}


/* gnImgVarImpression
* eg: gnImgVarClick("SS08-K123-ABC-SKY","A Blue Hoodie","OTS:HOO") 
* Params : ImgVarViewSKU - 
*          Product - 
*          CurrentCategory -
*******************************************************************************************************/
function gnImgVarImpression(ImgVarViewSKU, Product, CurrentCategory)
{
	cmCreateManualImpression(ImgVarViewSKU, Product, CurrentCategory);
}

/* gnProductView
* eg: gnProductView("SS08-K123-ABC-SKY","A Blue Hoodie","OTS:HOO") 
* Params : SKU - 
*          Product - 
*          CurrentCategory -
*******************************************************************************************************/
function gnProductView(SKU, Product, CurrentCategory)
{
    cmCreatePageviewTag(SKU, CurrentCategory);
    gnImgVarImpression(SKU, Product, CurrentCategory);
}

function gnFlashViewProductFromList(SKU, ProductName, ListCategory)
{
    gnProductView(SKU, ProductName, ListCategory);
}

function gnFlashViewProductDirectURL(SKU, ProductName)
{
    gnProductView(SKU, ProductName, g_gnCategoryNameDirectLink);
}

function gnFlashViewProductHomeKit(SKU, ProductName)
{
    gnProductView(SKU, ProductName, g_gnCategoryNameHomeKit);
}

function gnFlashViewProductCatRelated(SKU, ProductName)
{
    gnProductView(SKU, ProductName, g_gnCategoryNameCatRelated);
}

function gnFlashViewProductProdRelated(SKU, ProductName)
{
    gnProductView(SKU, ProductName, g_gnCategoryNameProdRelated);
}


function gnFlashProductListScrollbar(CurrentCategory)
{
    gnUIItemClick(g_gnProductListScrollbar, getFlashUIObjectName("ProductListScrollBar"), getFlashUIObjectType("ProductListScrollBar"), CurrentCategory);
}
function gnFlashProductListBack(CurrentCategory)
{
    gnUIItemClick(g_gnProductListBack, getFlashUIObjectName("ProductListBack"), getFlashUIObjectType("ProductListBack"), CurrentCategory);
}
function gnFlashProductListSize(CurrentCategory)
{
    gnUIItemClick(g_gnProductListSize, getFlashUIObjectName("ProductListSize"), getFlashUIObjectType("ProductListSize"), CurrentCategory);
}
function gnFlashProductListViewAll(CurrentCategory)
{
    gnUIItemClick(g_gnProductListViewAll, getFlashUIObjectName("ProductListViewAll"), getFlashUIObjectType("ProductListViewAll"), CurrentCategory);
}
function gnFlashProductListViewNormal(CurrentCategory)
{
    gnUIItemClick(g_gnProductListViewNormal, getFlashUIObjectName("ProductListViewNormal"), getFlashUIObjectType("ProductListViewNormal"), CurrentCategory);
}

function gnFlashProductZoomIn(CurrentProductSKU)
{
    gnUIItemClick(g_gnProductZoomIn, getFlashUIObjectName("ProductZoomIn"), getFlashUIObjectType("ProductZoomIn"), CurrentProductSKU);
}
function gnFlashProductZoomOut(CurrentProductSKU)
{
    gnUIItemClick(g_gnProductZoomOut, getFlashUIObjectName("ProductZoomOut"), getFlashUIObjectType("ProductZoomOut"), CurrentProductSKU);
}
function gnFlashProductColourStyle(CurrentProductSKU)
{
    gnUIItemClick(g_gnProductColourStyle, getFlashUIObjectName("ProductColourStyle"), getFlashUIObjectType("ProductColourStyle"), CurrentProductSKU);
}
function gnFlashProductSize(CurrentProductSKU)
{
    gnUIItemClick(g_gnProductSize, getFlashUIObjectName("ProductSize"), getFlashUIObjectType("ProductSize"), CurrentProductSKU);
}
function gnFlashProductAddToWishlist(CurrentProductSKU)
{
    gnUIItemClick(g_gnProductAddToWishlist, getFlashUIObjectName("ProductAddToWishlist"), getFlashUIObjectType("ProductAddToWishlist"), CurrentProductSKU);
}
function gnFlashProductMoreInfo(CurrentProductSKU)
{
    gnUIItemClick(g_gnProductMoreInfo, getFlashUIObjectName("ProductMoreInfo"), getFlashUIObjectType("ProductMoreInfo"), CurrentProductSKU);
}
function gnFlashProductLessInfo(CurrentProductSKU)
{
    gnUIItemClick(g_gnProductLessInfo, getFlashUIObjectName("ProductLessInfo"), getFlashUIObjectType("ProductLessInfo"), CurrentProductSKU);
}

function gnFlashProductBack(CurrentProductSKU)
{
    gnUIItemClick(g_gnProductBack, getFlashUIObjectName("ProductBack"), getFlashUIObjectType("ProductBack"), CurrentProductSKU);
}


// Core Metrics documentation has typos and different names for funcs - so check the actual jscript
// if possible for correct names of functions

/******************************************************************************************************
* SHOPPING CART FUNCTIONS (call from flash)
*       gnFlashAbandonCheckout
*       gnFlashAddCartItem
*       gnFlashCartAction
*       gnFlashChooseShipping
*       gnFlashDelCartItem
*       gnFlashEditCartItem
*       gnFlashStartCheckoutProcess
*       gnFlashViewCart
*       gnFlashViewCartPanel
*******************************************************************************************************/

// Global variables

// passed through these functions, not sent to coremetrics
var g_gnCartActionEnum = { 
    AddCartItem: 0,
    DelCartItem: 1,
    EditCartItem: 2,
    ViewCartItem: 3,
    StartCheckout: 4,
    AbandonCheckout: 5,
    ChooseShipping: 6
}

// values passed into cmCreateManualLinkTag()
// first param - most granular information
var g_gnCartActionTagChangeQuantity = "changeQuantity";    // item quantity changed
var g_gnCartActionTagRemoveItem = "removeItem";            // item removed
var g_gnCartActionTagChooseShipping = "shippingChosen";    // shipping chosen
var g_gnCartActionTagStartCheckout = "checkoutStart";      // checkout process initiated
var g_gnCartActionTagAbandonCheckout = "checkoutAbandoned"; // checkout process abandoned by user

/* gnViewCartPanel
* Param 0: strListOfItemsInCart double delimited list:
*          comma separated on cart items
*          semicolon separated on item info
*          "prodid123;product name;qty;unit price;categoryid,prodid124;product name 2;qty;unit price;categoryid"
*******************************************************************************************************/
function gnViewCartPanel(strListOfItemsInCart)
{
    gnPanelImpression(g_gnPanelNameCart, g_gnCategoryConstantUI);
    var arItems = strListOfItemsInCart.split(",");
    for(ii = 0; ii < arItems.length; ii++)
    {
        var arItemInfo = arItems[ii].split(";");
        cmCreateShopAction5Tag(arItemInfo[0], arItemInfo[1], arItemInfo[2], arItemInfo[3], arItemInfo[4]);
        // Tim decided not an "impression" hit here.
        // gnImgVarImpression(arItemInfo[0], arItemInfo[1], arItemInfo[4]);
    }
    cmDisplayShop5s();    
}

/* gnCartAction
* Param 0: enum: update item, add item, delete item, view cart, etc.
* Param 1: strListOfItemsInCart double delimited list - see "gnViewCartPanel" above
*******************************************************************************************************/
function gnCartAction(enumCartActionEnum, strListOfItemsInCart)
{
    switch(enumCartActionEnum)
    {
        case g_gnCartActionEnum.AddCartItem:
            // button click already registered in gnAddCartItem() function, no need to duplicate here
            gnViewCartPanel(strListOfItemsInCart);
            break;
        case g_gnCartActionEnum.DelCartItem:
            gnUIItemClick(g_gnCartActionTagRemoveItem, getFlashUIObjectName("CartDelCartItem"), getFlashUIObjectType("CartDelCartItem"), g_gnPanelNameCart);
            gnViewCartPanel(strListOfItemsInCart);
            break;
        case g_gnCartActionEnum.EditCartItem:
            gnUIItemClick(g_gnCartActionTagChangeQuantity, getFlashUIObjectName("CartEditCartItem"), getFlashUIObjectType("CartEditCartItem"), g_gnPanelNameCart);
            gnViewCartPanel(strListOfItemsInCart);
            break;
        case g_gnCartActionEnum.ViewCartItem:
            gnViewCartPanel(strListOfItemsInCart);
            break;
        case g_gnCartActionEnum.AbandonCheckout:
            gnUIItemClick(g_gnCartActionTagAbandonCheckout, getFlashUIObjectName("CheckoutAbandon"), getFlashUIObjectType("CheckoutAbandon"), g_gnPanelNameCart);
            gnViewCartPanel(strListOfItemsInCart);
            break;
        case g_gnCartActionEnum.ChooseShipping:
            gnUIItemClick(g_gnCartActionTagChooseShipping, getFlashUIObjectName("CartShipping"), getFlashUIObjectType("CartShipping"), g_gnPanelNameCart);
            gnViewCartPanel(strListOfItemsInCart);
            break;
        case g_gnCartActionEnum.StartCheckout:
            gnUIItemClick(g_gnCartActionTagStartCheckout, getFlashUIObjectName("CartCheckout"), getFlashUIObjectType("CartCheckout"), g_gnPanelNameCart);
            // gnViewCartPanel(strListOfItemsInCart); ?? do we show cart contents in this instance?
            break;
    }
}

/* gnFlashAddCartItem
* Log an item added to the cart, and also the button click that put it there
* Param 0: strListOfItemsInCart double delimited list - see "gnViewCartPanel" above
* Param 1: strSource: this has to be "product", "wishlist" etc
*******************************************************************************************************/
function gnFlashAddCartItem(strListOfItemsInCart, strSource)
{
    gnCartAction(g_gnCartActionEnum.AddCartItem, strListOfItemsInCart);
    switch(strSource)
    {
        case "product":
            gnUIItemClick(g_gnProductActionTagAddToCart, getFlashUIObjectName("ProductAddToCart") , getFlashUIObjectType("ProductAddToCart"), strCurrentCategory)
            break;
        case "wishlist":
            gnUIItemClick(g_gnWishlistActionTagAddToCart, getFlashUIObjectName("WishlistAddItemToCart") , getFlashUIObjectType("WishlistAddItemToCart"), strCurrentCategory)
            break;
    }
}

/* gnFlashDelCartItem
* Param 0: strListOfItemsInCart double delimited list - see "gnViewCartPanel" above
*******************************************************************************************************/
function gnFlashDelCartItem(strListOfItemsInCart)
{
    gnCartAction(g_gnCartActionEnum.DelCartItem, strListOfItemsInCart);
}

/* gnFlashEditCartItem
* Param 0: strListOfItemsInCart double delimited list - see "gnViewCartPanel" above
*******************************************************************************************************/
function gnFlashEditCartItem(strListOfItemsInCart)
{
    gnCartAction(g_gnCartActionEnum.EditCartItem, strListOfItemsInCart);
}

/* gnFlashViewCart
* Param 0: strListOfItemsInCart double delimited list - see "gnViewCartPanel" above
* Param 1: Category currently in - can be null. If set will add a button click to the cart tab selector
*******************************************************************************************************/
function gnFlashViewCart(strListOfItemsInCart, strCurrentCategory)
{
    gnCartAction(g_gnCartActionEnum.ViewCartItem, strListOfItemsInCart);
    if(strCurrentCategory != null)
        gnUIItemClick(g_gnPanelNameCart, getFlashUIObjectName("CartViewCart") , getFlashUIObjectType("CartViewCart"), strCurrentCategory)
}

/* gnFlashAbandonCheckout
* Param 0: strListOfItemsInCart double delimited list - see "gnViewCartPanel" above
*******************************************************************************************************/
function gnFlashAbandonCheckout(strListOfItemsInCart)
{
    gnCartAction(g_gnCartActionEnum.AbandonCheckout, strListOfItemsInCart);
}

/* gnFlashChooseShipping
* Param 0: strListOfItemsInCart double delimited list - see "gnViewCartPanel" above
*******************************************************************************************************/
function gnFlashChooseShipping(strListOfItemsInCart)
{
    gnCartAction(g_gnCartActionEnum.ChooseShipping, strListOfItemsInCart);
}

/* gnFlashStartCheckoutProcess
* Logs the start of a checkout process and also the click of the "Checkout" button in the cart panel
* Param 0: strListOfItemsInCart double delimited list - see "gnViewCartPanel" above
*******************************************************************************************************/
function gnFlashStartCheckoutProcess(strListOfItemsInCart)
{
    gnCartAction(g_gnCartActionEnum.StartCheckout, strListOfItemsInCart);
}
/******************************************************************************************************
* END 0F SHOPPING CART FUNCTIONS
*******************************************************************************************************/



/******************************************************************************************************
* USER ACCOUNT FUNCTIONS  (call from flash)
*       gnFlashForgotPassword
*       gnFlashRegisterProcessCompleted
*       gnFlashStartLoginProcess
*       gnFlashStartRegisterProcess
*       gnFlashUserSignOut
*       gnFlashViewAccountPanel
*******************************************************************************************************/
// Global variables

// passed through these functions, not sent to coremetrics
var g_gnAccountActionEnum = { 
    SignIn: 0,
    ForgotPassword: 1,
    RegisterUser: 2,
    RegisterCompleted: 3,
    SignOut: 4,
    ChoosePreference: 5
}

var g_gnAccountActionTagSignIn = "signIn";                  // sign in process started
var g_gnAccountActionTagSignOut = "signOut";                 // sign out
var g_gnAccountActionTagForgotPwd = "forgottenPassword";    // pwd forgotten
var g_gnAccountActionTagRegister = "registerUser";          // user registration started
var g_gnAccountActionTagRegisterCompleted = "registerUserCompleted"; // user reg completed
var g_gnAccountActionTagChoosePreference = "sizeCombo";          // user registration started

/* gnViewAccountPanel
* Param 0: intPageId - which stage of the Account forms we are looking at, 1-based
* TODO: check out the different "pages" of the Account information
*******************************************************************************************************/
function gnFlashViewAccountPanel(intPageId)
{
    gnPanelImpression(g_gnPanelNameAccount, g_gnCategoryConstantUI);
}

/* gnAccountAction
* Param 0: enum: login, forgot password, register, etc.
*******************************************************************************************************/
function gnAccountAction(enumAccountActionEnum)
{
    switch(enumAccountActionEnum)
    {
        case g_gnAccountActionEnum.ForgotPassword:
            gnUIItemClick(g_gnAccountActionTagForgotPwd, getFlashUIObjectName("AccountForgotPwd"), getFlashUIObjectType("AccountForgotPwd"), g_gnPanelNameAccount);
            gnViewAccountPanel(1);
            break;
        case g_gnAccountActionEnum.RegisterUser:
            gnUIItemClick(g_gnAccountActionTagRegister, getFlashUIObjectName("AccountRegisterUser"), getFlashUIObjectType("AccountRegisterUser"), g_gnPanelNameAccount);
            gnViewAccountPanel(1);
            break;
        case g_gnAccountActionEnum.RegisterCompleted:
            cmCreateManualLinkClickTag(g_gnAccountActionTagRegisterCompleted, g_gnAccountActionTagRegisterCategory, g_gnPanelNameAccount);
            gnViewAccountPanel(1);
            break;
        case g_gnAccountActionEnum.SignIn:
            gnUIItemClick(g_gnAccountActionTagSignIn, getFlashUIObjectName("AccountSignIn"), getFlashUIObjectType("AccountSignIn"), g_gnPanelNameAccount);
            gnViewAccountPanel(1);
            break;
        case g_gnAccountActionEnum.SignOut:
            gnUIItemClick(g_gnAccountActionTagSignOut, getFlashUIObjectName("AccountSignOut"), getFlashUIObjectType("AccountSignOut"), g_gnPanelNameAccount);
            gnViewAccountPanel(1);
            break;
        case g_gnAccountActionEnum.ChoosePreference:
            gnUIItemClick(g_gnAccountActionTagChoosePreference, getFlashUIObjectName("AccountSizeChange"), getFlashUIObjectType("AccountSizeChange"), g_gnPanelNameAccount);
            gnViewAccountPanel(1);
            break;
    }
}

/* gnStartLoginProcess
*******************************************************************************************************/
function gnFlashStartLoginProcess()
{
    gnAccountAction(g_gnAccountActionEnum.SignIn);
}

/* gnStartRegisterProcess
*******************************************************************************************************/
function gnFlashStartRegisterProcess()
{
    gnAccountAction(g_gnAccountActionEnum.RegisterUser);
}

/* gnRegisterProcessCompleted
*       params self explanatory except for last two.
*       iCustId is madatory, others are optional, and should be nulls if blank / not used
*       sNewsletterName is name of a newsletter subscribed to - only populate if a newsletter activity occured
*       sNewsletterSubscription should be blank, unless sNewsletterName is NOT blank, 
*           then "Y" for subscribe activity, "N" for unsubscribe activity
*******************************************************************************************************/
function gnFlashRegisterProcessCompleted(iCustId, sEmail, sCity, sState, sZip, sNewsletterName, sNewsletterSubscription)
{
    gnAccountAction(g_gnAccountActionEnum.RegisterCompleted);
    cmCreateCreateRegistratonTag(iCustId, sEmail, sCity, sState, sZip, sNewsletterName, sNewsletterSubscription);
}

/* gnUserSignOut
*******************************************************************************************************/
function gnFlashUserSignOut()
{
    gnAccountAction(g_gnAccountActionEnum.SignOut);
}

/* gnForgotPassword
*******************************************************************************************************/
function gnFlashForgotPassword()
{
    gnAccountAction(g_gnAccountActionEnum.ForgotPassword);
}

function gnFlashChoosePreferences()
{
    gnAccountAction(g_gnAccountActionEnum.ChoosePreference);
}
/******************************************************************************************************
* END 0F USER ACCOUNT FUNCTIONS
*******************************************************************************************************/




/******************************************************************************************************
* WISHLIST FUNCTIONS -  (call from flash) very similar to cart functionality
*******************************************************************************************************/
/* gnViewWishlist(call from flash)
*       gnFlashViewWishlistPanel
*       gnFlashWishlistDelWishlistItem
*       gnFlashWishlistAddWishlistItem
*       gnFlashWishlistAddWishlistItemToCart
*       gnFlashWishlistEmailWishlist
*       gnFlashWishlistEmailWishlistItemInStock
*******************************************************************************************************/
// passed through these functions, not sent to coremetrics
var g_gnWishlistActionEnum = { 
    AddItem: 0,
    DelItem: 1,
    EmailWishlist: 2,
    EmailWhenInStock: 3,
    DontEmailWhenInStock: 4,
    AddItemToCart: 5
}


var g_gnWishlistActionTagViewPanel = "wishlistPanel";      // view panel
var g_gnWishlistActionTagRemoveItem = "removeItem";        // item removed
var g_gnWishlistActionTagAddItem = "addItem";              // item added
var g_gnWishlistActionTagEmailWishlist = "emailWishlist";  // email whole wishlist somewhere
var g_gnWishlistActionTagDoEmailInStock = "remindStock";   // email user when item comes in stock
var g_gnWishlistActionTagDontEmailInStock = "don'tRemindStock"; // don't email user when item comes in stock (a change from previously enabled)
var g_gnWishlistActionTagAddToCart = "moveToBasket";              // item added

/* gnWishlistAction
* Param 0: enum: login, forgot password, register, etc.
*******************************************************************************************************/
function gnWishlistAction(enumWishlistActionEnum)
{
    switch(enumWishlistActionEnum)
    {
        case g_gnWishlistActionEnum.AddItem:
            gnUIItemClick(g_gnWishlistActionTagAddItem, getFlashUIObjectName("AccountForgotPwd"), getFlashUIObjectType("AccountForgotPwd"), g_gnPanelNameWishlist);
            gnViewWishlistPanel();
            break;
        case g_gnWishlistActionEnum.DelItem:
            gnUIItemClick(g_gnWishlistActionTagRemoveItem, getFlashUIObjectName("AccountRegisterUser"), getFlashUIObjectType("AccountRegisterUser"), g_gnPanelNameWishlist);
            gnViewWishlistPanel();
            break;
        case g_gnWishlistActionEnum.EmailWishlist:
            gnUIItemClick(g_gnWishlistActionTagEmailInStock, getFlashUIObjectName("WishlistEmailList"), getFlashUIObjectType("WishlistEmailList"), g_gnPanelNameWishlist);
            gnViewWishlistPanel();
            break;
        case g_gnWishlistActionEnum.EmailWhenInStock:
            gnUIItemClick(g_gnWishlistActionTagDoEmailInStock, getFlashUIObjectName("WishlistEmailStock"), getFlashUIObjectType("WishlistEmailStock"), g_gnPanelNameWishlist);
            gnViewWishlistPanel();
            break;
        case g_gnWishlistActionEnum.DontEmailWhenInStock:
            gnUIItemClick(g_gnWishlistActionTagDontEmailInStock, getFlashUIObjectName("WishlistEmailStock"), getFlashUIObjectType("WishlistEmailStock"), g_gnPanelNameWishlist);
            gnViewWishlistPanel();
            break;
        case g_gnWishlistActionEnum.AddItemToCart:
            gnUIItemClick(g_gnWishlistActionTagAddToCart, getFlashUIObjectName("AccountForgotPwd"), getFlashUIObjectType("AccountForgotPwd"), g_gnPanelNameWishlist);
            gnViewWishlistPanel();
            break;
    }
}

function gnFlashViewWishlistPanel()
{
    gnUIItemClick(g_gnWishlistActionTagViewPanel, getFlashUIObjectName("WishlistViewPanel"), getFlashUIObjectType("WishlistViewPanel"), g_gnPanelNameWishlist);
    gnPanelImpression(g_gnPanelNameWishlist, g_gnCategoryConstantUI);
}
function gnFlashWishlistDelWishlistItem()
{
    gnWishlistAction(g_gnWishlistActionEnum.DelItem);
}
function gnFlashWishlistAddWishlistItem()
{
    gnWishlistAction(g_gnWishlistActionEnum.AddItem);
}
function gnFlashWishlistAddWishlistItemToCart()
{
    gnWishlistAction(g_gnWishlistActionEnum.AddItemToCart);
}
function gnFlashWishlistEmailWishlist()
{
    gnWishlistAction(g_gnWishlistActionEnum.EmailWishlist);
}
function gnFlashWishlistEmailWishlistItemInStock(EmailWhenInStock)
{
    if(EmailWhenInStock == true)
        gnWishlistAction(g_gnWishlistActionEnum.EmailWhenInStock);
    else
        gnWishlistAction(g_gnWishlistActionEnum.DontEmailWhenInStock);
}

/******************************************************************************************************
* END 0F WISHLIST FUNCTIONS
*******************************************************************************************************/





/******************************************************************************************************
* CATALOGUE FUNCTIONS
*******************************************************************************************************/
// what to send to coremetrics 
var g_gnCatalogueActionTagMoreInfo = "catalogueMoreInfo";
var g_gnCatalogueActionTagLessInfo = "catalogueLessInfo";
var g_gnCatalogueActionTagZoomIn = "catalogueZoomIn";
var g_gnCatalogueActionTagZoomOut = "catalogueZoomOut";
var g_gnCatalogueActionTagBack = "catalogueBack";
var g_gnCatalogueActionTagScrollbar = "catalogueScrollbar";
var g_gnCatalogueActionTagProductClick = "catalogueViewProduct";

var g_gnCatalogueActionEnum = { 
    MoreInfo: 0,
    LessInfo: 1,
    ZoomIn: 2,
    ZoomOut: 3,
    Back: 4,
    Scrollbar: 5,
    ProductView: 6
}

function gnCatalogueAction(enumCatalogueActionEnum)
{
    switch(enumCatalogueActionEnum)
    {
        case g_gnCatalogueActionEnum.Back:
            gnUIItemClick(g_gnCatalogueActionTagBack, getFlashUIObjectName("CatalogueBack"), getFlashUIObjectType("CatalogueBack"), g_gnPageNameCatalogue);
            break;
        case g_gnCatalogueActionEnum.LessInfo:
            gnUIItemClick(g_gnCatalogueActionTagLessInfo, getFlashUIObjectName("CatalogueLessInfo"), getFlashUIObjectType("CatalogueLessInfo"), g_gnPageNameCatalogue);
            break;
        case g_gnCatalogueActionEnum.MoreInfo:
            gnUIItemClick(g_gnCatalogueActionTagMoreInfo, getFlashUIObjectName("CatalogueMoreInfo"), getFlashUIObjectType("CatalogueMoreInfo"), g_gnPageNameCatalogue);
            break;
        case g_gnCatalogueActionEnum.ProductView:
            gnUIItemClick(g_gnCatalogueActionTagProductClick, getFlashUIObjectName("CatalogueProductClick"), getFlashUIObjectType("CatalogueProductClick"), g_gnPageNameCatalogue);
            break;
        case g_gnCatalogueActionEnum.Scrollbar:
            gnUIItemClick(g_gnCatalogueActionTagScrollbar, getFlashUIObjectName("CatalogueScrollBar"), getFlashUIObjectType("CatalogueScrollBar"), g_gnPageNameCatalogue);
            break;
        case g_gnCatalogueActionEnum.ZoomIn:
            gnUIItemClick(g_gnCatalogueActionTagZoomIn, getFlashUIObjectName("CatalogueZoomIn"), getFlashUIObjectType("CatalogueZoomIn"), g_gnPageNameCatalogue);
            break;
        case g_gnCatalogueActionEnum.ZoomOut:
            gnUIItemClick(g_gnCatalogueActionTagZoomOut, getFlashUIObjectName("CatalogueZoomOut"), getFlashUIObjectType("CatalogueZoomOut"), g_gnPageNameCatalogue);
            break;
    }
}

/* gnFlashCataloguePageView
* Viewing a catalogue/Catalogue page - one main image and upto 6 smaller pics on the right.
* This will call product impressions for each of the affected products' images and well as a page
* eg: gnFlashCataloguePageView("SS08-K123-ABC-SKY", "SS08:JEA", "SS08-K123-DEF-BLK", null, null, null, null, null)
* Params : MainImageSKU - 
*          CurrentCategory - Current Catalogue category
*          SubImage1SKU to SubImage6SKU - 
*******************************************************************************************************/
function gnFlashCataloguePageView(MainImageSKU, CurrentCategory, SubImage1SKU, SubImage2SKU, SubImage3SKU, SubImage4SKU, SubImage5SKU, SubImage6SKU)
{
    gnPageView(g_gnPageNameCatalogue, CurrentCategory);
    gnImgVarImpression(MainImageSKU, null, CurrentCategory);
    if(SubImage1SKU != null)        gnImgVarImpression(SubImage1SKU, null, CurrentCategory);
    if(SubImage2SKU != null)        gnImgVarImpression(SubImage2SKU, null, CurrentCategory);
    if(SubImage3SKU != null)        gnImgVarImpression(SubImage3SKU, null, CurrentCategory);
    if(SubImage4SKU != null)        gnImgVarImpression(SubImage4SKU, null, CurrentCategory);
    if(SubImage5SKU != null)        gnImgVarImpression(SubImage5SKU, null, CurrentCategory);
    if(SubImage6SKU != null)        gnImgVarImpression(SubImage6SKU, null, CurrentCategory);
}

function gnFlashCatalogueMoreInfo(CurrentProductSKU)
{
    gnCatalogueAction(g_gnCatalogueActionEnum.MoreInfo);
}
function gnFlashCatalogueLessInfo(CurrentProductSKU)
{
    gnCatalogueAction(g_gnCatalogueActionEnum.LessInfo);
}
function gnFlashCatalogueZoomIn(CurrentProductSKU)
{
    gnCatalogueAction(g_gnCatalogueActionEnum.ZoomIn);
}
function gnFlashCatalogueZoomOut(CurrentProductSKU)
{
    gnCatalogueAction(g_gnCatalogueActionEnum.ZoomOut);
}
function gnFlashCatalogueBack(CurrentProductSKU)
{
    gnCatalogueAction(g_gnCatalogueActionEnum.Back);
}
function gnFlashCatalogueScrollbar(CurrentProductSKU)
{
    gnCatalogueAction(g_gnCatalogueActionEnum.Scrollbar);
}
function gnFlashCatalogueProductClick(CurrentProductSKU, ClickedProductSKU, ProductName)
{
    gnCatalogueAction(g_gnCatalogueActionEnum.ProductView);
    gnFlashViewProductCatRelated(ClickedProductSKU, ProductName);
}

/******************************************************************************************************
* END OF CATALOGUE FUNCTIONS
*******************************************************************************************************/
