/*
 * jQLoader 0.1.0 Plugin for jQquery.
 * http://sanraul.com/projects/jqloader/
 * 
 * Copyright (c) 2008 Raul Sanchez (http://www.sanraul.com)
 * 
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 */
(function($){var helper={index:{},queue:[],cache:[],onReady:'onReady',onError:'onError',onPublish:'onPublish',settings:null,info:{appName:'JQLoader',copyright:'Copyright (c) 2009 Raul Sanchez',site:'http://www.jqloader.com',author:'Raul Sanchez',email:'sanraul@gmail.com',version:'0.1.0',id:'$Id: jqloader-0.1.0.js 8 2009-12-01 13:45:09Z sanraul $',date:'$Date: 2009-12-01 08:45:09 -0500 (Tue, 01 Dec 2009) $',revision:'$Rev: 8 $',toString:function(){var str='';$.each(this,function(i,item){str+=i+': '+item+'\n'});return str}},isInQueue:function(src){var exist=false;for(var i=0;i<this.queue.length;i++){if(this.queue[i].src==src){exist=true;break}}return exist},isReady:function(){var ready=true;$.each(this.queue,function(i,item){if(item.loaded===false){ready=false}});return ready},enqueue:function(entry){this.queue.push(entry)},dequeue:function(){var next;for(var i=0;i<this.queue.length;i++){if(this.queue[i].loaded===false){next=this.queue[i].src;break}}this.process(next)},process:function(src){var that=this;var cacheString='['+this.cache.join('][')+']';if(cacheString.indexOf('['+src+']')==-1){this.cache.push(src)}else{this.dequeue();return}var fileURL=this.settings.baseURL.length==0?src:(this.settings.baseURL+'/'+src);$.ajax({type:"GET",url:fileURL,dataType:"script",success:function(data){that.flagAsReady(src,data);var ready=that.isReady();if(ready){that.dispatchReadyEvent.apply(that)}else{that.dequeue()}},error:function(e){that.dispatchErrorEvent.apply(that,[e])}})},flagAsReady:function(src,data){for(var i=0;i<this.queue.length;i++){if(this.queue[i].src===src){this.queue[i].loaded=true;this.queue[i].data=data;break}}},getClassBySource:function(src){var classConst=null;for(var i=0;i<this.queue.length;i++){if(this.queue[i].src===src){break}}return classConst},dispatchReadyEvent:function(){$(this).trigger({type:this.onReady,helper:this})},dispatchPublishEvent:function(){$(this).trigger({type:this.onPublish,queue:this.queue})},dispatchErrorEvent:function(e){$(this).trigger({type:this.onError,helper:this,error:e})},reset:function(options){var params;this.index={};this.queue=[];this.cache=[];this.settings={ready:function(options){},error:function(options){},autorun:true,baseURL:''};if(options!=null){if(typeof options=='function'){params={ready:options}}else{params=options}this.settings=$.extend(this.settings,params)}return this.settings}};var pluginObj={jqloader:{load:function(src,options){var params=helper.reset(options);this.include(src);var that=this;$(helper).bind(helper.onReady,function(e){this.settings.ready(params)});$(helper).bind(helper.onError,function(e){params.e=e;this.settings.error(params)});helper.process(src)},publish:function(src,options){var params=helper.reset(options);$(helper).bind(helper.onPublish,{printFileName:true},function(e){params.queue=e.queue;params.output='// '+this.info.appName+' - '+this.info.copyright+'\n\n';for(var i=0;i<e.queue.length;i++){params.output+='// src: '+e.queue[i].src+'\n\n';params.output+=e.queue[i].data+'\n\n'}if(params.autorun!=null&&params.autorun!=false){params.output+='var application = (new ($.jqloader.get("Application"))()).main();\n'}if(typeof options=='function'){options(params)}else{try{options.ready(params)}catch(e){}}});this.load(src,function(options){helper.dispatchPublishEvent.apply(helper)})},run:function(src,options){var that=this;var params=helper.reset(options);this.load(src,function(options){try{var ClassConst=that.get('Application');var application=new ClassConst();application.main(options)}catch(e){}})},register:function(key,classConst){if(!helper.index.hasOwnProperty(key)){if(typeof classConst=='function'){helper.index[key]=classConst}else{var Func=function(){if(this.constructor!=null){try{this.constructor.apply(this,arguments)}catch(e){}}};Func.prototype=classConst;helper.index[key]=Func}return true}else{return false}},get:function(key){var classConst=null;if(helper.index.hasOwnProperty(key)){classConst=helper.index[key]}return classConst},include:function(src){var isInQueue=helper.isInQueue(src);if(!isInQueue){var entry={src:src,loaded:false,data:null};helper.enqueue(entry)}},version:function(){return helper.info.version},info:function(key){if(key==null){return helper.info.version}else{return helper.info[key]}}}};$.extend(pluginObj)})(jQuery);