orion.Loader = function(framework){};
orion.Loader.prototype = {
	resolve : function(bundle){},
	unresolve : function(bundle){},
	load : function(bundle, name){}
};
	
orion.ModuleLoader = function(framework) {
	this._framework = framework;
	this._bundleScopes = {};
};

orion.ModuleLoader.prototype = {
	resolve : function(bundle) {
		var namedExports = {};
		var jsExport = null;
		var i = 0;
		// process imports (first)
		var imports = bundle.getImports();
		for (i = 0; i < imports.length; i++) {
			var jsImport = imports[i];
			var jsExport = jsImport.getWiredExport();
			if (!jsExport)
				continue; // optional
			var name = jsExport.getName();
			if (name.charAt(0) == "/")
				continue; // resource
			if (!namedExports.hasOwnProperty(name))
				namedExports[name] = jsImport.getWiredExport();
		}
	
		var names = [];
		var exportName = null;
		for (exportName in namedExports) {
			if (namedExports.hasOwnProperty(exportName))
				names.push(exportName);
		}
	
		// this sorts the set of names we'll be importing alphabetically and
		// perhaps more importantly will allow us to create the shorter/parent dotted entries first
		names.sort();
		
		var importScope = {};
		for (i = 0; i < names.length; i++) {
			exportName = names[i];
			jsExport = namedExports[exportName];
			this._addToScope(importScope, jsExport);
		}
	
		this._evalScript(importScope, bundle);
	},
	_evalScript : function(importScope, bundle) {
		var parameterNames = ["bundleContext"];
		var parameterValues = [this._framework._getBundleContext(bundle)];
		var parameterName = null;
		for (parameterName in importScope) {
			if (importScope.hasOwnProperty(parameterName)) {
				parameterNames.push(parameterName);
				parameterValues.push(importScope[parameterName]);
			}
		}
		
		var exportNames = [];
		var exports = bundle.getExports();
		for (var i = 0; i < exports.length; i++) {
			var exportName = exports[i].getName();
			if (exportName.charAt(0) == "/")
				continue; // resource
			var dotIndex = exportName.indexOf(".");
			if (dotIndex !== -1)
				exportName = exportName.substring(0,dotIndex);
			
			if (! exportNames.hasOwnProperty(exportName)) {
				exportNames[exportName] = true;
				exportNames.push(exportName + ":" + exportName);
			}
		}
		
		var parameterStatement = parameterNames.join(",");
		var returnStatement = "\n\nreturn {" + exportNames.join(",") + "};";
				
		var finalScript = bundle._script + returnStatement;
		// var load = new Function(parameterStatement, finalScript);
		var load = orion.Framework._eval("(function("+parameterStatement+") {\n" + finalScript + "\n})//@ sourceURL=" + bundle.getLocation());
		this._bundleScopes[bundle.getName + "_" + bundle.getVersion().toString()] = load.apply(null, parameterValues);
	},
	_addToScope: function(scope, jsExport) {
		var value = this.load(jsExport.getExportingBundle(), jsExport.getName());
		var tokens = jsExport.getName().split(".");
		var _Wrapper = function() {};
		var i = 0;
		while (true) {
			var token = tokens[i++];
			var current = null;
			if (scope.hasOwnProperty(token)) {
				current = scope[token];
			}
			if (i === tokens.length) {
				if (current === null || current === undefined) {
					if (typeof value === "object") {
						_Wrapper.prototype = value;
						value = new _Wrapper();
					}
					scope[token]= value;
					return;
				}
				throw "Resolve error: " + jsExport.getName() + " already exists.";				
			}
			if (current === null || current === undefined) {
				current = scope[token];
				if (current === null || current === undefined) {
					current = {};
				} else if (typeof current === "object") {
					_Wrapper.prototype = current;
					current = new _Wrapper();
				} else
					throw "Resolve error: " + jsExport.getName() + "-" + token + " already exists.";
				scope[token] = current;
			}
			scope = current;
		}
	},
	unresolve : function (bundle) {
		delete this._bundleScopes[bundle.getName + "_" + bundle.getVersion().toString()];
	},
	load : function(bundle, name) {
		var value = this._bundleScopes[bundle.getName + "_" + bundle.getVersion().toString()];
		if (value === null || value === undefined) {
			return undefined;
		}
		var names = name.split(".");
		for ( var i = 0; i < names.length; i++) {
			if (value === null || value === undefined) {
				return undefined;
			}
			value = value[names[i]];
		}
		return value;
	}
};