/** --------------------------------------------------------------------
 HashMap - Even though all objects in JavaScript are essentially 
	hashtables under the covers, HashMap proves useful in situations 
	where you want to iterate over the explicitly-added elements 
	(key-value pairs) of an array, without tripping over implicitly-
	included properties and methods.
--------------------------------------------------------------------- */
function HashMap()
{
	function init() 
	{
		map = new Array();
	};
	
	var map = null;
	var self = this;
    init();

	this.clear = function()
	{
		map = new Array();
	};
	
	this.containsKey = function(key)
	{
		var result = false;
		if (this.indexOfKey(key) != -1)
		{
			result = true;
		}
	
		return result;
	};
	
	this.containsValue = function(value)
	{
		var result = false;
		if (this.indexOfValue(value) != -1)
		{
			result = true;
		}
	
		return result;
	};
	
	this.get = function(key)
	{
		var result;
		var index = this.indexOfKey(key);
	
		if (index != -1)
		{
			result = map[index]["value"];
		}
	
		return result;
	};
	
	this.keySet = function()
	{
		var result = new Array();
		var limit = map.length;
		for (var index = 0; index < limit; index++)
		{
			result.push(map[index]["key"]);
		}
	
		return result;
	};
	
	this.put = function(key, value)
	{
		var index = this.indexOfKey(key);
	
		if (index < 0)
		{
			index = map.length;
		}
	
		map[index] = new Array();
		map[index]["key"] = key;
		map[index]["value"] = value;
	};
	
	this.remove = function(key)
	{
		var result = false;
		var index = this.indexOfKey(key);
	
		if (index > -1)
		{
			map.splice(index, 1);
			result = true;
		}
	
		return result;
	};
	
	this.size = function()
	{
		return map.length;
	};
	
	this.values = function()
	{
		var result = new Array();
	
		var limit = map.length;
		for (var index = 0; index < limit; index++)
		{
			result.push(map[index]["value"]);
		}
	
		return result;
	};
	
	this.indexOfKey = function(key)
	{
		var result = -1;
		
		var limit = map.length;
		for (var index = 0; index < limit; index++)
		{
			if (map[index]["key"] == key)
			{
				result = index;
				break;
			}
		}
	
		return result;
	};
	
	this.indexOfValue = function(value)
	{
		var result = -1;
	
		var limit = map.length;
		for (var index = 0; index < limit; index++)
		{
			if (map[index]["value"] == value)
			{
				result = index;
				break;
			}
		}
	
		return result;
	};
  
    this.load = function(keyValuePairs, delimiter)
    {
        if (keyValuePairs)
        {
	        if (delimiter)
	        {
		        var stringList = new String(keyValuePairs);
		        var keyValueStringArray = stringList.split(delimiter);
		        for (var i=0; i<keyValueStringArray.length; i++)
		        {
		            var keyValueString = new String (keyValueStringArray[i]);
		            var keyValueArray = keyValueString.split("=");
		            var key = keyValueArray[0];
		            var value = keyValueArray[1];
		            if (this.containsKey(key)==false)
		            {
		                this.put(key, value);
		            }
		        }
            }
        } 
    };
    
};

