/*
 * Oodrive-core-min
 * Copyright(c) 2006, Nicolas BUI.
 * 
 * This code is licensed under BSD license. Use it as you wish, 
 * but keep this copyright intact.
 */


Tine.ns("Tine.app.resources");(function(){var $c=Tine.app;var $r=Tine.app.resources;$r.ResourcesManager=function(config){Tine.merge(this,config);$r.ResourcesManager.superclass.constructor.call(this,arguments);}
Tine.overload($r.ResourcesManager,{resourceIds:{},resources:[],runnerResources:[],imageResources:[],xhrResources:[],application:null,ready:false,error:false,isReady:function(){return this.ready;},hasError:function(){return this.error;},setApplicationModel:function(application){if(application instanceof $c.ApplicationModel){this.application=application;}},getApplicationModel:function(){return this.application;},initialize:function(){var rm=this;(function(){var monitor=window.setInterval(function(){var asyncResources=rm.imageResources.concat(rm.xhrResources);var completed=true;var err=false;for(var i=0,l=asyncResources.length;i<l;i++){if(!err){err=asyncResources[i].hasError();}
completed=completed&&asyncResources[i].isReady();}
if(completed){window.clearInterval(monitor);rm.ready=true;rm.error=err;}},30);})();var runnerResources=this.runnerResources;for(var i=0,l=runnerResources.length;i<l;i++){var runner=runnerResources[i];if(runner instanceof $r.RunnerResource){runner.initialize();}}
var imageResources=this.imageResources;for(var i=0,l=imageResources.length;i<l;i++){var runner=imageResources[i];if(runner instanceof $r.ImageResource){runner.initialize();}}
var xhrResources=this.xhrResources;for(var i=0,l=xhrResources.length;i<l;i++){var runner=xhrResources[i];if(runner instanceof $r.XHRResource){runner.initialize();}}},addResource:function(){var args=arguments;for(var i=0,l=args.length;i<l;i++){var a=args[i];if(!(a instanceof $r.Resource)){if(!Is.NoU(a.src)){a=new $r.ImageResource(a);}
else if(!Is.NoU(a.url)){a=new $r.XHRResource(a);}
else if(!Is.NoU(a.fn)){a=new $r.RunnerResource(a);}
else if(!Is.NoU(a.value)){a=new $r.Resource(a);}
else{throw"Not a valid resources ... please check syntax"}}
if(a instanceof $r.Resource){var id=''+a.getId();if(id==''){throw"Resource must be associated with an id !";}
if(!Is.NoU(this.resourceIds[id])){throw"Resource with the id ["+id+"] already exists";}
a.setResourcesManager(this);this.resourceIds[id]=a;this.resources.push(a);if(a instanceof $r.XHRResource){this.xhrResources.push(a);}
else if(a instanceof $r.RunnerResource){this.runnerResources.push(a);}
else if(a instanceof $r.ImageResource){this.imageResources.push(a);}}}},getResource:function(resourceId){return this.getById(resourceId);},getValue:function(resourceId){var r=this.getById(resourceId);return r?r.getValue():null;},getById:function(resourceId){return this.resourceIds[resourceId];},getByIndex:function(index){if(index>=0&&index<this.resources.length){return this.resources[index];}
return null;},hasResource:function(a){var id=null;if(a instanceof $r.Resource){id=a.getId;}
else if(typeof(a)=='string'&&a!=''){id=a;}
else{throw"Not a resource";}
return!Is.NoU(this.resourceIds[id])}});})();

(function(){var $e=Tine.require("Tine.app.resources");$e.Resource=function(config){Tine.merge(this,config);$e.Resource.superclass.constructor.call(this,arguments);}
Tine.overload($e.Resource,{id:'',value:'',resourceMgr:null,getId:function(){return this.id;},getValue:function(){return this.value;},setValue:function(value){this.value=value;},getResourcesManager:function(){return this.resourceMgr;},setResourcesManager:function(resourceMgr){this.resourceMgr=resourceMgr;},loadResource:function(){this.loaded=true;return this.value;},initialize:function(){this.setValue(this.loadResource());}});})();

(function(){var $e=Tine.require("Tine.app.resources");$e.RunnerResource=function(config){Tine.merge(this,config);$e.RunnerResource.superclass.constructor.call(this,arguments);if(!Is.fn(this.fn)){throw"Tine.app.resource.RunnerResource: no function to launch";}
this.scope=this.scope||window;}
Tine.extend($e.RunnerResource,$e.Resource,{fn:null,scope:window,params:null,loadResource:function(){var args=[];if(!Is.NoU(this.params)){if(!Is.array(this.params)){args=[params];}
else{args=this.params;}}
return this.fn.call(this.scope||window,args);}});})();

(function(){var $e=Tine.require("Tine.app.resources");$e.AsyncResource=function(config){Tine.merge(this,config);$e.AsyncResource.superclass.constructor.call(this,arguments);}
Tine.extend($e.AsyncResource,$e.Resource,{loaded:false,failed:false,isReady:function(){return this.loaded;},hasError:function(){return this.failed;}});})();

(function(){var $e=Tine.require("Tine.app.resources");$e.ImageResource=function(config){Tine.merge(this,config);$e.ImageResource.superclass.constructor.call(this,arguments);if(!Is.str(this.src)){throw"Tine.app.resource.ImageResource: no location to load image";}}
Tine.extend($e.ImageResource,$e.AsyncResource,{fn:null,scope:window,monitor:null,monitorInterval:40,timeoutMonitor:null,timeoutInterval:6000,image:null,src:'',loadResource:function(){var ir=this;ir.image=new Image();ir.image.src=this.src;this.timeoutMonitor=window.setTimeout(function(){console.error("[timeout]: Loading "+ir.src+" failed");if(ir.monitor){window.clearInterval(ir.monitor);delete ir.monitor;}
ir.failed=true;ir.loaded=true;},this.timeout||this.timeoutInterval);this.monitor=window.setInterval(function(){if(ir.image.complete){window.clearInterval(ir.monitor);delete ir.monitor;if(ir.timeoutMonitor){window.clearTimeout(ir.timeoutMonitor);delete ir.timeoutMonitor;}
ir.loaded=true;ir.failed=(ir.image.width==0||ir.image.height==0);}},ir.monitorInterval);return this.src;}});})();

(function(){var $e=Tine.require("Tine.app.resources");$e.XHRResource=function(config){Tine.merge(this,config);if(!Is.str(this.url)||Is.empty(this.url)){throw"XHRResource require a url to process";}
$e.XHRResource.superclass.constructor.call(this,arguments);}
Tine.extend($e.XHRResource,$e.AsyncResource,{url:'',method:'POST',response:'',params:'',callback:undefined,loadResource:function(){var $this=this;var resMgr=this.getResourcesManager();var reg=/^res\:\/\/([a-zA-Z0-9_\-.]+)/g;var resUrl=this.url.match(reg);if(Is.array(resUrl)&&resUrl.length>0){var resourceName=resUrl[0].substring(6);this.url=this.url.replace(resUrl[0],resMgr.getValue(resourceName));}
var conn=Tine.net.Ajax.request({url:this.url,params:this.params,method:this.method,callback:function(response,xhr){var cb=$this.callback;if(cb){if(Is.fn(cb)){cb.call($this,response,xhr);}
else if(Is.obj(cb)&&Is.fn(cb)){cb.fn.call(cb.scope||$this,response,xhr);}}
$this.loaded=true;$this.failed=!response.success;$this.response=response;}});return this.response;}});})();

(function(){var $m=Tine.ns("Tine.app.modules");var $c=Tine.require("Tine.app");var $r=Tine.require("Tine.app.resources");$m.ModulesManager=function(config){Tine.merge(this,config);$m.ModulesManager.superclass.constructor.call(this,arguments);}
Tine.overload($m.ModulesManager,{moduleIds:{},modules:[],application:null,resourcesMgr:null,ready:false,setResourcesManager:function(resourcesMgr){if(resourcesMgr instanceof $r.ResourcesManager){this.resourcesMgr=resourcesMgr;}},getResourcesManager:function(){return this.resourcesMgr;},setApplicationModel:function(application){if(application instanceof $c.ApplicationModel){this.application=application;}},getApplicationModel:function(){return this.application;},initializeModules:function(){var modules=this.modules;for(var i=0,l=modules.length;i<l;i++){var module=modules[i];if(module instanceof $m.Module){module.initialize();}}},startModules:function(){var modules=this.modules;for(var i=0,l=modules.length;i<l;i++){var module=modules[i];if(module instanceof $m.Module){module.startModule();}}},addModule:function(){var args=arguments;for(var i=0,l=args.length;i<l;i++){var a=args[i];if(a instanceof $m.Module){var id=''+a.getId();if(id==''){throw"Module must be associated with an id !";}
if(!Is.NoU(this.moduleIds[id])){throw"Module with the id ["+id+"] already exists";}
a.setModulesManager(this);this.moduleIds[id]=a;this.modules.push(a);}}},getModule:function(moduleId){return this.getById(moduleId);},getModules:function(){return this.modules;},getById:function(moduleId){return this.moduleIds[moduleId];},getByIndex:function(index){if(index>=0&&index<this.modules.length){return this.modules[index];}
return null;},hasModule:function(a){var id=null;if(a instanceof $m.Module){id=a.getId();}
else if(typeof(a)=='string'&&a!=''){id=a;}
else{throw"Not a module";}
return!Is.NoU(this.moduleIds[id])}});})();

(function(){var $m=Tine.require("Tine.app.modules");$m.Module=function(config){Tine.merge(this,config);$m.Module.superclass.constructor.call(this,arguments);}
Tine.overload($m.Module,{id:'',modulesMgr:null,getId:function(){return this.id;},getResourcesManager:function(){return this.modulesMgr.getResourcesManager();},getModulesManager:function(){return this.modulesMgr;},setModulesManager:function(modulesMgr){this.modulesMgr=modulesMgr;},initialize:function(){},destroy:function(){},startModule:function(){}});})();

Tine.ns("Tine.app");(function(){var $c=Tine.app;var $r=Tine.require("Tine.app.resources","[Tine.app.resources] must be load first");var $m=Tine.require("Tine.app.modules","[Tine.app.modules] must be load first");$c.ApplicationModel=function(config){Tine.merge(this,config);if(Is.NoU(this.resourcesMgr)){this.resourcesMgr=new $r.ResourcesManager();}
this.resourcesMgr.setApplicationModel(this);this.initResources();if(Is.NoU(this.modulesMgr)){this.modulesMgr=new $m.ModulesManager();}
this.modulesMgr.setApplicationModel(this);this.modulesMgr.setResourcesManager(this.resourcesMgr);$c.ApplicationModel.superclass.constructor.apply(this,arguments);};Tine.overload($c.ApplicationModel,{resources:[],modules:[],resourcesMgr:null,modulesMgr:null,getResourcesManager:function(){return this.resourcesMgr;},getModulesManager:function(){return this.modulesMgr;},initResources:function(){var resourcesMgr=this.getResourcesManager();var resources=this.resources;for(var i=0,l=resources.length;i<l;i++){resourcesMgr.addResource(resources[i]);}
resourcesMgr.initialize();var appmodel=this;(function(){var monitor=window.setInterval(function(){if(resourcesMgr.isReady()){window.clearInterval(monitor);appmodel.initModules();}},30);})();},initModules:function(){var modulesMgr=this.getModulesManager();var modules=this.modules;for(var i=0,l=modules.length;i<l;i++){modulesMgr.addModule(modules[i]);}
modulesMgr.initializeModules();modulesMgr.startModules();}});})();

