dojo.require("dojo.undo.browser");
dojo.require("dojo.io.*");
dojo.require("dojo.lang.common");

//
// Dojo-Config in der HTML-Datei:
//
//   djConfig = { preventBackButtonFix: false };
//


//
// Ajax-Request ausführen
//
function getGlueckskeks() {
    dojo.io.bind({
            url: "/code/WS/getFortuneCookieWS/",
                load: receiveMessage,
                mimetype: "text/plain",
                transport: "XMLHTTPTransport",
                method: "POST"
                });
}

//
// Callback für den Ajax-Request
//
function receiveMessage(type, data, evt) {
    if(type == "load"){
        dojo.undo.browser.addToHistory(cookieChangeHandler);
	pushData(cookieHistory, showFortuneMessage, data);
    } else {
        alert("Glückskeksnachricht konnte nicht geladen werden");
    }
}


//
// Anzeigen der Daten und der Position in der History
//
function showFortuneMessage(text, position) {
    var htmlElement = document.getElementById("fortuneMessage");
    htmlElement.innerHTML = text;

    var historyElem = document.getElementById("historyPosition");
    historyElem.innerHTML = position.cursor + " von " + position.max;
}


//
// Konstruktor für generisches History-Objekt
// 
function History() {
    this.current  = -1;  // noch nicht initialisiert
    this.states   = new Array();
    this.back     = function() { this.current-- };
    this.forward  = function() { this.current++ };
    this.getCurrentState = function() { return this.states[this.current] };
    // this.isFirst    = function() { return (this.current == 0); };
    // this.isLast     = function() { return (this.current == this.states.length); };
    this.hasPast    = function() { return (this.current > 0); };
    this.hasFuture  = function() { return (this.current < this.states.length-1); };
    this.push       = function(object) { this.current++; this.states[this.current] = object; this.states.length = this.current+1 };
    this.getPosition = function() { return { cursor: this.current, max: this.states.length-1}; };
}

//
//  Konstruktor für StateChangeHandler
//
function StateChangeHandler(historyObject, displayFunction) {
    this.back = function() {
	if (historyObject.hasPast()) {
	    historyObject.back();
	    displayFunction(historyObject.getCurrentState(), historyObject.getPosition());
	} else {
	    alert("Ende der Vergangenheit");
	}
    };
    this.forward = function() {
	if (historyObject.hasFuture()) {
	    historyObject.forward();
	    displayFunction(historyObject.getCurrentState(), historyObject.getPosition());
	} else {
	    alert("Ende der Zukunft :-|");
	}
    };
    this.changeUrl = true;
}

//
// Anzeigen und Ablegen neuer Daten in der History
//
function pushData(historyObject, displayFunction, data) {
    historyObject.push(data);
    displayFunction(historyObject.getCurrentState(), historyObject.getPosition());
}

//
// Globales History-Objekt erzeugen
// 
var cookieHistory = new History();

//
// Handler für Zustandswechel (onBack/onForward) erzeugen
//
var cookieChangeHandler = new StateChangeHandler(cookieHistory, showFortuneMessage);

//
// Handler für initialen Zustand erzeugen
// und bei Dojo registrieren
//
function init() {
    dojo.undo.browser.setInitialState(cookieChangeHandler);
    pushData(cookieHistory, showFortuneMessage, "");
}

