/**
 * Obiekt uruchamia sktypty wprowadzone metodami
 * addScript w postaci tekstu oraz addSource w postaci linku do scryptu.
 * Po otrzymaniu sygnału, że wszystkie skrypty zostały wskazane obiekt
 * czeka na odczyt wszystkich linków i następnie wykonuje wszystkie skrypty
 * w kolejnoiści wskazania
 *
 * @version 1.01
 */
function LoadAndRun() {

//    var instance = this;
    this.scripts = new Array();
    this.toAddCount = 0;
    this.addedCount = 0;
    this.ready = false;
    this.allRun = false;

}

/**
 * Dodaje script do listy  wykoania
 */
LoadAndRun.prototype.addScript = LoadAndRun_addScript;

/**
 * Dodaje link ze sktyptem do ściągnięcia i wykonania
 */
LoadAndRun.prototype.addSource = LoadAndRun_addSource;


/**
 * Zwraca załadowany skrypt
 */
LoadAndRun.prototype.getScriptsArray = LoadAndRun_getScriptsArray;

LoadAndRun.prototype.run = LoadAndRun_run;

/**
 * Funkcja, którą nalezy nadpisać i służy do wykonania
 * czegoś z załadowanymi sktyptami. Powina zwrócić wartość true
 * jeśli wszystko jest wykonane, lub fale w przeciwnym wypadku
 */
LoadAndRun.prototype.loader = LoadAndRun_loader;

LoadAndRun.prototype.itsAll = LoadAndRun_itsAll;

/**
 * Dodaje script do listy  wykoania
 */
function LoadAndRun_addScript(script, target) {
    this.toAddCount++;
    if (!target) this.scripts[this.scripts.length] = script;
    this.scripts[target] = script;
    this.addedCount++;
}


/**
 * Dodaje link ze sktyptem do ściągnięcia i wykonania
 */
function LoadAndRun_addSource(source, target) {

    var instance = this;
    var loader = new DestSender();

    loader.listener = function(responseScript, xml, sender) {

        instance.scripts[sender.restore('numer')] = responseScript;
        instance.addedCount++;

        /* sprawdzenie, czy wszystkie dodane i wszystkie załadowane,
         * jeśli tak to wykonanie
         */
        if (instance.ready && (instance.toAddCount == instance.addedCount))
            instance.run();

        return false;
    }

    /* rezerwacja miejsca w celu zachowania kolejności */
    this.toAddCount++;
    var index = target;
    if (!index) index = this.scripts.length;
    loader.save('numer', index);
    this.scripts[index] = '';

    loader.send(source);
}


/**
 * Zwraca załadowany skrypt
 */
function LoadAndRun_getScriptsArray() {
    if (this.ready) return this.scripts;
    else {
        alert('Nie wszystkie sktypty załadowane');
        return null;
    }
}


function LoadAndRun_run() {
    this.allRun = this.loader();
    if (this.postAction) this.postAction();
}

/**
 * Funkcja, którą nalezy nadpisać i służy do wykonania
 * czegoś z załadowanymi sktyptami. Powina zwrócić wartość true
 * jeśli wszystko jest wykonane, lub fale w przeciwnym wypadku
 */
function LoadAndRun_loader() {
    return false;
}


function LoadAndRun_itsAll(postAction) {
    this.ready = true;
    if (postAction) this.postAction = postAction;

    /* sprawdzenie, czy wszystkie załadowane,
     * jeśli tak to wykonanie
     */
    if (this.toAddCount == this.addedCount) this.run();
}
