(
function() {
	var Global = this;
	
	if(typeof(Global.Forever) == "undefined") {
		var Forever = Global.Forever = {};
	} else {
		throw new Error("Namespace: Forever is already defined.");
	}
	
	Forever.lang = {};
	
	Forever.lang.Bind = function(scope, fn) {
		var args = [];
		for(var i = 2; i < arguments.length; i++) {
			args[args.length] = arguments[i];
		}
		return function() {
			fn.apply(scope, args);
		};
	};
	
	Forever.lang.Parse = function(obj) {
		var str = "{\n";
		try {
			if(!obj.length) throw false;
			for(var i = 0; i < obj.length; i++) {
				str += i + ": " + (YAHOO.lang.isObject(obj[i]) ? Forever.lang.Parse(obj[i]) : obj[i]) + "\n";
			}
		} catch(e) {
			for(var prop in obj) {
				str += prop + ": " + (YAHOO.lang.isObject(obj[prop]) ? Forever.lang.Parse(obj[prop]) : obj[prop]) + "\n";
			}
		}
		return str + "}";
	};
	
	Forever.lang.hasYUI = function(yahoo) {
		yahoo = typeof(yahoo) == "undefined" ? {} : yahoo;
		if(typeof(YAHOO) == "object") {
			Forever.lang._hasYUI(yahoo);
		} else {
			throw new Error("Namespace: YAHOO is not defined.");
			return false;
		}
	};
	
	Forever.lang._hasYUI = function(object, yahoo, namespace) {
		yahoo = typeof(yahoo) == "undefined" ? Global.YAHOO : yahoo;
		namespace = typeof(namespace) == "string" ? namespace : "YAHOO";
		if(YAHOO.lang.isArray(object)) {
			for(var i = 0; i < object.length; i++) {
				var property = object[i];
				if(!yahoo[property]) {
					throw new Error("Namespace: " + namespace + "." + property + " is not defined.");
				}
			}
		} else if(YAHOO.lang.isObject(object)) {
			for(var property in object) {
				if(yahoo[property]) {
					Forever.lang._hasYUI(object[property], yahoo[property], namespace + "." + property);
				} else {
					throw new Error("Namespace: " + namespace + "." + property + " is not defined.");
				}
			}
		}
	};
	
	Forever.lang.hasForever = function(forever) {
		forever = typeof(forever) == "undefined" ? {} : forever;
		Forever.lang._hasForever(forever);
	};
	
	Forever.lang._hasForever = function(object, forever, namespace) {
		forever = typeof(forever) == "undefined" ? Global.Forever : forever;
		namespace = typeof(namespace) == "string" ? namespace : "Forever";
		if(YAHOO.lang.isArray(object)) {
			for(var i = 0; i < object.length; i++) {
				var property = object[i];
				if(!forever[property]) {
					throw new Error("Namespace: " + namespace + "." + property + " is not defined.");
				}
			}
		} else if(YAHOO.lang.isObject(object)) {
			for(var property in object) {
				if(forever[property]) {
					Forever.lang._hasYUI(object[property], forever[property], namespace + "." + property);
				} else {
					throw new Error("Namespace: " + namespace + "." + property + " is not defined.");
				}
			}
		}
	};
	
	Forever.lang.hasGoogle = function(google) {
		google = typeof(google) == "undefined" ? {} : google;
		if(typeof(google) == "object") {
			Forever.lang._hasGoogle(google);
		} else {
			throw new Error("Namespace: google is not defined.");
			return false;
		}
	};
	
	Forever.lang._hasGoogle = function(object, google, namespace) {
		google = typeof(google) == "undefined" ? Global.google : google;
		namespace = typeof(namespace) == "string" ? namespace : "google";
		if(YAHOO.lang.isArray(object)) {
			for(var i = 0; i < object.length; i++) {
				var property = object[i];
				if(!google[property]) {
					throw new Error("Namespace: " + namespace + "." + property + " is not defined.");
				}
			}
		} else if(YAHOO.lang.isObject(object)) {
			for(var property in object) {
				if(google[property]) {
					Forever.lang._hasYUI(object[property], google[property], namespace + "." + property);
				} else {
					throw new Error("Namespace: " + namespace + "." + property + " is not defined.");
				}
			}
		}
	};
}
)();