﻿// -----------------------------------------------------------------
//   Description:
//	 Class that handles events on behalf of the product grid navigation controls
//   
//   Usage:
//   var g_gridNavigationEventHandler = new GridNavigationEventHandler();
//   subscribe(g_gridNavigationEventHandler);
// -----------------------------------------------------------------

var VIEW_ALL_THRESHOLD = 48;

function GridNavigationEventHandler()
{
}

// -----------------------------------------------------------------
// Function onGridSwitched
// Author:		Nathan Derksen
// Description:	Event handler called when grid switched between view all and view less
// Inputs:		<String> gridName - Name of the current product grid
//				<Object> gridProperties - Model data representing the current product grid
// Returns:		<nothing>
// -----------------------------------------------------------------
GridNavigationEventHandler.prototype.onGridSwitched = function(gridName, gridProperties)
{
	try
	{
		var vwLocator = ViewLocator.getInstance();
		
		var pageNav = vwLocator.getView("pageNavigator");
		pageNav.setNumPages(gridProperties.numPages);
		pageNav.setCurrentPage(gridProperties.currentPage);
		
		var pageLabel = vwLocator.getView("pageNumHolder");
		var numPages = gridProperties.numPages;
		if (numPages <= 0)
		{
			numPages = 1;
		}
		
		pageLabel.innerHTML = getPageLabelText(gridProperties.currentPage+1, numPages);
		
		if (numPages <= 1)
		{
			vwLocator.getView("pageOfPageBar").style.display = "none";
			vwLocator.getView("pagination").style.display = "none";
		}
		else
		{
			vwLocator.getView("pageOfPageBar").style.display = "inline";
			vwLocator.getView("pagination").style.display = "block";
		}

		if (gridName.toLowerCase() == "viewall")
		{
			vwLocator.getView("viewAllButton").style.display = "none";
			vwLocator.getView("viewLessButton").style.display = "block";
		}
		else
		{
			vwLocator.getView("viewAllButton").style.display = "block";
			vwLocator.getView("viewLessButton").style.display = "none";
		}
		
		updateBigProductNavArrows();
	}
	catch (err)
	{
		Debug.error(err);
	}
};

// -----------------------------------------------------------------
// Function onPageChanged
// Author:		Nathan Derksen
// Description:	Event handler called when a new page of products is displayed
// Inputs:		<Number> pageNum - The zero-based page number
//				<Object> gridProperties - Model data representing the current product grid
// Returns:		<nothing>
// -----------------------------------------------------------------
GridNavigationEventHandler.prototype.onPageChanged = function(pageNum, gridProperties)
{
	try
	{
		var vwLocator = ViewLocator.getInstance();

		var pageNav = vwLocator.getView("pageNavigator");	
		pageNav.setNumPages(gridProperties.numPages);
		pageNav.setCurrentPage(gridProperties.currentPage);
		
		var pageLabel = vwLocator.getView("pageNumHolder");
		var numPages = gridProperties.numPages;
		if (numPages <= 0)
		{
			numPages = 1;
		}
		pageLabel.innerHTML = getPageLabelText(pageNum+1, numPages);
		
		updateBigProductNavArrows();
	}
	catch (err)
	{
		Debug.error(err);
	}
};

// -----------------------------------------------------------------
// Function onNumResultsChanged
// Author:		Nathan Derksen
// Description:	Event handler called when a new search has been performed, which will result in a different number of hits
// Inputs:		<Number> numResults - The total number of products returned by the current search
//				<Object> gridProperties - Model data representing the current product grid
// Returns:		<nothing>
// -----------------------------------------------------------------
GridNavigationEventHandler.prototype.onNumResultsChanged = function(num, gridProperties)
{
	try
	{
		var gridName = ProductModel.getInstance().getCurrentProductGridName();
		var vwLocator = ViewLocator.getInstance();

		var pageNav = vwLocator.getView("pageNavigator");
		pageNav.setNumPages(gridProperties.numPages);
		
		var pageLabel = vwLocator.getView("pageNumHolder");
		var numPages = gridProperties.numPages;
		if (numPages <= 0)
		{
			numPages = 1;
		}
		pageLabel.innerHTML = getPageLabelText(gridProperties.currentPage+1, numPages);
		
		vwLocator.getView("navLinksHolder").style.visibility = "visible";

		if (numPages <= 1)
		{
			vwLocator.getView("pageOfPageBar").style.display = "none";
			vwLocator.getView("pagination").style.display = "none";
		}
		else
		{
			vwLocator.getView("pageOfPageBar").style.display = "inline";
			vwLocator.getView("pagination").style.display = "block";
		}

		var numResults = gridProperties.numResults;
		if (numResults > VIEW_ALL_THRESHOLD || numResults <= ProductModel.getInstance().getProductGrid("viewPaged").pageSize)
		{
			ProductModel.getInstance().setCurrentProductGridName("viewPaged");
			vwLocator.getView("viewAllButton").style.display = "none";
			vwLocator.getView("viewLessButton").style.display = "none";
		}
		else if (gridName.toLowerCase() == "viewall")
		{
			vwLocator.getView("viewAllButton").style.display = "none";
			vwLocator.getView("viewLessButton").style.display = "block";
		}
		else
		{
			vwLocator.getView("viewAllButton").style.display = "block";
			vwLocator.getView("viewLessButton").style.display = "none";
			
			// Omniture reporting - we want to know every time the view all button becomes visible
			s.pageName = document.title + " | View All Button Visible";
			void(s.t());
			GATrackCategoryBrowseEvent('View All Button Visible');
		}
		
		updateBigProductNavArrows();
	}
	catch (err)
	{
		Debug.error(err);
	}
};

// -----------------------------------------------------------------
// Function onSetStateSnapshot
// Author:		Nathan Derksen
// Description:	Set category menu selections based on state snapshot
// Inputs:		<Object> browseState - An object holding properties representing the selected value of each category browse drop-down
//				<Object> modelState - The state snapshot representing the state to represent
// Returns:		<nothing>
// -----------------------------------------------------------------
GridNavigationEventHandler.prototype.onSetStateSnapshot = function(browseState, modelState)
{
	try
	{
		var gridName = ProductModel.getInstance().getCurrentProductGridName();
		var gridProperties = ProductModel.getInstance().getProductGrid(gridName);

		var vwLocator = ViewLocator.getInstance();
		
		var pageNav = vwLocator.getView("pageNavigator");
		pageNav.setNumPages(gridProperties.numPages);
		pageNav.setCurrentPage(gridProperties.currentPage);
		
		var pageLabel = vwLocator.getView("pageNumHolder");
		var numPages = gridProperties.numPages;
		if (numPages <= 0)
		{
			numPages = 1;
		}
		pageLabel.innerHTML = getPageLabelText(gridProperties.currentPage+1, numPages);
		
		if (numPages <= 1)
		{
			vwLocator.getView("pageOfPageBar").style.display = "none";
			vwLocator.getView("pagination").style.display = "none";
		}
		else
		{
			vwLocator.getView("pageOfPageBar").style.display = "inline";
			vwLocator.getView("pagination").style.display = "block";
		}
		
		if (gridName.toLowerCase() == "viewall")
		{
			vwLocator.getView("viewAllButton").style.display = "none";
			vwLocator.getView("viewLessButton").style.display = "block";
		}
		else
		{
			vwLocator.getView("viewAllButton").style.display = "block";
			vwLocator.getView("viewLessButton").style.display = "none";
		}

		var numResults = gridProperties.numResults;
		if (numResults > VIEW_ALL_THRESHOLD)
		{
			ProductModel.getInstance().setCurrentProductGridName("viewPaged");
			vwLocator.getView("viewAllButton").style.display = "none";
			vwLocator.getView("viewLessButton").style.display = "none";
		}
		
		updateBigProductNavArrows();
	}
	catch (err)
	{
		Debug.error(err);
	}
};

// -----------------------------------------------------------------
// -----------------------------------------------------------------
function getPageLabelText(currentPage, numPages)
{
	var pageLabelText = "";
	
	if (document.forms[0].pageOfLabel)
	{
		pageLabelText = Formatters.formatLabel(document.forms[0].pageOfLabel.value, String(currentPage), String(numPages));
	}
	else
	{
		pageLabelText = Formatters.formatLabel("%1 OF %2", String(currentPage), String(numPages));
	}
	return pageLabelText;
}

// -----------------------------------------------------------------
// Function updateBigProductNavArrows
// Author:		Nathan Derksen
// Description:	Utility function to handle display of next/prev page arrows on either side of product grid
// Inputs:		<none>
// Returns:		<nothing>
// -----------------------------------------------------------------
function updateBigProductNavArrows()
{
	try
	{
		var pageNav = vwLocator.getView("pageNavigator");	
		
		if (pageNav.isLeftArrowVisible() == true)
		{
			vwLocator.getView("pageArrowLeft").style.visibility = "visible";
		}
		else
		{
			vwLocator.getView("pageArrowLeft").style.visibility = "hidden";
		}
		
		if (pageNav.isRightArrowVisible() == true)
		{
			vwLocator.getView("pageArrowRight").style.visibility = "visible";
		}
		else
		{
			vwLocator.getView("pageArrowRight").style.visibility = "hidden";
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}