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