var Rico = {
	Version: '2.0',
	loadRequested: 1,
	loadComplete: 2,
	init : function() {
		this.preloadMsgs='';
		var elements = document.getElementsByTagName('script');
		this.baseHref= location.protocol + "//" + location.host;
		this.loadedFiles={};
		this.loadQueue=[];		
		this.windowIsLoaded=false;
		this.onLoadCallbacks=[];
		for (var i=0; i<elements.length; i++) {
			if (!elements[i].src) continue;
			var src = elements[i].src;
			var slashIdx = src.lastIndexOf('/');
			var path = src.substring(0, slashIdx+1);
			var filename = src.substring(slashIdx+1);
			this.loadedFiles[filename]=this.loadComplete;
			if (filename == 'rico.js') {
				this.jsDir = path;
				this.cssDir= path+'css/';
				this.imgDir= path+'images/';
				this.htmDir= path;
				this.xslDir= path;
			}
		}
		if (typeof Prototype=='undefined')
			this.include('prototype.js');
		var func=function() { Rico.windowLoaded(); };
		if (window.addEventListener)
			window.addEventListener('load', func, false);
		else if (window.attachEvent)
			window.attachEvent('onload', func);
		this.onLoad(function() { Rico.writeDebugMsg('Pre-load messages:\n'+Rico.preloadMsgs); });
	},
	moduleDependencies : {
		Effect : ['ricoEffects.js']
	},
	loadModule : function(name) {
		var dep=this.moduleDependencies[name];
		if (!dep) return;
		for (var i=0; i<dep.length; i++)
			if (dep[i].substring(0,1)=='+')
				this.loadModule(dep[i].slice(1));
			else
				this.include(dep[i]);
	},
	include : function(filename) {
		if (this.loadedFiles[filename]) return;
		this.addPreloadMsg('include: '+filename);
		var ext = filename.substr(filename.lastIndexOf('.')+1);
		switch (ext.toLowerCase()) {
			case 'js':
				this.loadQueue.push(filename);
				this.loadedFiles[filename]=this.loadRequested;
				this.checkLoadQueue();
				return;
			case 'css':
				var el = document.createElement('link');
				el.type = 'text/css';
				el.rel = 'stylesheet'
				el.href = this.cssDir+filename;
				this.loadedFiles[filename]=this.loadComplete;
				document.getElementsByTagName('head')[0].appendChild(el);
				return;
		}
	},
	
	checkLoadQueue: function() {
		if (this.loadQueue.length==0) return;
		if (this.inProcess) return;
		this.addScriptToDOM(this.loadQueue.shift());
	},
	addScriptToDOM: function(filename) {
		this.addPreloadMsg('addScriptToDOM: '+filename);
		var js = document.createElement('script');
		js.type = 'text/javascript';
		js.src = this.jsDir+filename;
		this.loadedFiles[filename]=this.loadRequested;
		this.inProcess=filename;
		var head=document.getElementsByTagName('head')[0];
		if (filename.substring(0,4)=='rico') {
			head.appendChild(js);
		} else if(/WebKit|Khtml/i.test(navigator.userAgent)) {
			head.appendChild(js);
			this.includeLoaded(filename);
		} else {
			js.onload = js.onreadystatechange = function() {
				if (js.readyState && js.readyState != 'loaded' && js.readyState != 'complete') return;
				js.onreadystatechange = js.onload = null;
				Rico.includeLoaded(filename);
			};
			head.appendChild(js);
		}
	},
	includeLoaded: function(filename) {
		this.addPreloadMsg('loaded: '+filename);
		this.loadedFiles[filename]=this.loadComplete;
		if (filename==this.inProcess) {
			this.inProcess=null;
			this.checkLoadQueue();
			this.checkIfComplete();
		}
	},
	windowLoaded: function() {
		this.windowIsLoaded=true;
		this.checkIfComplete();
	},
	checkIfComplete: function() {
		var waitingFor=this.windowIsLoaded ? '' : 'window';
		for(var filename in	this.loadedFiles) {
			if (this.loadedFiles[filename]==this.loadRequested)
				waitingFor+=' '+filename;
		}
		this.addPreloadMsg('waitingFor: '+waitingFor);
		if (waitingFor.length==0) {
			this.addPreloadMsg('Processing callbacks');
			while (this.onLoadCallbacks.length > 0) {
				var callback=this.onLoadCallbacks.pop();
				if (callback) callback();
			}
		}
	},
	onLoad: function(callback) {
		this.onLoadCallbacks.push(callback);
		this.checkIfComplete();
	},
	isKonqueror : navigator.userAgent.toLowerCase().indexOf("konqueror") >= 0,
	startTime : new Date(),
	timeStamp: function() {
		var stamp = new Date();
		return (stamp.getTime()-this.startTime.getTime())+": ";
	},
	setDebugArea: function(id, forceit) {
		if (!this.debugArea || forceit) {
			var newarea=document.getElementById(id);
			if (!newarea) return;
			this.debugArea=newarea;
			newarea.value='';
		}
	},
	addPreloadMsg: function(msg) {
		this.preloadMsgs+=Rico.timeStamp()+msg+"\n";
	},
	writeDebugMsg: function(msg, resetFlag) {
		if (this.debugArea) {
			if (resetFlag) this.debugArea.value='';
			this.debugArea.value+=this.timeStamp()+msg+"\n";
		}
	}
}
Rico.init();