/*----------------------------------------------------------------------
|
| Copyright 2008 by
|
| majortom.ch, St.Johannsring 51, 4056 Basel, Switzerland
|
| If you are interessed in this code, contact us at info@majortom.ch
|
-----------------------------------------------------------------------*/
   mt = {version:'0.1 alpha',PATH_JS:'/_js/_build/'};window.mt = mt;mt.Loader = {STATUS_IDLE:0,STATUS_LOADING :1,STATUS_LOADED:2,STATUS_INITIALIZED:3,TYPE_NAMES:['Unknown','Package','Class'],TYPE_UNKNOWN:0,TYPE_PACKAGE:1,TYPE_CLASS:2,RE_FQNAME:/^([A-Za-z0-9\.])*[A-Za-z0-9\*]$/,status:0,console:'',registry:null,loaded:false,bodyLoaded:false,_loadElement:null,_includes:null,$$name:'mt.Loader',$$events:null,$$constructor:function(){this.$$events = {onload:[]};this.registry = {};this._includes = [];this.status = this.STATUS_IDLE;if (window.addEventListener){ window.addEventListener('load',this._bind({name:'onload',method:function(){this.bodyLoaded=true;this._loadFiles();},scope:this}),false);}else if (window.attachEvent){ window.attachEvent('onload',this._bind({name:'onload',method:function(){this.bodyLoaded=true;this._loadFiles();},scope:this}));}},include:function(_fqname){if(!this.RE_FQNAME.test(_fqname)) return null;this._includes.push(_fqname);this._loadFiles();},register:function(_fqname,_type,_data){if(!this.RE_FQNAME.test(_fqname)) return null;if(!this.isRegistered(_fqname)){this.registry[_fqname] = {loaded:false,initialized:false,type:this.TYPE_UNKNOWN,data:null};this.registry[_fqname].type = (typeof(_type)=='number') ? _type : this.TYPE_UNKNOWN;}if(typeof(_data)=='object' && !this.isLoaded(_fqname)){this.registry[_fqname].data = _data;this.registry[_fqname].type = (typeof(_type)=='number') ? _type : this.TYPE_UNKNOWN;this.registry[_fqname].loaded = true;if(this.registry[_fqname].type == this.TYPE_CLASS)this._initClass(_fqname);if(this._loadElement == _fqname){this.status = this.STATUS_IDLE;this._loadElement = '';this._loadFiles();}}},isRegistered:function(_fqname){return (typeof(this.registry[_fqname])=='object');},isLoaded:function(_fqname){return (typeof(this.registry[_fqname])=='object' && this.registry[_fqname].loaded);},isInitialized:function(_fqname){return (typeof(this.registry[_fqname])=='object' && this.registry[_fqname].initialized);},getType:function(_fqname){return (typeof(this.registry[_fqname])=='object') ? this.registry[_fqname].type : this.TYPE_UNKNOWN;},addListener:function(_arg){if(!this.$$events[_arg.name] || typeof(_arg.handler)!='function') return null;if(typeof(_arg.priority)!='number') _arg.priority=0;this.$$events[_arg.name].push({handler:_arg.handler,scope:_arg.scope,once:_arg.once,priority:_arg.priority});},_initClass:function(_fqname){if(this.isInitialized(_fqname)) return null;if(this.isInitialized('mt.core.Class')){mt.core.Class.create(_fqname,this.registry[_fqname].data);this.registry[_fqname].initialized = true;}if(typeof(this.registry[_fqname].data.$$init)=='function')this.registry[_fqname].data.$$init();},_loadFiles:function(){if(this.status != this.STATUS_IDLE) return null;for(var i=0;i<this._includes.length;i++){var names = this._includes[i].split('.');for(var j=1;j<names.length;j++){var name = names.slice(0,j+1);var firstChar = name[name.length-1].charAt(0);if(firstChar=='*' || firstChar.toLowerCase() != firstChar) break;name = name.join('.');if(!this.isLoaded(name)){this.status = this.STATUS_LOADING;this._loadElement = name;this._loadScriptfile(this._getFilename(name));break;}}if(this.status == this.STATUS_LOADING) break;var name = names[names.length-1];var re;if(name=='*')re = eval('/^'+this._includes[i]+'[A-Za-z0-9\.]*/');else if(name!='' && name.toLowerCase() == name) re = eval('/^'+this._includes[i]+'\.[A-Z0-9]+/');else re = eval('/^'+this._includes[i]+'$/');for(var name in this.registry){if(re.test(name) && !this.isLoaded(name)){this.status = this.STATUS_LOADING;this._loadElement = name;this._loadScriptfile(this._getFilename(name));break;}}if(this.status == this.STATUS_LOADING) break;this._includes.splice(i,1);i--;}if(this.status == this.STATUS_IDLE){if(this.bodyLoaded && !this.loaded){this.loaded = true;this._fireEvent({name:'onload'});}}},_bind:function(_arg){this._bind[_arg.name] = function(){_arg.method.apply(_arg.scope, arguments);};return this._bind[_arg.name];},_loadScriptfile:function(_file){var script  = document.createElement('script');script.setAttribute('language','javascript');script.setAttribute('type','text/javascript');script.setAttribute('src',_file);document.getElementsByTagName('head')[0].appendChild(script);},_getFilename:function(_fqname){var filename = _fqname.replace(/mt\./g,mt.PATH_JS);filename = filename.replace(/\./g,'/')+'.js';return filename;},_fireEvent:function(_arg){var $$event = (this.$$events[_arg.name] instanceof Array) ? this.$$events[_arg.name]  : [];$$event.sort(function(a,b){return b.priority-a.priority});for(var i=0; i<$$event.length; i++){$$event[i].handler.call($$event[i].scope,_arg.value);if($$event[i].once){$$event.splice(i,1);i--;}}}};mt.Loader.$$constructor();