//----------------------------------------------------------------------- // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------- // MicrosoftAjax.Function.js. // Microsoft AJAX Framework. Function.__typeName = 'Function'; Function.__class = true; Function.createCallback = function Function$createCallback(method, context) { /// <param name="method" type="Function"></param> /// <param name="context" mayBeNull="true"></param> /// <returns type="Function"></returns> var e = Function._validateParams(arguments, [ {name: "method", type: Function}, {name: "context", mayBeNull: true} ]); if (e) throw e; return function() { var l = arguments.length; if (l > 0) { var args = []; for (var i = 0; i < l; i++) { args[i] = arguments[i]; } args[l] = context; return method.apply(this, args); } return method.call(this, context); } } Function.createDelegate = function Function$createDelegate(instance, method) { /// <param name="instance" mayBeNull="true"></param> /// <param name="method" type="Function"></param> /// <returns type="Function"></returns> var e = Function._validateParams(arguments, [ {name: "instance", mayBeNull: true}, {name: "method", type: Function} ]); if (e) throw e; return function() { return method.apply(instance, arguments); } } Function.emptyFunction = Function.emptyMethod = function Function$emptyMethod() { if (arguments.length !== 0) throw Error.parameterCount(); } // Function._validateParams = function Function$_validateParams(params, expectedParams) { var e; e = Function._validateParameterCount(params, expectedParams); if (e) { e.popStackFrame(); return e; } for (var i=0; i < params.length; i++) { var expectedParam = expectedParams[Math.min(i, expectedParams.length - 1)]; var paramName = expectedParam.name; if (expectedParam.parameterArray) { paramName += "[" + (i - expectedParams.length + 1) + "]"; } e = Function._validateParameter(params[i], expectedParam, paramName); if (e) { e.popStackFrame(); return e; } } return null; } Function._validateParameterCount = function Function$_validateParameterCount(params, expectedParams) { var maxParams = expectedParams.length; var minParams = 0; for (var i=0; i < expectedParams.length; i++) { if (expectedParams[i].parameterArray) { maxParams = Number.MAX_VALUE; } else if (!expectedParams[i].optional) { minParams++; } } if (params.length < minParams || params.length > maxParams) { var e = Error.parameterCount(); e.popStackFrame(); return e; } return null; } Function._validateParameter = function Function$_validateParameter(param, expectedParam, paramName) { var e; var expectedType = expectedParam.type; var expectedInteger = !!expectedParam.integer; var expectedDomElement = !!expectedParam.domElement; var mayBeNull = !!expectedParam.mayBeNull; e = Function._validateParameterType(param, expectedType, expectedInteger, expectedDomElement, mayBeNull, paramName); if (e) { e.popStackFrame(); return e; } var expectedElementType = expectedParam.elementType; var elementMayBeNull = !!expectedParam.elementMayBeNull; if (expectedType === Array && typeof(param) !== "undefined" && param !== null && (expectedElementType || !elementMayBeNull)) { var expectedElementInteger = !!expectedParam.elementInteger; var expectedElementDomElement = !!expectedParam.elementDomElement; for (var i=0; i < param.length; i++) { var elem = param[i]; e = Function._validateParameterType(elem, expectedElementType, expectedElementInteger, expectedElementDomElement, elementMayBeNull, paramName + "[" + i + "]"); if (e) { e.popStackFrame(); return e; } } } return null; } Function._validateParameterType = function Function$_validateParameterType(param, expectedType, expectedInteger, expectedDomElement, mayBeNull, paramName) { var e; if (typeof(param) === "undefined") { if (mayBeNull) { return null; } else { e = Error.argumentUndefined(paramName); e.popStackFrame(); return e; } } if (param === null) { if (mayBeNull) { return null; } else { e = Error.argumentNull(paramName); e.popStackFrame(); return e; } } if (expectedType && expectedType.__enum) { if (typeof(param) !== 'number') { e = Error.argumentType(paramName, Object.getType(param), expectedType); e.popStackFrame(); return e; } if ((param % 1) === 0) { var values = expectedType.prototype; if (!expectedType.__flags || (param === 0)) { for (var i in values) { if (values[i] === param) return null; } } else { var v = param; for (var i in values) { var vali = values[i]; if (vali === 0) continue; if ((vali & param) === vali) { v -= vali; } if (v === 0) return null; } } } e = Error.argumentOutOfRange(paramName, param, String.format(Sys.Res.enumInvalidValue, param, expectedType.getName())); e.popStackFrame(); return e; } if (expectedDomElement && (param !== window) && (param !== document) && !(window.HTMLElement && (param instanceof HTMLElement)) && (typeof(param.nodeName) !== 'string')) { e = Error.argument(paramName, Sys.Res.argumentDomElement); e.popStackFrame(); return e; } if (expectedType && !expectedType.isInstanceOfType(param)) { e = Error.argumentType(paramName, Object.getType(param), expectedType); e.popStackFrame(); return e; } if (expectedType === Number && expectedInteger) { if ((param % 1) !== 0) { e = Error.argumentOutOfRange(paramName, param, Sys.Res.argumentInteger); e.popStackFrame(); return e; } } return null; }