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