(function(){
	
	if(typeof Strix == "undefined"){
		this.Strix = {};
	}
	
	Strix._attachEvent = function(obj,evt,fnc,useCapture) {
		if (!useCapture) useCapture=false;
		if (obj.addEventListener){
			obj.addEventListener(evt,fnc,useCapture);
			return true;
		} else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc);
		else{
			this._oldAttachEvent(obj,evt,fnc);
			obj['on'+evt]=function(){
				this._fireEvent(obj,evt)
			};
		}
	}

	//The following are for browsers like NS4 or IE5Mac which don't support either
	//attachEvent or addEventListener
	Strix._oldAttachEvent = function(obj,evt,fnc) {
		if (!obj.myEvents) obj.myEvents={};
		if (!obj.myEvents[evt]) obj.myEvents[evt]=[];
		var evts = obj.myEvents[evt];
		evts[evts.length]=fnc;
	}

	Strix._fireEvent = function(obj,evt) {
		if (!obj || !obj.myEvents || !obj.myEvents[evt]) return;
		var evts = obj.myEvents[evt];
		for (var i=0,len=evts.length;i<len;i++) evts[i]();
	}

	// private variables
	Strix._loadedURIs = new Array();

	Strix.registerLoadedUrl = function(url) {
		var module = this._loadedURIs[url];
		if (!module) {
			this._loadedURIs[url] = true;
		}
	}

	Strix.require = function(url, type) {
		if (type == 'js') {
			// TODO: determine if external url
			return Strix.requireJs(url);
		} else if (type = 'css') {
			return Strix.requireCss(url);
		} else {
			return false;
		}
	};

	// public interface
	Strix.requireJs = function(url, cb){
		var module = this._loadedURIs[url];
		if (module) {
			return true;
		}
		
		var _scriptTag 	= document.createElement('script');
		_scriptTag.type = "text/javascript";
		_scriptTag.src = url;

		if (cb) {
			this._attachEvent(_scriptTag, 'load', cb, false);

			this._attachEvent(_scriptTag, 'readystatechange',
				function(){
					if(_scriptTag.readyState === 'loaded' || _scriptTag.readyState === 'complete'){
						cb();
					}
				}, 
				false
				);
		}

		if (typeof _scriptTag != "undefined") {
			document.getElementsByTagName("head")[0].appendChild(_scriptTag);
			this._loadedURIs[url] = _scriptTag;
			return true;
		}
		return false;

	};


	Strix.requireCss = function(url){
		var css = this._loadedURIs[url];
		if (css) {
			return true;
		}
		var link = document.createElement('link');
		link.setAttribute("href", url);
		link.setAttribute("rel", "stylesheet");
		link.setAttribute("type", "text/css");
		if (typeof link != "undefined") {
			document.getElementsByTagName("head")[0].appendChild(link);
			this._loadedURIs[url] = link;
			return true;
		}
		return false;
	};


})();

