/*
 * ScriptLoader
 * version: 1.0
 * date: 12-10-2007
 */

var ScriptLoader = {
    loaded: [],
    toPreload: [],
    finished: 0,
    required: 0,
    startTime: new Date(),
    onLoad: null,
    preloaderRegistered: false,
    
    indexOf: function(library) {
        for ( var i=0; i<this.loaded.length; i++ )
            if ( this.loaded[i]==library )
                return i;
        return -1;
    },
    
    load: function(library, dir) {
        if ( (typeof library).toLowerCase() == 'string' ) {
            if ( dir && (dir.length>0) )
                library = dir+"/"+library;
            if ( this.indexOf(library) == -1 ) {
                ScriptLoader.loaded.push(library);
                ScriptLoader.required++;
                document.write('<script type="text/javascript" src="'+library+'" onerror="ScriptLoader.onError(\'' + library + '\')" onload="ScriptLoader.notify()"></script>');
            }
        } else {
            for ( var i=0; i<library.length; i++ )
                ScriptLoader.load(library[i], dir);
        }
    },
    
    preload: function(library, dir) {
        if ( (typeof library).toLowerCase() == 'string' ) {
            if ( dir && (dir.length>0) )
                library = dir+"/"+library;
            ScriptLoader.toPreload.push(library)
            if ( ! ScriptLoader.preloaderRegistered ) {
                if ( window.addEventListener )
                    window.addEventListener("load", ScriptLoader.startPreloading, true);
                else if ( window.attachEvent )                
                    window.attachEvent("load", ScriptLoader.startPreloading);
               else
                window.onload = ScriptLoader.startPreloading;
            }
            
        } else {
            for ( var i=0; i<library.length; i++ )
                ScriptLoader.preload(library[i], dir);
        }
    },
    
    notify: function () {
        ScriptLoader.finished++;
        if ( ScriptLoader.finished == ScriptLoader.required ) {
            if ( this.onLoad != null )
                this.onLoad();
        }
    },
    
    onError: function (name) {
        alert('Error in loading library: ' + name + '\nPlease, contact the webmaster and notify him');
    },
    
    startPreloading: function () {
        for ( var i=0; i<ScriptLoader.toPreload.length; i++ ) {
            var library = ScriptLoader.toPreload[i];
            var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0")
            request.open("GET", library, true);
            request.send(null);
        }
    }
}
