﻿// ----------------------------------------------
// File:		GetEngagementCatalogService.js
// Author:		Nathan Derksen
// Description:	A class that holds the available service methods, along with response handlers.
// Example:
// GetEngagementCatalogService.getInstance().getData(searchCriteria, 0, 12);
// ----------------------------------------------

var GetEngagementCatalogService_service = null;
var GetEngagementCatalogService_fullResults = null;
var GetEngagementCatalogService_currentPage = 0;

// ----------------------------------------------
// Function:	GetEngagementCatalogService
// Author:		Nathan Derksen
// Description:	Base class
// Inputs:		<none>
// Returns:		<nothing>
// ----------------------------------------------
function GetEngagementCatalogService()
{
}

// ----------------------------------------------
// Function:	GetProductsService.getProducts
// Author:		Nathan Derksen
// Description:	Calls the service to retrieve a set of products
// Inputs:		<Object> searchCriteria - An object of properties to search on
//				<Number> startIndex - The zero-based index of which row to start at in the total results
//				<Number> maxResults - The maximum number of results to return
// Returns:		<nothing>
// ----------------------------------------------
GetEngagementCatalogService.prototype.getData = function(queryString)
{
	try
	{
		if (typeof (queryString) != "undefined" && queryString != null && queryString != "")
		{
			GetEngagementCatalogService_currentPage = Number(URLFactory.extractValue(queryString, "currentPage"));
		}

		if (isAjaxEnabled() == true)
		{
			// Check to see if the list of products has already been loaded. If it has,
			// just update the list of products to show, otherwise start the data load
			// and update once the load has completed.
			if (GetEngagementCatalogService_fullResults == null)
			{
				var executor = new Sys.Net.XMLHttpExecutor();
				GetEngagementCatalogService_service = new Sys.Net.WebRequest();
				GetEngagementCatalogService_service.set_url("/Engagement/dataprovider.aspx");
				GetEngagementCatalogService_service.add_completed(this.onResult);
				GetEngagementCatalogService_service.set_executor(executor);
				executor.executeRequest();
			}
			else
			{
				GetEngagementCatalogService_updateResults();
			}
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
};

// ----------------------------------------------
// Function:	GetProductsAndCategoriesService.getProducts
// Author:		Nathan Derksen
// Description:	Calls the service to retrieve a set of products
// Inputs:		<Object> searchCriteria - An object of properties to search on
//				<Number> startIndex - The zero-based index of which row to start at in the total results
//				<Number> maxResults - The maximum number of results to return
// Returns:		<nothing>
// ----------------------------------------------
GetEngagementCatalogService.prototype.getJSONData = function()
{
	try
	{
		var resultProductArray = [];
		if (typeof(tblData) != "undefined")
		{
			resultProductArray = ProductFactory.convertJSONToArray(tblData);
		}
		
		var numHits = 0;
		if (typeof(gridData) != "undefined")
		{
			numHits = gridData.numHits;
		}

		var productsGrid = ViewLocator.getInstance().getView("productsGrid");
		productsGrid.setProducts(resultProductArray);
		
		var model = ProductModel.getInstance();
		model.setNumProducts(numHits);
		model.setProducts(resultProductArray);	
	}
	catch (err)
	{
		Debug.error(err);
	}
};

// ----------------------------------------------
// Function:	GetProductsService.onResult
// Author:		Nathan Derksen
// Description:	Callback from the successful completion of the service call
// Inputs:		<XMLElement> result - Handle to the results xml object
// Returns:		<nothing>
// ----------------------------------------------
GetEngagementCatalogService.prototype.onResult = function(executor, eventArgs) {
	try {
		if (executor.get_responseAvailable() && executor.get_statusCode() == 200) {
			//			alert("Request Status: [" + executor.get_statusCode() + " " + executor.get_statusText() + "]");
			//			alert(executor.get_xml().documentElement);
			var model = ProductModel.getInstance();
			var productGrid = model.getProductGrid("viewPaged");
			var resultElements = executor.get_xml().documentElement;
			var resultArray = ProductFactory.convertEngagementXMLToArray(resultElements, productGrid.imageSize);
			var numHits = resultArray.length;

			GetEngagementCatalogService_fullResults = resultArray;

			model.setNumProducts(numHits);
			GetEngagementCatalogService_updateResults();
		}
		else {
			var tempArray = new Array();
			var productsGrid = ViewLocator.getInstance().getView("productsGrid");
			productsGrid.setProducts(tempArray);

			var error = new Object();
			error.name = "Service 'GetProductsService' returned with no results";
			error.message = error.name;
			error.fileName = "itemPage/GetProductsService.js";
			error.lineNumber = "";
			Debug.error(error);
		}
		/*		if (result)
		{
		var resultElements = result.documentElement;
		var resultArray = ProductFactory.convertXMLToArray(resultElements);
		var numHits = ProductFactory.getTotalNumProducts(resultElements);

			var productsGrid = ViewLocator.getInstance().getView("productsGrid");
		productsGrid.setProducts(resultArray);

			var model = ProductModel.getInstance();
		model.setNumProducts(numHits);
		model.setProducts(resultArray);
		}
		else
		{
		var tempArray = new Array();
		var productsGrid = ViewLocator.getInstance().getView("productsGrid");
		productsGrid.setProducts(tempArray);
			
		var error = new Object();
		error.name = "Service 'GetProductsService' returned with no results";
		error.message = error.name;
		error.fileName = "itemPage/GetProductsService.js";
		error.lineNumber = "";
		Debug.error(error);
		}*/
	}
	catch (err) {
		Debug.error(err);
	}
};

// ----------------------------------------------
// Function:	GetEngagementCatalogService.onError
// Author:		Nathan Derksen
// Description:	Callback from the unsuccessful completion of the service call
// Inputs:		<XMLElement> result - Handle to the results xml object
// Returns:		<nothing>
// ----------------------------------------------
GetEngagementCatalogService.prototype.onError = function(result)
{
	var tempArray = new Array();
	var productsGrid = ViewLocator.getInstance().getView("productsGrid");
	productsGrid.setProducts(tempArray);
	
	var error = new Object();
	error.name = "Service 'GetProductsService' returned with an error";
	error.message = result.get_message();
	error.fileName = "itemPage/GetProductsService.js";
	error.lineNumber = "";
	Debug.error(error);
};

// ----------------------------------------------
// ----------------------------------------------
GetEngagementCatalogService_updateResults = function()
{
	if (GetEngagementCatalogService_fullResults != null)
	{
		var tempList = [];
		var thumbnailsPerPage = 4;
		var start = (GetEngagementCatalogService_currentPage-1) * thumbnailsPerPage;
		var end = start + thumbnailsPerPage;

		if (end > GetEngagementCatalogService_fullResults.length)
		{
			end = GetEngagementCatalogService_fullResults.length;
		}

		for (var i = start; i < end; i++)
		{
			tempList.push(GetEngagementCatalogService_fullResults[i]);
		}

		var productsGrid = ViewLocator.getInstance().getView("productsGrid");
		productsGrid.setProducts(tempList);

		var model = ProductModel.getInstance();
		model.setProducts(tempList);
	}
};
