1 | /// <reference path="jquery-1.5.1.js" />
|
---|
2 |
|
---|
3 | /*!
|
---|
4 | ** Unobtrusive Ajax support library for jQuery
|
---|
5 | ** Copyright (C) Microsoft Corporation. All rights reserved.
|
---|
6 | */
|
---|
7 |
|
---|
8 | /*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
|
---|
9 | /*global window: false, jQuery: false */
|
---|
10 |
|
---|
11 | (function ($) {
|
---|
12 | var data_click = "unobtrusiveAjaxClick",
|
---|
13 | data_validation = "unobtrusiveValidation";
|
---|
14 |
|
---|
15 | function getFunction(code, argNames) {
|
---|
16 | var fn = window, parts = (code || "").split(".");
|
---|
17 | while (fn && parts.length) {
|
---|
18 | fn = fn[parts.shift()];
|
---|
19 | }
|
---|
20 | if (typeof (fn) === "function") {
|
---|
21 | return fn;
|
---|
22 | }
|
---|
23 | argNames.push(code);
|
---|
24 | return Function.constructor.apply(null, argNames);
|
---|
25 | }
|
---|
26 |
|
---|
27 | function isMethodProxySafe(method) {
|
---|
28 | return method === "GET" || method === "POST";
|
---|
29 | }
|
---|
30 |
|
---|
31 | function asyncOnBeforeSend(xhr, method) {
|
---|
32 | if (!isMethodProxySafe(method)) {
|
---|
33 | xhr.setRequestHeader("X-HTTP-Method-Override", method);
|
---|
34 | }
|
---|
35 | }
|
---|
36 |
|
---|
37 | function asyncOnSuccess(element, data, contentType) {
|
---|
38 | var mode;
|
---|
39 |
|
---|
40 | if (contentType.indexOf("application/x-javascript") !== -1) { // jQuery already executes JavaScript for us
|
---|
41 | return;
|
---|
42 | }
|
---|
43 |
|
---|
44 | mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase();
|
---|
45 | $(element.getAttribute("data-ajax-update")).each(function (i, update) {
|
---|
46 | var top;
|
---|
47 |
|
---|
48 | switch (mode) {
|
---|
49 | case "BEFORE":
|
---|
50 | top = update.firstChild;
|
---|
51 | $("<div />").html(data).contents().each(function () {
|
---|
52 | update.insertBefore(this, top);
|
---|
53 | });
|
---|
54 | break;
|
---|
55 | case "AFTER":
|
---|
56 | $("<div />").html(data).contents().each(function () {
|
---|
57 | update.appendChild(this);
|
---|
58 | });
|
---|
59 | break;
|
---|
60 | default:
|
---|
61 | $(update).html(data);
|
---|
62 | break;
|
---|
63 | }
|
---|
64 | });
|
---|
65 | }
|
---|
66 |
|
---|
67 | function asyncRequest(element, options) {
|
---|
68 | var confirm, loading, method, duration;
|
---|
69 |
|
---|
70 | confirm = element.getAttribute("data-ajax-confirm");
|
---|
71 | if (confirm && !window.confirm(confirm)) {
|
---|
72 | return;
|
---|
73 | }
|
---|
74 |
|
---|
75 | loading = $(element.getAttribute("data-ajax-loading"));
|
---|
76 | duration = element.getAttribute("data-ajax-loading-duration") || 0;
|
---|
77 |
|
---|
78 | $.extend(options, {
|
---|
79 | type: element.getAttribute("data-ajax-method") || undefined,
|
---|
80 | url: element.getAttribute("data-ajax-url") || undefined,
|
---|
81 | beforeSend: function (xhr) {
|
---|
82 | var result;
|
---|
83 | asyncOnBeforeSend(xhr, method);
|
---|
84 | result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(this, arguments);
|
---|
85 | if (result !== false) {
|
---|
86 | loading.show(duration);
|
---|
87 | }
|
---|
88 | return result;
|
---|
89 | },
|
---|
90 | complete: function () {
|
---|
91 | loading.hide(duration);
|
---|
92 | getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(this, arguments);
|
---|
93 | },
|
---|
94 | success: function (data, status, xhr) {
|
---|
95 | asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
|
---|
96 | getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(this, arguments);
|
---|
97 | },
|
---|
98 | error: getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"])
|
---|
99 | });
|
---|
100 |
|
---|
101 | options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });
|
---|
102 |
|
---|
103 | method = options.type.toUpperCase();
|
---|
104 | if (!isMethodProxySafe(method)) {
|
---|
105 | options.type = "POST";
|
---|
106 | options.data.push({ name: "X-HTTP-Method-Override", value: method });
|
---|
107 | }
|
---|
108 |
|
---|
109 | $.ajax(options);
|
---|
110 | }
|
---|
111 |
|
---|
112 | function validate(form) {
|
---|
113 | var validationInfo = $(form).data(data_validation);
|
---|
114 | return !validationInfo || !validationInfo.validate || validationInfo.validate();
|
---|
115 | }
|
---|
116 |
|
---|
117 | $("a[data-ajax=true]").live("click", function (evt) {
|
---|
118 | evt.preventDefault();
|
---|
119 | asyncRequest(this, {
|
---|
120 | url: this.href,
|
---|
121 | type: "GET",
|
---|
122 | data: []
|
---|
123 | });
|
---|
124 | });
|
---|
125 |
|
---|
126 | $("form[data-ajax=true] input[type=image]").live("click", function (evt) {
|
---|
127 | var name = evt.target.name,
|
---|
128 | $target = $(evt.target),
|
---|
129 | form = $target.parents("form")[0],
|
---|
130 | offset = $target.offset();
|
---|
131 |
|
---|
132 | $(form).data(data_click, [
|
---|
133 | { name: name + ".x", value: Math.round(evt.pageX - offset.left) },
|
---|
134 | { name: name + ".y", value: Math.round(evt.pageY - offset.top) }
|
---|
135 | ]);
|
---|
136 |
|
---|
137 | setTimeout(function () {
|
---|
138 | $(form).removeData(data_click);
|
---|
139 | }, 0);
|
---|
140 | });
|
---|
141 |
|
---|
142 | $("form[data-ajax=true] :submit").live("click", function (evt) {
|
---|
143 | var name = evt.target.name,
|
---|
144 | form = $(evt.target).parents("form")[0];
|
---|
145 |
|
---|
146 | $(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []);
|
---|
147 |
|
---|
148 | setTimeout(function () {
|
---|
149 | $(form).removeData(data_click);
|
---|
150 | }, 0);
|
---|
151 | });
|
---|
152 |
|
---|
153 | $("form[data-ajax=true]").live("submit", function (evt) {
|
---|
154 | var clickInfo = $(this).data(data_click) || [];
|
---|
155 | evt.preventDefault();
|
---|
156 | if (!validate(this)) {
|
---|
157 | return;
|
---|
158 | }
|
---|
159 | asyncRequest(this, {
|
---|
160 | url: this.action,
|
---|
161 | type: this.method || "GET",
|
---|
162 | data: clickInfo.concat($(this).serializeArray())
|
---|
163 | });
|
---|
164 | });
|
---|
165 | }(jQuery)); |
---|