function Map()
{
	this.keys=new Array();
	this.values=new Array();
	this.hash=new Array();
}

Map.prototype.getHash=function(key,create)
{
	var strKey=key.toString();
	var hash=this.hash[strKey];
	if (hash==null && create)
	{
		hash=new Array();
		this.hash[strKey]=hash;
	}
	return(hash);
}

Map.prototype.getPosition=function(key)
{
	var hash=this.getHash(key);
	if (hash!=null)
	{
		for (var i=0;i < hash.length; i++)
		{
			if (this.keys[hash[i]]==key)
			{
				return(hash[i]);
			}
		}
	}
	return(null);
}

Map.prototype.put=function(key, value)
{
	if (key==null || value==null)
	{
		throw "can not be null"
	}
	this.remove(key);
	
/*	var nPosition=this.getPosition(key);
	if (nPosition!=null)
	{
		this.keys[nPosition]=key;
		this.values[nPosition]=value;
		return;
	}*/

	var hash=this.getHash(key,true);
	hash[hash.length]=this.keys.length;

	this.keys[this.keys.length]=key;
	this.values[this.values.length]=value;
}

Map.prototype.get=function(key)
{
	var nPosition=this.getPosition(key);
	if (nPosition!=null)
	{
		return(this.values[nPosition]);
	}
	return(null);
}

Map.prototype.remove=function(key)
{
	var hash=this.getHash(key);
	if (hash!=null)
	{
		var nPosition=null;
		for (var i=0; i < hash.length; i++)
		{
			if (this.keys[hash[i]]==key)
			{
				nPosition=hash[i];
			}
			hash.splice(i,1);
			if (hash.length==0)
			{
				delete this.hash[key];
			}
		}
		if (nPosition != null)
		{
			var obj=this.values[nPosition];
			delete this.keys[nPosition];
			delete this.values[nPosition];
			//this.keys.splice(nPosition,1);
			//this.values.splice(nPosition,1);
			return(obj);
		}
	}

	return(null);
}

Map.prototype.getKeys=function()
{
	var keys=new Array();
	for (var i=0;i < this.keys.length; i++)
	{
		var key=this.keys[i];
		if (key!=null)
		{
			keys[keys.length]=this.keys[i];
			if (this.getPosition(key)==null)
			{
				var hash=this.getHash(this.keys[i]);
				alert("should not happen '"+i+" "+this.keys[i]+"' "+hash);
			}
		}
	}
	return(keys);
}

Map.prototype.size=function()
{
	return(this.keys.length);
}

function Utils()
{
	this.timeouts=new Array();
	this.timeoutCount=0;
}

Utils.prototype.callWithParamArray=function(object, func, array, start)
{
	var params=new Array();
	for (var i=start;i < array.length; i++)
	{
		params[params.length]="array["+i+"]";
	}
	eval("func.call(object"+((array.length > 0)?",":"")+params.join(",")+")");
}

Utils.prototype.objectTimeout=function(object, func)
{
	var id=""+(this.timeoutCount++);
	var array=new Array();
	array[array.length]=object;
	array[array.length]=func;
	array[array.length]=arguments;
	this.timeouts[id]=array;
	setTimeout("var array=utils.timeouts["+id+"];utils.callWithParamArray(array[0],array[1],array[2],2)",100);
}

var utils=new Utils();