<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

<jquery>
    <object name="jQuery.ajax">
        <property name="accepts" type="Object">
            <doc>
                The content type sent in the request header that tells the server what kind of response it will accept in return. If the accepts setting needs modification, it is recommended to do so once in the $.ajaxSetup() method.
            </doc>
        </property>
        <property name="async" type="boolean">
            <doc>
                By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active. As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done() or the deprecated jqXHR.success().
            </doc>
            <template>
                <![CDATA[
                    false${cursor}
                ]]>
            </template>
        </property>
        <property name="beforeSend" type="Function">
            <doc>
                A pre-request callback function that can be used to modify the jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object before it is sent. Use this to set custom headers, etc. The jqXHR and settings objects are passed as arguments. This is an Ajax Event. Returning false in the beforeSend function will cancel the request. As of jQuery 1.5, the beforeSend option will be called regardless of the type of request.
            </doc>
            <template>
                <![CDATA[
                    function (xhr) {
                        ${cursor}
                    }
                ]]>
            </template>
        </property>
        <property name="cache" type="boolean">
            <doc>
                If set to false, it will force requested pages not to be cached by the browser. Note: Setting cache to false will only work correctly with HEAD and GET requests. It works by appending "_={timestamp}" to the GET parameters. The parameter is not needed for other types of requests, except in IE8 when a POST is made to a URL that has already been requested by a GET.
            </doc>
            <template>
                <![CDATA[
                    false${cursor}
                ]]>
            </template>
        </property>
        <property name="complete" type="Function">
            <doc>
                A function to be called when the request finishes (after success and error callbacks are executed). The function gets passed two arguments: The jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object and a string categorizing the status of the request ("success", "notmodified", "error", "timeout", "abort", or "parsererror"). As of jQuery 1.5, the complete setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event.
            </doc>
            <template>
                <![CDATA[
                function (jqXHR, textStatus ) {
                        ${cursor}
                }
                ]]>
            </template>
        </property>
        <property name="contents" type="Object">
            <doc>
                An object of string/regular-expression pairs that determine how jQuery will parse the response, given its content type. (version added: 1.5)
            </doc>
        </property>
        <property name="contentType" type="String">
            <doc>
                When sending data to the server, use this content type. Default is "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it'll always be sent to the server (even if no data is sent). If no charset is specified, data will be transmitted to the server using the server's default charset; you must decode this appropriately on the server side.
            </doc>
            <template>
                <![CDATA[
                    '${cursor}'
                ]]>
            </template>
        </property>
        <property name="context" type="Object">
            <doc>
                This object will be made the context of all Ajax-related callbacks. By default, the context is an object that represents the ajax settings used in the call ($.ajaxSettings merged with the settings passed to $.ajax). For example, specifying a DOM element as the context will make that the context for the complete callback of a request.
            </doc>
        </property>
        <property name="converters" type="Object">
            <doc>
                An object containing dataType-to-dataType converters. Each converter's value is a function that returns the transformed value of the response. (version added: 1.5)
            </doc>
            <template>
                <![CDATA[
                    {${cursor}}
                ]]>
            </template>
        </property>
        <property name="crossDomain" type="boolean">
            <doc>
                If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of crossDomain to true. This allows, for example, server-side redirection to another domain. (version added: 1.5)
            </doc>
            <template>
                <![CDATA[
                    false${cursor}
                ]]>
            </template>
        </property>
        <property name="data" type="String">
            <doc>
                Data to be sent to the server. It is converted to a query string, if not already a string. It's appended to the url for GET-requests. See processData option to prevent this automatic processing. Object must be Key/Value pairs. If value is an Array, jQuery serializes multiple values with same key based on the value of the traditional setting (described below).
            </doc>
        </property>
        <property name="dataFilter" type="Function">
            <doc>
                A function to be used to handle the raw response data of XMLHttpRequest.This is a pre-filtering function to sanitize the response. You should return the sanitized data. The function accepts two arguments: The raw data returned from the server and the 'dataType' parameter.
            </doc>
            <template>
                <![CDATA[
                    function (data, type) {
                        ${cursor}
                    }
                ]]>
            </template>
        </property>
        <property name="dataType" type="String">
            <doc>
                The type of data that you're expecting back from the server. If none is specified, jQuery will try to infer it based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string). 
            </doc>
            <template>
                <![CDATA[
                    '${cursor}'
                ]]>
            </template>
        </property>
        <property name="error" type="Function">
            <doc>
                A function to be called if the request fails. The function receives three arguments: The jqXHR (in jQuery 1.4.x, XMLHttpRequest) object, a string describing the type of error that occurred and an optional exception object, if one occurred. Possible values for the second argument (besides null) are "timeout", "error", "abort", and "parsererror". When an HTTP error occurs, errorThrown receives the textual portion of the HTTP status, such as "Not Found" or "Internal Server Error." As of jQuery 1.5, the error setting can accept an array of functions. Each function will be called in turn. Note: This handler is not called for cross-domain script and cross-domain JSONP requests. This is an Ajax Event.
            </doc>
            <template>
                <![CDATA[
                    function (jqXHR, textStatus, errorThrown) {
                        ${cursor}
                    }
                ]]>
            </template>
        </property>
        <property name="global" type="boolean">
            <doc>
                Whether to trigger global Ajax event handlers for this request. The default is true. Set to false to prevent the global handlers like ajaxStart or ajaxStop from being triggered. This can be used to control various Ajax Events.
            </doc>
            <template>
                <![CDATA[
                    false${cursor}
                ]]>
            </template>
        </property>
        <property name="headers" type="Object">
            <doc>
                An object of additional header key/value pairs to send along with the request. This setting is set before the beforeSend function is called; therefore, any values in the headers setting can be overwritten from within the beforeSend function. (version added: 1.5)
            </doc>
            <template>
                <![CDATA[
                    {${cursor}}
                ]]>
            </template>
        </property>
        <property name="ifModified" type="boolean">
            <doc>
                Allow the request to be successful only if the response has changed since the last request. This is done by checking the Last-Modified header. Default value is false, ignoring the header. In jQuery 1.4 this technique also checks the 'etag' specified by the server to catch unmodified data.
            </doc>
            <template>
                <![CDATA[
                    true${cursor}
                ]]>
            </template>
        </property>
        <property name="isLocal" type="boolean">
            <doc>
                Allow the current environment to be recognized as "local," (e.g. the filesystem), even if jQuery does not recognize it as such by default. The following protocols are currently recognized as local: file, *-extension, and widget. If the isLocal setting needs modification, it is recommended to do so once in the $.ajaxSetup() method. (version added: 1.5.1)
            </doc>
            <template>
                <![CDATA[
                    false${cursor}
                ]]>
            </template>
        </property>
        <property name="jsonp" type="String">
            <doc>
                Override the callback function name in a jsonp request. This value will be used instead of 'callback' in the 'callback=?' part of the query string in the url. So {jsonp:'onJSONPLoad'} would result in 'onJSONPLoad=?' passed to the server. As of jQuery 1.5, setting the jsonp option to false prevents jQuery from adding the "?callback" string to the URL or attempting to use "=?" for transformation. In this case, you should also explicitly set the jsonpCallback setting. For example, { jsonp: false, jsonpCallback: "callbackName" }
            </doc>
            <template>
                <![CDATA[
                    '${cursor}'
                ]]>
            </template>
        </property>
        <property name="jsonpCallback" type="String|Function">
            <doc>
                Specify the callback function name for a JSONP request. This value will be used instead of the random name automatically generated by jQuery. It is preferable to let jQuery generate a unique name as it'll make it easier to manage the requests and provide callbacks and error handling. You may want to specify the callback when you want to enable better browser caching of GET requests. As of jQuery 1.5, you can also use a function for this setting, in which case the value of jsonpCallback is set to the return value of that function.
            </doc>
        </property>
        <property name="mimeType" type="String">
            <doc>
                A mime type to override the XHR mime type. (version added: 1.5.1)
            </doc>
            <template>
                <![CDATA[
                    '${cursor}'
                ]]>
            </template>
        </property>
        <property name="password" type="String">
            <doc>
                A password to be used in response to an HTTP access authentication request.
            </doc>
            <template>
                <![CDATA[
                    false${cursor}
                ]]>
            </template>
        </property>
        <property name="processData" type="boolean">
            <doc>
                By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded". If you want to send a DOMDocument, or other non-processed data, set this option to false.
            </doc>
            <template>
                <![CDATA[
                    false${cursor}
                ]]>
            </template>
        </property>
        <property name="scriptCharset" type="String">
            <doc>
                Only applies when the "script" transport is used (e.g., cross-domain requests with "jsonp" or "script" dataType and "GET" type). Sets the charset attribute on the script tag used in the request. Used when the character set on the local page is not the same as the one on the remote script.
            </doc>
            <template>
                <![CDATA[
                    '${cursor}'
                ]]>
            </template>
        </property>
        <property name="statusCode" type="Object">
            <doc>
                An object of numeric HTTP codes and functions to be called when the response has the corresponding code.
            </doc>
            <template>
                <![CDATA[
                    {${cursor}}
                ]]>
            </template>
        </property>
        <property name="success" type="Function">
            <doc>
                A function to be called if the request succeeds. The function gets passed three arguments: The data returned from the server, formatted according to the dataType parameter; a string describing the status; and the jqXHR (in jQuery 1.4.x, XMLHttpRequest) object. As of jQuery 1.5, the success setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event.
            </doc>
            <template>
                <![CDATA[
                    function (data, textStatus, jqXHR) {
                        ${cursor}
                    }
                ]]>
            </template>
        </property>
        <property name="timeout" type="Number">
            <doc>
                Set a timeout (in milliseconds) for the request. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent. In jQuery 1.4.x and below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period.
            </doc>
        </property>
        <property name="traditional" type="boolean">
            <doc>
                Set this to true if you wish to use the traditional style of param serialization.
            </doc>
            <template>
                <![CDATA[
                    true${cursor}
                ]]>
            </template>
        </property>
        <property name="type" type="String">
            <doc>
                The type of request to make ("POST" or "GET"), default is "GET". Note: Other HTTP request methods, such as PUT and DELETE, can also be used here, but they are not supported by all browsers.
            </doc>
            <template>
                <![CDATA[
                    'POST${cursor}'
                ]]>
            </template>
        </property>
        <property name="url" type="String">
            <doc>
                A string containing the URL to which the request is sent.
            </doc>
            <template>
                <![CDATA[
                    "${cursor}"
                ]]>
            </template>
        </property>
        <property name="username" type="String">
            <doc>
                A username to be used in response to an HTTP access authentication request.
            </doc>
            <template>
                <![CDATA[
                    "${cursor}"
                ]]>
            </template>
        </property>
        <property name="xhr" type="Function">
            <doc>
                Callback for creating the XMLHttpRequest object. Defaults to the ActiveXObject when available (IE), the XMLHttpRequest otherwise. Override to provide your own implementation for XMLHttpRequest or enhancements to the factory.
            </doc>
            <template>
                <![CDATA[
                   function () {
                        ${cursor}
                    }
                ]]>
            </template>
        </property>
        <property name="xhrFields" type="Object">
            <doc>
                An object of fieldName-fieldValue pairs to set on the native XHR object. For example, you can use it to set withCredentials to true for cross-domain requests if needed.
            </doc>
            <template>
                <![CDATA[
                    {${cursor}}
                ]]>
            </template>
        </property>
        
    </object>
</jquery>
