User:Gerbrant/fw.js

From Wikipedia, the free encyclopedia

Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.

new function()
{
	var pathPrefix = "/w/index.php?title=User:";
	var pathPostfix = ".js&action=raw&ctype=text/javascript&dontcountme=s";
	var interPrefix1 = "http://";
	var interPrefix2 = ".wikipedia.org/w/index.php?title=User:";
	var ownClassName = "Gerbrant.fw";
	var globalScope = window;
	var frameworkFunctionsGlobal = true;
 
//	-----------------------------------------------------------------------
 
	this.version = "1.0.1";
	this.revision = 1;
 
	var loadingModules = {};
	var loadedModules = {};
	var thisModule = globalScope;
	var bootModules = null;
 
	var ids = ownClassName.split(".");
	for(i in ids)
	{
		id = ids[i];
		if(!defined(thisModule[id]))
		{
			thisModule = null;
			break;
		}
		thisModule = thisModule[id];
	}
	if(thisModule)
	{
		if(defined(thisModule.loadModule)) return;
		if(defined(thisModule.load))
			bootModules = thisModule.load;
	}
 
	loadingModules[ownClassName] = [];
 
	function warning(message)
	{
		alert("Framework warning message:\n\n" + message);
	}
 
	function defined(a)
	{
		return a != undefined;
	}
 
	function modulePath(moduleName)
	{
		return moduleName.replace(/\./g, "/") + pathPostfix;
	}
 
	this.loadModule = function(moduleName, callback)
	{
		var p = moduleName.indexOf(":"), inter;
		if(p == -1)
			p = pathPrefix;
		else
		{
			inter = moduleName.slice(0, p);
			moduleName = moduleName.slice(p + 1);
			p = interPrefix1 + inter + interPrefix2;
		}
 
		var module = loadedModules[moduleName];
		if(defined(module))
		{
			if(defined(callback)) callback(module);
			return;
		}
 
		module = loadingModules[moduleName];
		if(defined(module))
		{
			if(defined(callback)) module.push(callback);
			return;
		}
 
		if(defined(callback)) callback = [callback];
		else callback = [];
		loadingModules[moduleName] = callback;
		document.write("<script src='" + p + modulePath(moduleName) + "'></script>");
	}
 
	this.module = function(moduleName, module)
	{
		var i, ids, id, mid, scope = globalScope;
 
		if(defined(loadedModules[moduleName]))
			warning("Module " + moduleName + " is loaded more than once.");
		else
		{
			loadedModules[moduleName] = module;
 
			ids = moduleName.split(".");
			mid = ids.pop();
			for(i in ids)
			{
				id = ids[i];
				if(!defined(scope[id]))
					scope[id] = {};
				scope = scope[id];
			}
			id = scope[mid];
			if(defined(id))
				for(i in module) id[i] = module[i];
			else
				scope[mid] = module;
		}
 
		var callbacks = loadingModules[moduleName];
		delete loadingModules[moduleName];
		if(defined(callbacks))
			for(i in callbacks)
				if(typeof callbacks[i] == "function")
					callbacks[i](module, moduleName);
				else
					warning("One of the callbacks registered for " +
						moduleName + " is not a function:\n" + callbacks[i]);
		else
			warning("Module " + moduleName + " finished loading without request.");
	}
 
	this.loadModules = function(moduleNames, callback)
	{
		var n = moduleNames.length, moduleList = {}, f;
		if(defined(callback))
			f = function(module, moduleName)
			{
				moduleList[moduleName] = module;
				if(--n == 0) callback(moduleList);
			};
		for(i in moduleNames) loadModule(moduleNames[i], f);
	}
 
	if(frameworkFunctionsGlobal)
	{
		module = this.module;
		loadModule = this.loadModule;
		loadModules = this.loadModules;		
	}
 
	this.module(ownClassName, this);
 
	if(defined(bootModules)) this.loadModules(bootModules);
};