﻿// -----------------------------------------------------------------
//   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 (vwLocator.getView("viewRelatedButton") != null && vwLocator.getView("viewRelatedButton").innerHTML != "&nbsp;"
			&& vwLocator.getView("viewProductsButton") != null && vwLocator.getView("viewProductsButton").innerHTML != "&nbsp;")
		{
			if (gridName.toLowerCase() == "viewrelated")
			{
				vwLocator.getView("viewRelatedButton").style.display = "none";
				vwLocator.getView("viewProductsButton").style.display = "block";
			}
			else
			{
				vwLocator.getView("viewRelatedButton").style.display = "block";
				vwLocator.getView("viewProductsButton").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(numResults, gridProperties)
{
	try
	{
		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";
		}

		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 (vwLocator.getView("viewRelatedButton") != null && vwLocator.getView("viewRelatedButton").innerHTML != "&nbsp;"
			&& vwLocator.getView("viewProductsButton") != null && vwLocator.getView("viewProductsButton").innerHTML != "&nbsp;")
		{
			if (gridName.toLowerCase() == "viewrelated")
			{
				vwLocator.getView("viewRelatedButton").style.display = "none";
				vwLocator.getView("viewProductsButton").style.display = "block";
			}
			else
			{
				vwLocator.getView("viewRelatedButton").style.display = "block";
				vwLocator.getView("viewProductsButton").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);
	}
}