﻿// ----------------------------------------------
// File:		ProductFactory.js
// Author:		Nathan Derksen
// Description:	Class to handle converting product information from one data format to another
// Example:
// var productsArray = ProductFactory.convertXMLToArray(result.documentElement);
// ----------------------------------------------

var imageCodeMap = new Array();
imageCodeMap["1002item"] = {template:"[sku]_m_[v].jpg", type:"smallImg"};
imageCodeMap["1003item"] = {template:"[sku]_m_over_[v].jpg", type:"smallOverImg"};
imageCodeMap["1002group"] = {template:"[sku]_m_[v].jpg", type:"smallImg"};
imageCodeMap["1003group"] = {template:"[sku]_m_over_[v].jpg", type:"smallOverImg"};
imageCodeMap["1065item"] = {template:"[sku]_l_[v].jpg", type:"largeImg"};
imageCodeMap["1066item"] = {template:"[sku]_l_over_[v].jpg", type:"largeOverImg"};
imageCodeMap["1065group"] = {template:"[sku]_l_[v].jpg", type:"largeImg"};
imageCodeMap["1066group"] = {template:"[sku]_l_over_[v].jpg", type:"largeOverImg"};


// ----------------------------------------------
// Function:	ProductFactory()
// Author:		Nathan Derksen
// Description:	Base class
// Inputs:		<None>
// Returns:		<Nothing>
// ----------------------------------------------
function ProductFactory()
{
}

// ----------------------------------------------
// Function:	ProductFactory.convertXMLToArray()
// Author:		Nathan Derksen
// Description:	Converts an XML based product list to an array of objects
// Inputs:		<XMLDOM> xmlData: A DOM handle to the root xml node returned by an Ajax call
// Returns:		<Array>: An array of objects, with property names id, name, and price.
// ----------------------------------------------
ProductFactory.convertXMLToArray = function(xmlData)
{
	var currentNode;
	var tempObject;
	var returnArray = new Array();
	var itemType;
	var images;
	var imageCode;
	var imageVersion;
	var imageType;
	var imagePath;
	var isGroup;
	var isPurchaseable;

	try
	{
		for (var i = 0; i < xmlData.childNodes.length; i++)
		{
			currentNode = xmlData.childNodes[i];
			if (currentNode.nodeName.toLowerCase() == "item")
			{
				itemType = "item";
				tempObject = {id:XMLUtils.getNodeValue(currentNode, "sku"),
					name:XMLUtils.getNodeValue(currentNode, "name"),
					price:XMLUtils.getNodeValue(currentNode, "price"),
					qs:XMLUtils.getNodeValue(currentNode, "qs"),
					smallImg:"/local/" + locale + "/Images/txt/placeholder_m.gif",
					smallOverImg:"/local/" + locale + "/Images/txt/placeholder_m_over.gif",
					largeImg:"/local/" + locale + "/Images/txt/placeholder_l.gif",
					largeOverImg:"/local/" + locale + "/Images/txt/placeholder_l_over.gif"
				};
				isGroup = XMLUtils.getNodeValue(currentNode, "isGroup");
				tempObject.isGroup = (isGroup == "true");
				isPurchaseable = XMLUtils.getNodeValue(currentNode, "isPurchasable");
				tempObject.isPurchaseable = (isPurchaseable != "false");
					
				if (XMLUtils.getNode(currentNode, "defaultSku") != null)
				{
					tempObject.defaultSku = XMLUtils.getNodeValue(currentNode, "defaultSku");
				}
				
				if (tempObject.id.toUpperCase().indexOf("GRP") > -1)
				{
					itemType = "group";
				}
				
				images = currentNode.getElementsByTagName("img");
				for (var j=0; j < images.length; j++)
				{
					imageVersion = XMLUtils.getNodeAttribute(images[j], "V");
					imageCode = images[j].attributes.getNamedItem("id").value;
					imageType = ProductFactory.getImageType(itemType, imageCode);
					imagePath = XMLUtils.getNodeAttribute(images[j], "file");
					if (imagePath != "")
					{
						tempObject[imageType] = imagePath;
					}
					else
					{
						tempObject[imageType] = ProductFactory.getImagePath(tempObject.id, tempObject.defaultSku, imageVersion, itemType, imageCode);
					}
				}

				returnArray.push(tempObject);
			}
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
	return returnArray;
};

// ----------------------------------------------
// Function:	ProductFactory.convertJSONToArray()
// Author:		Nathan Derksen
// Description:	Converts an XML based product list to an array of objects
// Inputs:		<XMLDOM> xmlData: A DOM handle to the root xml node returned by an Ajax call
// Returns:		<Array>: An array of objects, with property names id, name, and price.
// ----------------------------------------------
ProductFactory.convertJSONToArray = function(JSONData)
{
	var currentNode;
	var tempObject;
	var returnArray = new Array();
	var itemType;
	var images;
	var imageCode;
	var imageVersion;
	var imageType;

	try
	{
		for (var i = 0; i < JSONData.length; i++)
		{
			currentNode = JSONData[i];
			tempObject = {id:currentNode.id,
				name:currentNode.name,
				price:currentNode.price,
				qs:currentNode.qs};
			if (currentNode.defaultSku != null)
			{
				tempObject.defaultSku = currentNode.defaultSku;
			}
				
			itemType = "item";
			if (tempObject.id.toUpperCase().indexOf("GRP") > -1)
			{
				itemType = "group";
			}

			images = currentNode.imgs.split("#");
			for (var j=0; j < images.length; j++)
			{
				imageArr = images[j].split(":");
				imageVersion = imageArr[0];
				imageCode = imageArr[1];
				imageType = ProductFactory.getImageType(itemType, imageCode);
				if (imageArr.length > 2 && imageArr[2] != null && imageArr[2] != "")
				{
					tempObject[imageType] = imageArr[2];
				}
				else
				{
					tempObject[imageType] = ProductFactory.getImagePath(tempObject.id, tempObject.defaultSku, imageVersion, itemType, imageCode);
				}
			}
			
			returnArray.push(tempObject);
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
	return returnArray;
};

// ----------------------------------------------
// Function:	ProductFactory.getTotalNumProducts()
// Author:		Nathan Derksen
// Description:	Retrieves the numHits root node attribute from the returned xml
// Inputs:		<XMLDOM> xmlData: A DOM handle to the root xml node returned by an Ajax call
// Returns:		<Number> The total number of products in the search query (beyond just the current page)
// ----------------------------------------------
ProductFactory.getTotalNumProducts = function(xmlData)
{
	try
	{
		if (xmlData)
		{
			return Number(xmlData.attributes.getNamedItem("numHits").value);
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
	return null;
};

// ----------------------------------------------
// ----------------------------------------------
ProductFactory.getImagePath = function(lSku, lDefaultSku, lVersion, lItemType, lCode)
{
	var returnPath = "";
	var valid = true;
	var sku = "";
	var version = "";
	var itemType = "";
	var code = "";
	
	var IMAGE_ROOT_DIR = "/shared/media/products/";
	
	try
	{
		if (lSku)
		{
			sku = lSku;
		}
		
		if (lDefaultSku)
		{
			sku = lDefaultSku;
		}
		
		if (typeof(lVersion) != "undefined" && lVersion != null && lVersion != "")
		{
			version = "_" + lVersion;
		}
		
		if (lItemType)
		{
			itemType = lItemType;
		}
		
		if (lCode)
		{
			code = lCode;
		}
		
		if (imageCodeMap[code + itemType])
		{
			if (sku != "")
			{
				returnPath = imageCodeMap[code + itemType].template;
				returnPath = IMAGE_ROOT_DIR + returnPath.split("[sku]").join(sku).split("_[v]").join(version);
				return returnPath;
			}
		}
	}
	catch (err)
	{
		Debug.error(err);
	}
	return "";
};

// ----------------------------------------------
// ----------------------------------------------
ProductFactory.getImageType = function(itemType, code)
{
	if (imageCodeMap[code + itemType])
	{
		return imageCodeMap[code + itemType].type;
	}
	return "";
};

// ----------------------------------------------
// Function:	ProductFactory.getTotalNumProducts()
// Author:		Nathan Derksen
// Description:	Retrieves the numHits root node attribute from the returned xml
// Inputs:		<XMLDOM> xmlData: A DOM handle to the root xml node returned by an Ajax call
// Returns:		<Number> The total number of products in the search query (beyond just the current page)
// ----------------------------------------------
ProductFactory.getShowSortMenu = function(xmlData)
{
	try
	{
		if (xmlData)
		{
			if (xmlData.attributes.getNamedItem("showSortBy") != null)
			{
				var showSort = xmlData.attributes.getNamedItem("showSortBy").value;
				if (showSort.toLowerCase() == "false")
				{
					return false;
				}
			}
		}
		return true;
	}
	catch (err)
	{
		Debug.error(err);
	}
	return true;
};