/* 
 * KemenAran Javascript Lib v.1.2
 *
 * A bunch of Javascript usefull functions
 */


/*
 * Events handling
 */

// Add an event (cross-browser)
function addEvent(obj, evType, fn)
{ 
	if (obj.addEventListener){ 
		obj.addEventListener(evType, fn, false); 
		return true; 
	} else if (obj.attachEvent){ 
		var r = obj.attachEvent("on"+evType, fn);
		return r; 
	} else { 
		return false; 
	}
}

// Remove an event (cross-browser)
function removeEvent(obj, evType, fn)
{ 
	if (obj.removeEventListener){ 
		obj.removeEventListener(evType, fn, false); 
		return true; 
	} else if (obj.detachEvent){ 
		var r = obj.detachEvent("on"+evType, fn);
		return r; 
	} else { 
		return false; 
	}
}

// Execute the requested function when the DOM is loaded (cross-browser)
function addDOMLoaded(callback)
{
	window.DOMLoadedCallback = callback;
	
	// For Mozilla browsers
	if(document.addEventListener && !window.opera && !(!document.all && document.childNodes && !navigator.taintEnabled)) {
		document.addEventListener("DOMContentLoaded", window.DOMLoadedCallback, false);
		return;
	}
	
	// Start WebKit timer for Safari (if it doesn't already exists)
	if (/WebKit/i.test(navigator.userAgent) && window.webKitTimer == null) {
		window.webKitTimer = setInterval(function() {
	        if (/loaded|complete/.test(document.readyState)) {
	            clearInterval(window.webKitTimer);
	            delete window.webKitTimer;
	            window.DOMLoadedCallback();
	        }
    	}, 10);
    	return;
	}
	
	// For Internet Explorer (using conditional comments)
	/*@cc_on @*/
	/*@if (@_win32)
	document.write('<script id="__ie_onload" defer src="javascript:void(0)"><\/script>');
	var script = document.getElementById('__ie_onload');
	script.onreadystatechange = function() {
		if (this.readyState == 'complete') {
			window.DOMLoadedCallback(); // call the onload handler
		}
	};
	return;
	/*@end @*/
	
	// If we're there, we didn't found a way to add the event on DOM loading ; let's fallback on window.onload.
	addEvent(window, 'load', window.DOMLoadedCallback);
}


/*
 * DOM Manipulation
 */

// Get an element by its CSS class
document.getElementsByClassName = function(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];      
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}   
	}
	return (arrReturnElements);
}

// Get the first parent element of the matching tagName
document.getParentByTagName = function(node, strTagName) {
	if(node == null || node.tagName == null)
		return;
	
	while (node.tagName.toLowerCase() != strTagName) {
		if (node.parentNode) {
			node = node.parentNode;
		} else {
			return null;
		}
	}
	
	return node;
}

// Hide all the nodes
function hide() {
    for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof(element) == "object" && element.length) { // If array
			for(var j = 0; j < element.length; j++)
				hide(element[j]);
		}
		if (element.style) {
			element.style.display = 'none';
			element.style.visibility = 'hidden';
		}
	}
}

// Show all the nodes
function show() {
    for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if(typeof(element) == 'object' && element.length) { // If array
			for(var j = 0; j < element.length; j++)
				show(element[j]);
		}
		if (element.style) {
			element.style.display = 'block';
			element.style.visibility = '';
		}
    }
}

// DOM cleaner for Gecko (removes whitespaces in the DOM)
function cleanDOM(d){
	var bal = d.getElementsByTagName('*');
	for(i=0; i<bal.length; i++){
		a = bal[i].previousSibling;
		if(a && a.nodeType==3) {
			if(!a.data.replace(/\s/g,'')) a.parentNode.removeChild(a);
		}
		b = bal[i].nextSibling;
		if(b && b.nodeType==3) {
			if(!b.data.replace(/\s/g,'')) b.parentNode.removeChild(b);
		}
	}
	return d;
}