// Setup global vars
var model;
var svcLocator;
var vwLocator;
var sortByCriteria = "";

var itemZoomProperties = {
	maskColor: "#FFFFFF",
	thumbnailHilightColor: "#66CCCC",
	thumbnailBorderColor: "#EAEAEA",
	thumbnailBackgroundColor: "#FFFFFF",
	backgroundColor: "#FFFFFF"
};

function handleImagesPerPage(menuHandle)
{
	try
	{
		var numImages = 12;
		if (menuHandle.selectedIndex > -1)
		{
			numImages = Number(menuHandle.options[menuHandle.selectedIndex].value);
			model.updateGridPageSize("viewPaged", numImages, numImages / 6);
			updateSelects();
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch(err)
	{
		Debug.error(err);
	}
}

// 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 handleViewProducts()
{
	try
	{
		if (isAjaxEnabled() == false)
		{
			cookielessPageRefresh("viewPaged");
		}
		else
		{
			model.setCurrentProductGridName("viewPaged");
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
}

// ----------------------------------------------
// ----------------------------------------------
function handleViewDetails(id)
{
	//ImageDetails will resize itself, so pass in smaller size for initial layout
	pr_createPopUp(814,600,true,this,88,'ImageDetails.aspx?id=' + id);
}

// ----------------------------------------------
// ----------------------------------------------
function handleAddImage(id)
{

    if(ServiceLocator.getInstance().getService("addImageService") == null) 
	  {	       
	   ServiceLocator.getInstance().registerService("addImageService", new AddImageService());	        
	  }
	  
	ServiceLocator.getInstance().getService("addImageService").addImage(id);
}

// ----------------------------------------------
// ----------------------------------------------
function handleSearch()
{
	try
	{
		var hash = window.location.hash;
		var previousSearchTerms = URLFactory.extractValue(hash, "searchTerms");
		var searchTerms = document.getElementById("prSearchImagesTerm").value;
		var refine = document.getElementById("chkRefine").checked;

		if (searchTerms == "")
		{
			document.getElementById("rfvSearchTerm").style.visibility = "visible";
		}
		else
		{
			document.getElementById("rfvSearchTerm").style.visibility = "hidden";
			
			if (refine == true && previousSearchTerms != "")
			{
				searchTerms = previousSearchTerms + "|" + searchTerms;
			}
			
			if (refine == false)
			{
				model.setBrowseStates({searchTerms:searchTerms, refinement:refine, useCategory:"false"});
			}
			else
			{
				model.setBrowseStates({searchTerms:searchTerms, refinement:refine});
			}
			
			s.eVar2 = searchTerms;
			void(s.t());
			
			HistoryManager.getInstance().addHistoryItem(URLFactory.convertStateToHash(model.getStateSnapshot()));
		}
	}
	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
	{
		// Suppress errors - only known workaround for Flash 9 ExternalInterface bug
		window.onerror = function(message, URL, line)
		{
			return true;
		};

		HistoryManager.getInstance().disableHistory();

		setTimeout("initEnterKeyHandler()", 1000);

		// Initialize Ajax services
		svcLocator = ServiceLocator.getInstance();
		svcLocator.registerService("getDataService", new GetImagesService());
		svcLocator.registerService("addImageService", new AddImageService());
		
		// Initialize product grid and product navigator components
		var prodGrid = new ProductGrid(document.getElementById("divRelItems"));
		var pageNav = new PageNavigator(document.getElementById("relItemPagination"));
		
		// Register some useful visual components for later access
		vwLocator = ViewLocator.getInstance();
		vwLocator.registerView("productsGridHolder", document.getElementById("relItemsGrid"));
		vwLocator.registerView("productsGrid", prodGrid);
		vwLocator.registerView("navLinksHolder", document.getElementById("divRelItemLinks"));
		vwLocator.registerView("pageNavigator", pageNav);
		vwLocator.registerView("pageNumHolder", document.getElementById("pageOfPageText"));
		vwLocator.registerView("pageArrowLeft", document.getElementById("relItemsArrowLft"));
		vwLocator.registerView("pageArrowRight", document.getElementById("relItemsArrowRht"));
		vwLocator.registerView("pageOfPageBar", document.getElementById("pageOfPageBar"));
		vwLocator.registerView("pagination", document.getElementById("relItemPagination"));
		
		vwLocator.getView("productsGridHolder").style.visibility = "visible";
		
		vwLocator.getView("pageArrowLeft").firstChild.href = "javascript:handlePageLeft();";
		vwLocator.getView("pageArrowRight").firstChild.href = "javascript:handlePageRight();";

		// Initialize model
		var hash = window.location.hash;
		var query = window.location.search.split("?").join("");
		var cid = URLFactory.extractQueryStringValue(query, "cid");
		var mcat = URLFactory.extractQueryStringValue(query, "mcat");
		var pageSize = URLFactory.extractValue(hash, "pageSize");
		var searchTerms = URLFactory.extractValue(hash, "searchTerms");
		var refine = URLFactory.extractValue(hash, "refinement");
		var useCategory = URLFactory.extractValue(hash, "useCategory");
		
		if (typeof(pageSize) == "undefined" || pageSize == null || pageSize == "")
		{
			pageSize = "18";
		}

		// Set up grid definition data for view all scenario
		var viewProductsGrid = new ProductGridVO();
		viewProductsGrid.gridType = "uniform";
		viewProductsGrid.gridName = "viewPaged";
		viewProductsGrid.numRows = Math.ceil(pageSize/6);
		viewProductsGrid.pageSize = pageSize;
		
		// Clear out whatever static HTML was already in place
		prodGrid.setGridType(viewProductsGrid.gridType);
		prodGrid.setToolTip(ToolTipAdvanced.getInstance());
		prodGrid.setProducts(["","","","","","","","","","","","","","","","","",""]);
		
		document.getElementById("container").style.height = (535 + (viewProductsGrid.numRows - 1) * 150) + "px";
		
		// Set up event handlers for all components
		var productGridHandler = new ProductGridEventHandler();
		subscribe(productGridHandler);

		var gridNavigationHandler = new GridNavigationEventHandler();
		subscribe(gridNavigationHandler);

		model = ProductModel.getInstance();
		model.addProductGrid(viewProductsGrid);
		model.categoryName = LABEL_CATEGORY_NAME;
		
		if (useCategory == "false")
		{
			model.setBrowseStatesNoSideEffects({useCategory:"false"});
		}
		else
		{
			model.setBrowseStatesNoSideEffects({useCategory:"true"});
		}
		
		if (document.forms[0].hidSearchString.value != "" && document.forms[0].prSearchImagesTerm.value == "")
		{
			// Search submission happened from image search page
			setSearchBoxValue(document.forms[0].hidSearchString.value);
			handleSearch();
		}
		else if (document.forms[0].prSearchImagesTerm.value != "")
		{
			// There is something in the search field
			handleSearch();
		}
		else if (hash != "" && isAjaxEnabled() == true)
		{
			if (URLFactory.extractValue(hash, "searchTerms") != "")
			{
				setSearchBoxValue(searchTerms);
				DisplayTitle();
				if (refine == "true" || refine == true)
				{
					document.getElementById("chkRefine").checked = true;
				}
				else
				{
					document.getElementById("chkRefine").checked = false;
				}
			}
			// There is a hash set on the URL
			model.setStateSnapshot(URLFactory.convertHashToState(hash));
		}
		else
		{
			// Take the default values
			var stateSnapshot = model.getStateSnapshot();
			model.setStateSnapshot(stateSnapshot);
		}

		HistoryManager.getInstance().overrideBaseState(URLFactory.convertStateToHash(model.getStateSnapshot()));

		// Initialize tooltip
		ToolTipAdvanced.getInstance().init("toolTipHolder");
		ToolTipAdvanced.getInstance().moveWithCursor = false;


		for (var i = 0; document.forms[0].imagesPerPage.options.length; i++)
		{
			if (document.forms[0].imagesPerPage.options[i].value == pageSize)
			{
				document.forms[0].imagesPerPage.selectedIndex = i;
				break;
			}
		}
		updateSelects();
		
		document.getElementById("pageTitleHolder").style.display = "block";
		DisplayTitle();
	}
	catch (err)
	{
		Debug.error(err);
	}
}

function cookielessPageRefresh(selectedGrid)
{
	var newSearchParamsString = URLFactory.convertStateToServiceHash(model.getStateSnapshot());
	var existingQueryString = window.location.search.split("?").join("");
	var currentGrid = model.getCurrentProductGridName();
	var newQueryString = existingQueryString;

	var previousPageNum = URLFactory.extractQueryStringValue(existingQueryString, "pp");	
	if (previousPageNum == "")
	{
		previousPageNum = "1";
	}
	
	var existingPageNum = String(model.getPageNum() + 1);
	if (model.getPageNum() < 0 || existingPageNum == null || typeof(existingPageNum) == "undefined")
	{
		existingPageNum = "1";
	}

	newSearchParamsString = URLFactory.updateHash(newSearchParamsString, "currentPage", previousPageNum);
	newQueryString = URLFactory.updateQuery(newQueryString, "pp", existingPageNum);

	newQueryString = URLFactory.updateQuery(newQueryString, "search_params", newSearchParamsString);
	window.location.search = newQueryString;
}

function setSearchBoxValue(searchVal)
{
	var splitSearchVal = searchVal.split("|");
	if (splitSearchVal.length == 0)
	{
		document.forms[0].prSearchImagesTerm.value = "";
	}
	else
	{
		document.forms[0].prSearchImagesTerm.value = splitSearchVal[splitSearchVal.length-1];
	}
}

function initEnterKeyHandler()
{
	document.getElementById("prSearchImagesTerm").onkeypress = handleSearchKeyPress;
}

function handleSearchKeyPress(evt)
{
	var evt  = (evt) ? evt : ((event) ? event : null);
	var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);

	if (evt.keyCode == 13) 
	{ 
		handleSearch();
		DisplayTitle();
		return false; 
	}
}

BrowserUtils.addOnLoadHandler(init);