Rev 20 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
10534 | obado | 1 | /* |
2 | DynAPI Distribution |
||
20 | reyssat | 3 | |
10534 | obado | 4 | Dynamic Loading extension to dynapi.library |
20 | reyssat | 5 | |
10534 | obado | 6 | The DynAPI Distribution is distributed under the terms of the GNU LGPL license. |
20 | reyssat | 7 | |
10534 | obado | 8 | */ |
20 | reyssat | 9 | |
10534 | obado | 10 | dynapi.debug.print('library.js start'); |
20 | reyssat | 11 | |
10534 | obado | 12 | // begin loading the object |
20 | reyssat | 13 | |
10534 | obado | 14 | DynAPILibrary.prototype.load = function(n,fn) { |
20 | reyssat | 15 | |
10534 | obado | 16 | var list = this._queue(n,null,arguments[2]); |
20 | reyssat | 17 | |
10534 | obado | 18 | //return dynapi.debug.print('going to load: '+list); |
20 | reyssat | 19 | |
10534 | obado | 20 | if (list.length) { |
20 | reyssat | 21 | |
10534 | obado | 22 | var s,src; |
20 | reyssat | 23 | |
10534 | obado | 24 | for (var i=0;i<list.length;i++) { |
20 | reyssat | 25 | |
10534 | obado | 26 | src = list[i]; |
20 | reyssat | 27 | |
10534 | obado | 28 | s = this.scripts[list[i]]; |
20 | reyssat | 29 | |
10534 | obado | 30 | if (i==list.length-1 && fn!=null) s.fn = fn; |
20 | reyssat | 31 | |
10534 | obado | 32 | this.loadList[this.loadList.length] = src; |
20 | reyssat | 33 | |
10534 | obado | 34 | } |
20 | reyssat | 35 | |
10534 | obado | 36 | this._load(); |
37 | } |
||
20 | reyssat | 38 | |
10534 | obado | 39 | else if (fn) fn(); |
20 | reyssat | 40 | |
10534 | obado | 41 | }; |
20 | reyssat | 42 | |
43 | |||
44 | |||
10534 | obado | 45 | // reload the object |
20 | reyssat | 46 | |
10534 | obado | 47 | DynAPILibrary.prototype.reload = function(n,fn,force) { |
20 | reyssat | 48 | |
10534 | obado | 49 | var s = this.objects[n]; |
20 | reyssat | 50 | |
10534 | obado | 51 | if (s) { |
52 | s.loaded = false; |
||
53 | this.load(n,fn,force); |
||
54 | } |
||
55 | }; |
||
20 | reyssat | 56 | |
57 | |||
58 | |||
10534 | obado | 59 | // load a script that is not added to the library |
20 | reyssat | 60 | |
10534 | obado | 61 | DynAPILibrary.prototype.loadScript = function(src,fn) { |
20 | reyssat | 62 | |
10534 | obado | 63 | if (!this.scripts[src]) { |
20 | reyssat | 64 | |
10534 | obado | 65 | var n = 'unnamed'+this._c++; |
20 | reyssat | 66 | |
10534 | obado | 67 | s = this.add(n,src); // generate a name for the script |
68 | s.unnamed = true; |
||
69 | s.fn = null; |
||
70 | s.dep = []; |
||
20 | reyssat | 71 | |
10534 | obado | 72 | this.load(n,fn); |
20 | reyssat | 73 | |
10534 | obado | 74 | } |
20 | reyssat | 75 | |
10534 | obado | 76 | }; |
20 | reyssat | 77 | |
78 | |||
10534 | obado | 79 | // reload a script |
20 | reyssat | 80 | |
10534 | obado | 81 | DynAPILibrary.prototype.reloadScript = function(src,fn,force) { |
20 | reyssat | 82 | |
10534 | obado | 83 | var s=this.scripts[src]; |
20 | reyssat | 84 | |
10534 | obado | 85 | if(s) this.load(s.objects[0],fn,force); |
20 | reyssat | 86 | |
10534 | obado | 87 | } |
20 | reyssat | 88 | |
89 | |||
10534 | obado | 90 | // inserts the script element into the page |
20 | reyssat | 91 | |
10534 | obado | 92 | DynAPILibrary.prototype._load = function() { |
20 | reyssat | 93 | |
10534 | obado | 94 | if (this.busy) return; // dynapi.debug.print('Library Warning: busy'); |
20 | reyssat | 95 | |
10534 | obado | 96 | else { |
20 | reyssat | 97 | |
10534 | obado | 98 | if (this.loadIndex<this.loadList.length-1) { |
20 | reyssat | 99 | |
10534 | obado | 100 | this.busy = true; |
20 | reyssat | 101 | |
10534 | obado | 102 | this.loadIndex++; |
20 | reyssat | 103 | |
10534 | obado | 104 | var src = this.loadList[this.loadIndex]; |
20 | reyssat | 105 | |
10534 | obado | 106 | //if (!confirm('load: '+src+' ?')) return; |
20 | reyssat | 107 | |
10534 | obado | 108 | var rsrc = src + '?'+Math.random(); // random ensures cached files are not loaded |
20 | reyssat | 109 | |
10534 | obado | 110 | var s = this.scripts[src]; |
20 | reyssat | 111 | |
10534 | obado | 112 | if (dynapi.ua.ns4) { |
20 | reyssat | 113 | |
10534 | obado | 114 | // delete the constructors |
20 | reyssat | 115 | |
10534 | obado | 116 | for (var j=0;j<s.objects.length;j++) { |
20 | reyssat | 117 | |
10534 | obado | 118 | var n = s.objects[j]; |
20 | reyssat | 119 | |
10534 | obado | 120 | if (dynapi.frame[n]) { |
20 | reyssat | 121 | |
10534 | obado | 122 | dynapi.frame[n] = null; |
20 | reyssat | 123 | |
10534 | obado | 124 | if (s.pkg) dynapi.frame[s.pkg+'.'+n] = null; |
20 | reyssat | 125 | |
10534 | obado | 126 | } |
20 | reyssat | 127 | |
10534 | obado | 128 | } |
20 | reyssat | 129 | |
10534 | obado | 130 | //NS4 does not like "/" inside the ?name=value |
20 | reyssat | 131 | |
10534 | obado | 132 | src=src.replace(/\//g,'+'); //substitute "/" for "+" |
20 | reyssat | 133 | |
10534 | obado | 134 | this.elm.src = dynapi._path+'ext/library.html?js='+src; |
20 | reyssat | 135 | |
10534 | obado | 136 | } |
20 | reyssat | 137 | |
10534 | obado | 138 | else if (dynapi.ua.ie && (dynapi.ua.v==4 || dynapi.ua.mac)) { |
139 | dynapi.frame.document.body.insertAdjacentHTML('beforeEnd','<script type="text/javascript" language="javascript" src="'+rsrc+'" defer><\/script>'); |
||
140 | this._export(src); |
||
141 | } |
||
20 | reyssat | 142 | |
10534 | obado | 143 | else { |
20 | reyssat | 144 | |
10534 | obado | 145 | var elm = s.elm = dynapi.frame.document.createElement('script'); |
20 | reyssat | 146 | |
10534 | obado | 147 | elm.src = rsrc; |
148 | elm.type = 'text/javascript'; |
||
149 | elm.defer = true; |
||
20 | reyssat | 150 | |
10534 | obado | 151 | if (dynapi.ua.ie) { |
20 | reyssat | 152 | |
10534 | obado | 153 | elm.C = 0; |
20 | reyssat | 154 | |
10534 | obado | 155 | var o = this; |
20 | reyssat | 156 | |
10534 | obado | 157 | elm.onreadystatechange = function() { |
20 | reyssat | 158 | |
10534 | obado | 159 | elm.C++; |
20 | reyssat | 160 | |
10534 | obado | 161 | if (elm.C==2 || elm.readyState=="complete") { // use 2nd statechange for onload |
20 | reyssat | 162 | |
10534 | obado | 163 | o._export(src); |
20 | reyssat | 164 | |
10534 | obado | 165 | } |
166 | } |
||
167 | } |
||
20 | reyssat | 168 | |
10534 | obado | 169 | dynapi.frame.document.getElementsByTagName('head')[0].appendChild(elm); |
20 | reyssat | 170 | |
10534 | obado | 171 | // I could not find way to know when the script is complete in Moz v0.9.3 |
20 | reyssat | 172 | |
10534 | obado | 173 | if (dynapi.ua.ns6) setTimeout(this+'._export("'+src+'")',100); |
20 | reyssat | 174 | |
10534 | obado | 175 | } |
176 | } |
||
177 | } |
||
178 | }; |
||
20 | reyssat | 179 | |
180 | |||
10534 | obado | 181 | // executed after a script is finished loading, run main() functions |
20 | reyssat | 182 | |
10534 | obado | 183 | DynAPILibrary.prototype._export = function(src) { |
20 | reyssat | 184 | |
10534 | obado | 185 | var src = this.loadList[this.loadIndex]; |
186 | var s = this.scripts[src]; |
||
20 | reyssat | 187 | |
10534 | obado | 188 | if (s) { |
20 | reyssat | 189 | |
10534 | obado | 190 | this._register(s); |
20 | reyssat | 191 | |
10534 | obado | 192 | // run elm.main)() before global main() |
20 | reyssat | 193 | |
10534 | obado | 194 | if (dynapi.ua.ns4 && typeof(this.elm.main)=="function") { |
20 | reyssat | 195 | |
10534 | obado | 196 | this.elm.main(); |
20 | reyssat | 197 | |
10534 | obado | 198 | this.elm.main = null; |
20 | reyssat | 199 | |
10534 | obado | 200 | } |
20 | reyssat | 201 | |
10534 | obado | 202 | // run global main() if available |
20 | reyssat | 203 | |
10534 | obado | 204 | if (typeof(main)=="function") { |
20 | reyssat | 205 | |
10534 | obado | 206 | main(); |
20 | reyssat | 207 | |
10534 | obado | 208 | main = null; |
20 | reyssat | 209 | |
10534 | obado | 210 | } |
20 | reyssat | 211 | |
10534 | obado | 212 | // clear out all functions in the layer's scope |
20 | reyssat | 213 | |
10534 | obado | 214 | if (dynapi.ua.ns4) { |
20 | reyssat | 215 | |
10534 | obado | 216 | for (var i in this.elm) { |
20 | reyssat | 217 | |
10534 | obado | 218 | if (typeof(this.elm[i])=="function") delete this.elm[i]; |
20 | reyssat | 219 | |
10534 | obado | 220 | } |
20 | reyssat | 221 | |
10534 | obado | 222 | } |
223 | this.busy = false; |
||
20 | reyssat | 224 | |
10534 | obado | 225 | // load next file |
20 | reyssat | 226 | |
10534 | obado | 227 | this._load(); |
20 | reyssat | 228 | |
10534 | obado | 229 | } |
20 | reyssat | 230 | |
10534 | obado | 231 | //else return alert('Library Error: unknown script '+src); |
232 | }; |
||
20 | reyssat | 233 | |
234 | |||
235 | |||
10534 | obado | 236 | // registers the script as loaded, exports the objects |
20 | reyssat | 237 | |
10534 | obado | 238 | DynAPILibrary.prototype._register = function(s) { |
20 | reyssat | 239 | |
10534 | obado | 240 | dynapi.debug.print('loaded "'+s.src+'"'); |
20 | reyssat | 241 | |
10534 | obado | 242 | s.loaded = true; |
20 | reyssat | 243 | |
10534 | obado | 244 | s.queued = false; |
20 | reyssat | 245 | |
10534 | obado | 246 | if (!s.unnamed) { |
20 | reyssat | 247 | |
10534 | obado | 248 | var n,found; |
20 | reyssat | 249 | |
10534 | obado | 250 | // loop through each object that the script contains |
20 | reyssat | 251 | |
10534 | obado | 252 | for (var i=0;i<s.objects.length;i++) { |
20 | reyssat | 253 | |
10534 | obado | 254 | found = false; |
20 | reyssat | 255 | |
10534 | obado | 256 | n = s.objects[i]; |
20 | reyssat | 257 | |
10534 | obado | 258 | // scope local objects in the layer to the DynAPI frame |
20 | reyssat | 259 | |
10534 | obado | 260 | if (dynapi.ua.ns4 && this.elm && typeof(this.elm[n])!="undefined") { |
20 | reyssat | 261 | |
10534 | obado | 262 | dynapi.frame[n] = this.elm[n]; |
20 | reyssat | 263 | |
10534 | obado | 264 | found = true; |
20 | reyssat | 265 | |
10534 | obado | 266 | } |
20 | reyssat | 267 | |
10534 | obado | 268 | else if (typeof(dynapi.frame[n])!="undefined") found = true; |
20 | reyssat | 269 | |
10534 | obado | 270 | else if (n.indexOf('.')>0) { |
20 | reyssat | 271 | |
10534 | obado | 272 | var ns = n.split('.'), o = dynapi.frame, b = false; |
20 | reyssat | 273 | |
10534 | obado | 274 | for (var j=0;j<ns.length;j++) { |
20 | reyssat | 275 | |
10534 | obado | 276 | o = o[ns[j]]; |
20 | reyssat | 277 | |
10534 | obado | 278 | } |
20 | reyssat | 279 | |
10534 | obado | 280 | if (typeof(o)!="undefined") found = true; |
20 | reyssat | 281 | |
10534 | obado | 282 | } |
20 | reyssat | 283 | |
10534 | obado | 284 | else if (typeof(dynapi[n])!="undefined") found = true; |
20 | reyssat | 285 | |
10534 | obado | 286 | if (found) { |
20 | reyssat | 287 | |
10534 | obado | 288 | if (s.pkg) { |
20 | reyssat | 289 | |
10534 | obado | 290 | // make package link: dynapi.api.DynLayer = DynLayer |
20 | reyssat | 291 | |
10534 | obado | 292 | if (s.pkg!="dynapi") this.packages[s.pkg][n] = dynapi.frame[n]; |
20 | reyssat | 293 | |
10534 | obado | 294 | n = s.pkg+'.'+n; |
20 | reyssat | 295 | |
10534 | obado | 296 | } |
20 | reyssat | 297 | |
10534 | obado | 298 | dynapi.debug.print('loaded ['+n+']'); |
20 | reyssat | 299 | |
10534 | obado | 300 | } |
20 | reyssat | 301 | |
10534 | obado | 302 | else { |
20 | reyssat | 303 | |
10534 | obado | 304 | dynapi.debug.print('Library Error: could not find ['+n+']'); |
20 | reyssat | 305 | |
10534 | obado | 306 | } |
20 | reyssat | 307 | |
10534 | obado | 308 | } |
20 | reyssat | 309 | |
10534 | obado | 310 | } |
20 | reyssat | 311 | |
10534 | obado | 312 | // run handler if available |
20 | reyssat | 313 | |
10534 | obado | 314 | if (s.fn) { |
20 | reyssat | 315 | |
10534 | obado | 316 | s.fn(); |
317 | delete s.fn; |
||
20 | reyssat | 318 | |
10534 | obado | 319 | } |
20 | reyssat | 320 | |
10534 | obado | 321 | }; |
20 | reyssat | 322 | |
323 | |||
324 | |||
10534 | obado | 325 | // called from /lib/dynapi/library.html to write the <script>, NS4 only |
20 | reyssat | 326 | |
10534 | obado | 327 | DynAPILibrary.prototype._handleLoad = function(elm) { |
20 | reyssat | 328 | |
10534 | obado | 329 | var args = dynapi.functions.getURLArguments(elm.src); |
20 | reyssat | 330 | |
10534 | obado | 331 | var js = args["js"]; |
20 | reyssat | 332 | |
10534 | obado | 333 | if (js) { |
20 | reyssat | 334 | |
10534 | obado | 335 | js=js.replace(/\+/g,'/'); // convert + to / |
20 | reyssat | 336 | |
10534 | obado | 337 | if (js.indexOf('http')!=0) { |
20 | reyssat | 338 | |
10534 | obado | 339 | var l = dynapi.frame.document.location; |
20 | reyssat | 340 | |
10534 | obado | 341 | if (js.substr(0,1)=='/') js = l.port+'//'+host+src; |
20 | reyssat | 342 | |
10534 | obado | 343 | else js = dynapi.documentPath+js; |
20 | reyssat | 344 | |
10534 | obado | 345 | } |
20 | reyssat | 346 | |
10534 | obado | 347 | elm.document.write('<script type="text/javascript" language="JavaScript" src="'+js+'?r'+Math.random()+'"><\/script>'); |
20 | reyssat | 348 | |
10534 | obado | 349 | elm.document.close(); |
20 | reyssat | 350 | |
10534 | obado | 351 | elm.onload = function() { |
20 | reyssat | 352 | |
10534 | obado | 353 | dynapi.library._export(js); |
20 | reyssat | 354 | |
10534 | obado | 355 | } |
20 | reyssat | 356 | |
10534 | obado | 357 | } |
20 | reyssat | 358 | |
10534 | obado | 359 | }; |
20 | reyssat | 360 | |
361 | |||
362 | |||
10534 | obado | 363 | // inserts the layer for NS4, register included scripts |
20 | reyssat | 364 | |
10534 | obado | 365 | DynAPILibrary.prototype._create = function() { |
20 | reyssat | 366 | |
10534 | obado | 367 | // ensure a previous main function is wiped out |
20 | reyssat | 368 | |
10534 | obado | 369 | if (typeof(main)=="function") main = null; |
20 | reyssat | 370 | |
371 | |||
10534 | obado | 372 | // register objects from scripts included by dynapi.library.include() or manually |
20 | reyssat | 373 | |
10534 | obado | 374 | var s,n; |
20 | reyssat | 375 | |
10534 | obado | 376 | for (var i in this.scripts) { |
20 | reyssat | 377 | |
10534 | obado | 378 | s = this.scripts[i]; |
20 | reyssat | 379 | |
10534 | obado | 380 | n=s.objects[0]; |
20 | reyssat | 381 | |
10534 | obado | 382 | if(s.pkg=='dynapi.functions') { // used to avoid conflicts with intrinsic objects such as String, Image, Date and Math objects |
20 | reyssat | 383 | |
10534 | obado | 384 | if(dynapi.functions[n]) this._register(s); |
20 | reyssat | 385 | |
10534 | obado | 386 | } |
20 | reyssat | 387 | |
10534 | obado | 388 | else if (s.loaded || (s.objects[0] && dynapi.frame[s.objects[0]])) this._register(s); |
389 | } |
||
20 | reyssat | 390 | |
10534 | obado | 391 | // create NS4 layer to load scripts into |
20 | reyssat | 392 | |
10534 | obado | 393 | if (dynapi.ua.ns4) this.elm = new Layer(0, dynapi.frame); |
20 | reyssat | 394 | |
10534 | obado | 395 | this.busy = false; |
20 | reyssat | 396 | |
10534 | obado | 397 | // load any scripts before proceeding |
20 | reyssat | 398 | |
10534 | obado | 399 | if (this.loadList.length) { |
20 | reyssat | 400 | |
10534 | obado | 401 | var s = this.scripts[this.loadList[this.loadList.length-1]]; |
20 | reyssat | 402 | |
10534 | obado | 403 | s.fn = function() { |
404 | setTimeout('dynapi._onLoad()',1); |
||
405 | } |
||
20 | reyssat | 406 | |
10534 | obado | 407 | this._load(); |
20 | reyssat | 408 | |
10534 | obado | 409 | } |
20 | reyssat | 410 | |
10534 | obado | 411 | else setTimeout('dynapi._onLoad()',1); |
20 | reyssat | 412 | |
10534 | obado | 413 | }; |
20 | reyssat | 414 |