var Core = {};
if (document.addEventListener) {
	Core.addEventListener = function(target, type, listener) {
		target.addEventListener(type, listener, false);
	};
	Core.removeEventListener = function(target, type, listener) {
		target.removeEventListener(type, listener, false);
	};
	Core.preventDefault = function(event) {
		event.preventDefault();
	};
	Core.stopPropagation = function(event) {
		event.stopPropagation();
	};
} else if (document.attachEvent) {
	Core.addEventListener = function(target, type, listener) {
		if (Core._findListener(target, type, listener) != -1){return;};
		var listener2 = function() {
			var event = window.event;
			if (Function.prototype.call) {
				listener.call(target, event);
			} else {
				target._currentListener = listener;
				target._currentListener(event);
				target._currentListener = null;
			}
		};
		target.attachEvent("on" + type, listener2);
		var listenerRecord = {
			target : target,
			type : type,
			listener : listener,
			listener2 : listener2
		};
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		var listenerId = "1" + Core._listenerCounter++;
		if (!targetWindow._allListeners){targetWindow._allListeners = {};};
		targetWindow._allListeners[listenerId] = listenerRecord;
		if (!target._listeners){target._listeners = [];};
		target._listeners[target._listeners.length] = listenerId;
		if (!targetWindow._unloadListenerAdded) {
			targetWindow._unloadListenerAdded = true;
			targetWindow.attachEvent("onunload", Core._removeAllListeners);
		};
	};
	Core.removeEventListener = function(target, type, listener) {
		var listenerIndex = Core._findListener(target, type, listener);
		if (listenerIndex == -1){return;};
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		var listenerId = target._listeners[listenerIndex];
		var listenerRecord = targetWindow._allListeners[listenerId];
		target.detachEvent("on" + type, listenerRecord.listener2);
		target._listeners.splice(listenerIndex, 1);
		delete targetWindow._allListeners[listenerId];
	};
	Core.preventDefault = function(event) {
		event.returnValue = false;
	};
	Core.stopPropagation = function(event) {
		event.cancelBubble = true;
	};
	Core._findListener = function(target, type, listener) {
		var listeners = target._listeners;
		if (!listeners){return -1;};
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		for (var i = listeners.length - 1; i >= 0; i--) {
			var listenerId = listeners[i];
			var listenerRecord = targetWindow._allListeners[listenerId];
			if (listenerRecord.type == type
					&& listenerRecord.listener == listener) {
				return i;
			};
		};
		return -1;
	};
	Core._removeAllListeners = function() {
		var targetWindow = this;
		for (id in targetWindow._allListeners) {
			var listenerRecord = targetWindow._allListeners[id];
			listenerRecord.target.detachEvent("on" + listenerRecord.type,
					listenerRecord.listener2);
			delete targetWindow._allListeners[id];
		}
	};
	Core._listenerCounter = 0;
};
Core.addClass = function(target, theClass) {
	if (!Core.hasClass(target, theClass)) {
		if (target.className == "") {
			target.className = theClass;
		} else {
			target.className += " " + theClass;
		}
	}
};
Core.getElementsByClass = function(theClass) {
	var elementArray = [];
	if (document.all) {
		elementArray = document.all;
	} else {
		elementArray = document.getElementsByTagName("*");
	};
	var matchedArray = [];
	var pattern = new RegExp("(^| )" + theClass + "( |$)");
	for (var i = 0; i < elementArray.length; i++) {
		if (pattern.test(elementArray[i].className)) {
			matchedArray[matchedArray.length] = elementArray[i];
		}
	};
	return matchedArray;
};
Core.hasClass = function(target, theClass) {
	var pattern = new RegExp("(^| )" + theClass + "( |$)");
	if (pattern.test(target.className)) {
		return true;
	};
	return false;
};
Core.removeClass = function(target, theClass) {
	var pattern = new RegExp("(^| )" + theClass + "( |$)");
	target.className = target.className.replace(pattern, "$1");
	target.className = target.className.replace(/ $/, "");
};
Core.getComputedStyle = function(element, styleProperty) {
	var computedStyle = null;
	if (typeof element.currentStyle != "undefined") {
		computedStyle = element.currentStyle;
	} else {
		computedStyle = document.defaultView.getComputedStyle(element, null);
	};
	if((styleProperty == 'height' || styleProperty == 'width') && computedStyle[styleProperty] == 'auto'){
		if(styleProperty == 'height') {
			return element.offsetHeight + 'px';
		} else {
			if (styleProperty == 'width'){
				return element.offsetWidth + 'px';
			};
		};
	};
	return computedStyle[styleProperty];
};
Core.ajaxRequest = function(Url, Method, Data, Handler) {
	var Request = typeof(XMLHttpRequest) != 'undefined'	? new XMLHttpRequest() : (typeof(window.createRequest) != 'undefined' ? window.createRequest() : false);
	if (!Request) {
		try {
			Request = new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e) {
			try {
				Request = new ActiveXObject('Microsoft.XMLHTTP');
			} catch (e) {
				Request = false;
			}
		}
	};
	if (Request) {
		Request.open(Method, Url, true, false, false);
		Request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		Request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
		Request.onreadystatechange = function() {
			try {
				Request.readyState == 4 ? (Request.status == 200 ? Handler(Request.responseText) : Handler(false)) : null;
			} catch (e) {
				Handler(false);
			}
		};
		Request.send(Data);
	}
};
Core.createStyleSheet = function(stylesheet_href){
	if(document.createStyleSheet) {

		document.createStyleSheet(stylesheet_href);

		} else {
		var newSS=document.createElement('link');

		newSS.rel='stylesheet';
		newSS.type = 'text/css';
		newSS.href= stylesheet_href;

		document.getElementsByTagName("head")[0].appendChild(newSS);

		}
};
Core.start = function(runnable) {
	Core.addEventListener(window, "load", runnable.init);
};