
// TODO:
// Dieses Skript gibt Infos zum Login Vorgang und sollte daher
// zumindest verschleiert werden


$(document).ready(function(){

    debug_mode = 'off';
    debug_init();


    // Grafik Preload
    // TODO:
    // Prüfen, ob notwendig und sinnvoll
    //preload();


    // Authentication
    authInit();
});



// -----------------------------------------------------------------------------


url_auth = $("base").attr("href") + "_ajax/en/authentication/";
url_init =  url_auth + "init/";
url_login =  url_auth + "login/";
url_logout =  url_auth + "logout/";
url_salt =  url_auth + "salt/";


// -----------------------------------------------------------------------------


function debug(message)
{
    if(debug_mode == 'on')
    {
        $("#jsdebug").append('<p>'+message+'</p>');
    }
}


// -----------------------------------------------------------------------------


function debug_init()
{
    if(debug_mode == 'on')
    {
        $("#page").append('<div id="jsdebug"></div>');
        $("#jsdebug")
        .css("position", "absolute")
        .css("top", "300px")
        .css("width", "300px")
        .css("padding", "9px")
        .css("background-color", "#ffffff")
        .css("border", "1px solid #555555")
        .css("z-index", "99999");

        $("#jsdebug p")
        .css("line-height", "2em");
    }
}


// -----------------------------------------------------------------------------


function preload()
{
    // Grafik Preload
    var images = new Array( "cms/edit.png",
                            "cms/overlay30.png"
                            );

    for(var i = 0; i<images.length; i++)
    {
        $("<img>").attr("src", images[i]);
    }
}


// -----------------------------------------------------------------------------


function authInit()
{
    debug('authInit');

    // Init Daten vom Server laden
    $.get(url_init, function(data)
    {
        // Daten in #page einfügen
        $("#page").append(data);

        // Buttons definieren
        $("#auth01")
        .click(function()
        {
            // Button anzeigen
            $("#auth02").css("display", "block");

            $("#auth02")
            .click(function()
            {
                // Show Login Formular / Info
                $("#auth03").slideToggle(500);
            });
        });

        // Formular Events definieren
        authSetFormEvents();

        // Login Status bestimmen
        authRequestStatus();

        // Status alle 25 Minuten neu laden (Session aufrecht halten)
        // Der Wert ist abhängig von SESSION_MAX_LIFETIME in der Settings.ini(!)
        var update_interval = 25 * 60 * 1000;
        setInterval( "authRequestStatus()", update_interval );
    });
}


// -----------------------------------------------------------------------------


function authRequestLogout()
{
    debug('authRequestLogout');

    // Ajax Request
    $.ajax(
    {
        cache: false,
        url: url_logout,
        error: function(msg)
        {
            debug('authRequestLogout - error: ' + msg);
        },
        success: function(logout)
        {
            debug('authRequestLogout - data recieved');

            if(logout === 'done')
            {
                authShowForm();
            }
            else
            {
                debug('Unknown error during logout');
            }
        }
    });
}


// -----------------------------------------------------------------------------


function authRequestLogin()
{
    debug('authRequestLogin');

    // Ajax Request Salt and Pepper
    $.ajax(
    {
        cache: false,
        url: url_salt,
        error: function(msg)
        {
            debug('authRequestSalt - error: ' + msg);
        },
        success: function(data)
        {
            debug('authRequestSalt - data recieved');

            var saltandpepper = data.split('|');

            // User und Passwort aus Formular übernehmen
            var user = $("#authform #user").val();
            var key = $("#authform #key").val();

            // Passwort aus Formular löschen
            $("#authform #key").val('');

            var toomanysecrets = MD5( MD5( key + saltandpepper[0]) + user + saltandpepper[1]) + saltandpepper[1];

            // Ajax Request Status
            authRequestStatus(toomanysecrets);
        }
    });
}


// -----------------------------------------------------------------------------


function authRequestStatus(toomanysecrets)
{
    debug('authRequestStatus');

    // Ist ein Wert für toomanysecrets gesetzt wird ein Login versucht,
    // ansonsten wird geprüft, ob für den User eine aktive Session besteht.

    var post_data = new Object;
    if ( toomanysecrets !== undefined )
    {
        post_data.toomanysecrets = toomanysecrets;
    }

    // Ajax Request
    $.ajax(
    {
        cache: false,
        datatype: "html",
        type: "POST",
        url: url_login,
        data: post_data,
        error: function(msg)
        {
            debug('authRequestStatus - error: ' + msg);
        },
        success: function(data)
        {
            debug('authRequestStatus - data recieved');

            // Wenn User verifiziert ist, Status anzeigen
            if(data !== 'user unknown')
            {
                authShowStatus(data);
            }
            // ...sonst Feedback geben (nur bei Loginversuch)
            else if ( toomanysecrets !== undefined )
            {
                $("#authfeedback").slideDown(400);

                // Focus auf Password Input
                document.getElementById("key").focus();
            }
        }
    });
}


// -----------------------------------------------------------------------------


function authSetFormEvents()
{
    debug('authSetFormEvents');

    // Formular Submit festlegen
    $("#authform").submit(function()
    {
        debug('submit');

        // Login
        authRequestLogin();

        // Formular NICHT absenden
        return false;
    });

    // Input - neue Eingabe
    $("#authform .textinput").keydown(function()
    {
        // Feedback ausblenden, neues Submit ermöglichen
        $("#authfeedback").slideUp(400);
    });
}


// -----------------------------------------------------------------------------


function authShowForm()
{
    debug('authShowForm');

    // Container ausblenden
    $("#auth03").slideUp(500, function()
    {
        // Noch vorhandenen Status entfernen
        $("#authstatus").remove();

        // Feedback ausblenden
        $("#authfeedback").css("display", "none");

        // Formular anzeigen
        $("#authform").css("display", "block");

        // Container einblenden
        $("#auth03").slideDown(500);
    });
}


// -----------------------------------------------------------------------------


function authShowStatus(status)
{
    debug('authShowStatus');

    // Container ausblenden
    $("#auth03").slideUp(500, function()
    {
        // Form und Feedback ausblenden
        $("#authform, #authfeedback").css("display", "none");

        // Noch vorhandenen Status entfernen
        $("#authstatus").remove();

        // Status in Container einfügen
        $("#auth03").append(status);

        // Logout definieren
        $("#authlogout").click(function()
        {
            authRequestLogout();
        });

        // Container einblenden
        $("#auth03").slideDown(500);
    });

}


// -----------------------------------------------------------------------------




    // --- Edit Formular



    // var div_id = $(this).parent().attr("id");




    /*
    Prinzip:

    Per Ajax Request wird vom Server ein Login Formular angefordert.

    Beim Absenden des Formulars werden zunächst zwei SALT Werte vom Server
    angefordert:
    - statisches SALT des Servers
    - dynamisch erzeugten SALT

    Der statische SALT ist auf dem Server gespeichert,
    z.B. könnte ein Settingswert, bzw. der md5 Hash dieses Wertes
    als SALT verwendet werden

    Der dynamische SALT wird erst beim Request erzeugt und mit
    Timestamp, IP-Adresse und User Agent des Requests auf dem Server gespeichert.
    Die Gültigkeit dieses SALTS kann über den Timestamp zeitlich begrenzt werden.
    Der SALT ist nur für einen Request gültig.

    Der Client sendet als Logindaten:
    MD5( MD5( Password + Server SALT ) + Username + dynamischer SALT ) + dynamischer SALT

    Der Server kann mit den in der Db gespeicherten Daten die Logindaten überprüfen.
    Bei korrektem Login sendet der Server eine Bestätigung.

    Die weitere Identifikation findet per Session Id statt und ist damit anfällig
    für Man-in-the-middle-attacks.

    Sollen durch den Client weitere Daten gesendet werden, empfiehlt es sich,
    auch hier die Übertragung per SALT und Passwort abzusichern.
    Durch einen MD5 Hash der Nutzdaten kann zudem gewährleistet werden, dass
    die Daten auf dem Weg zum Server nicht verändert werden können.

    Die Nutzdaten werden im Klartext übertragen, sind also während der Übertragung
    einsehbar.
    Bei höherem Sicherheisbedarf sollte die gesamte Verbindung per SSL abgesichert
    werden.

    */