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