// Prototype.JS usage is required

/***********************************************
* 	OnLoad Handlers
***********************************************/

var onLoadHandlers = $H();
var loadHandlerCnt = 0;

/**
*	Register handler to run it after the page is loaded.
*
*	@param		handler		function    handler
*	@param		priority	int			priority value (the bigger number the sooner run) 0 - by default
*
*	@return		void
*/
function addOnLoadHandler(handler, priority)
{
	loadHandlerCnt++;

	if ('undefined'==priority+'')
		priority = 0;	

	if (!onLoadHandlers[priority])
		onLoadHandlers[priority] = $A();

	if (!onLoadHandlers[priority][loadHandlerCnt])
		onLoadHandlers[priority][loadHandlerCnt] = [];

	onLoadHandlers[priority][loadHandlerCnt].push(handler);
}

var _pageLoaded = false;
function processOnLoadHandlers(e)
{
	if (!_pageLoaded)
		_pageLoaded = true;
	
	onLoadHandlers.keys().sort(function(a,b) {return parseInt(b) - parseInt(a)}).each(function(p)
	{
		if ('object' == typeof onLoadHandlers[p])
		{
			$A(onLoadHandlers[p]).each(function(handlers)
			{
				$A(handlers).each(function(handler)
				{
					if ('function' == typeof handler) 
						handler();
				});
			});
		}
	});

	onLoadHandlers = $H();
}
window.onload = processOnLoadHandlers;

/***********************************************
* 	Usefull functions
***********************************************/

/** 
*	Returns current time in milliseconds
*
*	@return		mixed
*/
function msec()
{
	var d = new Date();
	return  d.valueOf();
}

/**
*	Loads client CPU for certain time and does nothing.
*
*	@param		msec		int		 milliseconds to sleep
*
*	@return		void
*/
function sleep(msec)
{
	var s = new Date().getTime(), b;
	while (new Date().getTime() - s < t) b=1;
}

/** 
*	Execute JS code in the given html content.
*
*	@param		content		string			HTML content
*
*	@return		void
*/
function evalJS(content, callback)
{
	obj = document.createElement("div");
	obj.innerHTML = content;
	var scriptTags = obj.getElementsByTagName('SCRIPT');
	_evalJsItems(scriptTags, 0, callback);
}

function _evalJsItems(items, offset, callback)
{
	for(var i=offset; i<items.length; i++)
	{
		if (items[i].src)
		{
			var s 		= document.body.appendChild(document.createElement('script'));
			s.type 		= "text/javascript";
			s.language	= 'javascript';

			void(s.src=items[i].src);

			s.onload = function(){ _evalJsItems(items, i+1, callback) };

			s.onreadystatechange = function()
			{
				if(s.readyState == 'loaded')
				{
					_evalJsItems(items, i+1, callback);
					s.onreadystatechange = function(){}
				}
			}
			return;
		}
		else
		{
			var code = items[i].innerHTML.replace(/(<!--|\/\/-->)/g, ""); 
			try
			{
				eval(code);
			}
			catch(e)
			{
				alert('Inline script error '+e.name+ ' : '+e.message);
			}
		}
	}
	if (callback)
		callback();
}

/**
*	Dump any variable (objects, complicated hashes) into string. Usefull for debug.
*
*	@param		variable		mixed		variable to dump
*
*	@return		string
*/
function dump(variable,level,full)
{
	if (level == null)
		level = 1;

	if (full == null)
		full = 0;

	var s = '';
	
	if (typeof(variable) == "object" && full)
	{
		s += typeof(variable) + " {\n";
		for (var k in variable)
		{
			for (var i=0; i<level; i++)
			{
				s += "  ";
			}

			s += k+": " + dump(variable[k], level+1);
		}

		for (var i=0; i<level-1; i++)
		{
			s += "  ";
		}

		s += "}\n"
	}
	else
	{
		s += "" + variable + "\n";
	}
	return s;
}
