/*!
	THcore 26.11.2009 www.timehouse.fi
*/
function $(elemid)
{
	return document.getElementById(elemid);
}

window.addToOnLoad = function(func)
{
	window.onload = THcore.addToEvent(func,window.onload);
}

window.addToOnKeyDown = function(func)
{
	document.onkeydown = THcore.addToEvent(func,document.onkeydown,'onkeydowns');
}

window.removeFromOnKeyDown = function(func)
{
	document.onkeydown = THcore.removeFromEvent(func,'onkeydowns');
}

window.addToOnKeyUp = function(func)
{
	document.onkeyup = THcore.addToEvent(func,document.onkeyup,'onkeyups');
}

window.removeFromOnKeyUp = function(func)
{
	document.onkeyup = THcore.removeFromEvent(func,'onkeyups');
}

window.addToMouseMove = function(func)
{
	document.onmousemove = THcore.addToEvent(func,document.onmousemove,'mousemoves');
}

window.removeFromMouseMove = function(func)
{
	document.onmousemove = THcore.removeFromEvent(func,'mousemoves');
}

window.addToOnResize = function(func)
{
	window.onresize = THcore.addToEvent(func,window.onresize,'onresizes');
}

window.removeFromOnResize = function(func)
{
	window.onresize = THcore.removeFromEvent(func,'onresizes');
}

window.mouseInit = function()
{
	Thcore.mouseInit(arguments);
}

window.mouse = function()
{
	return {x:THcore.mouseX(),y:THcore.mouseY()};
}

window.innerSize = function()
{
	var THw = 0;
	var THh = 0;

	if(!window.innerWidth)
	{
		if(!(document.documentElement.clientWidth == 0))
		{
			THw = document.documentElement.clientWidth;
			THh = document.documentElement.clientHeight;
		}
		else
		{
			THw = document.body.clientWidth;
			THh = document.body.clientHeight;
		}
	}
	else
	{
		THw = window.innerWidth;
		THh = window.innerHeight;
	}
	return {width:THw,height:THh};
}

window.offset = function()
{
	var offsetX = 0;
	var offsetY = 0;

	if(!window.pageYOffset)
	{
		if(!(document.documentElement.scrollTop == 0 && document.documentElement.scrollLeft == 0))
		{
			offsetY = document.documentElement.scrollTop;
			offsetX = document.documentElement.scrollLeft;
		}
		else
		{
			offsetY = document.body.scrollTop;
			offsetX = document.body.scrollLeft;
		}
	}
	else
	{
		offsetX = window.pageXOffset;
		offsetY = window.pageYOffset;
	}
	return {x:offsetX,y:offsetY};
}

var THcore = new function()
{
	var eventsHolder = new Array(),
	ttMouseX = 0,
	ttMouseY = 0,
	mouseInitDone = false;
	
	function THGetMouse(e)
	{
		if (!e)
		{
			e = window.event;
		}
		if (e.pageX || e.pageY)
		{
			ttMouseX = e.pageX;
			ttMouseY = e.pageY;
		}
		else if (e.clientX || e.clientY)
		{
			ttMouseX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
			ttMouseY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
		}
	}
	
	return{
		hasParameterKey: function(str1,arr1,delimiter)
		{
			for (var i=0;i < arr1.length;i++)
			{
				if (str1.substring(0,arr1[i].length+1) == arr1[i] + delimiter)
				{
					return arr1[i];
				}
			}
			return '';
		},
		
		getParameter: function(str1,delimiter)
		{
			return{key:str1.substring(0,str1.indexOf(delimiter)), val:str1.substring(str1.indexOf(delimiter)+1)};
		},
		
		mouseInit: function()
		{
			if (!mouseInitDone)
			{
				window.addToMouseMove(THGetMouse);
				mouseInitDone = true;
			}
			if (arguments.length > 0)
			{
				window.addToMouseMove(arguments[0]);
			}
		},
		
		mouseX: function()
		{
			return ttMouseX;
		},
		
		mouseY: function()
		{
			return ttMouseY;
		},
		
		chainEvents: function(f1,f2)
		{
			return typeof f1 !== 'function' ? f2 : function() {
		        var r1 = f1.apply(this, arguments),
		            r2 = f2.apply(this, arguments);
		        return typeof r1 === 'undefined' ? r2 : (r1 && r2);
		    };
		},
		
		addToEvent: function(f1,eventContent)
		{
			if (arguments.length > 2)
			{
				if (typeof(eventsHolder[arguments[2]]) == 'undefined')
				{
					eventsHolder[arguments[2]] = new Array();
				}
				if (typeof(eventContent) != 'undefined' && eventsHolder[arguments[2]].length < 1)
				{
					eventsHolder[arguments[2]].push(eventContent);
				}
				eventsHolder[arguments[2]].push(f1);
			}
			if (typeof(eventContent) != 'undefined')
			{
				eventContent = THcore.chainEvents(eventContent,f1);
			}
			else
			{
				eventContent = f1;
			}
			return eventContent;
		},
		
		removeFromEvent: function(f1,eventid)
		{
			var toberemoved;
			var eventContent = '';
			for (var i=0;i < eventsHolder[eventid].length;i++)
			{
				if (f1 == eventsHolder[eventid][i])
				{
					toberemoved = i;
				}
				else
				{
					eventContent = THcore.chainEvents(eventContent,eventsHolder[eventid][i]);
				}
			}
			eventsHolder[eventid].splice(toberemoved,1);
			return eventContent;
		}
	};
}();