var Util = {};

if(document.addEventListener) {		//W3C Events model
	Util.addEventListener = function(type, func, capture, element) {
		element.addEventListener(type, func, capture);
	};
	Util.removeEventListener = function(type, func, capture, element) {
		element.removeEventListener(type, func, false);
	};
	Util.preventDefault = function(event) {
		event.preventDefault();
	};
	Util.stopPropagation = function(event) {
		event.stopPropagation();
	};
} else if(document.attachEvent) {		//IE Events model
	Util.addEventListener = function(type, func, capture, element) {
		if (Util._findListener(element, type, func) != -1) return;

		var listener2 = function() {
			var event = window.event;

			if (Function.prototype.call) {
				func.call(element, event);
			} else {
				element._currentListener = func;
				element._currentListener(event)
				element._currentListener = null;
			}
		};
		
		element.attachEvent("on" + type, listener2);
		
		var listenerRec = {
			element: element,
			type: type,
			func: func,
			listener2: listener2
		};
		
		var listenerId = "l" + Util._listenerCount++;
		window._allListeners[listenerId] = listenerRec;
		if(!element._listeners) element._listeners = [];
		element._listeners[element._listeners.length] = listenerId;
	};
	Util.removeEventListener = function(type, func, capture, element) {
		var index = Util._findListener(type, func, element);
		if(index == -1) return;
		
		var listenerRec = window._allListeners[element._listeners[index]];
		element.detachEvent("on" + type, listenerRec.listener2);

		delete window._allListeners[element._listeners[index]];
		element._listeners.splice(index,1);
	};
	Util.preventDefault = function(event) {
		event.returnValue = false;
	};
	Util.stopPropagation = function(event) {
		event.cancelBubble = true;
	};
	Util._findListener = function(type, func, element) {
		var listeners = element._listeners;
		if(!listeners) return -1;
		
		for(var i = listeners.length - 1; i >= 0; i--) {
			var listenerRec = window._allListeners[listeners[i]];
			if(listenerRec.type == type && listenerRec.func == func) {
				return i;
			}
		}
		return -1;
	};
	Util._removeAllListeners = function() {
		for(id in this._allListeners) {
			var listenerRec = this._allListeners[id];
			listenerRec.element.detachEvent("on" + listenerRec.type, listenerRec.listener2);
			delete this._allListeners[id];
		}
	};
	Util._listenerCount = 0;
	window._allListeners = {};
	window.attachEvent("onunload", Util._removeAllListeners);
}

Util.getNextSibling = function(n) {
	while(n = n.nextSibling) {
		if(n.nodeType == 1) return n;
	}
	return null;
}

Util.getElementsByClass = function(c) {
	if(typeof document.all != "undefined")
		var el = document.all;
	else
		var el = document.getElementsByTagName("*");
	
	var reg = new RegExp("(^| )" + c + "( |$)");
	var matches = [];
	
	for(var i = 0; i < el.length; i++) {
		if(reg.test(el[i].className))
			matches[matches.length] = el[i];
	}
	
	return matches;
}

Util.newAJAX = function() {
	try {
		var XMLRequest = new XMLHttpRequest();
	}
	catch(error) {
		try {
			var XMLRequest = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(error) {
			alert("Unable to create an AJAX object");
			return null;
		}
	}
	return XMLRequest;
}