Mercurial > hg > extraction-interface
comparison geotemco/lib/simile/ajax/simile-ajax-api.js @ 0:b12c99b7c3f0
commit for previous development
author | Zoe Hong <zhong@mpiwg-berlin.mpg.de> |
---|---|
date | Mon, 19 Jan 2015 17:13:49 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:b12c99b7c3f0 |
---|---|
1 /*================================================== | |
2 * Simile Ajax API | |
3 *================================================== | |
4 */ | |
5 | |
6 if (typeof SimileAjax == "undefined") { | |
7 var isCompiled = ("SimileAjax_isCompiled" in window) && window.SimileAjax_isCompiled; | |
8 | |
9 var SimileAjax = { | |
10 loaded: false, | |
11 loadingScriptsCount: 0, | |
12 error: null, | |
13 params: { bundle:"true" } | |
14 }; | |
15 | |
16 SimileAjax.Platform = new Object(); | |
17 /* | |
18 HACK: We need these 2 things here because we cannot simply append | |
19 a <script> element containing code that accesses SimileAjax.Platform | |
20 to initialize it because IE executes that <script> code first | |
21 before it loads ajax.js and platform.js. | |
22 */ | |
23 | |
24 var getHead = function(doc) { | |
25 return doc.getElementsByTagName("head")[0]; | |
26 }; | |
27 | |
28 SimileAjax.findScript = function(doc, substring) { | |
29 var scripts=doc.documentElement.getElementsByTagName("script"); | |
30 for (s=0; s<scripts.length;s++) { | |
31 var url = scripts[s].src; | |
32 var i = url.indexOf(substring); | |
33 if (i >= 0) { | |
34 return url; | |
35 } | |
36 } | |
37 | |
38 var heads = doc.documentElement.getElementsByTagName("head"); | |
39 for (var h = 0; h < heads.length; h++) { | |
40 var node = heads[h].firstChild; | |
41 while (node != null) { | |
42 if (node.nodeType == 1 && node.tagName.toLowerCase() == "script") { | |
43 var url = node.src; | |
44 var i = url.indexOf(substring); | |
45 if (i >= 0) { | |
46 return url; | |
47 } | |
48 } | |
49 node = node.nextSibling; | |
50 } | |
51 } | |
52 return null; | |
53 }; | |
54 | |
55 SimileAjax.includeJavascriptFile = function(doc, url, onerror, charset, callback) { | |
56 onerror = onerror || ""; | |
57 if (doc.body == null) { | |
58 try { | |
59 var q = "'" + onerror.replace( /'/g, '&apos' ) + "'"; // " | |
60 doc.write("<script src='" + url + "' onerror="+ q + | |
61 (charset ? " charset='"+ charset +"'" : "") + | |
62 " type='text/javascript'>"+ onerror + "</script>"); | |
63 return; | |
64 } catch (e) { | |
65 // fall through | |
66 } | |
67 } | |
68 | |
69 var calledBack = false; | |
70 var callbackOnce = function() { | |
71 if (callback && !calledBack) { | |
72 calledBack=true; | |
73 callback(); | |
74 } | |
75 } | |
76 var script = doc.createElement("script"); | |
77 if (onerror) { | |
78 try { script.innerHTML = onerror; } catch(e) {}; | |
79 script.onerror = function () {onerror(); callbackOnce()}; | |
80 } | |
81 else { | |
82 script.onerror = callbackOnce; | |
83 } | |
84 if (charset) { | |
85 script.setAttribute("charset", charset); | |
86 } | |
87 script.type = "text/javascript"; | |
88 script.language = "JavaScript"; | |
89 script.src = url; | |
90 if (callback) | |
91 script.onload = script.onreadystatechange = function() { | |
92 if (!this.readyState || this.readyState == "loaded" || | |
93 this.readyState == "complete") | |
94 callbackOnce(); | |
95 } | |
96 return getHead(doc).appendChild(script); | |
97 }; | |
98 | |
99 function includeJavascriptList(doc, urlPrefix, filenames, included, index, callback) { | |
100 if (!included[index]) { // avoid duplicate callback | |
101 included[index] = true; | |
102 if (index<filenames.length) { | |
103 var nextCall=function(){ | |
104 includeJavascriptList(doc, urlPrefix, filenames, | |
105 included, index+1, callback); | |
106 } | |
107 SimileAjax. | |
108 includeJavascriptFile(doc, | |
109 urlPrefix + filenames[index], null, null, | |
110 nextCall); | |
111 } | |
112 else if (callback != null) callback(); | |
113 } | |
114 } | |
115 | |
116 SimileAjax.includeJavascriptFiles = function(doc, urlPrefix, filenames) { | |
117 if (doc.body == null) { | |
118 for (var i = 0; i < filenames.length; i++) { | |
119 SimileAjax.includeJavascriptFile(doc, urlPrefix + filenames[i]); | |
120 } | |
121 SimileAjax.loadingScriptsCount += filenames.length; | |
122 SimileAjax.includeJavascriptFile(doc, SimileAjax.urlPrefix + "scripts/signal.js?" + filenames.length); | |
123 } | |
124 else { | |
125 var included = new Array(); | |
126 for (var i = 0; i < filenames.length; i++) | |
127 included[i] = false; | |
128 | |
129 if (typeof window.SimileAjax_onLoad == "string") | |
130 f = eval(window.SimileAjax_onLoad); | |
131 else if (typeof window.SimileAjax_onLoad == "function") | |
132 f = window.SimileAjax_onLoad; | |
133 | |
134 window.SimileAjax_onLoad = null; | |
135 includeJavascriptList(doc, urlPrefix, filenames, included, 0, f); | |
136 } | |
137 }; | |
138 | |
139 SimileAjax.includeCssFile = function(doc, url) { | |
140 if (doc.body == null) { | |
141 try { | |
142 doc.write("<link rel='stylesheet' href='" + url + "' type='text/css'/>"); | |
143 return; | |
144 } catch (e) { | |
145 // fall through | |
146 } | |
147 } | |
148 | |
149 var link = doc.createElement("link"); | |
150 link.setAttribute("rel", "stylesheet"); | |
151 link.setAttribute("type", "text/css"); | |
152 link.setAttribute("href", url); | |
153 getHead(doc).appendChild(link); | |
154 }; | |
155 SimileAjax.includeCssFiles = function(doc, urlPrefix, filenames) { | |
156 for (var i = 0; i < filenames.length; i++) { | |
157 SimileAjax.includeCssFile(doc, urlPrefix + filenames[i]); | |
158 } | |
159 }; | |
160 | |
161 /** | |
162 * Append into urls each string in suffixes after prefixing it with urlPrefix. | |
163 * @param {Array} urls | |
164 * @param {String} urlPrefix | |
165 * @param {Array} suffixes | |
166 */ | |
167 SimileAjax.prefixURLs = function(urls, urlPrefix, suffixes) { | |
168 for (var i = 0; i < suffixes.length; i++) { | |
169 urls.push(urlPrefix + suffixes[i]); | |
170 } | |
171 }; | |
172 | |
173 /** | |
174 * Parse out the query parameters from a URL | |
175 * @param {String} url the url to parse, or location.href if undefined | |
176 * @param {Object} to optional object to extend with the parameters | |
177 * @param {Object} types optional object mapping keys to value types | |
178 * (String, Number, Boolean or Array, String by default) | |
179 * @return a key/value Object whose keys are the query parameter names | |
180 * @type Object | |
181 */ | |
182 SimileAjax.parseURLParameters = function(url, to, types) { | |
183 to = to || {}; | |
184 types = types || {}; | |
185 | |
186 if (typeof url == "undefined") { | |
187 url = location.href; | |
188 } | |
189 var q = url.indexOf("?"); | |
190 if (q < 0) { | |
191 return to; | |
192 } | |
193 url = (url+"#").slice(q+1, url.indexOf("#")); // toss the URL fragment | |
194 | |
195 var params = url.split("&"), param, parsed = {}; | |
196 var decode = window.decodeURIComponent || unescape; | |
197 for (var i = 0; param = params[i]; i++) { | |
198 var eq = param.indexOf("="); | |
199 var name = decode(param.slice(0,eq)); | |
200 var old = parsed[name]; | |
201 var replacement = decode(param.slice(eq+1)); | |
202 | |
203 if (typeof old == "undefined") { | |
204 old = []; | |
205 } else if (!(old instanceof Array)) { | |
206 old = [old]; | |
207 } | |
208 parsed[name] = old.concat(replacement); | |
209 } | |
210 for (var i in parsed) { | |
211 if (!parsed.hasOwnProperty(i)) continue; | |
212 var type = types[i] || String; | |
213 var data = parsed[i]; | |
214 if (!(data instanceof Array)) { | |
215 data = [data]; | |
216 } | |
217 if (type === Boolean && data[0] == "false") { | |
218 to[i] = false; // because Boolean("false") === true | |
219 } else { | |
220 to[i] = type.apply(this, data); | |
221 } | |
222 } | |
223 return to; | |
224 }; | |
225 | |
226 if (!isCompiled) { | |
227 (function() { | |
228 var javascriptFiles = [ | |
229 "platform.js", | |
230 "debug.js", | |
231 "xmlhttp.js", | |
232 "json.js", | |
233 "dom.js", | |
234 "graphics.js", | |
235 "date-time.js", | |
236 "string.js", | |
237 "html.js", | |
238 "data-structure.js", | |
239 "units.js", | |
240 | |
241 "ajax.js", | |
242 "history.js", | |
243 "window-manager.js", | |
244 "remoteLog.js" | |
245 ]; | |
246 var cssFiles = [ | |
247 "graphics.css" | |
248 ]; | |
249 if (!("jQuery" in window) && !("$" in window)) { | |
250 // javascriptFiles.unshift("jquery-1.4.2.min.js"); | |
251 SimileAjax.includeJavascriptFile(document, "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"); | |
252 } | |
253 | |
254 | |
255 if (typeof SimileAjax_urlPrefix == "string") { | |
256 SimileAjax.urlPrefix = SimileAjax_urlPrefix; | |
257 } else { | |
258 var url = SimileAjax.findScript(document, "simile-ajax-api.js"); | |
259 if (url == null) { | |
260 SimileAjax.error = new Error("Failed to derive URL prefix for Simile Ajax API code files"); | |
261 return; | |
262 } | |
263 | |
264 SimileAjax.urlPrefix = url.substr(0, url.indexOf("simile-ajax-api.js")); | |
265 SimileAjax.parseURLParameters(url, SimileAjax.params, { bundle: Boolean }); | |
266 } | |
267 | |
268 | |
269 | |
270 if (!isCompiled) { | |
271 if (SimileAjax.params.bundle) { | |
272 SimileAjax.includeJavascriptFiles(document, SimileAjax.urlPrefix, [ "simile-ajax-bundle.js" ]); | |
273 } else { | |
274 SimileAjax.includeJavascriptFiles(document, SimileAjax.urlPrefix + "scripts/", javascriptFiles); | |
275 } | |
276 SimileAjax.includeCssFiles(document, SimileAjax.urlPrefix + "styles/", cssFiles); | |
277 } | |
278 | |
279 SimileAjax.loaded = true; | |
280 })(); | |
281 } | |
282 } |