﻿(function() {

	// Maybe use the version here? http://www.jasonclawson.com/2008/05/28/extjs-using-namespaces-improved/
	Elevator = {
		RegisterNamespace: function() {
			var args = arguments, obj = null, i, j;
			for (i = 0; i < args.length; ++i) {
				var ns = args[i];
				var nsParts = ns.split(".");
				var root = nsParts[0];
				eval('if (typeof ' + root + ' == "undefined"){' + root + ' = {};} obj = ' + root + ';');
				for (j = 1; j < nsParts.length; ++j) {
					obj[nsParts[j]] = obj[nsParts[j]] || {};
					obj = obj[nsParts[j]];
				}
			}
		}
	}; // Elevator

	Elevator.Utility = {
		applicationRoot: ''

		, Init: function(applicationRoot) {
			this.applicationRoot = applicationRoot;
		}

		, ResolveUrl: function(url) {
			return url.replace(/~\//, this.applicationRoot);
		}
	}; // Utility

	// From http://ejohn.org/blog/simple-javascript-inheritance/
	var initializingClass = false, fnTest = /xyz/.test(function() { xyz; }) ? /\b_super\b/ : /.*/;

	Elevator.Class = function() { };

	// Create a new Class that inherits from this class
	Elevator.Class.extend = function(prop) {
		var _super = this.prototype;

		// Instantiate a base class (but only create the instance,
		// don't run the init constructor)
		initializingClass = true;
		var prototype = new this();
		initializingClass = false;

		// Copy the properties over onto the new prototype
		for (var name in prop) {
			// Check if we're overwriting an existing function
			prototype[name] = typeof prop[name] == "function" &&
			typeof _super[name] == "function" && fnTest.test(prop[name]) ?
			(function(name, fn) {
				return function() {
					var tmp = this._super;

					// Add a new ._super() method that is the same method
					// but on the super-class
					this._super = _super[name];

					// The method only need to be bound temporarily, so we
					// remove it when we're done executing
					var ret = fn.apply(this, arguments);
					this._super = tmp;
					return ret;
				};
			})(name, prop[name]) :
			prop[name];
		}

		// The dummy class constructor
		function Class() {
			// All construction is actually done in the init method
			if (!initializingClass && this.init)
				this.init.apply(this, arguments);
		}

		// Populate our constructed prototype object
		Class.prototype = prototype;

		// Enforce the constructor to be what we expect
		Class.constructor = Class;


		// And make this class extendable
		Class.extend = arguments.callee;

		return Class;
	}; // Class

})();
