core.js
上传用户:szgaoree
上传日期:2009-01-05
资源大小:74k
文件大小:13k
源码类别:

Ajax

开发平台:

C#

  1. addNamespace("AjaxPro");
  2. Object.extend(AjaxPro, {
  3. noOperation: function() {},
  4. cryptProvider: null,
  5. queue: null,
  6. token: "",
  7. version: "6.4.16.1",
  8. timeoutPeriod: 5000,
  9. queue: null,
  10. typeOf: function(o) {
  11. if(o != null && o.__type) {
  12. var ts = this.__type.split(',');
  13. if(ts.length > 0)
  14. return ts[0];
  15. else
  16. return typeof o;
  17. } else {
  18. return typeof o;
  19. }
  20. },
  21. getInstance: function(className, o) {
  22. if(o == null) o = window;
  23. var c = className.split(".");
  24. if(c.length > 1)
  25. return AjaxPro.getInstance(className.substr(className.indexOf(".") +1), o[c[0]]);
  26. return o[className];
  27. },
  28. toJSON: function(o) {
  29. if(o == null)
  30. return "null";
  31. switch(o.constructor) {
  32. case String:
  33. var s = o; // .encodeURI();
  34. s = '"' + s.replace(/(["\])/g, '\$1') + '"';
  35. s = s.replace(/n/g,"\n");
  36. s = s.replace(/r/g,"\r");
  37. return s;
  38. case Array:
  39. var v = [];
  40. for(var i=0; i<o.length; i++)
  41. v.push(AjaxPro.toJSON(o[i])) ;
  42. return "[" + v.join(", ") + "]";
  43. case Number:
  44. return isFinite(o) ? o.toString() : AjaxPro.toJSON(null);
  45. case Boolean:
  46. return o.toString();
  47. case Date:
  48. var d = new Object();
  49. d.__type = "System.DateTime";
  50. d.Year = o.getUTCFullYear();
  51. d.Month = o.getUTCMonth() +1;
  52. d.Day = o.getUTCDate();
  53. d.Hour = o.getUTCHours();
  54. d.Minute = o.getUTCMinutes();
  55. d.Second = o.getUTCSeconds();
  56. d.Millisecond = o.getUTCMilliseconds();
  57. d.TimezoneOffset = o.getTimezoneOffset();
  58. return AjaxPro.toJSON(d);
  59. default:
  60. if(o["toJSON"] != null && typeof o["toJSON"] == "function")
  61. return o.toJSON();
  62. if(typeof o == "object") {
  63. var v=[];
  64. for(attr in o) {
  65. if(typeof o[attr] != "function")
  66. v.push('"' + attr + '": ' + AjaxPro.toJSON(o[attr]));
  67. }
  68. if(v.length>0)
  69. return "{" + v.join(", ") + "}";
  70. else
  71. return "{}";
  72. }
  73. return o.toString();
  74. }
  75. }
  76. });
  77. AjaxPro.IFrameXmlHttp = Class.create();
  78. AjaxPro.IFrameXmlHttp.prototype = {
  79. onreadystatechange: null, headers: [], method: "POST", url: null, async: true, iframe: null,
  80. status: 0, readyState: 0, responseText: null,
  81. abort: function() {
  82. },
  83. readystatechanged: function() {
  84. var doc = this.iframe.contentDocument || this.iframe.document;
  85. if(doc.readyState == "complete")
  86. {
  87. this.status = 200;
  88. this.readyState = 4;
  89. this.responseText = doc.body.res;
  90. this.onreadystatechange();
  91. return;
  92. }
  93. setTimeout(this.readystatechanged.bind(this), 100);
  94. },
  95. open: function(method, url, async) {
  96. if(async == false) {
  97. alert("Synchronous call using IFrameXMLHttp is not supported.");
  98. return;
  99. }
  100. if(this.iframe == null) {
  101. var iframeID = "hans";
  102. if (document.createElement && document.documentElement &&
  103. (window.opera || navigator.userAgent.indexOf('MSIE 5.0') == -1))
  104. {
  105. var ifr = document.createElement('iframe');
  106. ifr.setAttribute('id', iframeID);
  107. ifr.style.visibility = 'hidden';
  108. ifr.style.position = 'absolute';
  109. ifr.style.width = ifr.style.height = ifr.borderWidth = '0px';
  110. this.iframe = document.getElementsByTagName('body')[0].appendChild(ifr);
  111. }
  112. else if (document.body && document.body.insertAdjacentHTML)
  113. {
  114. document.body.insertAdjacentHTML('beforeEnd', '<iframe name="' + iframeID + '" id="' + iframeID + '" style="border:1px solid black;xdisplay:none"></iframe>');
  115. }
  116. if (window.frames && window.frames[iframeID]) this.iframe = window.frames[iframeID];
  117. this.iframe.name = iframeID;
  118. this.iframe.document.open();
  119. this.iframe.document.write("<html><body></body></html>");
  120. this.iframe.document.close();
  121. }
  122. this.method = method;
  123. this.url = url;
  124. this.async = async;
  125. },
  126. setRequestHeader: function(name, value) {
  127. for(var i=0; i<this.headers.length; i++) {
  128. if(this.headers[i].name == name) {
  129. this.headers[i].value = value;
  130. return;
  131. }
  132. }
  133. this.headers.push({"name":name,"value":value});
  134. },
  135. addInput: function(doc, form, name, value) {
  136. var ele;
  137. var tag = "input";
  138. if(value.indexOf("n") >= 0) tag = "textarea";
  139. if(doc.all) {
  140. ele = doc.createElement("<" + tag + " name="" + name + "" />");
  141. }else{
  142. ele = doc.createElement(tag);
  143. ele.setAttribute("name", name);
  144. }
  145. ele.setAttribute("value", value);
  146. form.appendChild(ele);
  147. ele = null;
  148. },
  149. send: function(data) {
  150. if(this.iframe == null) {
  151. // alert("Connection must be opened before sending data.");
  152. return;
  153. }
  154. var doc = this.iframe.contentDocument || this.iframe.document;
  155. var form = doc.createElement("form");
  156. doc.body.appendChild(form);
  157. form.setAttribute("action", this.url);
  158. form.setAttribute("method", this.method);
  159. for(var i=0; i<this.headers.length; i++) {
  160. switch(this.headers[i].name.toLowerCase()) {
  161. case "content-length":
  162. case "accept-encoding":
  163. break;
  164. case "content-type":
  165. form.setAttribute("enctype", this.headers[i].value);
  166. break;
  167. default:
  168. this.addInput(doc, form, this.headers[i].name, this.headers[i].value);
  169. }
  170. }
  171. this.addInput(doc, form, "data", data);
  172. form.submit();
  173. setTimeout(this.readystatechanged.bind(this), 1);
  174. }
  175. };
  176. // IE compatibility methods
  177. if(!window.XMLHttpRequest) {
  178. window.XMLHttpRequest = function() {
  179. var xmlHttp = null;
  180. var clsids = ["Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
  181. for(var i=0; i<clsids.length && xmlHttp == null; i++) {
  182. try {
  183. xmlHttp = new ActiveXObject(clsids[i]);
  184. } catch(e){}
  185. }
  186. if(xmlHttp == null && MS.Browser.isIE) {
  187. return new AjaxPro.IFrameXmlHttp();
  188. }
  189. return xmlHttp;
  190. }
  191. }
  192. // Ajax.NET Professional Request and Queue
  193. AjaxPro.Request = Class.create();
  194. AjaxPro.Request.prototype = {
  195. url: null,
  196. callback: null,
  197. onLoading: null,
  198. onError: null,
  199. onTimeout: null,
  200. onStateChanged: null,
  201. args: null,
  202. context: null,
  203. isRunning: false,
  204. doStateChange: function() {
  205. if(this.onStateChanged != null && typeof this.onStateChanged == "function")
  206. try{ this.onStateChanged(this.xmlHttp.readyState, this); }catch(e){}
  207. if(this.xmlHttp.readyState != 4)
  208. return;
  209. if(this.xmlHttp.status == 200) {
  210. this.duration = new Date().getTime() - this.__start;
  211. if(this.timeoutTimer != null) clearTimeout(this.timeoutTimer);
  212. if(typeof this.onLoading == "function") this.onLoading(false);
  213. var res = this.createResponse();
  214. this.xmlHttp.onreadystatechange = AjaxPro.noOperation;
  215. this.xmlHttp.abort();
  216. this.isRunning = false;
  217. if(res.error != null && typeof this.onError == "function")
  218. try{ this.onError(res.error, this); }catch(e){}
  219. if(typeof this.callback == "function")
  220. this.callback(res, this);
  221. } else {
  222. var res = this.createResponse(true);
  223. this.xmlHttp.onreadystatechange = AjaxPro.noOperation;
  224. this.isRunning = false;
  225. res.error = {Message:this.xmlHttp.statusText,Type:"ConnectFailure",Status:this.xmlHttp.status};
  226. this.xmlHttp.abort();
  227. if(res.error != null && typeof this.onError == "function")
  228. try{ this.onError(res.error, this); }catch(e){}
  229. if(typeof this.callback == "function")
  230. this.callback(res, this);
  231. }
  232. },
  233. initialize: function(url) {
  234. if(url != null) this.url = url;
  235. this.xmlHttp = new XMLHttpRequest();
  236. },
  237. createResponse: function(noContent) {
  238. var r = new Object();
  239. r.error = null;
  240. r.value = null;
  241. r.request = {method:this.method,args:this.args};
  242. r.context = this.context;
  243. if(MS.Debug.enabled == true)
  244. MS.Debug.trace("... " + this.method + " finished.");
  245. if(!noContent) {
  246. var responseText = new String(this.xmlHttp.responseText);
  247. if(AjaxPro.cryptProvider != null && typeof AjaxPro.cryptProvider == "function")
  248. responseText = AjaxPro.cryptProvider.decrypt(responseText);
  249. if(this.xmlHttp.getResponseHeader("Content-Type") == "text/xml")
  250. r.value = this.xmlHttp.responseXML;
  251. else
  252. if(responseText != null && responseText.trim().length > 0)
  253. eval("r.value = " + responseText + ";");
  254. responseText = null;
  255. }
  256. return r;
  257. },
  258. timeout: function() {
  259. this.duration = new Date().getTime() - this.__start;
  260. this.xmlHttp.abort();
  261. this.isRunning = false;
  262. try{ this.onTimeout(this.duration, this); }catch(e){}
  263. },
  264. invoke: function(method, args, callback, context) {
  265. this.__start = new Date().getTime();
  266. this.isRunning = true;
  267. this.method = method;
  268. this.args = args;
  269. this.callback = callback;
  270. this.context = context;
  271. if(MS.Debug.enabled == true)
  272. MS.Debug.trace("Invoking " + method + "...");
  273. var async = typeof callback == "function" && callback != AjaxPro.noOperation;
  274. var json = AjaxPro.toJSON(args) + " ";
  275. if(AjaxPro.cryptProvider != null)
  276. json = AjaxPro.cryptProvider.encrypt(json);
  277. if(async) {
  278. this.xmlHttp.onreadystatechange = this.doStateChange.bind(this);
  279. if(typeof this.onLoading == "function") this.onLoading(true);
  280. }
  281. this.xmlHttp.open("POST", this.url, async);
  282. this.xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  283. this.xmlHttp.setRequestHeader("Content-Length", json.length);
  284. this.xmlHttp.setRequestHeader("Ajax-method", method);
  285. if(AjaxPro.token != null && AjaxPro.token.length > 0)
  286. this.xmlHttp.setRequestHeader("Ajax-token", AjaxPro.token);
  287. if(MS.Browser.isIE)
  288. this.xmlHttp.setRequestHeader("Accept-Encoding", "gzip, deflate");
  289. else
  290. this.xmlHttp.setRequestHeader("Connection", "close"); // Mozilla Bug #246651
  291. if(this.onTimeout != null && typeof this.onTimeout == "function")
  292. this.timeoutTimer = setTimeout(this.timeout.bind(this), AjaxPro.timeoutPeriod);
  293. this.xmlHttp.send(json);
  294. json = null;
  295. args = null;
  296. delete json;
  297. delete args;
  298. if(!async) {
  299. return this.createResponse();
  300. }
  301. return true;
  302. }
  303. };
  304. AjaxPro.RequestQueue = Class.create();
  305. AjaxPro.RequestQueue.prototype = {
  306. process: function() {
  307. this.timer = null;
  308. if(this.queue.length == 0) return;
  309. for(var i=0; i<this.requests.length && this.queue.length > 0; i++) {
  310. if(this.requests[i].isRunning == false) {
  311. var r = this.queue.shift();
  312. this.requests[i].url = r[0];
  313. this.requests[i].onLoading = r[3].length >2 && r[3][2] != null && typeof r[3][2] == "function" ? r[3][2] : AjaxPro.onLoading;
  314. this.requests[i].onError = r[3].length >3 && r[3][3] != null && typeof r[3][3] == "function" ? r[3][3] : AjaxPro.onError;
  315. this.requests[i].onTimeout = r[3].length >4 && r[3][4] != null && typeof r[3][4] == "function" ? r[3][4] : AjaxPro.onTimeout;
  316. this.requests[i].onStateChanged = r[3].length >5 && r[3][5] != null && typeof r[3][5] == "function" ? r[3][5] : AjaxPro.onStateChanged;
  317. if(MS.Debug.enabled == true)
  318. MS.Debug.trace("Using http connection " + i + " for method " + r[1] + " (" + this.queue.length + " waiting).");
  319. this.requests[i].invoke(r[1], r[2], this.requests[i].callbackHandle, r);
  320. r = null;
  321. }
  322. }
  323. if(this.queue.length > 0 && this.timer == null) {
  324. this.timer = setTimeout(this.process.bind(this), 100);
  325. }
  326. },
  327. initialize: function() {
  328. this.queue = [];
  329. this.requests = [];
  330. this.timer = null;
  331. for(var i=0; i<2; i++) { // max 2 http connections
  332. this.requests[i] = new AjaxPro.Request();
  333. this.requests[i].callback = function(res) {
  334. var r = res.context;
  335. res.context = r[3][1];
  336. try {
  337. r[3][0](res, this);
  338. }catch(e){alert(e.description);}
  339. };
  340. this.requests[i].callbackHandle = this.requests[i].callback.bind(this.requests[i]);
  341. }
  342. },
  343. add: function(url, method, args, e) {
  344. this.queue.push([url, method, args, e]);
  345. if(MS.Debug.enabled == true)
  346. MS.Debug.trace(method + " added to queue");
  347. if(this.timer == null) {
  348. this.timer = setTimeout(this.process.bind(this), 1);
  349. }
  350. }
  351. };
  352. AjaxPro.queue = new AjaxPro.RequestQueue();
  353. AjaxPro.AjaxClass = Class.create();
  354. AjaxPro.AjaxClass.prototype = {
  355. initialize: function(url) {
  356. this.url = url;
  357. },
  358. invoke: function(method, args, e) {
  359. if(e != null) {
  360. if(e.length != 6) for(;e.length<6;) e.push(null);
  361. if(e[2] == null) e[2] = this.onLoading;
  362. if(e[2] == null) e[3] = this.onError;
  363. if(e[2] == null) e[4] = this.onTimeout;
  364. if(e[2] == null) e[5] = this.onStateChanged;
  365. if(e[0] != null && typeof e[0] == "function") {
  366. return AjaxPro.queue.add(this.url, method, args, e);
  367. }
  368. }
  369. var r = new AjaxPro.Request();
  370. r.url = this.url;
  371. r.onLoading = this.onLoading != null && typeof this.onLoading == "function" ? this.onLoading : AjaxPro.onLoading;
  372. r.onError = this.onError != null && typeof this.onError == "function" ? this.onError : AjaxPro.onError;
  373. r.onTimeout = this.onTimeout != null && typeof this.onTimeout == "function" ? this.onTimeout : AjaxPro.onTimeout;
  374. r.onStateChanged = this.onStateChanged != null && typeof this.onStateChanged == "function" ? this.onStateChanged : AjaxPro.onStateChanged;
  375. return r.invoke(method, args);
  376. }
  377. };