// $Id$ /** * Clear contents of element 'jsdebug' */ function CED(txt) { var element = document.getElementById('jsdebug'); if (element) element.innerHTML = txt ? txt : ""; } /** * Return string with dump of all arguments */ function D() { var text = ""; for (var i = 0; i < arguments.length; i++) { var variable = arguments[i]; if (typeof variable == "string") variable = variable.replace(/&/g, '&').replace(new RegExp("<", "g"), '<'); 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"; } return text; } /** * Add debugging output to element 'jsdebug' */ function ED() { var element; if (!(element = document.getElementById('jsdebug'))) return; // var element = it_create_element(document.body, 'div', {id:'jsdebug', style:{position:'absolute', left:'100px', top:'10px', opacity:'0.8'}}) element.innerHTML += '
'  + D.apply(this, arguments) + '<' + '/pre>';
}

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

/**
 * 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;
}

function it_add_event(p)
{
	if (!p.object || !p.method)  // not enough arguments
		return;
	if (!p.element)
		p.element = document;

	if (!p.object._it_events)
		p.object._it_events = [];
	
	var evt = p.event;
	var key = p.event + '*' + p.method;
	var p_closure = p;	// Needed for Konqueror 3.4.2 as p is (wrongly) shadowed by global input element named p
	if (!p.object._it_events[key])
		p.object._it_events[key] = function(e){ return p_closure.object[p_closure.method](e, p_closure); };

	if (p.element.addEventListener)
		p.element.addEventListener(evt, p.object._it_events[key], false);
	else if (p.element.attachEvent)
		p.element.attachEvent('on'+evt, p.object._it_events[key]);
	else
	{
		p.element['on'+evt] = function(e)
		{
			var ret = true;
			for (var k in p_closure.object._it_events)
				if (p_closure.object._it_events[k] && k.indexOf(evt) == 0)
					ret = p_closure.object._it_events[k](e);
			return ret;
		};
	}
}

function it_remove_event(p)
{
	if (!p.element)
		p.element = document;

	var key = p.event + '*' + p.method;
	if (p.object && p.object._it_events && p.object._it_events[key]) {
		if (p.element.removeEventListener)
			p.element.removeEventListener(p.event, p.object._it_events[key], false);
		else if (p.element.detachEvent)
			p.element.detachEvent('on'+p.event, p.object._it_events[key]);

		p.object._it_events[key] = null;
	}
}

/**
 * Prevent event propagation and bubbeling
 */
function it_event_void(evt)
{
	var e = evt ? evt : window.event;
	if (e.preventDefault)
		e.preventDefault();
	if (e.stopPropagation)
		e.stopPropagation();

	e.cancelBubble = true;
	e.returnValue = false;
	return false;
}

/* Get object pixel position. Based on quirksmode.org's code */
function it_get_obj_x(obj)
{       
	return obj.getBoundingClientRect().left + ((window.pageXOffset !== undefined) ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft);
}       

function it_get_obj_y(obj)
{	       
	return obj.getBoundingClientRect().top + ((window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop);
}

/* Common accessor for dom elements */
function it_find_obj(obj)
{
	if (document.getElementById)
		return document.getElementById(obj);
	else if (document.all)
		return document.all[obj];
	else if (document.layers)
   		return document.layers[obj];
	return null;
}

/* Get dom element by ID but always return a valid object */
function it_element(label)
{
	var tmp = it_find_obj(label);
	return tmp ? tmp : { style:{}, src:"", value:"", isundefined:true };
}

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

/* Create a new dom element and append to doc */
function it_create_element(doc, type, init)
{
	var e = document.createElement(type);
	it_set(e, init);
	doc.appendChild(e);
	return e;
}

/**
 * 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, ")");
}

/**
 * Unicode-safe equivalent of unescape()
 * @param str string URL encoded string to be decoded
 */
function it_url_decode(str)
{
	str = str.replace(/\+/g, '%20');

	// catch URI malformed errors
	try {
		if (window.decodeURIComponent)
			return decodeURIComponent(str);
	}
	catch(e) {}

	return unescape(str);
}

/**
 * Patch PNG transparency for IE 5.5-6 on the given image
 */
function it_pngfix(img, w, h, mode)
{
	var old_IE = navigator.platform == "Win32" && String(navigator.userAgent).match(/MSIE ((5\.5)|6)/);
	if (img.src && img.src.match(/\.png($|\?)/) && old_IE) {
		img.style.width = (w || img.width) + 'px';
		img.style.height = (h || img.height) + 'px';
		img.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+img.src+"',sizingMethod='"+(mode ? mode : 'crop')+"')";
		img.src = '/images/0.gif';
	}
	else if (img && old_IE)
		img.style.filter = 'none';
}