/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.lang.type");
dojo.require("dojo.lang.common");
dojo.lang.whatAmI = function (value) {
	dojo.deprecated("dojo.lang.whatAmI", "use dojo.lang.getType instead", "0.5");
	return dojo.lang.getType(value);
};
dojo.lang.whatAmI.custom = {};
dojo.lang.getType = function (value) {
	try {
		if (dojo.lang.isArray(value)) {
			return "array";
		}
		if (dojo.lang.isFunction(value)) {
			return "function";
		}
		if (dojo.lang.isString(value)) {
			return "string";
		}
		if (dojo.lang.isNumber(value)) {
			return "number";
		}
		if (dojo.lang.isBoolean(value)) {
			return "boolean";
		}
		if (dojo.lang.isAlien(value)) {
			return "alien";
		}
		if (dojo.lang.isUndefined(value)) {
			return "undefined";
		}
		for (var name in dojo.lang.whatAmI.custom) {
			if (dojo.lang.whatAmI.custom[name](value)) {
				return name;
			}
		}
		if (dojo.lang.isObject(value)) {
			return "object";
		}
	}
	catch (e) {
	}
	return "unknown";
};
dojo.lang.isNumeric = function (value) {
	return (!isNaN(value) && isFinite(value) && (value != null) && !dojo.lang.isBoolean(value) && !dojo.lang.isArray(value) && !/^\s*$/.test(value));
};
dojo.lang.isBuiltIn = function (value) {
	return (dojo.lang.isArray(value) || dojo.lang.isFunction(value) || dojo.lang.isString(value) || dojo.lang.isNumber(value) || dojo.lang.isBoolean(value) || (value == null) || (value instanceof Error) || (typeof value == "error"));
};
dojo.lang.isPureObject = function (value) {
	return ((value != null) && dojo.lang.isObject(value) && value.constructor == Object);
};
dojo.lang.isOfType = function (value, type, keywordParameters) {
	var optional = false;
	if (keywordParameters) {
		optional = keywordParameters["optional"];
	}
	if (optional && ((value === null) || dojo.lang.isUndefined(value))) {
		return true;
	}
	if (dojo.lang.isArray(type)) {
		var arrayOfTypes = type;
		for (var i in arrayOfTypes) {
			var aType = arrayOfTypes[i];
			if (dojo.lang.isOfType(value, aType)) {
				return true;
			}
		}
		return false;
	} else {
		if (dojo.lang.isString(type)) {
			type = type.toLowerCase();
		}
		switch (type) {
		  case Array:
		  case "array":
			return dojo.lang.isArray(value);
		  case Function:
		  case "function":
			return dojo.lang.isFunction(value);
		  case String:
		  case "string":
			return dojo.lang.isString(value);
		  case Number:
		  case "number":
			return dojo.lang.isNumber(value);
		  case "numeric":
			return dojo.lang.isNumeric(value);
		  case Boolean:
		  case "boolean":
			return dojo.lang.isBoolean(value);
		  case Object:
		  case "object":
			return dojo.lang.isObject(value);
		  case "pureobject":
			return dojo.lang.isPureObject(value);
		  case "builtin":
			return dojo.lang.isBuiltIn(value);
		  case "alien":
			return dojo.lang.isAlien(value);
		  case "undefined":
			return dojo.lang.isUndefined(value);
		  case null:
		  case "null":
			return (value === null);
		  case "optional":
			dojo.deprecated("dojo.lang.isOfType(value, [type, \"optional\"])", "use dojo.lang.isOfType(value, type, {optional: true} ) instead", "0.5");
			return ((value === null) || dojo.lang.isUndefined(value));
		  default:
			if (dojo.lang.isFunction(type)) {
				return (value instanceof type);
			} else {
				dojo.raise("dojo.lang.isOfType() was passed an invalid type");
			}
		}
	}
	dojo.raise("If we get here, it means a bug was introduced above.");
};
dojo.lang.getObject = function (str) {
	var parts = str.split("."), i = 0, obj = dj_global;
	do {
		obj = obj[parts[i++]];
	} while (i < parts.length && obj);
	return (obj != dj_global) ? obj : null;
};
dojo.lang.doesObjectExist = function (str) {
	var parts = str.split("."), i = 0, obj = dj_global;
	do {
		obj = obj[parts[i++]];
	} while (i < parts.length && obj);
	return (obj && obj != dj_global);
};

