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