// $Id$

/**
 * Clear contents of element 'jsdebug'
 */
function CED(txt)
{
	var element = document.getElementById('jsdebug');
	if (element)
		element.innerHTML = txt ? txt : "";
}

/**
 * Add debugging output to element 'jsdebug'
 */
function ED()
{
	var element = document.getElementById('jsdebug');
	if (element)
	{
		var text = "";

		for (var i = 0; i < arguments.length; i++)
		{
			var variable = arguments[i];

			if (typeof variable == "string")
				variable = variable.replace(/&/g, '&amp;').replace(/</g, '&lt;');

			text += (typeof variable) + " " + variable;

			if (typeof variable == "object")
			{
				text += ":";

				for (field in variable)
				{
					text += field + "=";

					try { text += typeof variable[field] == 'function' ? 'function' : variable[field]; }
					catch (e) { text += "*" + e + "*"; }

					text += "\n";
				}
				text += "\n";
			}

			text += "\n";
		}

		element.innerHTML += '<pre style="background-color:#FEE; margin:0">'  + text + '</pre>';
	}
}

/**
 * Quote HTML special chars
 * @return Text string with & " < > htmlentities-encoded
 */
function Q(value)
{
	return typeof value == "undefined" ? "" : value.toString().replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

/**
 * String class: Replaces variables of the form {var} with values from given array
 * @param values Associative array containing values to fill in (optional)
 * @return Text string with variables replaced by their values
 */
String.prototype.T = function(values)
{
	var result = this;

	for (key in values)
		result = result.replace(new RegExp("{" + key + "}", "g"), values[key]);

	return result;
}

/**
 * Insert an event handler on top of chain
 * @param p.element Element to handle event for
 * @param p.event Name of event:'focus', 'click', ... (without 'on')
 * @param p.object Object that contains handler method
 * @param p.method Method of p.object to call on p.event
 */
function it_event(p)
{
	var oldhandler = p.element["on" + p.event];

	p.element["on" + p.event] = function(ev)
	{
		var pp = arguments.callee.p ? arguments.callee.p : p;
		var oo = arguments.callee.oldhandler ? arguments.callee.oldhandler : oldhandler;

		var result = pp.object[pp.method](ev ? ev : window.event, pp);

		if (result && oo)
			result = oo(ev);

		return result;
	}
	p.element["on" + p.event].p = p;
	p.element["on" + p.event].oldhandler = oldhandler;
}

/* Get object pixel position. Based on quirksmode.org's code */
function it_get_obj_x(obj)
{       
	var curleft = 0;
	if (obj.offsetParent)
		while (obj)
		{
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}       

function it_get_obj_y(obj)
{	       
	var curtop = 0;
	if (obj.offsetParent)
		while (obj)
		{
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

/* Get an iframe's content document in a compatible way */
function it_get_iframe_document(iframe)
{
	return iframe.contentWindow ? iframe.contentWindow.document : iframe.contentDocument;
}

/**
 * Copy attributes from src to dst in a recursive manner.
 * @param dst Destination object which gets attributes
 * @param src Source object containing attributes
 */
function it_set(dst, src)
{
	if (dst)
	{
		for (var i in src)
		{
			if (typeof src[i] == 'object')
			{
				if (dst[i])
					it_set(dst[i], src[i]);
			}
			else
				dst[i] = src[i];
		}
	}
}

/**
 * Return the current timestamp
 */
function it_now()
{
	return new Date().getTime();
}

/**
 * Encodes arbitrary string for use in an url
 * @param str string to be encoded
 */
function it_url_encode(str)
{
	var result = window.encodeURIComponent ? encodeURIComponent(str) : escape(str).replace(/\+/g, "%2B");

	return result.replace(/%20/gi, "+").replace(/%2C/gi, ",").replace(/%3B/gi, ";").replace(/%28/gi, "(").replace(/%29/gi, ")");
}