You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/08/28 05:48:57 UTC
[50/51] [partial] rename folder /datajs into /odatajs. no file
modification.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/d5ec5557/datajs/demo/scripts/datajs-1.1.1.js
----------------------------------------------------------------------
diff --git a/datajs/demo/scripts/datajs-1.1.1.js b/datajs/demo/scripts/datajs-1.1.1.js
deleted file mode 100644
index 339b153..0000000
--- a/datajs/demo/scripts/datajs-1.1.1.js
+++ /dev/null
@@ -1,10710 +0,0 @@
-// Copyright (c) Microsoft. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odatajs.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // AMD support
- if (typeof define === 'function' && define.amd) {
- define('datajs', datajs);
- define('OData', odata);
- } else {
- window.odatajs = datajs;
- window.OData = odata;
- }
-
- odatajs.version = {
- major: 1,
- minor: 1,
- build: 1
- };
-
-
- var activeXObject = function (progId) {
- /// <summary>Creates a new ActiveXObject from the given progId.</summary>
- /// <param name="progId" type="String" mayBeNull="false" optional="false">
- /// ProgId string of the desired ActiveXObject.
- /// </param>
- /// <remarks>
- /// This function throws whatever exception might occur during the creation
- /// of the ActiveXObject.
- /// </remarks>
- /// <returns type="Object">
- /// The ActiveXObject instance. Null if ActiveX is not supported by the
- /// browser.
- /// </returns>
- if (window.ActiveXObject) {
- return new window.ActiveXObject(progId);
- }
- return null;
- };
-
- var assigned = function (value) {
- /// <summary>Checks whether the specified value is different from null and undefined.</summary>
- /// <param name="value" mayBeNull="true" optional="true">Value to check.</param>
- /// <returns type="Boolean">true if the value is assigned; false otherwise.</returns>
- return value !== null && value !== undefined;
- };
-
- var contains = function (arr, item) {
- /// <summary>Checks whether the specified item is in the array.</summary>
- /// <param name="arr" type="Array" optional="false" mayBeNull="false">Array to check in.</param>
- /// <param name="item">Item to look for.</param>
- /// <returns type="Boolean">true if the item is contained, false otherwise.</returns>
-
- var i, len;
- for (i = 0, len = arr.length; i < len; i++) {
- if (arr[i] === item) {
- return true;
- }
- }
-
- return false;
- };
-
- var defined = function (a, b) {
- /// <summary>Given two values, picks the first one that is not undefined.</summary>
- /// <param name="a">First value.</param>
- /// <param name="b">Second value.</param>
- /// <returns>a if it's a defined value; else b.</returns>
- return (a !== undefined) ? a : b;
- };
-
- var delay = function (callback) {
- /// <summary>Delays the invocation of the specified function until execution unwinds.</summary>
- /// <param name="callback" type="Function">Callback function.</param>
- if (arguments.length === 1) {
- window.setTimeout(callback, 0);
- return;
- }
-
- var args = Array.prototype.slice.call(arguments, 1);
- window.setTimeout(function () {
- callback.apply(this, args);
- }, 0);
- };
-
-
- var extend = function (target, values) {
- /// <summary>Extends the target with the specified values.</summary>
- /// <param name="target" type="Object">Object to add properties to.</param>
- /// <param name="values" type="Object">Object with properties to add into target.</param>
- /// <returns type="Object">The target object.</returns>
-
- for (var name in values) {
- target[name] = values[name];
- }
-
- return target;
- };
-
- var find = function (arr, callback) {
- /// <summary>Returns the first item in the array that makes the callback function true.</summary>
- /// <param name="arr" type="Array" optional="false" mayBeNull="true">Array to check in.</param>
- /// <param name="callback" type="Function">Callback function to invoke once per item in the array.</param>
- /// <returns>The first item that makes the callback return true; null otherwise or if the array is null.</returns>
-
- if (arr) {
- var i, len;
- for (i = 0, len = arr.length; i < len; i++) {
- if (callback(arr[i])) {
- return arr[i];
- }
- }
- }
- return null;
- };
-
- var isArray = function (value) {
- /// <summary>Checks whether the specified value is an array object.</summary>
- /// <param name="value">Value to check.</param>
- /// <returns type="Boolean">true if the value is an array object; false otherwise.</returns>
-
- return Object.prototype.toString.call(value) === "[object Array]";
- };
-
- var isDate = function (value) {
- /// <summary>Checks whether the specified value is a Date object.</summary>
- /// <param name="value">Value to check.</param>
- /// <returns type="Boolean">true if the value is a Date object; false otherwise.</returns>
-
- return Object.prototype.toString.call(value) === "[object Date]";
- };
-
- var isObject = function (value) {
- /// <summary>Tests whether a value is an object.</summary>
- /// <param name="value">Value to test.</param>
- /// <remarks>
- /// Per javascript rules, null and array values are objects and will cause this function to return true.
- /// </remarks>
- /// <returns type="Boolean">True is the value is an object; false otherwise.</returns>
-
- return typeof value === "object";
- };
-
- var parseInt10 = function (value) {
- /// <summary>Parses a value in base 10.</summary>
- /// <param name="value" type="String">String value to parse.</param>
- /// <returns type="Number">The parsed value, NaN if not a valid value.</returns>
-
- return parseInt(value, 10);
- };
-
- var renameProperty = function (obj, oldName, newName) {
- /// <summary>Renames a property in an object.</summary>
- /// <param name="obj" type="Object">Object in which the property will be renamed.</param>
- /// <param name="oldName" type="String">Name of the property that will be renamed.</param>
- /// <param name="newName" type="String">New name of the property.</param>
- /// <remarks>
- /// This function will not do anything if the object doesn't own a property with the specified old name.
- /// </remarks>
-
- if (obj.hasOwnProperty(oldName)) {
- obj[newName] = obj[oldName];
- delete obj[oldName];
- }
- };
-
- var throwErrorCallback = function (error) {
- /// <summary>Default error handler.</summary>
- /// <param name="error" type="Object">Error to handle.</param>
- throw error;
- };
-
- var trimString = function (str) {
- /// <summary>Removes leading and trailing whitespaces from a string.</summary>
- /// <param name="str" type="String" optional="false" mayBeNull="false">String to trim</param>
- /// <returns type="String">The string with no leading or trailing whitespace.</returns>
-
- if (str.trim) {
- return str.trim();
- }
-
- return str.replace(/^\s+|\s+$/g, '');
- };
-
- var undefinedDefault = function (value, defaultValue) {
- /// <summary>Returns a default value in place of undefined.</summary>
- /// <param name="value" mayBeNull="true" optional="true">Value to check.</param>
- /// <param name="defaultValue">Value to return if value is undefined.</param>
- /// <returns>value if it's defined; defaultValue otherwise.</returns>
- /// <remarks>
- /// This should only be used for cases where falsy values are valid;
- /// otherwise the pattern should be 'x = (value) ? value : defaultValue;'.
- /// </remarks>
- return (value !== undefined) ? value : defaultValue;
- };
-
- // Regular expression that splits a uri into its components:
- // 0 - is the matched string.
- // 1 - is the scheme.
- // 2 - is the authority.
- // 3 - is the path.
- // 4 - is the query.
- // 5 - is the fragment.
- var uriRegEx = /^([^:\/?#]+:)?(\/\/[^\/?#]*)?([^?#:]+)?(\?[^#]*)?(#.*)?/;
- var uriPartNames = ["scheme", "authority", "path", "query", "fragment"];
-
- var getURIInfo = function (uri) {
- /// <summary>Gets information about the components of the specified URI.</summary>
- /// <param name="uri" type="String">URI to get information from.</param>
- /// <returns type="Object">
- /// An object with an isAbsolute flag and part names (scheme, authority, etc.) if available.
- /// </returns>
-
- var result = { isAbsolute: false };
-
- if (uri) {
- var matches = uriRegEx.exec(uri);
- if (matches) {
- var i, len;
- for (i = 0, len = uriPartNames.length; i < len; i++) {
- if (matches[i + 1]) {
- result[uriPartNames[i]] = matches[i + 1];
- }
- }
- }
- if (result.scheme) {
- result.isAbsolute = true;
- }
- }
-
- return result;
- };
-
- var getURIFromInfo = function (uriInfo) {
- /// <summary>Builds a URI string from its components.</summary>
- /// <param name="uriInfo" type="Object"> An object with uri parts (scheme, authority, etc.).</param>
- /// <returns type="String">URI string.</returns>
-
- return "".concat(
- uriInfo.scheme || "",
- uriInfo.authority || "",
- uriInfo.path || "",
- uriInfo.query || "",
- uriInfo.fragment || "");
- };
-
- // Regular expression that splits a uri authority into its subcomponents:
- // 0 - is the matched string.
- // 1 - is the userinfo subcomponent.
- // 2 - is the host subcomponent.
- // 3 - is the port component.
- var uriAuthorityRegEx = /^\/{0,2}(?:([^@]*)@)?([^:]+)(?::{1}(\d+))?/;
-
- // Regular expression that matches percentage enconded octects (i.e %20 or %3A);
- var pctEncodingRegEx = /%[0-9A-F]{2}/ig;
-
- var normalizeURICase = function (uri) {
- /// <summary>Normalizes the casing of a URI.</summary>
- /// <param name="uri" type="String">URI to normalize, absolute or relative.</param>
- /// <returns type="String">The URI normalized to lower case.</returns>
-
- var uriInfo = getURIInfo(uri);
- var scheme = uriInfo.scheme;
- var authority = uriInfo.authority;
-
- if (scheme) {
- uriInfo.scheme = scheme.toLowerCase();
- if (authority) {
- var matches = uriAuthorityRegEx.exec(authority);
- if (matches) {
- uriInfo.authority = "//" +
- (matches[1] ? matches[1] + "@" : "") +
- (matches[2].toLowerCase()) +
- (matches[3] ? ":" + matches[3] : "");
- }
- }
- }
-
- uri = getURIFromInfo(uriInfo);
-
- return uri.replace(pctEncodingRegEx, function (str) {
- return str.toLowerCase();
- });
- };
-
- var normalizeURI = function (uri, base) {
- /// <summary>Normalizes a possibly relative URI with a base URI.</summary>
- /// <param name="uri" type="String">URI to normalize, absolute or relative.</param>
- /// <param name="base" type="String" mayBeNull="true">Base URI to compose with.</param>
- /// <returns type="String">The composed URI if relative; the original one if absolute.</returns>
-
- if (!base) {
- return uri;
- }
-
- var uriInfo = getURIInfo(uri);
- if (uriInfo.isAbsolute) {
- return uri;
- }
-
- var baseInfo = getURIInfo(base);
- var normInfo = {};
- var path;
-
- if (uriInfo.authority) {
- normInfo.authority = uriInfo.authority;
- path = uriInfo.path;
- normInfo.query = uriInfo.query;
- } else {
- if (!uriInfo.path) {
- path = baseInfo.path;
- normInfo.query = uriInfo.query || baseInfo.query;
- } else {
- if (uriInfo.path.charAt(0) === '/') {
- path = uriInfo.path;
- } else {
- path = mergeUriPathWithBase(uriInfo.path, baseInfo.path);
- }
- normInfo.query = uriInfo.query;
- }
- normInfo.authority = baseInfo.authority;
- }
-
- normInfo.path = removeDotsFromPath(path);
-
- normInfo.scheme = baseInfo.scheme;
- normInfo.fragment = uriInfo.fragment;
-
- return getURIFromInfo(normInfo);
- };
-
- var mergeUriPathWithBase = function (uriPath, basePath) {
- /// <summary>Merges the path of a relative URI and a base URI.</summary>
- /// <param name="uriPath" type="String>Relative URI path.</param>
- /// <param name="basePath" type="String">Base URI path.</param>
- /// <returns type="String">A string with the merged path.</returns>
-
- var path = "/";
- var end;
-
- if (basePath) {
- end = basePath.lastIndexOf("/");
- path = basePath.substring(0, end);
-
- if (path.charAt(path.length - 1) !== "/") {
- path = path + "/";
- }
- }
-
- return path + uriPath;
- };
-
- var removeDotsFromPath = function (path) {
- /// <summary>Removes the special folders . and .. from a URI's path.</summary>
- /// <param name="path" type="string">URI path component.</param>
- /// <returns type="String">Path without any . and .. folders.</returns>
-
- var result = "";
- var segment = "";
- var end;
-
- while (path) {
- if (path.indexOf("..") === 0 || path.indexOf(".") === 0) {
- path = path.replace(/^\.\.?\/?/g, "");
- } else if (path.indexOf("/..") === 0) {
- path = path.replace(/^\/\..\/?/g, "/");
- end = result.lastIndexOf("/");
- if (end === -1) {
- result = "";
- } else {
- result = result.substring(0, end);
- }
- } else if (path.indexOf("/.") === 0) {
- path = path.replace(/^\/\.\/?/g, "/");
- } else {
- segment = path;
- end = path.indexOf("/", 1);
- if (end !== -1) {
- segment = path.substring(0, end);
- }
- result = result + segment;
- path = path.replace(segment, "");
- }
- }
- return result;
- };
-
- var convertByteArrayToHexString = function (str) {
- var arr = [];
- if (window.atob === undefined) {
- arr = decodeBase64(str);
- } else {
- var binaryStr = window.atob(str);
- for (var i = 0; i < binaryStr.length; i++) {
- arr.push(binaryStr.charCodeAt(i));
- }
- }
- var hexValue = "";
- var hexValues = "0123456789ABCDEF";
- for (var j = 0; j < arr.length; j++) {
- var t = arr[j];
- hexValue += hexValues[t >> 4];
- hexValue += hexValues[t & 0x0F];
- }
- return hexValue;
- };
-
- var decodeBase64 = function (str) {
- var binaryString = "";
- for (var i = 0; i < str.length; i++) {
- var base65IndexValue = getBase64IndexValue(str[i]);
- var binaryValue = "";
- if (base65IndexValue !== null) {
- binaryValue = base65IndexValue.toString(2);
- binaryString += addBase64Padding(binaryValue);
- }
- }
- var byteArray = [];
- var numberOfBytes = parseInt(binaryString.length / 8, 10);
- for (i = 0; i < numberOfBytes; i++) {
- var intValue = parseInt(binaryString.substring(i * 8, (i + 1) * 8), 2);
- byteArray.push(intValue);
- }
- return byteArray;
- };
-
- var getBase64IndexValue = function (character) {
- var asciiCode = character.charCodeAt(0);
- var asciiOfA = 65;
- var differenceBetweenZanda = 6;
- if (asciiCode >= 65 && asciiCode <= 90) { // between "A" and "Z" inclusive
- return asciiCode - asciiOfA;
- } else if (asciiCode >= 97 && asciiCode <= 122) { // between 'a' and 'z' inclusive
- return asciiCode - asciiOfA - differenceBetweenZanda;
- } else if (asciiCode >= 48 && asciiCode <= 57) { // between '0' and '9' inclusive
- return asciiCode + 4;
- } else if (character == "+") {
- return 62;
- } else if (character == "/") {
- return 63;
- } else {
- return null;
- }
- };
-
- var addBase64Padding = function (binaryString) {
- while (binaryString.length < 6) {
- binaryString = "0" + binaryString;
- }
- return binaryString;
- };
-
- var getJsonValueArraryLength = function (data) {
- if (data && data.value) {
- return data.value.length;
- }
-
- return 0;
- };
-
- var sliceJsonValueArray = function (data, start, end) {
- if (data == undefined || data.value == undefined) {
- return data;
- }
-
- if (start < 0) {
- start = 0;
- }
-
- var length = getJsonValueArraryLength(data);
- if (length < end) {
- end = length;
- }
-
- var newdata = {};
- for (var property in data) {
- if (property == "value") {
- newdata[property] = data[property].slice(start, end);
- } else {
- newdata[property] = data[property];
- }
- }
-
- return newdata;
- };
-
- var concatJsonValueArray = function (data, concatData) {
- if (concatData == undefined || concatData.value == undefined) {
- return data;
- }
-
- if (data == undefined || Object.keys(data).length == 0) {
- return concatData;
- }
-
- if (data.value == undefined) {
- data.value = concatData.value;
- return data;
- }
-
- data.value = data.value.concat(concatData.value);
-
- return data;
- };
-
-
-
- // URI prefixes to generate smaller code.
- var http = "http://";
- var w3org = http + "www.w3.org/"; // http://www.w3.org/
-
- var xhtmlNS = w3org + "1999/xhtml"; // http://www.w3.org/1999/xhtml
- var xmlnsNS = w3org + "2000/xmlns/"; // http://www.w3.org/2000/xmlns/
- var xmlNS = w3org + "XML/1998/namespace"; // http://www.w3.org/XML/1998/namespace
-
- var mozillaParserErroNS = http + "www.mozilla.org/newlayout/xml/parsererror.xml";
-
- var hasLeadingOrTrailingWhitespace = function (text) {
- /// <summary>Checks whether the specified string has leading or trailing spaces.</summary>
- /// <param name="text" type="String">String to check.</param>
- /// <returns type="Boolean">true if text has any leading or trailing whitespace; false otherwise.</returns>
-
- var re = /(^\s)|(\s$)/;
- return re.test(text);
- };
-
- var isWhitespace = function (text) {
- /// <summary>Determines whether the specified text is empty or whitespace.</summary>
- /// <param name="text" type="String">Value to inspect.</param>
- /// <returns type="Boolean">true if the text value is empty or all whitespace; false otherwise.</returns>
-
- var ws = /^\s*$/;
- return text === null || ws.test(text);
- };
-
- var isWhitespacePreserveContext = function (domElement) {
- /// <summary>Determines whether the specified element has xml:space='preserve' applied.</summary>
- /// <param name="domElement">Element to inspect.</param>
- /// <returns type="Boolean">Whether xml:space='preserve' is in effect.</returns>
-
- while (domElement !== null && domElement.nodeType === 1) {
- var val = xmlAttributeValue(domElement, "space", xmlNS);
- if (val === "preserve") {
- return true;
- } else if (val === "default") {
- break;
- } else {
- domElement = domElement.parentNode;
- }
- }
-
- return false;
- };
-
- var isXmlNSDeclaration = function (domAttribute) {
- /// <summary>Determines whether the attribute is a XML namespace declaration.</summary>
- /// <param name="domAttribute">Element to inspect.</param>
- /// <returns type="Boolean">
- /// True if the attribute is a namespace declaration (its name is 'xmlns' or starts with 'xmlns:'; false otherwise.
- /// </returns>
-
- var nodeName = domAttribute.nodeName;
- return nodeName == "xmlns" || nodeName.indexOf("xmlns:") === 0;
- };
-
- var safeSetProperty = function (obj, name, value) {
- /// <summary>Safely set as property in an object by invoking obj.setProperty.</summary>
- /// <param name="obj">Object that exposes a setProperty method.</param>
- /// <param name="name" type="String" mayBeNull="false">Property name.</param>
- /// <param name="value">Property value.</param>
-
- try {
- obj.setProperty(name, value);
- } catch (_) { }
- };
-
- var msXmlDom3 = function () {
- /// <summary>Creates an configures new MSXML 3.0 ActiveX object.</summary>
- /// <remakrs>
- /// This function throws any exception that occurs during the creation
- /// of the MSXML 3.0 ActiveX object.
- /// <returns type="Object">New MSXML 3.0 ActiveX object.</returns>
-
- var msxml3 = activeXObject("Msxml2.DOMDocument.3.0");
- if (msxml3) {
- safeSetProperty(msxml3, "ProhibitDTD", true);
- safeSetProperty(msxml3, "MaxElementDepth", 256);
- safeSetProperty(msxml3, "AllowDocumentFunction", false);
- safeSetProperty(msxml3, "AllowXsltScript", false);
- }
- return msxml3;
- };
-
- var msXmlDom = function () {
- /// <summary>Creates an configures new MSXML 6.0 or MSXML 3.0 ActiveX object.</summary>
- /// <remakrs>
- /// This function will try to create a new MSXML 6.0 ActiveX object. If it fails then
- /// it will fallback to create a new MSXML 3.0 ActiveX object. Any exception that
- /// happens during the creation of the MSXML 6.0 will be handled by the function while
- /// the ones that happend during the creation of the MSXML 3.0 will be thrown.
- /// <returns type="Object">New MSXML 3.0 ActiveX object.</returns>
-
- try {
- var msxml = activeXObject("Msxml2.DOMDocument.6.0");
- if (msxml) {
- msxml.async = true;
- }
- return msxml;
- } catch (_) {
- return msXmlDom3();
- }
- };
-
- var msXmlParse = function (text) {
- /// <summary>Parses an XML string using the MSXML DOM.</summary>
- /// <remakrs>
- /// This function throws any exception that occurs during the creation
- /// of the MSXML ActiveX object. It also will throw an exception
- /// in case of a parsing error.
- /// <returns type="Object">New MSXML DOMDocument node representing the parsed XML string.</returns>
-
- var dom = msXmlDom();
- if (!dom) {
- return null;
- }
-
- dom.loadXML(text);
- var parseError = dom.parseError;
- if (parseError.errorCode !== 0) {
- xmlThrowParserError(parseError.reason, parseError.srcText, text);
- }
- return dom;
- };
-
- var xmlThrowParserError = function (exceptionOrReason, srcText, errorXmlText) {
- /// <summary>Throws a new exception containing XML parsing error information.</summary>
- /// <param name="exceptionOrReason">
- /// String indicatin the reason of the parsing failure or
- /// Object detailing the parsing error.
- /// </param>
- /// <param name="srcText" type="String">
- /// String indicating the part of the XML string that caused the parsing error.
- /// </param>
- /// <param name="errorXmlText" type="String">XML string for wich the parsing failed.</param>
-
- if (typeof exceptionOrReason === "string") {
- exceptionOrReason = { message: exceptionOrReason };
- }
- throw extend(exceptionOrReason, { srcText: srcText || "", errorXmlText: errorXmlText || "" });
- };
-
- var xmlParse = function (text) {
- /// <summary>Returns an XML DOM document from the specified text.</summary>
- /// <param name="text" type="String">Document text.</param>
- /// <returns>XML DOM document.</returns>
- /// <remarks>This function will throw an exception in case of a parse error.</remarks>
-
- var domParser = window.DOMParser && new window.DOMParser();
- var dom;
-
- if (!domParser) {
- dom = msXmlParse(text);
- if (!dom) {
- xmlThrowParserError("XML DOM parser not supported");
- }
- return dom;
- }
-
- try {
- dom = domParser.parseFromString(text, "text/xml");
- } catch (e) {
- xmlThrowParserError(e, "", text);
- }
-
- var element = dom.documentElement;
- var nsURI = element.namespaceURI;
- var localName = xmlLocalName(element);
-
- // Firefox reports errors by returing the DOM for an xml document describing the problem.
- if (localName === "parsererror" && nsURI === mozillaParserErroNS) {
- var srcTextElement = xmlFirstChildElement(element, mozillaParserErroNS, "sourcetext");
- var srcText = srcTextElement ? xmlNodeValue(srcTextElement) : "";
- xmlThrowParserError(xmlInnerText(element) || "", srcText, text);
- }
-
- // Chrome (and maybe other webkit based browsers) report errors by injecting a header with an error message.
- // The error may be localized, so instead we simply check for a header as the
- // top element or descendant child of the document.
- if (localName === "h3" && nsURI === xhtmlNS || xmlFirstDescendantElement(element, xhtmlNS, "h3")) {
- var reason = "";
- var siblings = [];
- var cursor = element.firstChild;
- while (cursor) {
- if (cursor.nodeType === 1) {
- reason += xmlInnerText(cursor) || "";
- }
- siblings.push(cursor.nextSibling);
- cursor = cursor.firstChild || siblings.shift();
- }
- reason += xmlInnerText(element) || "";
- xmlThrowParserError(reason, "", text);
- }
-
- return dom;
- };
-
- var xmlQualifiedName = function (prefix, name) {
- /// <summary>Builds a XML qualified name string in the form of "prefix:name".</summary>
- /// <param name="prefix" type="String" maybeNull="true">Prefix string.</param>
- /// <param name="name" type="String">Name string to qualify with the prefix.</param>
- /// <returns type="String">Qualified name.</returns>
-
- return prefix ? prefix + ":" + name : name;
- };
-
- var xmlAppendText = function (domNode, textNode) {
- /// <summary>Appends a text node into the specified DOM element node.</summary>
- /// <param name="domNode">DOM node for the element.</param>
- /// <param name="text" type="String" mayBeNull="false">Text to append as a child of element.</param>
- if (hasLeadingOrTrailingWhitespace(textNode.data)) {
- var attr = xmlAttributeNode(domNode, xmlNS, "space");
- if (!attr) {
- attr = xmlNewAttribute(domNode.ownerDocument, xmlNS, xmlQualifiedName("xml", "space"));
- xmlAppendChild(domNode, attr);
- }
- attr.value = "preserve";
- }
- domNode.appendChild(textNode);
- return domNode;
- };
-
- var xmlAttributes = function (element, onAttributeCallback) {
- /// <summary>Iterates through the XML element's attributes and invokes the callback function for each one.</summary>
- /// <param name="element">Wrapped element to iterate over.</param>
- /// <param name="onAttributeCallback" type="Function">Callback function to invoke with wrapped attribute nodes.</param>
-
- var attributes = element.attributes;
- var i, len;
- for (i = 0, len = attributes.length; i < len; i++) {
- onAttributeCallback(attributes.item(i));
- }
- };
-
- var xmlAttributeValue = function (domNode, localName, nsURI) {
- /// <summary>Returns the value of a DOM element's attribute.</summary>
- /// <param name="domNode">DOM node for the owning element.</param>
- /// <param name="localName" type="String">Local name of the attribute.</param>
- /// <param name="nsURI" type="String">Namespace URI of the attribute.</param>
- /// <returns type="String" maybeNull="true">The attribute value, null if not found.</returns>
-
- var attribute = xmlAttributeNode(domNode, localName, nsURI);
- return attribute ? xmlNodeValue(attribute) : null;
- };
-
- var xmlAttributeNode = function (domNode, localName, nsURI) {
- /// <summary>Gets an attribute node from a DOM element.</summary>
- /// <param name="domNode">DOM node for the owning element.</param>
- /// <param name="localName" type="String">Local name of the attribute.</param>
- /// <param name="nsURI" type="String">Namespace URI of the attribute.</param>
- /// <returns>The attribute node, null if not found.</returns>
-
- var attributes = domNode.attributes;
- if (attributes.getNamedItemNS) {
- return attributes.getNamedItemNS(nsURI || null, localName);
- }
-
- return attributes.getQualifiedItem(localName, nsURI) || null;
- };
-
- var xmlBaseURI = function (domNode, baseURI) {
- /// <summary>Gets the value of the xml:base attribute on the specified element.</summary>
- /// <param name="domNode">Element to get xml:base attribute value from.</param>
- /// <param name="baseURI" mayBeNull="true" optional="true">Base URI used to normalize the value of the xml:base attribute.</param>
- /// <returns type="String">Value of the xml:base attribute if found; the baseURI or null otherwise.</returns>
-
- var base = xmlAttributeNode(domNode, "base", xmlNS);
- return (base ? normalizeURI(base.value, baseURI) : baseURI) || null;
- };
-
-
- var xmlChildElements = function (domNode, onElementCallback) {
- /// <summary>Iterates through the XML element's child DOM elements and invokes the callback function for each one.</summary>
- /// <param name="element">DOM Node containing the DOM elements to iterate over.</param>
- /// <param name="onElementCallback" type="Function">Callback function to invoke for each child DOM element.</param>
-
- xmlTraverse(domNode, /*recursive*/false, function (child) {
- if (child.nodeType === 1) {
- onElementCallback(child);
- }
- // continue traversing.
- return true;
- });
- };
-
- var xmlFindElementByPath = function (root, namespaceURI, path) {
- /// <summary>Gets the descendant element under root that corresponds to the specified path and namespace URI.</summary>
- /// <param name="root">DOM element node from which to get the descendant element.</param>
- /// <param name="namespaceURI" type="String">The namespace URI of the element to match.</param>
- /// <param name="path" type="String">Path to the desired descendant element.</param>
- /// <returns>The element specified by path and namespace URI.</returns>
- /// <remarks>
- /// All the elements in the path are matched against namespaceURI.
- /// The function will stop searching on the first element that doesn't match the namespace and the path.
- /// </remarks>
-
- var parts = path.split("/");
- var i, len;
- for (i = 0, len = parts.length; i < len; i++) {
- root = root && xmlFirstChildElement(root, namespaceURI, parts[i]);
- }
- return root || null;
- };
-
- var xmlFindNodeByPath = function (root, namespaceURI, path) {
- /// <summary>Gets the DOM element or DOM attribute node under root that corresponds to the specified path and namespace URI.</summary>
- /// <param name="root">DOM element node from which to get the descendant node.</param>
- /// <param name="namespaceURI" type="String">The namespace URI of the node to match.</param>
- /// <param name="path" type="String">Path to the desired descendant node.</param>
- /// <returns>The node specified by path and namespace URI.</returns>
- /// <remarks>
- /// This function will traverse the path and match each node associated to a path segement against the namespace URI.
- /// The traversal stops when the whole path has been exahusted or a node that doesn't belogong the specified namespace is encountered.
- ///
- /// The last segment of the path may be decorated with a starting @ character to indicate that the desired node is a DOM attribute.
- /// </remarks>
-
- var lastSegmentStart = path.lastIndexOf("/");
- var nodePath = path.substring(lastSegmentStart + 1);
- var parentPath = path.substring(0, lastSegmentStart);
-
- var node = parentPath ? xmlFindElementByPath(root, namespaceURI, parentPath) : root;
- if (node) {
- if (nodePath.charAt(0) === "@") {
- return xmlAttributeNode(node, nodePath.substring(1), namespaceURI);
- }
- return xmlFirstChildElement(node, namespaceURI, nodePath);
- }
- return null;
- };
-
- var xmlFirstChildElement = function (domNode, namespaceURI, localName) {
- /// <summary>Returns the first child DOM element under the specified DOM node that matches the specified namespace URI and local name.</summary>
- /// <param name="domNode">DOM node from which the child DOM element is going to be retrieved.</param>
- /// <param name="namespaceURI" type="String" optional="true">The namespace URI of the element to match.</param>
- /// <param name="localName" type="String" optional="true">Name of the element to match.</param>
- /// <returns>The node's first child DOM element that matches the specified namespace URI and local name; null otherwise.</returns>
-
- return xmlFirstElementMaybeRecursive(domNode, namespaceURI, localName, /*recursive*/false);
- };
-
- var xmlFirstDescendantElement = function (domNode, namespaceURI, localName) {
- /// <summary>Returns the first descendant DOM element under the specified DOM node that matches the specified namespace URI and local name.</summary>
- /// <param name="domNode">DOM node from which the descendant DOM element is going to be retrieved.</param>
- /// <param name="namespaceURI" type="String" optional="true">The namespace URI of the element to match.</param>
- /// <param name="localName" type="String" optional="true">Name of the element to match.</param>
- /// <returns>The node's first descendant DOM element that matches the specified namespace URI and local name; null otherwise.</returns>
-
- if (domNode.getElementsByTagNameNS) {
- var result = domNode.getElementsByTagNameNS(namespaceURI, localName);
- return result.length > 0 ? result[0] : null;
- }
- return xmlFirstElementMaybeRecursive(domNode, namespaceURI, localName, /*recursive*/true);
- };
-
- var xmlFirstElementMaybeRecursive = function (domNode, namespaceURI, localName, recursive) {
- /// <summary>Returns the first descendant DOM element under the specified DOM node that matches the specified namespace URI and local name.</summary>
- /// <param name="domNode">DOM node from which the descendant DOM element is going to be retrieved.</param>
- /// <param name="namespaceURI" type="String" optional="true">The namespace URI of the element to match.</param>
- /// <param name="localName" type="String" optional="true">Name of the element to match.</param>
- /// <param name="recursive" type="Boolean">
- /// True if the search should include all the descendants of the DOM node.
- /// False if the search should be scoped only to the direct children of the DOM node.
- /// </param>
- /// <returns>The node's first descendant DOM element that matches the specified namespace URI and local name; null otherwise.</returns>
-
- var firstElement = null;
- xmlTraverse(domNode, recursive, function (child) {
- if (child.nodeType === 1) {
- var isExpectedNamespace = !namespaceURI || xmlNamespaceURI(child) === namespaceURI;
- var isExpectedNodeName = !localName || xmlLocalName(child) === localName;
-
- if (isExpectedNamespace && isExpectedNodeName) {
- firstElement = child;
- }
- }
- return firstElement === null;
- });
- return firstElement;
- };
-
- var xmlInnerText = function (xmlElement) {
- /// <summary>Gets the concatenated value of all immediate child text and CDATA nodes for the specified element.</summary>
- /// <param name="domElement">Element to get values for.</param>
- /// <returns type="String">Text for all direct children.</returns>
-
- var result = null;
- var root = (xmlElement.nodeType === 9 && xmlElement.documentElement) ? xmlElement.documentElement : xmlElement;
- var whitespaceAlreadyRemoved = root.ownerDocument.preserveWhiteSpace === false;
- var whitespacePreserveContext;
-
- xmlTraverse(root, false, function (child) {
- if (child.nodeType === 3 || child.nodeType === 4) {
- // isElementContentWhitespace indicates that this is 'ignorable whitespace',
- // but it's not defined by all browsers, and does not honor xml:space='preserve'
- // in some implementations.
- //
- // If we can't tell either way, we walk up the tree to figure out whether
- // xml:space is set to preserve; otherwise we discard pure-whitespace.
- //
- // For example <a> <b>1</b></a>. The space between <a> and <b> is usually 'ignorable'.
- var text = xmlNodeValue(child);
- var shouldInclude = whitespaceAlreadyRemoved || !isWhitespace(text);
- if (!shouldInclude) {
- // Walk up the tree to figure out whether we are in xml:space='preserve' context
- // for the cursor (needs to happen only once).
- if (whitespacePreserveContext === undefined) {
- whitespacePreserveContext = isWhitespacePreserveContext(root);
- }
-
- shouldInclude = whitespacePreserveContext;
- }
-
- if (shouldInclude) {
- if (!result) {
- result = text;
- } else {
- result += text;
- }
- }
- }
- // Continue traversing?
- return true;
- });
- return result;
- };
-
- var xmlLocalName = function (domNode) {
- /// <summary>Returns the localName of a XML node.</summary>
- /// <param name="domNode">DOM node to get the value from.</param>
- /// <returns type="String">localName of domNode.</returns>
-
- return domNode.localName || domNode.baseName;
- };
-
- var xmlNamespaceURI = function (domNode) {
- /// <summary>Returns the namespace URI of a XML node.</summary>
- /// <param name="node">DOM node to get the value from.</param>
- /// <returns type="String">Namespace URI of domNode.</returns>
-
- return domNode.namespaceURI || null;
- };
-
- var xmlNodeValue = function (domNode) {
- /// <summary>Returns the value or the inner text of a XML node.</summary>
- /// <param name="node">DOM node to get the value from.</param>
- /// <returns>Value of the domNode or the inner text if domNode represents a DOM element node.</returns>
-
- if (domNode.nodeType === 1) {
- return xmlInnerText(domNode);
- }
- return domNode.nodeValue;
- };
-
- var xmlTraverse = function (domNode, recursive, onChildCallback) {
- /// <summary>Walks through the descendants of the domNode and invokes a callback for each node.</summary>
- /// <param name="domNode">DOM node whose descendants are going to be traversed.</param>
- /// <param name="recursive" type="Boolean">
- /// True if the traversal should include all the descenants of the DOM node.
- /// False if the traversal should be scoped only to the direct children of the DOM node.
- /// </param>
- /// <returns type="String">Namespace URI of node.</returns>
-
- var subtrees = [];
- var child = domNode.firstChild;
- var proceed = true;
- while (child && proceed) {
- proceed = onChildCallback(child);
- if (proceed) {
- if (recursive && child.firstChild) {
- subtrees.push(child.firstChild);
- }
- child = child.nextSibling || subtrees.shift();
- }
- }
- };
-
- var xmlSiblingElement = function (domNode, namespaceURI, localName) {
- /// <summary>Returns the next sibling DOM element of the specified DOM node.</summary>
- /// <param name="domNode">DOM node from which the next sibling is going to be retrieved.</param>
- /// <param name="namespaceURI" type="String" optional="true">The namespace URI of the element to match.</param>
- /// <param name="localName" type="String" optional="true">Name of the element to match.</param>
- /// <returns>The node's next sibling DOM element, null if there is none.</returns>
-
- var sibling = domNode.nextSibling;
- while (sibling) {
- if (sibling.nodeType === 1) {
- var isExpectedNamespace = !namespaceURI || xmlNamespaceURI(sibling) === namespaceURI;
- var isExpectedNodeName = !localName || xmlLocalName(sibling) === localName;
-
- if (isExpectedNamespace && isExpectedNodeName) {
- return sibling;
- }
- }
- sibling = sibling.nextSibling;
- }
- return null;
- };
-
- var xmlDom = function () {
- /// <summary>Creates a new empty DOM document node.</summary>
- /// <returns>New DOM document node.</returns>
- /// <remarks>
- /// This function will first try to create a native DOM document using
- /// the browsers createDocument function. If the browser doesn't
- /// support this but supports ActiveXObject, then an attempt to create
- /// an MSXML 6.0 DOM will be made. If this attempt fails too, then an attempt
- /// for creating an MXSML 3.0 DOM will be made. If this last attemp fails or
- /// the browser doesn't support ActiveXObject then an exception will be thrown.
- /// </remarks>
-
- var implementation = window.document.implementation;
- return (implementation && implementation.createDocument) ?
- implementation.createDocument(null, null, null) :
- msXmlDom();
- };
-
- var xmlAppendChildren = function (parent, children) {
- /// <summary>Appends a collection of child nodes or string values to a parent DOM node.</summary>
- /// <param name="parent">DOM node to which the children will be appended.</param>
- /// <param name="children" type="Array">Array containing DOM nodes or string values that will be appended to the parent.</param>
- /// <returns>The parent with the appended children or string values.</returns>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended to the parent.
- /// </remarks>
-
- if (!isArray(children)) {
- return xmlAppendChild(parent, children);
- }
-
- var i, len;
- for (i = 0, len = children.length; i < len; i++) {
- children[i] && xmlAppendChild(parent, children[i]);
- }
- return parent;
- };
-
- var xmlAppendChild = function (parent, child) {
- /// <summary>Appends a child node or a string value to a parent DOM node.</summary>
- /// <param name="parent">DOM node to which the child will be appended.</param>
- /// <param name="child">Child DOM node or string value to append to the parent.</param>
- /// <returns>The parent with the appended child or string value.</returns>
- /// <remarks>
- /// If child is a string value, then a new DOM text node is going to be created
- /// for it and then appended to the parent.
- /// </remarks>
-
- if (child) {
- if (typeof child === "string") {
- return xmlAppendText(parent, xmlNewText(parent.ownerDocument, child));
- }
- if (child.nodeType === 2) {
- parent.setAttributeNodeNS ? parent.setAttributeNodeNS(child) : parent.setAttributeNode(child);
- } else {
- parent.appendChild(child);
- }
- }
- return parent;
- };
-
- var xmlNewAttribute = function (dom, namespaceURI, qualifiedName, value) {
- /// <summary>Creates a new DOM attribute node.</summary>
- /// <param name="dom">DOM document used to create the attribute.</param>
- /// <param name="prefix" type="String">Namespace prefix.</param>
- /// <param name="namespaceURI" type="String">Namespace URI.</param>
- /// <returns>DOM attribute node for the namespace declaration.</returns>
-
- var attribute =
- dom.createAttributeNS && dom.createAttributeNS(namespaceURI, qualifiedName) ||
- dom.createNode(2, qualifiedName, namespaceURI || undefined);
-
- attribute.value = value || "";
- return attribute;
- };
-
- var xmlNewElement = function (dom, nampespaceURI, qualifiedName, children) {
- /// <summary>Creates a new DOM element node.</summary>
- /// <param name="dom">DOM document used to create the DOM element.</param>
- /// <param name="namespaceURI" type="String">Namespace URI of the new DOM element.</param>
- /// <param name="qualifiedName" type="String">Qualified name in the form of "prefix:name" of the new DOM element.</param>
- /// <param name="children" type="Array" optional="true">
- /// Collection of child DOM nodes or string values that are going to be appended to the new DOM element.
- /// </param>
- /// <returns>New DOM element.</returns>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended to the new DOM element.
- /// </remarks>
-
- var element =
- dom.createElementNS && dom.createElementNS(nampespaceURI, qualifiedName) ||
- dom.createNode(1, qualifiedName, nampespaceURI || undefined);
-
- return xmlAppendChildren(element, children || []);
- };
-
- var xmlNewNSDeclaration = function (dom, namespaceURI, prefix) {
- /// <summary>Creates a namespace declaration attribute.</summary>
- /// <param name="dom">DOM document used to create the attribute.</param>
- /// <param name="namespaceURI" type="String">Namespace URI.</param>
- /// <param name="prefix" type="String">Namespace prefix.</param>
- /// <returns>DOM attribute node for the namespace declaration.</returns>
-
- return xmlNewAttribute(dom, xmlnsNS, xmlQualifiedName("xmlns", prefix), namespaceURI);
- };
-
- var xmlNewFragment = function (dom, text) {
- /// <summary>Creates a new DOM document fragment node for the specified xml text.</summary>
- /// <param name="dom">DOM document from which the fragment node is going to be created.</param>
- /// <param name="text" type="String" mayBeNull="false">XML text to be represented by the XmlFragment.</param>
- /// <returns>New DOM document fragment object.</returns>
-
- var value = "<c>" + text + "</c>";
- var tempDom = xmlParse(value);
- var tempRoot = tempDom.documentElement;
- var imported = ("importNode" in dom) ? dom.importNode(tempRoot, true) : tempRoot;
- var fragment = dom.createDocumentFragment();
-
- var importedChild = imported.firstChild;
- while (importedChild) {
- fragment.appendChild(importedChild);
- importedChild = importedChild.nextSibling;
- }
- return fragment;
- };
-
- var xmlNewText = function (dom, text) {
- /// <summary>Creates new DOM text node.</summary>
- /// <param name="dom">DOM document used to create the text node.</param>
- /// <param name="text" type="String">Text value for the DOM text node.</param>
- /// <returns>DOM text node.</returns>
-
- return dom.createTextNode(text);
- };
-
- var xmlNewNodeByPath = function (dom, root, namespaceURI, prefix, path) {
- /// <summary>Creates a new DOM element or DOM attribute node as specified by path and appends it to the DOM tree pointed by root.</summary>
- /// <param name="dom">DOM document used to create the new node.</param>
- /// <param name="root">DOM element node used as root of the subtree on which the new nodes are going to be created.</param>
- /// <param name="namespaceURI" type="String">Namespace URI of the new DOM element or attribute.</param>
- /// <param name="namespacePrefix" type="String">Prefix used to qualify the name of the new DOM element or attribute.</param>
- /// <param name="Path" type="String">Path string describing the location of the new DOM element or attribute from the root element.</param>
- /// <returns>DOM element or attribute node for the last segment of the path.</returns>
- /// <remarks>
- /// This function will traverse the path and will create a new DOM element with the specified namespace URI and prefix
- /// for each segment that doesn't have a matching element under root.
- ///
- /// The last segment of the path may be decorated with a starting @ character. In this case a new DOM attribute node
- /// will be created.
- /// </remarks>
-
- var name = "";
- var parts = path.split("/");
- var xmlFindNode = xmlFirstChildElement;
- var xmlNewNode = xmlNewElement;
- var xmlNode = root;
-
- var i, len;
- for (i = 0, len = parts.length; i < len; i++) {
- name = parts[i];
- if (name.charAt(0) === "@") {
- name = name.substring(1);
- xmlFindNode = xmlAttributeNode;
- xmlNewNode = xmlNewAttribute;
- }
-
- var childNode = xmlFindNode(xmlNode, namespaceURI, name);
- if (!childNode) {
- childNode = xmlNewNode(dom, namespaceURI, xmlQualifiedName(prefix, name));
- xmlAppendChild(xmlNode, childNode);
- }
- xmlNode = childNode;
- }
- return xmlNode;
- };
-
- var xmlSerialize = function (domNode) {
- /// <summary>
- /// Returns the text representation of the document to which the specified node belongs.
- /// </summary>
- /// <param name="root">Wrapped element in the document to serialize.</param>
- /// <returns type="String">Serialized document.</returns>
-
- var xmlSerializer = window.XMLSerializer;
- if (xmlSerializer) {
- var serializer = new xmlSerializer();
- return serializer.serializeToString(domNode);
- }
-
- if (domNode.xml) {
- return domNode.xml;
- }
-
- throw { message: "XML serialization unsupported" };
- };
-
- var xmlSerializeDescendants = function (domNode) {
- /// <summary>Returns the XML representation of the all the descendants of the node.</summary>
- /// <param name="domNode" optional="false" mayBeNull="false">Node to serialize.</param>
- /// <returns type="String">The XML representation of all the descendants of the node.</returns>
-
- var children = domNode.childNodes;
- var i, len = children.length;
- if (len === 0) {
- return "";
- }
-
- // Some implementations of the XMLSerializer don't deal very well with fragments that
- // don't have a DOMElement as their first child. The work around is to wrap all the
- // nodes in a dummy root node named "c", serialize it and then just extract the text between
- // the <c> and the </c> substrings.
-
- var dom = domNode.ownerDocument;
- var fragment = dom.createDocumentFragment();
- var fragmentRoot = dom.createElement("c");
-
- fragment.appendChild(fragmentRoot);
- // Move the children to the fragment tree.
- for (i = 0; i < len; i++) {
- fragmentRoot.appendChild(children[i]);
- }
-
- var xml = xmlSerialize(fragment);
- xml = xml.substr(3, xml.length - 7);
-
- // Move the children back to the original dom tree.
- for (i = 0; i < len; i++) {
- domNode.appendChild(fragmentRoot.childNodes[i]);
- }
-
- return xml;
- };
-
- var xmlSerializeNode = function (domNode) {
- /// <summary>Returns the XML representation of the node and all its descendants.</summary>
- /// <param name="domNode" optional="false" mayBeNull="false">Node to serialize.</param>
- /// <returns type="String">The XML representation of the node and all its descendants.</returns>
-
- var xml = domNode.xml;
- if (xml !== undefined) {
- return xml;
- }
-
- if (window.XMLSerializer) {
- var serializer = new window.XMLSerializer();
- return serializer.serializeToString(domNode);
- }
-
- throw { message: "XML serialization unsupported" };
- };
-
-
-
-
- var forwardCall = function (thisValue, name, returnValue) {
- /// <summary>Creates a new function to forward a call.</summary>
- /// <param name="thisValue" type="Object">Value to use as the 'this' object.</param>
- /// <param name="name" type="String">Name of function to forward to.</param>
- /// <param name="returnValue" type="Object">Return value for the forward call (helps keep identity when chaining calls).</param>
- /// <returns type="Function">A new function that will forward a call.</returns>
-
- return function () {
- thisValue[name].apply(thisValue, arguments);
- return returnValue;
- };
- };
-
- var DjsDeferred = function () {
- /// <summary>Initializes a new DjsDeferred object.</summary>
- /// <remarks>
- /// Compability Note A - Ordering of callbacks through chained 'then' invocations
- ///
- /// The Wiki entry at http://wiki.commonjs.org/wiki/Promises/A
- /// implies that .then() returns a distinct object.
- ////
- /// For compatibility with http://api.jquery.com/category/deferred-object/
- /// we return this same object. This affects ordering, as
- /// the jQuery version will fire callbacks in registration
- /// order regardless of whether they occur on the result
- /// or the original object.
- ///
- /// Compability Note B - Fulfillment value
- ///
- /// The Wiki entry at http://wiki.commonjs.org/wiki/Promises/A
- /// implies that the result of a success callback is the
- /// fulfillment value of the object and is received by
- /// other success callbacks that are chained.
- ///
- /// For compatibility with http://api.jquery.com/category/deferred-object/
- /// we disregard this value instead.
- /// </remarks>
-
- this._arguments = undefined;
- this._done = undefined;
- this._fail = undefined;
- this._resolved = false;
- this._rejected = false;
- };
-
- DjsDeferred.prototype = {
- then: function (fulfilledHandler, errorHandler /*, progressHandler */) {
- /// <summary>Adds success and error callbacks for this deferred object.</summary>
- /// <param name="fulfilledHandler" type="Function" mayBeNull="true" optional="true">Success callback.</param>
- /// <param name="errorHandler" type="Function" mayBeNull="true" optional="true">Error callback.</param>
- /// <remarks>See Compatibility Note A.</remarks>
-
- if (fulfilledHandler) {
- if (!this._done) {
- this._done = [fulfilledHandler];
- } else {
- this._done.push(fulfilledHandler);
- }
- }
-
- if (errorHandler) {
- if (!this._fail) {
- this._fail = [errorHandler];
- } else {
- this._fail.push(errorHandler);
- }
- }
-
- //// See Compatibility Note A in the DjsDeferred constructor.
- //// if (!this._next) {
- //// this._next = createDeferred();
- //// }
- //// return this._next.promise();
-
- if (this._resolved) {
- this.resolve.apply(this, this._arguments);
- } else if (this._rejected) {
- this.reject.apply(this, this._arguments);
- }
-
- return this;
- },
-
- resolve: function (/* args */) {
- /// <summary>Invokes success callbacks for this deferred object.</summary>
- /// <remarks>All arguments are forwarded to success callbacks.</remarks>
-
-
- if (this._done) {
- var i, len;
- for (i = 0, len = this._done.length; i < len; i++) {
- //// See Compability Note B - Fulfillment value.
- //// var nextValue =
- this._done[i].apply(null, arguments);
- }
-
- //// See Compatibility Note A in the DjsDeferred constructor.
- //// this._next.resolve(nextValue);
- //// delete this._next;
-
- this._done = undefined;
- this._resolved = false;
- this._arguments = undefined;
- } else {
- this._resolved = true;
- this._arguments = arguments;
- }
- },
-
- reject: function (/* args */) {
- /// <summary>Invokes error callbacks for this deferred object.</summary>
- /// <remarks>All arguments are forwarded to error callbacks.</remarks>
- if (this._fail) {
- var i, len;
- for (i = 0, len = this._fail.length; i < len; i++) {
- this._fail[i].apply(null, arguments);
- }
-
- this._fail = undefined;
- this._rejected = false;
- this._arguments = undefined;
- } else {
- this._rejected = true;
- this._arguments = arguments;
- }
- },
-
- promise: function () {
- /// <summary>Returns a version of this object that has only the read-only methods available.</summary>
- /// <returns>An object with only the promise object.</returns>
-
- var result = {};
- result.then = forwardCall(this, "then", result);
- return result;
- }
- };
-
- var createDeferred = function () {
- /// <summary>Creates a deferred object.</summary>
- /// <returns type="DjsDeferred">
- /// A new deferred object. If jQuery is installed, then a jQuery
- /// Deferred object is returned, which provides a superset of features.
- /// </returns>
-
- if (window.jQuery && window.jQuery.Deferred) {
- return new window.jQuery.Deferred();
- } else {
- return new DjsDeferred();
- }
- };
-
-
-
-
- var dataItemTypeName = function (value, metadata) {
- /// <summary>Gets the type name of a data item value that belongs to a feed, an entry, a complex type property, or a collection property.</summary>
- /// <param name="value">Value of the data item from which the type name is going to be retrieved.</param>
- /// <param name="metadata" type="object" optional="true">Object containing metadata about the data tiem.</param>
- /// <remarks>
- /// This function will first try to get the type name from the data item's value itself if it is an object with a __metadata property; otherwise
- /// it will try to recover it from the metadata. If both attempts fail, it will return null.
- /// </remarks>
- /// <returns type="String">Data item type name; null if the type name cannot be found within the value or the metadata</returns>
-
- var valueTypeName = ((value && value.__metadata) || {}).type;
- return valueTypeName || (metadata ? metadata.type : null);
- };
-
- var EDM = "Edm.";
- var EDM_BINARY = EDM + "Binary";
- var EDM_BOOLEAN = EDM + "Boolean";
- var EDM_BYTE = EDM + "Byte";
- var EDM_DATETIME = EDM + "DateTime";
- var EDM_DATETIMEOFFSET = EDM + "DateTimeOffset";
- var EDM_DECIMAL = EDM + "Decimal";
- var EDM_DOUBLE = EDM + "Double";
- var EDM_GUID = EDM + "Guid";
- var EDM_INT16 = EDM + "Int16";
- var EDM_INT32 = EDM + "Int32";
- var EDM_INT64 = EDM + "Int64";
- var EDM_SBYTE = EDM + "SByte";
- var EDM_SINGLE = EDM + "Single";
- var EDM_STRING = EDM + "String";
- var EDM_TIME = EDM + "Time";
-
- var EDM_GEOGRAPHY = EDM + "Geography";
- var EDM_GEOGRAPHY_POINT = EDM_GEOGRAPHY + "Point";
- var EDM_GEOGRAPHY_LINESTRING = EDM_GEOGRAPHY + "LineString";
- var EDM_GEOGRAPHY_POLYGON = EDM_GEOGRAPHY + "Polygon";
- var EDM_GEOGRAPHY_COLLECTION = EDM_GEOGRAPHY + "Collection";
- var EDM_GEOGRAPHY_MULTIPOLYGON = EDM_GEOGRAPHY + "MultiPolygon";
- var EDM_GEOGRAPHY_MULTILINESTRING = EDM_GEOGRAPHY + "MultiLineString";
- var EDM_GEOGRAPHY_MULTIPOINT = EDM_GEOGRAPHY + "MultiPoint";
-
- var EDM_GEOMETRY = EDM + "Geometry";
- var EDM_GEOMETRY_POINT = EDM_GEOMETRY + "Point";
- var EDM_GEOMETRY_LINESTRING = EDM_GEOMETRY + "LineString";
- var EDM_GEOMETRY_POLYGON = EDM_GEOMETRY + "Polygon";
- var EDM_GEOMETRY_COLLECTION = EDM_GEOMETRY + "Collection";
- var EDM_GEOMETRY_MULTIPOLYGON = EDM_GEOMETRY + "MultiPolygon";
- var EDM_GEOMETRY_MULTILINESTRING = EDM_GEOMETRY + "MultiLineString";
- var EDM_GEOMETRY_MULTIPOINT = EDM_GEOMETRY + "MultiPoint";
-
- var GEOJSON_POINT = "Point";
- var GEOJSON_LINESTRING = "LineString";
- var GEOJSON_POLYGON = "Polygon";
- var GEOJSON_MULTIPOINT = "MultiPoint";
- var GEOJSON_MULTILINESTRING = "MultiLineString";
- var GEOJSON_MULTIPOLYGON = "MultiPolygon";
- var GEOJSON_GEOMETRYCOLLECTION = "GeometryCollection";
-
- var primitiveEdmTypes = [
- EDM_STRING,
- EDM_INT32,
- EDM_INT64,
- EDM_BOOLEAN,
- EDM_DOUBLE,
- EDM_SINGLE,
- EDM_DATETIME,
- EDM_DATETIMEOFFSET,
- EDM_TIME,
- EDM_DECIMAL,
- EDM_GUID,
- EDM_BYTE,
- EDM_INT16,
- EDM_SBYTE,
- EDM_BINARY
- ];
-
- var geometryEdmTypes = [
- EDM_GEOMETRY,
- EDM_GEOMETRY_POINT,
- EDM_GEOMETRY_LINESTRING,
- EDM_GEOMETRY_POLYGON,
- EDM_GEOMETRY_COLLECTION,
- EDM_GEOMETRY_MULTIPOLYGON,
- EDM_GEOMETRY_MULTILINESTRING,
- EDM_GEOMETRY_MULTIPOINT
- ];
-
- var geographyEdmTypes = [
- EDM_GEOGRAPHY,
- EDM_GEOGRAPHY_POINT,
- EDM_GEOGRAPHY_LINESTRING,
- EDM_GEOGRAPHY_POLYGON,
- EDM_GEOGRAPHY_COLLECTION,
- EDM_GEOGRAPHY_MULTIPOLYGON,
- EDM_GEOGRAPHY_MULTILINESTRING,
- EDM_GEOGRAPHY_MULTIPOINT
- ];
-
- var forEachSchema = function (metadata, callback) {
- /// <summary>Invokes a function once per schema in metadata.</summary>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <param name="callback" type="Function">Callback function to invoke once per schema.</param>
- /// <returns>
- /// The first truthy value to be returned from the callback; null or the last falsy value otherwise.
- /// </returns>
-
- if (!metadata) {
- return null;
- }
-
- if (isArray(metadata)) {
- var i, len, result;
- for (i = 0, len = metadata.length; i < len; i++) {
- result = forEachSchema(metadata[i], callback);
- if (result) {
- return result;
- }
- }
-
- return null;
- } else {
- if (metadata.dataServices) {
- return forEachSchema(metadata.dataServices.schema, callback);
- }
-
- return callback(metadata);
- }
- };
-
- var formatMilliseconds = function (ms, ns) {
- /// <summary>Formats a millisecond and a nanosecond value into a single string.</summary>
- /// <param name="ms" type="Number" mayBeNull="false">Number of milliseconds to format.</param>
- /// <param name="ns" type="Number" mayBeNull="false">Number of nanoseconds to format.</param>
- /// <returns type="String">Formatted text.</returns>
- /// <remarks>If the value is already as string it's returned as-is.</remarks>
-
- // Avoid generating milliseconds if not necessary.
- if (ms === 0) {
- ms = "";
- } else {
- ms = "." + formatNumberWidth(ms.toString(), 3);
- }
- if (ns > 0) {
- if (ms === "") {
- ms = ".000";
- }
- ms += formatNumberWidth(ns.toString(), 4);
- }
- return ms;
- };
-
- var formatDateTimeOffset = function (value) {
- /// <summary>Formats a DateTime or DateTimeOffset value a string.</summary>
- /// <param name="value" type="Date" mayBeNull="false">Value to format.</param>
- /// <returns type="String">Formatted text.</returns>
- /// <remarks>If the value is already as string it's returned as-is.</remarks>
-
- if (typeof value === "string") {
- return value;
- }
-
- var hasOffset = isDateTimeOffset(value);
- var offset = getCanonicalTimezone(value.__offset);
- if (hasOffset && offset !== "Z") {
- // We're about to change the value, so make a copy.
- value = new Date(value.valueOf());
-
- var timezone = parseTimezone(offset);
- var hours = value.getUTCHours() + (timezone.d * timezone.h);
- var minutes = value.getUTCMinutes() + (timezone.d * timezone.m);
-
- value.setUTCHours(hours, minutes);
- } else if (!hasOffset) {
- // Don't suffix a 'Z' for Edm.DateTime values.
- offset = "";
- }
-
- var year = value.getUTCFullYear();
- var month = value.getUTCMonth() + 1;
- var sign = "";
- if (year <= 0) {
- year = -(year - 1);
- sign = "-";
- }
-
- var ms = formatMilliseconds(value.getUTCMilliseconds(), value.__ns);
-
- return sign +
- formatNumberWidth(year, 4) + "-" +
- formatNumberWidth(month, 2) + "-" +
- formatNumberWidth(value.getUTCDate(), 2) + "T" +
- formatNumberWidth(value.getUTCHours(), 2) + ":" +
- formatNumberWidth(value.getUTCMinutes(), 2) + ":" +
- formatNumberWidth(value.getUTCSeconds(), 2) +
- ms + offset;
- };
-
- var formatDuration = function (value) {
- /// <summary>Converts a duration to a string in xsd:duration format.</summary>
- /// <param name="value" type="Object">Object with ms and __edmType properties.</param>
- /// <returns type="String">String representation of the time object in xsd:duration format.</returns>
-
- var ms = value.ms;
-
- var sign = "";
- if (ms < 0) {
- sign = "-";
- ms = -ms;
- }
-
- var days = Math.floor(ms / 86400000);
- ms -= 86400000 * days;
- var hours = Math.floor(ms / 3600000);
- ms -= 3600000 * hours;
- var minutes = Math.floor(ms / 60000);
- ms -= 60000 * minutes;
- var seconds = Math.floor(ms / 1000);
- ms -= seconds * 1000;
-
- return sign + "P" +
- formatNumberWidth(days, 2) + "DT" +
- formatNumberWidth(hours, 2) + "H" +
- formatNumberWidth(minutes, 2) + "M" +
- formatNumberWidth(seconds, 2) +
- formatMilliseconds(ms, value.ns) + "S";
- };
-
- var formatNumberWidth = function (value, width, append) {
- /// <summary>Formats the specified value to the given width.</summary>
- /// <param name="value" type="Number">Number to format (non-negative).</param>
- /// <param name="width" type="Number">Minimum width for number.</param>
- /// <param name="append" type="Boolean">Flag indicating if the value is padded at the beginning (false) or at the end (true).</param>
- /// <returns type="String">Text representation.</returns>
- var result = value.toString(10);
- while (result.length < width) {
- if (append) {
- result += "0";
- } else {
- result = "0" + result;
- }
- }
-
- return result;
- };
-
- var getCanonicalTimezone = function (timezone) {
- /// <summary>Gets the canonical timezone representation.</summary>
- /// <param name="timezone" type="String">Timezone representation.</param>
- /// <returns type="String">An 'Z' string if the timezone is absent or 0; the timezone otherwise.</returns>
-
- return (!timezone || timezone === "Z" || timezone === "+00:00" || timezone === "-00:00") ? "Z" : timezone;
- };
-
- var getCollectionType = function (typeName) {
- /// <summary>Gets the type of a collection type name.</summary>
- /// <param name="typeName" type="String">Type name of the collection.</param>
- /// <returns type="String">Type of the collection; null if the type name is not a collection type.</returns>
-
- if (typeof typeName === "string") {
- var end = typeName.indexOf(")", 10);
- if (typeName.indexOf("Collection(") === 0 && end > 0) {
- return typeName.substring(11, end);
- }
- }
- return null;
- };
-
- var invokeRequest = function (request, success, error, handler, httpClient, context) {
- /// <summary>Sends a request containing OData payload to a server.</summary>
- /// <param name="request">Object that represents the request to be sent..</param>
- /// <param name="success">Callback for a successful read operation.</param>
- /// <param name="error">Callback for handling errors.</param>
- /// <param name="handler">Handler for data serialization.</param>
- /// <param name="httpClient">HTTP client layer.</param>
- /// <param name="context">Context used for processing the request</param>
-
- return httpClient.request(request, function (response) {
- try {
- if (response.headers) {
- normalizeHeaders(response.headers);
- }
-
- if (response.data === undefined && response.statusCode !== 204) {
- handler.read(response, context);
- }
- } catch (err) {
- if (err.request === undefined) {
- err.request = request;
- }
- if (err.response === undefined) {
- err.response = response;
- }
- error(err);
- return;
- }
-
- success(response.data, response);
- }, error);
- };
-
- var isBatch = function (value) {
- /// <summary>Tests whether a value is a batch object in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is a batch object; false otherwise.</returns>
-
- return isComplex(value) && isArray(value.__batchRequests);
- };
-
- // Regular expression used for testing and parsing for a collection type.
- var collectionTypeRE = /Collection\((.*)\)/;
-
- var isCollection = function (value, typeName) {
- /// <summary>Tests whether a value is a collection value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <param name="typeName" type="Sting">Type name of the value. This is used to disambiguate from a collection property value.</param>
- /// <returns type="Boolean">True is the value is a feed value; false otherwise.</returns>
-
- var colData = value && value.results || value;
- return !!colData &&
- (isCollectionType(typeName)) ||
- (!typeName && isArray(colData) && !isComplex(colData[0]));
- };
-
- var isCollectionType = function (typeName) {
- /// <summary>Checks whether the specified type name is a collection type.</summary>
- /// <param name="typeName" type="String">Name of type to check.</param>
- /// <returns type="Boolean">True if the type is the name of a collection type; false otherwise.</returns>
- return collectionTypeRE.test(typeName);
- };
-
- var isComplex = function (value) {
- /// <summary>Tests whether a value is a complex type value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is a complex type value; false otherwise.</returns>
-
- return !!value &&
- isObject(value) &&
- !isArray(value) &&
- !isDate(value);
- };
-
- var isDateTimeOffset = function (value) {
- /// <summary>Checks whether a Date object is DateTimeOffset value</summary>
- /// <param name="value" type="Date" mayBeNull="false">Value to check.</param>
- /// <returns type="Boolean">true if the value is a DateTimeOffset, false otherwise.</returns>
- return (value.__edmType === "Edm.DateTimeOffset" || (!value.__edmType && value.__offset));
- };
-
- var isDeferred = function (value) {
- /// <summary>Tests whether a value is a deferred navigation property in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is a deferred navigation property; false otherwise.</returns>
-
- if (!value && !isComplex(value)) {
- return false;
- }
- var metadata = value.__metadata || {};
- var deferred = value.__deferred || {};
- return !metadata.type && !!deferred.uri;
- };
-
- var isEntry = function (value) {
- /// <summary>Tests whether a value is an entry object in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is an entry object; false otherwise.</returns>
-
- return isComplex(value) && value.__metadata && "uri" in value.__metadata;
- };
-
- var isFeed = function (value, typeName) {
- /// <summary>Tests whether a value is a feed value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <param name="typeName" type="Sting">Type name of the value. This is used to disambiguate from a collection property value.</param>
- /// <returns type="Boolean">True is the value is a feed value; false otherwise.</returns>
-
- var feedData = value && value.results || value;
- return isArray(feedData) && (
- (!isCollectionType(typeName)) &&
- (isComplex(feedData[0]))
- );
- };
-
- var isGeographyEdmType = function (typeName) {
- /// <summary>Checks whether the specified type name is a geography EDM type.</summary>
- /// <param name="typeName" type="String">Name of type to check.</param>
- /// <returns type="Boolean">True if the type is a geography EDM type; false otherwise.</returns>
-
- return contains(geographyEdmTypes, typeName);
- };
-
- var isGeometryEdmType = function (typeName) {
- /// <summary>Checks whether the specified type name is a geometry EDM type.</summary>
- /// <param name="typeName" type="String">Name of type to check.</param>
- /// <returns type="Boolean">True if the type is a geometry EDM type; false otherwise.</returns>
-
- return contains(geometryEdmTypes, typeName);
- };
-
- var isNamedStream = function (value) {
- /// <summary>Tests whether a value is a named stream value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is a named stream; false otherwise.</returns>
-
- if (!value && !isComplex(value)) {
- return false;
- }
- var metadata = value.__metadata;
- var mediaResource = value.__mediaresource;
- return !metadata && !!mediaResource && !!mediaResource.media_src;
- };
-
- var isPrimitive = function (value) {
- /// <summary>Tests whether a value is a primitive type value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <remarks>
- /// Date objects are considered primitive types by the library.
- /// </remarks>
- /// <returns type="Boolean">True is the value is a primitive type value.</returns>
-
- return isDate(value) ||
- typeof value === "string" ||
- typeof value === "number" ||
- typeof value === "boolean";
- };
-
- var isPrimitiveEdmType = function (typeName) {
- /// <summary>Checks whether the specified type name is a primitive EDM type.</summary>
- /// <param name="typeName" type="String">Name of type to check.</param>
- /// <returns type="Boolean">True if the type is a primitive EDM type; false otherwise.</returns>
-
- return contains(primitiveEdmTypes, typeName);
- };
-
- var navigationPropertyKind = function (value, propertyModel) {
- /// <summary>Gets the kind of a navigation property value.</summary>
- /// <param name="value">Value of the navigation property.</param>
- /// <param name="propertyModel" type="Object" optional="true">
- /// Object that describes the navigation property in an OData conceptual schema.
- /// </param>
- /// <remarks>
- /// The returned string is as follows
- /// </remarks>
- /// <returns type="String">String value describing the kind of the navigation property; null if the kind cannot be determined.</returns>
-
- if (isDeferred(value)) {
- return "deferred";
- }
- if (isEntry(value)) {
- return "entry";
- }
- if (isFeed(value)) {
- return "feed";
- }
- if (propertyModel && propertyModel.relationship) {
- if (value === null || value === undefined || !isFeed(value)) {
- return "entry";
- }
- return "feed";
- }
- return null;
- };
-
- var lookupProperty = function (properties, name) {
- /// <summary>Looks up a property by name.</summary>
- /// <param name="properties" type="Array" mayBeNull="true">Array of property objects as per EDM metadata.</param>
- /// <param name="name" type="String">Name to look for.</param>
- /// <returns type="Object">The property object; null if not found.</returns>
-
- return find(properties, function (property) {
- return property.name === name;
- });
- };
-
- var lookupInMetadata = function (name, metadata, kind) {
- /// <summary>Looks up a type object by name.</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <param name="kind" type="String">Kind of object to look for as per EDM metadata.</param>
- /// <returns>An type description if the name is found; null otherwise.</returns>
-
- return (name) ? forEachSchema(metadata, function (schema) {
- return lookupInSchema(name, schema, kind);
- }) : null;
- };
-
- var lookupEntitySet = function (entitySets, name) {
- /// <summary>Looks up a entity set by name.</summary>
- /// <param name="properties" type="Array" mayBeNull="true">Array of entity set objects as per EDM metadata.</param>
- /// <param name="name" type="String">Name to look for.</param>
- /// <returns type="Object">The entity set object; null if not found.</returns>
-
- return find(entitySets, function (entitySet) {
- return entitySet.name === name;
- });
- };
-
- var lookupComplexType = function (name, metadata) {
- /// <summary>Looks up a complex type object by name.</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <returns>A complex type description if the name is found; null otherwise.</returns>
-
- return lookupInMetadata(name, metadata, "complexType");
- };
-
- var lookupEntityType = function (name, metadata) {
- /// <summary>Looks up an entity type object by name.</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <returns>An entity type description if the name is found; null otherwise.</returns>
-
- return lookupInMetadata(name, metadata, "entityType");
- };
-
- var lookupDefaultEntityContainer = function (metadata) {
- /// <summary>Looks up an</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <returns>An entity container description if the name is found; null otherwise.</returns>
-
- return forEachSchema(metadata, function (schema) {
- return find(schema.entityContainer, function (container) {
- return parseBool(container.isDefaultEntityContainer);
- });
- });
- };
-
- var lookupEntityContainer = function (name, metadata) {
- /// <summary>Looks up an entity container object by name.</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <returns>An entity container description if the name is found; null otherwise.</returns>
-
- return lookupInMetadata(name, metadata, "entityContainer");
- };
-
- var lookupFunctionImport = function (functionImports, name) {
- /// <summary>Looks up a function import by name.</summary>
- /// <param name="properties" type="Array" mayBeNull="true">Array of function import objects as per EDM metadata.</param>
- /// <param name="name" type="String">Name to look for.</param>
- /// <returns type="Object">The entity set object; null if not found.</returns>
-
- return find(functionImports, function (functionImport) {
- return functionImport.name === name;
- });
- };
-
- var lookupNavigationPropertyType = function (navigationProperty, metadata) {
- /// <summary>Looks up the target entity type for a navigation property.</summary>
- /// <param name="navigationProperty" type="Object"></param>
- /// <param name="metadata" type="Object"></param>
- /// <returns type="String">The entity type name for the specified property, null if not found.</returns>
-
- var result = null;
- if (navigationProperty) {
- var rel = navigationProperty.relationship;
- var association = forEachSchema(metadata, function (schema) {
- // The name should be the namespace qualified name in 'ns'.'type' format.
- var nameOnly = removeNamespace(schema["namespace"], rel);
- var associations = schema.association;
- if (nameOnly && associations) {
- var i, len;
- for (i = 0, len = associations.length; i < len; i++) {
- if (associations[i].name === nameOnly) {
- return associations[i];
- }
- }
- }
- return null;
- });
-
- if (association) {
- var end = association.end[0];
- if (end.role !== navigationProperty.toRole) {
- end = association.end[1];
- // For metadata to be valid, end.role === navigationProperty.toRole now.
- }
- result = end.type;
- }
- }
- return result;
- };
-
- var lookupNavigationPropertyEntitySet = function (navigationProperty, sourceEntitySetName, metadata) {
- /// <summary>Looks up the target entityset name for a navigation property.</summary>
- /// <param name="navigationProperty" type="Object"></param>
- /// <param name="metadata" type="Object"></param>
- /// <returns type="String">The entityset name for the specified property, null if not found.</returns>
-
- if (navigationProperty) {
- var rel = navigationProperty.relationship;
- var associationSet = forEachSchema(metadata, function (schema) {
- var containers = schema.entity
<TRUNCATED>