Deferred experiments

by whelkaholism

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.js"></script>
<ul id="res"></ul>

JavaScript

if(typeof(Depends) == 'undefined') 
{
	Depends = {
		modules: {},
		defaultModule: '__DEFAULT__'
	};
	
	// =================================================================================================================================================================
	Depends.LoadManager = function()
	{
		var _this = this;

		var getScriptChain  = function(module, chain, index, getoptions)
    {
			if(typeof(index) == 'undefined')
					index = 0;

			if(index == 0)
				Depends.modules[module] = { loading: true, loaded: false };

			$.getScript(chain[index], 
				function()
				{					
					getoptions.scriptLoaded && getoptions.scriptLoaded(module, chain[index], index);
											
					if(index == chain.length - 1)
					{
						window.console && console.log('Depends.load', 'Module ' + module + ' loaded');
						
						Depends.modules[module] = { loading: false, loaded: true };

						getoptions.moduleLoaded && getoptions.moduleLoaded(module);
					}
					else 
						getScriptChain(module, chain, index + 1, getoptions);
				}
			);
    };
	
		this.load = function(loadoptions)
		{		
			if(!Depends.modules[loadoptions.module] && loadoptions._byName)
				window.console && console.log('Depends.load', 'Module ' + loadoptions.module + ' not registered');				
			else if(!loadoptions || !loadoptions.module || !loadoptions.chain)
				window.console && console.log('Depends.load', 'Minimum config is module and chain');
						
			if(loadoptions.chain && loadoptions.chain.length > 0)
			{
				var modstatus = Depends.modules[loadoptions.module];
				
				var getoptions = $.extend({}, loadoptions.getoptions, {
					moduleLoaded: 
						function() 
						{ 
							loadoptions.loaded && loadoptions.loaded.apply(_this, arguments);
						}
				});
				
				if(!modstatus || (!modstatus.loading && !modstatus.loaded))
					getScriptChain(loadoptions.module, loadoptions.chain, 0, getoptions);
				else if(modstatus)
					window.console && console.log('Depends.load', 'Module ' +...