ensurePackage('SuchMuch');

SuchMuch.events = new (function events() {

	var instance = this;
	var loadEventList = [];
	
	loadEventList.addLoadEvent = function(fn){
	    loadEventList[loadEventList.length] = fn;
	};
	
	this.loadEventListHasFired = false;

	loadEventList.fireLoadEvents = function(){
	    for (var i = 0; i < loadEventList.length; i++) {
	        loadEventList[i]();
	    }
	    instance.loadEventListHasFired = true;
	};
	
	this.addEvent = function (obj, type, fn) {
	    if (type === "load") {
	        loadEventList.addLoadEvent(fn);
    	    return true;
		}

		if (typeof obj === "string") {
			obj = document.getElementById(obj);
		}
		if (!obj) {
			return null;
		}
    
	    if (obj.addEventListener) {
	        obj.addEventListener(type, fn, false);
	        return true;
	    } else if (obj.attachEvent) {
            var r = obj.attachEvent("on" + type, fn);
            return r;
        } else {
            return false;
        }
	};

	if (/WebKit/i.test(navigator.userAgent)) { // Safari
	    var _timer = setInterval(function() {
	        if (/loaded|complete/.test(document.readyState)) {
	            clearInterval(_timer);
	            loadEventList.fireLoadEvents(); // call the onload handler
	        }
	    }, 100);
	} else if (document.addEventListener) {
		document.addEventListener("DOMContentLoaded", loadEventList.fireLoadEvents, false);
	} else {
	    // IE HACK
	    /*@cc_on @*/
	    /*@if (@_win32)
	     document.write("<script id='__ie_onload' defer='defer' src='//:'><\/script>");
	     var script = document.getElementById("__ie_onload");
	     script.onreadystatechange = function() {
		     if (this.readyState == "complete") {
			     loadEventList.fireLoadEvents(); // call the onload handler
		     }
	     };
	     @else @*/
	     window.onload = loadEventList.fireLoadEvents;
	     /*@end @*/
	}
	this.stop = function (event) {
		event = event || window.event; //IE.
		if (event.preventDefault) {
			event.preventDefault();
		} else { //IE
			event.returnValue = false;
		}
		if (event.stopPropagation) {
			event.stopPropagation();
		} else { //IE. Again.
			event.cancelBubble = true;
		}
	};
	
	this.getElement = function (event) {
		if ( !event.target ) {
			event.target = event.srcElement || document;
		}
		// check if target is a textnode (safari)
		if ( event.target.nodeType == 3 ) {
			event.target = event.target.parentNode;
		}
		return event.target;
	};
	
})();