/*
 * DEPENDENCIES:
 * This file requires the following javascript src files to be already loaded:
 *      http://jqueryjs.googlecode.com/files/jquery-1.3.js
 *      http://www.json.org/json2.js
 *      http://jsonschema.googlecode.com/files/jsonschema-b2.js
 *      http://SOAPjr.org/js/jquery.SOAPjr-1.3.0.js
*/

/* 
 * ****************************************************************************
 * Setup
 * ****************************************************************************
*/
var app           = {
    //host              : set automatically to something like "https://app.com.au"
    templates           : {},
    bin                 : "/",
    script              : "SOAPjr"
}
var buildAR;

$(document).ready(function(){
    var prot            = window.location.protocol;
    var host            = window.location.hostname;
    app.host            = prot+"//"+host;

    $.SOAPjr.config({ "url" : app.host+app.bin+app.script });

    buildAR = new SOAPjr_base();
    buildAR.login = login;
    buildAR.logout = logout;
    var st = get_cookie("session_token");
    var session = buildAR.get("session");
    if (st && !session.token) {
        buildAR.set({ "session" : { "token" : st } });
    }

    $("form").submit(function() { return false; });
    /*
	DD_roundies.addRule('.module', '10px', true);
	DD_roundies.addRule('.shadow', '20px', true);
	DD_roundies.addRule(' .module .head', '6px 6px 0px 0px', true);
    */
});


/* 
 * ****************************************************************************
 * Utility functions 
 * ****************************************************************************
*/
function get_cookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}
function call_service(io, service_type, action_type) {
    //show_processing();
    var call_io         = {};
    var caller          = call_service.caller.toString().match(/function\s*(\w+?)\s*\(/)[1];
    call_io.callback    = caller+"_callback";
    if (io.callback && io.callback != "") {
        call_io.callback    = io.callback;
    }
    if (io.OPTIONS != "") {
        call_io.OPTIONS     = io.OPTIONS;
    }
    if (io.ENVELOPE != "") {
        call_io.ENVELOPE    = io.ENVELOPE;
    }
    call_io.HEAD        = io.HEAD || {};
    var session         = buildAR.get("session");
    if (session.token) {
        call_io.HEAD.session_token = session.token;
    }
    call_io.BODY        = io.BODY || {};
    if (service_type) { call_io.HEAD.service_type = service_type; }
    if (action_type) { call_io.HEAD.action_type = action_type; }
    return $.SOAPjr.get(call_io);
}
function null_callback(resp, xhr) {
    hide_modal();
    if (resp.result()) {
        // do nothing - hence the name null_callback
    } else {
        var HEAD        = resp.get("HEAD");
        display_errors(HEAD.errors);
    }
}
function display_errors(errors) {
    var caller          = display_errors.caller.toString().match(/function\s*(\w+?)\s*\(/)[1];
    var eHEAD           = errors.get("HEAD");
    var eBODY           = errors.get("BODY");
    if (eHEAD.service_type && eHEAD.service_type.code && eHEAD.service_type.code == 401) {
        alert("Invalid session: Please login");
        window.location.reload();
    } else {
        // TODO: display errors nicely
        alert(caller+" errors:\n"+errors.dump());
    }
}



/* 
 * ****************************************************************************
 * Modal functions 
 * ****************************************************************************
*/
function show_processing() {
    $("object").css("visibility","hidden"); //TODO: this is a stoopid hack for flash movies taking top z-index 
    $("select").css("display","none"); //TODO: this is a stoopid hack for select's z-index mis-behaving in I6
    $("#modal_background2").css("display","block");
    if ($.browser.msie && $.browser.version < 7) {
        $("#modal_background2").height($(window).height());
    }
    $("#modal_foreground").css("display","block");
}
function hide_processing() {
    $("object").css("visibility",""); //TODO: this is a stoopid hack for flash movies taking top z-index 
    $("select").css("display",""); //TODO: this is a stoopid hack for select's z-index mis-behaving in I6
    $("#modal_background2").css("display","none");
    $("#modal_foreground").css("display","none");
}
function show_modal(head, content, foot, modal_class) {
    $("object").css("visibility","hidden"); //TODO: this is a stoopid hack for flash movies taking top z-index 
    $("select").css("display","none"); //TODO: this is a stoopid hack for select's z-index mis-behaving in I6
    if (!head) { head = ""; }
    if (!content) { content = ""; }
    if (!foot) { foot = ""; }
    $("#modal .head").html("<h2>"+head+"</h2>");
    $("#modal .content").html(content);
    $("#modal .foot").html(foot);

    if (modal_class) {
        $("#modal .module")[0].className = "module bg_white "+modal_class;
    } else {
        $("#modal .module")[0].className = "module bg_white w480"; 
    }

    $("#modal_background1").css("display","block");

    if ($.browser.msie && $.browser.version < 7) {
        $("#modal_background1").height($(window).height());
    }

    $("#modal").css("display","block");
    $("#modal_background2").css("display","none");
    $("#modal_foreground").css("display","none");
    window.location.href = "#_top";
}
function hide_modal() {
    $("object").css("visibility",""); //TODO: this is a stoopid hack for flash movies taking top z-index 
    $("select").css("display",""); //TODO: this is a stoopid hack for select's z-index mis-behaving in I6
    $("#modal_background1").css("display","none");
    $("#modal_background2").css("display","none");
    $("#modal").css("display","none");
    $("#modal_foreground").css("display","none");
}
function cancel() {
    hide_modal();
}




/* 
 * ****************************************************************************
 * default USERS functions 
 * ****************************************************************************
 * login, logout
*/
function show_login() {
    var html = '<form name="login_form"><div class="greycol clearfix"><div class="formblock w350"><div class="formrow"><div class="formlabel w50p"><label for="email_address">Email address</label></div><div class="formfield"><input class="w150" type="text" name="email_address" id="email_address"></div></div><div class="formrow"><div class="formlabel w50p"><label for="password">Password</label></div><div class="formfield"><input class="w150" type="password" name="password" id="password"></div></div><div class="formrow"><div class="formactions a-right clearfix"><div class="formaction"><a href="javascript:void(0)" onClick="cancel()"><img src="images/button_modal_cancel.png"></a></div><div class="formaction"><a href="javascript:void(0)" onClick="login()"><img src="images/button_modal_ok.png"></a></div></div></div><div class="formrow"><div class="formactions a-center"><a href="javascript:void(0)" onClick="resend_password()">I\'ve forgotten my password</a></div></div></div></div></form>';
    show_modal("Please login", html);
}
function login() {
    var io                  = {};
    io.BODY                 = { "source" : "login_form", "fields" : ["email_address", "password"] };
    //new_io.BODY             = { "email_address" : io.email_address, "password" : io.password };
    hide_modal();
    show_processing();
    return call_service(io, "users", "login");
}
function login_callback(resp, xhr) {
    if (resp.result()) {
        // do stuff
        window.location.reload()
        //buildAR.set({ "session" : resp.get("BODY") });
        //var s = buildAR.get("session");
        //var name = s.user.first_name+" "+s.user.last_name; 
        //alert("Hi "+name+", you are now logged in");
    } else {
        hide_processing();
        var HEAD            = resp.get("HEAD");
        var eHEAD           = HEAD.errors.get("HEAD");
        if (eHEAD.action_type && eHEAD.action_type.code && eHEAD.action_type.message) {
            alert(eHEAD.action_type.message);
        } else {
            display_errors(HEAD.errors);
        }
    }
}

function logout() {
    var new_io              = {};
    new_io.HEAD             = { "session_token" : buildAR.get("session").token };
    return call_service(new_io, "users", "logout");
}
function logout_callback(resp, xhr) {
    //hide_modal();
    if (resp.result()) {
        // do stuff
        buildAR.set({ "session" : null });
        window.location.reload()
    } else {
        var HEAD            = resp.get("HEAD");
        display_errors(HEAD.errors);
    }
}

function resend_password() {
    if ($("#email_address").val() != "") {
        var new_io              = {};
        new_io.BODY             = { "email_address" : $("#email_address").val() };
        return call_service(new_io, "users", "resend_password");
    } else {
        alert("Please enter the email address for your account");
    }
}
function resend_password_callback(resp, xhr) {
    if (resp.result()) {
        hide_modal();
        alert("Your password has been resent");
    } else {
        hide_processing();
        var HEAD            = resp.get("HEAD");
        var eHEAD           = HEAD.errors.get("HEAD");
        if (eHEAD.action_type && eHEAD.action_type.code && eHEAD.action_type.message) {
            alert(eHEAD.action_type.message);
        } else {
            display_errors(HEAD.errors);
        }
    }
}

