if("undefined" == typeof(SLOG)) {

SLOG = {

	namespaces: [],

	namespace: function(name) {
		var scripts = document.getElementsByTagName("script");
		for(var i = 0; i < scripts.length; ++i) {
			var namespaceAttribute = scripts[i].getAttribute("slog:namespace");
			if(name == namespaceAttribute) {
				SLOG.namespaces[name] = scripts[i].src.replace( /\.js$/ , '');
			}
		}
	},


	libraries: [],

	/**
	 * @public
	 */
	library: function(library, requirements, code) {
		if("undefined" == typeof(SLOG.libraries[library])) {
			SLOG.libraries[library] = {
				loaded: false,
				code: code,
				requirements: requirements,
				dependencies: []
			};
		}
		else if(SLOG.libraries[library].loaded == true) {
			return;
		}
		else {
			if( ("undefined" == SLOG.libraries[library].code) || (null == SLOG.libraries[library].code) ) {
				SLOG.libraries[library].code = code;
			}
			if( ("undefined" == SLOG.libraries[library].requirements) || (null == SLOG.libraries[library].requirements) ) {
				SLOG.libraries[library].requirements = requirements;
			}
		}

		var requirement;
		for(var iRequirement = 0; iRequirement < SLOG.libraries[library].requirements.length; ++iRequirement) {
			var requirement = SLOG.libraries[library].requirements[iRequirement];
			if("undefined" == typeof(SLOG.libraries[requirement])) {

				SLOG.libraries[requirement] = {
					loaded: false,
					dependencies: [library]
				};

				var script = document.createElement("script");

				//Detect the namespace of the requirement:
				var namespaceFound = false;
				var namespace = "";
				var re;
				for(namespace in SLOG.namespaces) {
					re = new RegExp("^" + namespace + "\\.");
					if(requirement.match(re)) {
						namespaceFound = true;
						break;
					}
				}
				if(namespaceFound) {
					var uri = SLOG.namespaces[namespace] + "/" + requirement.replace(re, "") + ".js";

					script.type = "text/javascript";
					script.src = uri;
					document.getElementsByTagName("head")[0].appendChild(script);					
				}
				else {
					alert("Namespace not found for: " + requirement);
				}
				
				return;
			}
		}
		//All the requirements are loaded. Execute the library.
		(code)();
		SLOG.libraries[library].loaded = true;
		if(SLOG.libraries[library].dependencies.length > 0) {
			var dependency = SLOG.libraries[library].dependencies[0];
			SLOG.library(dependency, SLOG.libraries[dependency].requirements, SLOG.libraries[dependency].code);
		}
	}

};

SLOG.namespace("SLOG");

}