var ScriptManager = (function() {
	
	//private static
	var scriptCache = {},
		d = new Date();
	
	//register all currently loaded scripts
	window.addEvent('domready', function() {
		$$('script').forEach(function(el) {
			if(el.src) {
				scriptCache[el.src] = el;
				el.store('loaded', true);
			}
		});
	});
	
	function addOnLoad(script, fn) {
		if(script.retrieve('loaded')) {
			fn();
		} else if(Browser.Engine.trident) {
			script.addEvent('readystatechange', function() {
				if(this.readyState == 'complete' || this.readyState == 'loaded') {
					fn();
				}
			});
		} else {
			script.addEvent('load', function() {
				fn();
			});
		}
		
	}
	
	//public api
	return {
		
		attemptScript: function(script) {
			if(typeof script === 'string') script = { src: script };
			
			if(scriptCache[script.src]) return scriptCache[script.src];
			
			return ScriptManager.attachScript(script);
		},
		
		attachScript: function(script) {
			if(typeof script === 'string') script = { src: script };
			
			var s = new Element('script', { type: 'text/javascript' });
			if(script.src) {
				s.src = script.src;//  + '?' + (+d);
				
				//	console.warn('todo: remove the script nonce')
				scriptCache[script.src] = s;
			}
			if(script.text)  {
				if(Browser.Engine.trident) {
					s.text = script.text;
				} else {
					s.set('text', script.text);
				}
			}
			
			addOnLoad(s, function() {
				s.store('loaded', true);
			});
			
			document.head.grab(s);
			return s;
		},
		
		detachScript: function(script) {
			
		},
		
		require: function(src, callback) {
			var script = this.attemptScript(src);
			addOnLoad(script, callback);
		}
		
	};
})();

var StyleManager = (function() {
	
	var head = $$('head')[0];
	
	return {
		attemptStyle: function(link, page) {
			var req = new Request({
				method: 'get',
				url: link.getAttribute('href'),
				onComplete: function () {
					page.cssLoaded = true;
					page.fireEvent('cssloaded');
				}
			});
			
			req.send();
			
			head.grab(link);
			
		}
	};	
})();