• Jump To … +
    breakpoints.js date-parse.js jquery.breakpoints.js jquery.calcRestrainedPos.js jquery.clientRect.js jquery.contentSize.js jquery.cookies.js jquery.css.js jquery.customEvent.js jquery.delimitedString.js jquery.disableEvent.js jquery.hostIframe.js jquery.hoverDelay.js jquery.htmlEncode.js jquery.imageSize.js jquery.isVisibleKeyCode.js jquery.menu.js jquery-menu-exampleskin.js jquery.modalDialog.deviceFixes.js jquery.modalDialog.getSettings.js jquery.modalDialog.header.js jquery.modalDialog.history.js jquery.modalDialog.js jquery.modalDialog.unobtrusive.js jquery.modalDialog.userAgent.js jquery.modalDialogContent.header.js jquery.modalDialogContent.js jquery.msAjax.js jquery.ns.js jquery.partialLoad.js jquery.postMessage.js jquery.proxyAll.js jquery.queryString.js jquery.richTooltip.js jquery.scrollAnchor.js jquery.uncomment.js jquery.url.js pointy.gestures.js pointy.js
  • jquery.msAjax.js

  • ¶

    / /

    (function (window, $) {
  • ¶

    Remove ASMX specific metadata from JSON

        var msJsonSanitizer = function (key, value) {
  • ¶

    Rehydrate date values

            if (typeof (value) == "string") {
                return msJsonDateOnlySanitizer(key, value);
            } else if (typeof (value) == "object") {
  • ¶

    ASMX adds a “__type” property to aid in return-trip deserialization. This isn’t useful most of the time.

                if (value && value.__type) {
                    delete value.__type;
                }
            }
    
            return value;
        };
  • ¶

    Converts date strings in ISO8601 or Microsoft format to JavaScript dates

        var msJsonDateOnlySanitizer = function (key, value) {
            if (typeof (value) == "string") {
  • ¶

    Perform strict parsing so that strings that are not full dates are not parsed as dates Example of a partial date: “2013” Example of a full ISO8601 date: “2013-08-07T21:40:05.121+06:00”

                if (!$.parseMsJSON.isNumericString(value)) {
                    var date = Date.parseISO(value) ||
                        Date.parseMsDate(value) ||
                        (value.indexOf("GMT") >= 0 ? Date.parse(value) : NaN);
                    if (!isNaN(date)) {
                        return new Date(date);
                    }
                }
            }
    
            return value;
        };
  • ¶

    Parses Microsoft JSON, removes the outer container, and revives it.

        $.parseMsJSON = function (text, preserveType) {
            if (!text) {
                return {};
            }
    
            var json = JSON.parse(text, preserveType ? msJsonDateOnlySanitizer : msJsonSanitizer);
    
            if (!json) {
                return {};
            }
  • ¶

    ASMX puts all JSON in a “d” property.

            return typeof json.d != "undefined" ? json.d : json;
        };
    
        $.parseMsJSON.isNumericString = function (value) {
            return new RegExp(/^-?[0-9]+\.?[0-9]*$/).test(value);
        };
  • ¶

    Recurses through a JSON object and applies the specified reviver

        var recurseJSON = function (holder, key, reviver) {
            var k, v, value = holder[key];
            if (value && typeof value == "object") {
                for (k in value) {
                    if (Object.prototype.hasOwnProperty.call(value, k)) {
                        v = recurseJSON(value, k, reviver);
                        if (v !== undefined) {
                            value[k] = v;
                        } else {
                            delete value[k];
                        }
                    }
                }
            }
    
            return reviver.call(holder, key, value);
        };
  • ¶

    Recurses over a json data structure and runs the specified reviver function

        $.recurseJSON = function (json, reviver) {
            return recurseJSON({
                "": json
            }, "", reviver);
        };
  • ¶

    Recurses over a json data structure output by Microsoft JSON serialization, and revives it.

        $.reviveMsJSON = function (json, datesOnly) {
            return $.recurseJSON(json, datesOnly ? msJsonDateOnlySanitizer : msJsonSanitizer);
        };
    
        var AJAX_SETTINGS_DEFAULTS = {
            dataType: "json",
            type: "post",
            contentType: "application/json; charset=utf-8",
            converters: {
                "text json": $.parseMsJSON
            } //Parse and sanitize the JSON returned by ASMX
        };
    
        var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/;
  • ¶

    A reviver/replacer for JSON.stringify() that converts dates into Microsoft format

        $.stringifyMsDate = function (key, value) {
            if (typeof value == "string") {
                var a = reISO.exec(value);
                if (a) {
                    var val = "/Date(" + new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])).getTime() + "-0000)/";
    
                    this[key] = val;
                    return val;
                }
            }
            return value;
        };
  • ¶

    Invoke $.ajax() with all the correct settings and wrappers for Microsoft script services such as ASMX and WCF. Otherwise identical to $.ajax() (same settings, arguments, and return values).

        $.msAjax = function (url, settings) {
            if (!settings) {
                settings = {};
            }
    
            if (typeof url == "object") {
                settings = url;
            } else if (typeof url == "string") {
                settings.url = url;
            }
  • ¶

    Validate settings

            if (!settings.url) {
                throw new Error("$.msAjax: url not specified");
            }
  • ¶

    Format the data as JSON before post

            if (settings.data) {
                settings.data = JSON.stringify(settings.data, $.stringifyMsDate);
            }
  • ¶

    In ASMX (and REST in general), web service method name gets appended to the URL

            if (settings.methodName) {
                settings.url += "/" + settings.methodName;
            }
    
            var coalescedSettings = {};
            $.extend(true, coalescedSettings, AJAX_SETTINGS_DEFAULTS, settings);
  • ¶

    For a sync call, return the parsed JSON

            if (coalescedSettings.async === false) {
                var xhr = $.ajax(coalescedSettings);
                return $.parseMsJSON(xhr.responseText, coalescedSettings.preserveType);
            }
    
            return $.ajax(coalescedSettings);
        };
    
        $.ajaxAsmx = $.msAjax;
        $.ajaxWcf = $.msAjax;
    
        /* test-code */
        $.msAjax_private = {
            msJsonDateOnlySanitizer: msJsonDateOnlySanitizer
        };
        /* end-test-code */
    
    })(window, jQuery);