//*** configuration
var path_to_lib		= (path_to_lib==null)?"":path_to_lib;
var modules_to_load	= (modules_to_load==null)?"mod_debug":modules_to_load;

//*** Module Class *********************************************************************************************************************
function Module(path) {
	
	this.registeredModules  = new Array();
	this.loadedModules      = new Array();
	this.loadPattern	= new Array();
	this.path	        = path;
	this.register	        = registerModule;
	this.add	        = addModule;
	this.getPath		= getModulePath;
	this.init		= initModules;
	this.find		= findRequired;
	this.getLoadedModules	= showLoadedModules;

	function showLoadedModules() {
		var temp = new Array();
		for(var i in this.loadedModules) {
			if(!isNaN(i)) continue;
			temp[temp.length] = i;
		}
		return temp
	}

	function registerModule(name,path,listing) {
		if(!this.registeredModules[name]) {
			var i = this.registeredModules.length;
			this.registeredModules[i] = new Array();
			this.registeredModules[i]['name'] = name;
			this.registeredModules[i]['path'] = this.getPath(path,name);
			this.registeredModules[i]['pattern'] = (listing==null||listing=="")?false:(listing.indexOf(",")!=-1)?listing.split(","):new Array(listing);
			this.registeredModules[name] = this.registeredModules[i];
		}
	}
	
	function addModule(name) {
		if(!this.loadedModules[name] && this.registeredModules[name]) {
			var path = "<SCR"+"IPT LANGUAGE='JavaScript' SRC='"+this.registeredModules[name]['path']+"' TYPE='text/javascript'><\/SCR"+"IPT>"
			document.write(path);
			var i = this.loadedModules.length;
			this.loadedModules[i] = new Array();
			this.loadedModules[i]['name'] = this.registeredModules[name]['name'];
			this.loadedModules[i]['path'] = this.registeredModules[name]['path']
			this.loadedModules[name] = this.loadedModules[i];
		}
	}
	
	function getModulePath(path,name) {
		var npath = this.path;
		if(this.path.lastIndexOf("/") != this.path.length && this.path != "") npath += "/";
		npath += path;
		if(npath.lastIndexOf("/") != npath.length && npath != "") npath += "/";
		npath += name+".js";
		return npath;
	}

	function findRequired(mod) {
		if(this.registeredModules[mod]['pattern'] != false) {
			for(var i=0;i<this.registeredModules[mod]['pattern'].length;i++) {
				this.find(this.registeredModules[mod]['pattern'][i]);
			}
		}
		this.loadPattern[this.loadPattern.length] = mod;
	}

	function initModules() {
	      //setting up quickMods
		var quickMods = new Array();
		quickMods['mod_basic'] 	        = "onerror,onload,onresize,onmousedown,onmouseup,session";
		quickMods['mod_detect']	        = quickMods['mod_basic']+",flash,quicktime,realplayer,mediaplayer,acrobat";
		quickMods['mod_dhtml_basic']    = quickMods['mod_basic']+",images,frames,forms,layers,document,window,cursor,contextmenu,dynimage";
		quickMods['mod_dhtml_advanced'] = quickMods['mod_dhtml_basic']+",dynlayer,dynlayermove,dynlayersize,dynlayerfloat";
		quickMods['mod_formeval']	= quickMods['mod_basic']+",forms";
		quickMods['mod_debug']		= quickMods['mod_dhtml_advanced']+",loader,forms";
		quickMods['mod_complete']	= "";
		quickMods['none']		= "";
		if(arguments.length == 0 || arguments[0] == "" || arguments[0] == "mod_complete") {
	      //loading all
			for(var i = 0;i<this.registeredModules.length;i++) {
				this.add(this.registeredModules[i]['name']);
			}
		} else if(arguments[0] != "none") {
	      //loading configured
	      		if(arguments[0].indexOf("mod_")!=-1) var args = quickMods[arguments[0]];
	      		else var args = arguments;
	      		var arr = (args.indexOf(",")!=-1)?args.split(","):args;
	      		for(var a = 0;a<arr.length;a++) {
				this.find(arr[a]);
			}
			for(var z = 0;z<this.loadPattern.length;z++) {
				this.add(this.loadPattern[z]);
			}
		}
	}
}

modules = new Module(path_to_lib);

//*** client modules *******************************************************************************************************************
modules.register(	"client",	"basic/client",		""						);
modules.register(	"browser",	"basic/client",		"client"					);
modules.register(	"os",		"basic/client",		"client"					);
modules.register(	"flash",	"basic/client",		"browser,os"					);
modules.register(	"quicktime",	"basic/client",		"browser,os"					);
modules.register(	"realplayer",	"basic/client",		"browser,os"					);
modules.register(	"mediaplayer",	"basic/client",		"browser,os"					);
modules.register(	"acrobat",	"basic/client",		"browser,os"					);

//*** misc modules *********************************************************************************************************************
modules.register(	"datatypes",	"basic/misc",		""						);
modules.register(	"queue",	"basic/misc",		"datatypes"					);
modules.register(	"array",	"basic/misc",		"array"						);
modules.register(	"convert",	"basic/misc",		""						);
modules.register(	"string",	"basic/misc",		""						);
modules.register(	"attributes",	"basic/misc",		""						);

//*** event modules ********************************************************************************************************************
modules.register(	"event",	"basic/event",		""						);
modules.register(	"onerror",	"basic/event",		"event,queue,browser"				);
modules.register(	"onload",	"basic/event",		"event,queue,browser"				);
modules.register(	"onresize",	"basic/event",		"event,queue,browser"				);
modules.register(	"onmousedown",	"basic/event",		"event,queue,browser"				);
modules.register(	"onmouseup",	"basic/event",		"event,queue,browser"				);
modules.register(	"onclick",	"basic/event",		"event,queue,browser"				);
modules.register(	"onmouseover",	"basic/event",		"event,queue,browser"				);
modules.register(	"onmouseout",	"basic/event",		"event,queue,browser"				);
modules.register(	"onmousemove",	"basic/event",		"event,queue,browser"				);
modules.register(	"ondragstart",	"basic/event",		"event,queue,browser"				);
modules.register(	"ondrag",	"basic/event",		"event,queue,browser"				);
modules.register(	"ondragstop",	"basic/event",		"event,queue,browser"				);
modules.register(	"onslidestart",	"basic/event",		"event,queue,browser"				);
modules.register(	"onslide",	"basic/event",		"event,queue,browser"				);
modules.register(	"onslidestop",	"basic/event",		"event,queue,browser"				);

//*** object modules *******************************************************************************************************************
modules.register(	"frames",	"basic/object",		"browser"					);
modules.register(	"layers",	"basic/object",		"browser,frames"				);
modules.register(	"images",	"basic/object",		"browser,frames"				);
modules.register(	"forms",	"basic/object",		"browser,frames"				);

//*** dhtml modules ********************************************************************************************************************
modules.register(	"document",	"dhtml/document",	"browser,frames"				);
modules.register(	"window",	"dhtml/document",	"browser"					);
modules.register(	"cursor",	"dhtml/document",	"browser,document"				);
modules.register(	"contextmenu",	"dhtml/document",	"browser,onmousedown,onmouseup"			);
modules.register(	"dynimage",	"dhtml/image",		"browser"					);
modules.register(	"dynlayer",	"dhtml/layer",		"browser,frames,layers"				);
modules.register(	"dynlayerget",	"dhtml/layer",		"browser,dynlayer,convert,string"		);
modules.register(	"dynlayerset",	"dhtml/layer",		"browser,dynlayer,dynlayerget"			);
modules.register(	"dynlayermove",	"dhtml/layer",		"browser,dynlayerget,dynlayerset,path"		);
modules.register(	"dynlayersize",	"dhtml/layer",		"browser,dynlayerget,dynlayerset,path"		);
modules.register(	"dynlayerfloat","dhtml/layer",		"dynlayer,dynlayerget,dynlayerset,document"	);
modules.register(	"path",		"dhtml/path",		""						);

//*** cookies **************************************************************************************************************************
modules.register(	"session",	"cookie",		""						);

//*** widgets **************************************************************************************************************************
modules.register(	"loader",	"widgets/loader",	"browser,frames,layers,dynlayer,dynlayerget,dynlayerset"	);


modules.init(modules_to_load);

