﻿
// DOM : Cross-browser DOM utilities
DOM = {};

// Is current browser IE
DOM.is_ie = ( /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) );

// Set keyboard costansts
DOM.keys = {
	ESC: 27, ENTER: 13, SPACE: 32,
	LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40	
};

// To keep track of functions assigned as handlers (to avoid memory leaking)
DOM.handlers = new Array();

// Create new element
DOM.create_Element = function(tagName, parent) {
	var el = null;
	if (document.createElementNS) 
		el = document.createElementNS("http://www.w3.org/1999/xhtml", "html:" + tagName);
	else
		el = document.createElement(tagName);
	
	if (!isDefined(parent)) {
		parent = document.getElementsByTagName("body")[0];	
	}

	parent.appendChild(el);
	return el;
};

// Set style properties
DOM.setStyle = function(el, style) {
	for(var pr in style)
		el.style[pr] = getValue(style[pr]);
};

// Remove CSS class from DOM element
DOM.removeClass = function(el, className) {
	if (!isDefined(el)) {
		return;
	}

	var cls = el.className.split(" ");
	var ar = new Array();
	for (var i = cls.length; i > 0;) {
		if (cls[--i] != className) {
			ar[ar.length] = cls[i];
		}
	}
	el.className = ar.join(" ");
};

// Add CSS class to DOM element
DOM.addClass = function(el, className) {
	DOM.removeClass(el, className);
	el.className += " " + className;
};

// Register handler for Document event
DOM.register = function(evName, c, func) {
	var component = c;
	if(!isDefined(component["document." + evName])) {
		component["document." + evName] = function(ev) {
			func(ev, c);
		};
		DOM.addEvent(document, evName, component["document." + evName]);
	}
};

// Un-register handler for Document event
DOM.unRegister = function(evName, c) {
	DOM.removeEvent(document, evName, c["document." + evName]);
	c["document." + evName] = null;
};

// Get target element in event
DOM.getTargetElement = function(ev) {
	if (DOM.is_ie) {
		return window.event.srcElement;
	} else {
		return ev.target;
	}
};

// Stop event propogation/bubbling
DOM.stopEvent = function(ev) {
	ev || (ev = window.event);
	if (DOM.is_ie) {
		ev.cancelBubble = true;
		ev.returnValue = false;
	} else {
		ev.preventDefault();
		ev.stopPropagation();
	}
	return false;
};

// Add event handler function to DOM element
DOM.addEvent = function(el, evname, func) {
	if (el.attachEvent) { 
		el.attachEvent("on" + evname, func);
	} else if (el.addEventListener) { 
		el.addEventListener(evname, func, false);
	} else {
		el["on" + evname] = func;
	}
	
	DOM.handlers.push({"el": el, "evName": evname, "func": func});
};

// Remove event handler function from DOM element
DOM.removeEvent = function(el, evname, func) {
	if (el.detachEvent) {
		el.detachEvent("on" + evname, func);
	} else if (el.removeEventListener) { 
		el.removeEventListener(evname, func, false);
	} else {
		el["on" + evname] = null;
	}
	
	var arrEl;
	for(var i=0; i<DOM.handlers.length; i++)
	{
		arrEl = DOM.handlers[i];
		if(arrEl.el == el && arrEl.evName == evname && arrEl.func == func)
		{
			DOM.handlers.splice(i, 1);
			break;
		}	        
	}
};

// Remove all event handlers (mostly for window unload)
DOM.removeAllHandlers = function()
{
    var arrEl;
	for(var i=0; i<DOM.handlers.length; i++)
	{
	    arrEl = DOM.handlers[i];
	    DOM.removeEvent( arrEl.el, arrEl.evName, arrEl.func, false);
	}
	delete DOM.handlers;
};

// Get absolute position for element
DOM.getAbsolutePos = function(el)
{
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);
	if (is_div && el.scrollLeft)
		SL = el.scrollLeft;
	if (is_div && el.scrollTop)
		ST = el.scrollTop;
	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
	if (el.offsetParent)
	{
		var tmp = DOM.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};

// Get absolute position for mouse
DOM.getPointer = function(event) {
	return {
		x: event.pageX || (event.clientX +
		  (document.documentElement.scrollLeft || document.body.scrollLeft)),
		y: event.pageY || (event.clientY +
		  (document.documentElement.scrollTop || document.body.scrollTop))
	}
};