JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.1
[ckeditor.git] / _source / core / ajax.js
1 /*\r
2 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 /**\r
7  * @fileOverview Defines the {@link CKEDITOR.ajax} object, which holds ajax methods for\r
8  *              data loading.\r
9  */\r
10 \r
11 /**\r
12  * Ajax methods for data loading.\r
13  * @namespace\r
14  * @example\r
15  */\r
16 CKEDITOR.ajax = (function()\r
17 {\r
18         var createXMLHttpRequest = function()\r
19         {\r
20                 // In IE, using the native XMLHttpRequest for local files may throw\r
21                 // "Access is Denied" errors.\r
22                 if ( !CKEDITOR.env.ie || location.protocol != 'file:' )\r
23                         try { return new XMLHttpRequest(); } catch(e) {}\r
24 \r
25                 try { return new ActiveXObject( 'Msxml2.XMLHTTP' ); } catch (e) {}\r
26                 try { return new ActiveXObject( 'Microsoft.XMLHTTP' ); } catch (e) {}\r
27 \r
28                 return null;\r
29         };\r
30 \r
31         var checkStatus = function( xhr )\r
32         {\r
33                 // HTTP Status Codes:\r
34                 //       2xx : Success\r
35                 //       304 : Not Modified\r
36                 //         0 : Returned when running locally (file://)\r
37                 //      1223 : IE may change 204 to 1223 (see http://dev.jquery.com/ticket/1450)\r
38 \r
39                 return ( xhr.readyState == 4 &&\r
40                                 (       ( xhr.status >= 200 && xhr.status < 300 ) ||\r
41                                         xhr.status == 304 ||\r
42                                         xhr.status === 0 ||\r
43                                         xhr.status == 1223 ) );\r
44         };\r
45 \r
46         var getResponseText = function( xhr )\r
47         {\r
48                 if ( checkStatus( xhr ) )\r
49                         return xhr.responseText;\r
50                 return null;\r
51         };\r
52 \r
53         var getResponseXml = function( xhr )\r
54         {\r
55                 if ( checkStatus( xhr ) )\r
56                 {\r
57                         var xml = xhr.responseXML;\r
58                         return new CKEDITOR.xml( xml && xml.firstChild ? xml : xhr.responseText );\r
59                 }\r
60                 return null;\r
61         };\r
62 \r
63         var load = function( url, callback, getResponseFn )\r
64         {\r
65                 var async = !!callback;\r
66 \r
67                 var xhr = createXMLHttpRequest();\r
68 \r
69                 if ( !xhr )\r
70                         return null;\r
71 \r
72                 xhr.open( 'GET', url, async );\r
73 \r
74                 if ( async )\r
75                 {\r
76                         // TODO: perform leak checks on this closure.\r
77                         /** @ignore */\r
78                         xhr.onreadystatechange = function()\r
79                         {\r
80                                 if ( xhr.readyState == 4 )\r
81                                 {\r
82                                         callback( getResponseFn( xhr ) );\r
83                                         xhr = null;\r
84                                 }\r
85                         };\r
86                 }\r
87 \r
88                 xhr.send(null);\r
89 \r
90                 return async ? '' : getResponseFn( xhr );\r
91         };\r
92 \r
93         return  /** @lends CKEDITOR.ajax */ {\r
94 \r
95                 /**\r
96                  * Loads data from an URL as plain text.\r
97                  * @param {String} url The URL from which load data.\r
98                  * @param {Function} [callback] A callback function to be called on\r
99                  *              data load. If not provided, the data will be loaded\r
100                  *              asynchronously, passing the data value the function on load.\r
101                  * @returns {String} The loaded data. For asynchronous requests, an\r
102                  *              empty string. For invalid requests, null.\r
103                  * @example\r
104                  * // Load data synchronously.\r
105                  * var data = CKEDITOR.ajax.load( 'somedata.txt' );\r
106                  * alert( data );\r
107                  * @example\r
108                  * // Load data asynchronously.\r
109                  * var data = CKEDITOR.ajax.load( 'somedata.txt', function( data )\r
110                  *     {\r
111                  *         alert( data );\r
112                  *     } );\r
113                  */\r
114                 load : function( url, callback )\r
115                 {\r
116                         return load( url, callback, getResponseText );\r
117                 },\r
118 \r
119                 /**\r
120                  * Loads data from an URL as XML.\r
121                  * @param {String} url The URL from which load data.\r
122                  * @param {Function} [callback] A callback function to be called on\r
123                  *              data load. If not provided, the data will be loaded\r
124                  *              asynchronously, passing the data value the function on load.\r
125                  * @returns {CKEDITOR.xml} An XML object holding the loaded data. For asynchronous requests, an\r
126                  *              empty string. For invalid requests, null.\r
127                  * @example\r
128                  * // Load XML synchronously.\r
129                  * var xml = CKEDITOR.ajax.loadXml( 'somedata.xml' );\r
130                  * alert( xml.getInnerXml( '//' ) );\r
131                  * @example\r
132                  * // Load XML asynchronously.\r
133                  * var data = CKEDITOR.ajax.loadXml( 'somedata.xml', function( xml )\r
134                  *     {\r
135                  *         alert( xml.getInnerXml( '//' ) );\r
136                  *     } );\r
137                  */\r
138                 loadXml : function( url, callback )\r
139                 {\r
140                         return load( url, callback, getResponseXml );\r
141                 }\r
142         };\r
143 })();\r