/** * 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)
{
if("getBoundingClientRect" in obj)
return obj.getBoundingClientRect().left + ((window.pageXOffset !== undefined) ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft);
else
{
// legacy for Android 1.6
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)
{
if("getBoundingClientRect" in obj)
return obj.getBoundingClientRect().top + ((window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop);
else
{
// legacy for Android 1.6
var curtop = 0;
if (obj.offsetParent)
while (obj)
{
curtop += obj.offsetTop;
obj = obj.offsetParent;
}
else if (obj.y)
curtop += obj.y;
return curtop;
}
}
/* 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';
}