﻿// Setup global vars
var model;
var svcLocator;
var vwLocator;
var sortByCriteria = "";
var GRID_DIRECTION = "topLeftBottomRight";

// Handler function for page left button
function handlePageLeft()
{
	try
	{
		model.setPageNum(model.getPageNum() - 1);
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// Handler function for page right button
function handlePageRight()
{
	try
	{
		model.setPageNum(model.getPageNum() + 1);
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// Handler function for skip 5 pages left button
function handleScrollLeft()
{
	try
	{
		model.pageSetBackward();
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// Handler function for skip 5 pages right button
function handleScrollRight()
{
	try
	{
		model.pageSetForward();
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// Handler function for show page button
function gotoPage(pageNum)
{
	try
	{
		model.setPageNum(pageNum);
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// Handler function view all button
function handleViewAll()
{
	try
	{
		model.setCurrentProductGridName("viewAll");		
		// Omniture reporting
		s.pageName = document.title + " | View All Button Pressed";
		void(s.t());
		GATrackCategoryBrowseEvent("View All Clicked");
		
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// Handler function for view less button
function handleViewLess()
{
	try
	{
		model.setCurrentProductGridName("viewPaged");
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// Handler function for sort by menu
function handleSortByChange(newCriteria)
{
	try
	{
		sortByCriteria = 0;

		switch(newCriteria.toLowerCase())
		{
			case "pricehightolow":
				sortByCriteria = 1;
				break;
			case "pricelowtohigh":
				sortByCriteria = 2;
				break;
			case "new":
				sortByCriteria = 3;
				break;
			case "alphabetically":
				sortByCriteria = 4;
				break;
			case "category":
				sortByCriteria = 5;
				break;
		}
		
		var browseStates = new Object();
		browseStates["sortCriteria"] = sortByCriteria;
		
		model.setBrowseStates(browseStates);
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// Handler function for category browse drop-down menus
function handleDropdownChange(dropDownMenuName)
{
	try
	{
		var formHandle = document.forms[0];
		var browseStates = new Object();

		var changedMenuHandle = formHandle.elements[dropDownMenuName];
		var selQueryString = changedMenuHandle.options[changedMenuHandle.selectedIndex].value;
		if (selQueryString == "" || selQueryString == null)
		{
			for (var i = 0; i < changedMenuHandle.options.length; i++)
			{
				if (changedMenuHandle.options[i].value.length > 4)
				{
					selQueryString = changedMenuHandle.options[i].value;
					break;
				}
			}
		}
		
		var category = URLFactory.extractValue(selQueryString, "category");
		var refinement = URLFactory.extractValue(selQueryString, "refinement");

		browseStates["category"] = category;
		browseStates["refinement"] = refinement;
		
		model.setBrowseStates(browseStates);
		updateSelects();
			
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh();
		}
		else
		{
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

function handleGridAddItem(argIdToAdd) 
{
	var ajaxCtx = {
		onSuccess:handleAddSuccess,
		onFailure:handleAddFault
	}
	svcLocator.getService("addToBagService").processAddToBag(argIdToAdd, null, "1", CATEGORY_ID, MASTER_CATEGORY_ID, ORDER_ORIGINATION, ajaxCtx);
	var query = window.location.search.split("?").join("");
	var searchNVP = URLFactory.extractQueryStringValue(query, "search");
	if (searchNVP == "1") {
		omnitureTrackActionAdd("Search Results Grid", "Add to ShoppingBag");
	} else {
		omnitureTrackActionAdd("Category Browse", "Add to ShoppingBag");
	}
}
function handleAddSuccess() {
	//do nothing
}
function handleAddFault(argResult)
{
	var skuId = argResult[0].id;
	var errorCode = argResult[0].status;
	generateEvent("onProductSelected", skuId, errorCode);
}
function handleGridSaveItem(argIdToSave)
{
	svcLocator.getService("addSavedItemService").processSavedItem(argIdToSave, null, CATEGORY_ID, MASTER_CATEGORY_ID);
	var query = window.location.search.split("?").join("");
	var searchNVP = URLFactory.extractQueryStringValue(query, "search");
	if (searchNVP == "1") {
		omnitureTrackAction("Search Results Grid", "Add to SavedItems");
	} else {
		omnitureTrackAction("Category Browse", "Add to SavedItems");
	}
}
// Set up drop-down menus
function initDropdowns(browseState)
{
	try
	{
		var formHandle = document.forms[0];
		
		hideMenu("CategoriesSub");
		hideMenu("DesignersCollectionsSub");

		// Check hidden form field for indicator as to whether or not to show price range menu
		if (formHandle.showPriceRangeMenu)
		{
			if (formHandle.showPriceRangeMenu.value == "false")
			{
				removeMenu("PriceRanges");
			}
		}
		generateEvent("onReloadCategoryMenus", this.categoryMenus);
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// ----------------------------------------------
// Function init
// Author:		Nathan Derksen
// Description:	First function to be called after page load
// Inputs:		<none>
// Returns:		<nothing>
// ----------------------------------------------
function init()
{
	try
	{
		if (isAjaxlessRewriteNeeded() == true)
		{
			rewriteURLAjaxToAjaxless();
		}
		else
		{
			// Check if there is a different view all threshold indicator set in a hidden form field
			if (document.forms[0].VIEW_ALL_THRESHOLD_OVERRIDE)
			{
				VIEW_ALL_THRESHOLD = Number(document.forms[0].VIEW_ALL_THRESHOLD_OVERRIDE.value);
			}

			if (document.forms[0].GRID_DIRECTION_OVERRIDE)
			{
				var direction = document.forms[0].GRID_DIRECTION_OVERRIDE.value.toLowerCase();;
				if (direction == "bottomlefttopright" || direction == "righttoleft" || direction == "right")
				{
					GRID_DIRECTION = "bottomlefttopright";
				}
				else
				{
					GRID_DIRECTION = "topleftbottomright";
				}
			}

			if ((locale.toLowerCase() == "intl" && isRetailMode.toLowerCase() == "false") || (locale.toLowerCase() == "zh-cn"))
			{
				if (document.getElementById("priceSortMenuItem1") != null 
					&& document.getElementById("priceSortMenuItem1") != null)
				{
					document.getElementById("priceSortMenuItem1").style.display = "none";
					document.getElementById("priceSortMenuItem2").style.display = "none";
					if (document.getElementById("priceSortMenuItem1").outerHTML)
					{
						document.getElementById("priceSortMenuItem1").outerHTML = "";
					}
					if (document.getElementById("priceSortMenuItem2").outerHTML)
					{
						document.getElementById("priceSortMenuItem2").outerHTML = "";
					}
				}
				document.forms[0].showPriceRangeMenu.value = "false";
			}
		
			// Initialize Ajax services
			svcLocator = ServiceLocator.getInstance();
			svcLocator.registerService("getDataService", new GetProductsAndCategoriesService());
			svcLocator.registerService("addToBagService", new AddShoppingBagItemService());
			svcLocator.registerService("addSavedItemService", new AddSavedItemService());
			
			// Initialize product grid and product navigator components
			var prodGrid = new ProductGrid(document.getElementById("productsGrid"));
			var pageNav = new PageNavigator(document.getElementById("pagination"));
			prodGrid.setToolTip(ToolTipAdvanced.getInstance());
			// Initialize tooltip
			ToolTipAdvanced.getInstance().init("toolTipHolder");
			ToolTipAdvanced.getInstance().moveWithCursor = false;


		//	deferDropDownMenuRender = true;
			blockDropDownClicks = true;
			
			// Register some useful visual components for later access
			vwLocator = ViewLocator.getInstance();
			vwLocator.registerView("productsGridHolder", document.getElementById("divArrowsAndGrid"));
			vwLocator.registerView("productsGrid", prodGrid);
			vwLocator.registerView("navLinksHolder", document.getElementById("divBrowsePageLinks"));
			vwLocator.registerView("pageNavigator", pageNav);
			vwLocator.registerView("pageNumHolder", document.getElementById("pageOfPageText"));
			vwLocator.registerView("viewAllButton", document.getElementById("viewAll"));
			vwLocator.registerView("viewLessButton", document.getElementById("viewLess"));
			vwLocator.registerView("pageArrowLeft", document.getElementById("pageArrowLeft"));
			vwLocator.registerView("pageArrowRight", document.getElementById("pageArrowRight"));
			vwLocator.registerView("pageOfPageBar", document.getElementById("pageOfPageBar"));
			vwLocator.registerView("pagination", document.getElementById("pagination"));
			vwLocator.registerView("filterRow1", document.getElementById("filterRow1"));
			vwLocator.registerView("filterRow2", document.getElementById("filterRow2"));
			vwLocator.registerView("didYouMeanHolder", document.getElementById("divDidYouMeanHolder"));
			vwLocator.registerView("sortBy", document.getElementById("sortBy"));

			vwLocator.getView("productsGridHolder").style.visibility = "visible";
			
			vwLocator.getView("pageArrowLeft").firstChild.href = "javascript:handlePageLeft();";
			vwLocator.getView("pageArrowRight").firstChild.href = "javascript:handlePageRight();";
			vwLocator.getView("viewAllButton").firstChild.href = "javascript:handleViewAll();";
			vwLocator.getView("viewLessButton").firstChild.href = "javascript:handleViewLess();";

			// Set up grid definition data for view all scenario
			var viewAllProductsGrid = new ProductGridVO();
			viewAllProductsGrid.gridType = GRID_DIRECTION;
			viewAllProductsGrid.gridName = "viewAll";
			viewAllProductsGrid.numRows = -1;
			viewAllProductsGrid.pageSize = VIEW_ALL_THRESHOLD;

			// Set up grid definition data for view less scenario
			var viewPagedProductsGrid = new ProductGridVO();
			viewPagedProductsGrid.gridType = GRID_DIRECTION;
			viewPagedProductsGrid.gridName = "viewPaged";
			viewPagedProductsGrid.numRows = 3;
			viewPagedProductsGrid.pageSize = 12;
			
			// Clear out whatever static HTML was already in place
			prodGrid.setGridType(viewPagedProductsGrid.gridType);
			prodGrid.setProducts(["","","","","","","","","","","",""]);
			
			// Set up event handlers for all components
			var productGridHandler = new ProductGridEventHandler();
			subscribe(productGridHandler);

			var gridNavigationHandler = new GridNavigationEventHandler();
			subscribe(gridNavigationHandler);

			var browseControlsHandler = new BrowseControlsEventHandler();
			subscribe(browseControlsHandler);

			// Initialize model
			var hash = window.location.hash;
			var query = window.location.search.split("?").join("");
			var cidParam = URLFactory.extractQueryStringValue(query, "cid");
			var searchParams = URLFactory.extractQueryStringValue(query, "search_params");
			var stateSnapshot;
			
			model = ProductModel.getInstance();
			initDropdowns();
			model.addProductGrid(viewPagedProductsGrid);
			model.addProductGrid(viewAllProductsGrid);
			if (hash != "" && isAjaxEnabled() == true)
			{
				model.setStateSnapshot(URLFactory.convertHashToState(hash));
			}
			else if (searchParams != "")
			{
				stateSnapshot = URLFactory.convertHashToState(searchParams);
				if (cidParam != "")
				{
					stateSnapshot.category = cidParam;
				}
				model.setStateSnapshot(stateSnapshot);
			}
			else
			{
				stateSnapshot = model.getStateSnapshot();
				if (cidParam != "")
				{
					stateSnapshot.category = cidParam;
				}
				model.setStateSnapshot(stateSnapshot);
			}
			
			HistoryManager.getInstance().overrideBaseState(URLFactory.convertStateToHash(model.getStateSnapshot()));

			if (document.forms[0].elements["_UrlReferrer"])
			{
				// Manually set a referrer property, it's not otherwise coming through the normal page headers
				document.forms[0].elements["_UrlReferrer"].value = window.location.href;
			}
				
			// Initialize tooltip
			ToolTip.getInstance().init("toolTipHolder");
			
			if (isAjaxEnabled() == false)
			{
				svcLocator.getService("getDataService").getJSONData();
				if (model.getBrowseStates().pageSize > 12)
				{
					model.setCurrentProductGridName("viewAll");
				}
			}
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

function cookielessPageRefresh()
{
	var newSearchQueryString = URLFactory.convertStateToServiceHash(model.getStateSnapshot());
	var existingQueryString = window.location.search.split("?").join("");
	var newQueryString = URLFactory.updateQuery(existingQueryString, "search_params", newSearchQueryString);

	var query = window.location.search.split("?").join("");
	var sessionId = "";
	var sessionIdQSVal = URLFactory.extractQueryStringValue(query, "mysid2");
	var partnerId = "";
	var partnerIdQSVal = URLFactory.extractQueryStringValue(query, "partner");

	if (sessionIdQSVal != "")
	{
		sessionId = "&mysid2=" + sessionIdQSVal;
	}

	if (partnerIdQSVal != "")
	{
		partnerId = "&partner=" + partnerIdQSVal;
	}

	window.location.href = "CategoryBrowse.aspx?" + newQueryString + sessionId + partnerId;
}

function isAjaxlessRewriteNeeded()
{
	if (isAjaxEnabled() == false)
	{
		var hash = window.location.hash.split("#").join("");
		var existingQueryString = window.location.search.split("?").join("");
		var searchParams = URLFactory.extractQueryStringValue(existingQueryString, "search_params");

		if (hash != "" && searchParams == "")
		{
			return true;
		}
	}
	return false;
}

function rewriteURLAjaxToAjaxless()
{
	// If we are in ajaxless mode, then any hash information is not recognized by the server. If there
	// is no equivalent search_params query string value, then the page will not get rendered as intended.
	// This routine will rewrite the page URL to include hash variables in the search_params query string param.
	if (isAjaxEnabled() == false)
	{
		var hash = window.location.hash.split("#").join("");
		var existingQueryString = window.location.search.split("?").join("");
		var newQueryString = "";
		var searchParams = URLFactory.extractQueryStringValue(existingQueryString, "search_params");

		if (hash != "" && searchParams == "")
		{
			searchParams = URLFactory.convertHashToServiceHash(hash); // Clean out any client-side specific hash values
			newQueryString = URLFactory.updateQuery(existingQueryString, "search_params", searchParams);
			window.location.href = "CategoryBrowse.aspx?" + newQueryString + "#" + hash;
		}
	}
}

BrowserUtils.addOnLoadHandler(init);