﻿// ----------------------------------------------
// File:		URLFactory.js
// Author:		Nathan Derksen
// Description:	Class to handle converting URL parameters to StateSnapshotVO
// Example:
// var stateObj = URLFactory.convertHashToState(window.location.href);
// ----------------------------------------------


// ----------------------------------------------
// Function:	URLFactory()
// Author:		Nathan Derksen
// Description:	Base class
// Inputs:		<None>
// Returns:		<Nothing>
// ----------------------------------------------
function LocationsURLFactory()
{
}

var locationsIntToExtStateMap = {
	searchTerms:"t",
	popup:"pu",
	mapMode:"mm",
	listMode:"lm",
	latitude:"la",
	longitude:"lo",
	zoomLevel:"z",
	directionsAddress:"da",
	directionsMode:"dm",
	infoDirectionsOpen:"ido",
	storeId:"sid",
	flash:"f",
	infoWindowId:"iw",
	infoTab:"it"
};

var locationsExtToIntStateMap = {
	t:"searchTerms",
	pu:"popup",
	mm:"mapMode",
	lm:"listMode",
	la:"latitude",
	lo:"longitude",
	z:"zoomLevel",
	da:"directionsAddress",
	dm:"directionsMode",
	ido:"infoDirectionsOpen",
	sid:"storeId",
	f:"flash",
	iw:"infoWindowId",
	it:"infoTab"
};


// ----------------------------------------------
// Function:	ProductFactory.convertHashToState()
// Author:		Nathan Derksen
// Description:	Converts a URL with parameters in an anchor to fill a StateSnapshotVO object
// Inputs:		<String> url: The URL from the address bar
// Returns:		<StateSnapshotVO>: An object with properties to hold the state values
// ----------------------------------------------
LocationsURLFactory.convertHashToState = function(hash)
{
//	Debug.windowTrace("convertHashToState: " + hash);
	var snapshot = new LocationsStateSnapshotVO();
	var splitURL;
	var anchor;
	var hashArray;
	var splitItem;
	var mappedProperty;
	var valueName;
	var tempVal;

	if (hash)
	{
		hash = hash.split("#").join("");
		hashArray = hash.split("-");
		for (var i=0; i < hashArray.length; i++)
		{
			splitItem = hashArray[i].split("+");
			valueName = splitItem[0];
			if (splitItem.length >= 2)
			{
				mappedProperty = locationsExtToIntStateMap[valueName];
				splitItem.shift();
				
				if (mappedProperty)
				{
					switch(mappedProperty.toLowerCase())
					{
						case "searchterms":
							snapshot.searchTerms = unescape(splitItem.join("+"));
							break;
						case "popup":
							snapshot.popup = unescape(splitItem.join("+"));
							break;
						case "mapmode":
							snapshot.mapMode = unescape(splitItem.join("+"));
							break;
						case "listmode":
							snapshot.listMode = unescape(splitItem.join("+"));
							break;
						case "latitude":
							snapshot.latitude = Number(unescape(splitItem.join("+")).split("*").join("-"));
							break;
						case "longitude":
							snapshot.longitude = Number(unescape(splitItem.join("+")).split("*").join("-"));
							break;
						case "zoomlevel":
							snapshot.zoomLevel = Number(unescape(splitItem.join("+")));
							break;
						case "directionsaddress":
							snapshot.directionsAddress = unescape(splitItem.join("+"));
							break;
						case "directionsmode":
							snapshot.directionsMode = unescape(splitItem.join("+"));
							break;
						case "infodirectionsopen":
							tempVal = unescape(splitItem.join("+"));
							snapshot.infoDirectionsOpen = false;
							if (tempVal.toLowerCase() == "true")
							{
								snapshot.infoDirectionsOpen = true;
							}
							break;
						case "storeid":
							snapshot.storeId = unescape(splitItem.join("+"));
							break;
						case "flash":
							snapshot.flash = unescape(splitItem.join("+"));
							break;
						case "infowindowid":
							snapshot.infoWindowId = unescape(splitItem.join("+"));
							break;
						case "infotab":
							snapshot.infoTab = unescape(splitItem.join("+"));
							break;
					}
				}
			}
		}
	}
	return snapshot;
};

// ----------------------------------------------
// Function:	ProductFactory.convertStateToHash()
// Author:		Nathan Derksen
// Description:	Converts a StateSnapshotVO object to a URL with parameters in an anchor
// Inputs:		<StateSnapshotVO> stateSnapshot: An object with properties to hold the state values
// Returns:		<String>: The URL from the address bar
// ----------------------------------------------
LocationsURLFactory.convertStateToHash = function(stateSnapshot)
{
	var stateArray = new Array();
	var newStateStr = "";

	var productGrid = ProductModel.getInstance().getProductsComplete();
	var sortCriteria = "";
	var sampleQueryString = "";
	
	if (productGrid.length > 0)
	{
		sampleQueryString = productGrid[0].qs;
		sortCriteria = LocationsURLFactory.extractValue(sampleQueryString, "sortCriteria");
	}
	
	for (var item in stateSnapshot)
	{
		switch(item.toLowerCase())
		{
			case "searchterms":
			case "mapmode":
			case "listmode":
			case "zoomlevel":
			case "directionsaddress":
			case "directionsmode":
			case "infodirectionsopen":
			case "storeid":
			case "popup":
			case "flash":
			case "infowindowid":
			case "infotab":
				stateArray.push(locationsIntToExtStateMap[item] + "+" + escape(String(stateSnapshot[item])));
				break;
			case "latitude":
			case "longitude":
				stateArray.push(locationsIntToExtStateMap[item] + "+" + escape(String(stateSnapshot[item]).split("-").join("*")));
				break;
		}
	}
	
	newStateStr = stateArray.join("-");
	return newStateStr;
};

// ----------------------------------------------
// ----------------------------------------------
LocationsURLFactory.updateHash = function(inputHash, criteria, value)
{
	var hashArray = inputHash.split("-");
	var splitItem;
	
	for (var i=0; i < hashArray.length; i++)
	{
		splitItem = hashArray[i].split("+");
		if (locationsExtToIntStateMap[splitItem[0]] == criteria)
		{
			hashArray[i] = splitItem[0] + "+" + value;
		}
	}
	return hashArray.join("-");
};

// ----------------------------------------------
// ----------------------------------------------
LocationsURLFactory.updateQuery = function(inputQuery, criteria, value)
{
	var queryArray = inputQuery.split("&");
	var splitItem;
	var itemFound = false;
	
	for (var i=0; i < queryArray.length; i++)
	{
		splitItem = queryArray[i].split("=");
		if (splitItem[0] == criteria)
		{
			queryArray[i] = splitItem[0] + "=" + value;
			itemFound = true;
		}
	}
	if (itemFound == false)
	{
		queryArray.push(criteria + "=" + value);
	}
	return queryArray.join("&");
};

// ----------------------------------------------
// ----------------------------------------------
LocationsURLFactory.extractValue = function(inputHash, criteria)
{
	var hashArray = inputHash.split("-");
	var splitItem;
	var valueName;
	
	for (var i=0; i < hashArray.length; i++)
	{
		splitItem = hashArray[i].split("+");
		valueName = splitItem[0];
		splitItem.shift();
		if (locationsExtToIntStateMap[valueName] == criteria)
		{
//		alert("extractValue: " + criteria + ":" + splitItem.join("+"));
			return splitItem.join("+");
		}
	}
	return "";
};

// ----------------------------------------------
// ----------------------------------------------
LocationsURLFactory.extractQueryStringValue = function(inputQueryString, criteria)
{
	var queryStringArray = inputQueryString.split("?").join("").split("&");
	var splitItem;
	
	for (var i=0; i < queryStringArray.length; i++)
	{
		splitItem = queryStringArray[i].split("=");
		if (splitItem[0].toLowerCase() == criteria.toLowerCase())
		{
			return splitItem[1];
		}
	}
	return "";
};

// ----------------------------------------------
// ----------------------------------------------
LocationsURLFactory.hashEscape = function(oldHash)
{
	var newHash = oldHash;
	newHash = escape(newHash);
	newHash = newHash.split("-").join("%45");
	newHash = newHash.split("+").join("%43");
	return newHash;
}

// ----------------------------------------------
// ----------------------------------------------
LocationsURLFactory.hashUnescape = function(oldHash)
{
	var newHash = oldHash;
	newHash = newHash.split("%45").join("-");
	newHash = newHash.split("%43").join("+");
	newHash = unescape(newHash);
	return newHash;
}