Subversion Repositories wimsdev

Rev

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