// Klasse for håndtering av (feil-)meldinger i en side.
// OBS! Kopi ligger i messagebox.js!
// Krever /js/i18n-js.php

GT = new GTjs("no.ravn.learningmodule.form.js");

MessageBox = Class.create();
MessageBox.prototype = {
    initialize: function(msg_container_id) {
        this.msg_container_id = msg_container_id;
    },

    // Shows an error-message
    show_message: function(msg, classname) {
        var id = this.msg_container_id;
        var node = $(id);
        if (node) {
            node.update(); // Slett gammelt innhold
            node.hide();
            node.className = classname;
            node.insert(msg.escapeHTML());
            node.insert(' ');
            var link = new Element('a', {'href': '#'});
            link.onclick = function() {
                var node = $(id);
                Effect.Fade(id,{duration: 0.25, queue: 'end'});
                return false;
            };
            link.insert('OK');
            node.insert(link);
            Effect.Appear(id,{duration: 0.25, queue: 'end'});
        } else {
            alert(GT._("Node ikke funnet i Messagebox::show_message():")+" "+this.msg_container_id);
        }
    },

    show_dom_msg: function(domnode, classname) {
        var id = this.msg_container_id;
        var node = $(id);
        if (node) {
            node.hide();
            node.update();
            node.className = classname;
            node.insert({top: domnode});
            var link = new Element('a', {'href': '#'});
            link.onclick = function() {
                var node = $(id);
                Effect.Fade(id, {duration: 0.25, queue: 'end'});
                return false;
            };
            link.insert('OK');
            node.appendChild(link);
            Effect.Appear(id, {duration: 0.25, queue: 'end'});
        } else {
            alert(GT._("Node ikke funnet i Messagebox::show_message(): ")+id);
        }
    },

    clear_msg: function() {
        var node = $(this.msg_container_id);
        if (node) {
            node.hide();
            node.update();
        }
    }
};


// Klasse for håndtering av former
// Kan redirigere til en URL eller kalle en javascript-funksjon etter
// et AJAX-kall.

FormHandler = Class.create();
FormHandler.prototype = {
    // rest_handler er urlen til REST servicen, f.eks.
    // '/__elevapi/services/activate-program'
    initialize: function(id, msg_container_id, rest_handler) {
        this.id = id;
        this.msg_container_id = msg_container_id;
        this.message_box = new MessageBox(msg_container_id);
        this.val = new Validator(this.message_box);
        this.msgbox = new MessageBox(msg_container_id);
        this.indicator = null; // Kan settes til en (DOM-)id som vises
            // mens AJAX requesten kjører. Se set_indicator()
        this.rest_handler = rest_handler;
        this.success_url = null;
        this.success_callback = null;
        this.failure_callback = null;
        this.oncomplete_callback = function() {}; //{ if ($(id)) { $(id).hide(); } };
        this.fields = [];
        this.additional_fields = [];
        this.json = null;
        this.id_prefix = '';
        // Default-method er POST
        this.method = 'post';
        var form = $('id');

        // Legg til en onsubmit-funksjon til alle submit-knapper
    },

    set_indicator: function(id) {
        this.indicator = id;
        this.oncomplete_callback = function() { if ($(id)) { $(id).hide(); } };
    },

    submit_handler: function() {
        if (this.val.validate(this.id)) {
            var json = {};
            if (this.json !== null) {
                json = this.json;
            }
            var index;
            var item;
            for (index = 0; index < this.fields.length; ++index) {
                item = this.fields[index];
                if ($(this.id_prefix+item)) {
                    json[item] = $(this.id_prefix+item).value;
                }
            }
            for(index = 0; index < this.additional_fields.length; ++index) {
                item = this.additional_fields[index];
                json[item.field] = item.value;
            }
            var auth = Cookie.get('RavnAuth');
            var request = {
                method: this.method,
                postBody: Object.toJSON(json),
                onSuccess: this.on_success.bind(this),
                onFailure: this.on_failure.bind(this),
                onException: this.on_exception.bind(this)
                };
            if (this.indicator) {
                var id = this.indicator;
                request.onCreate = function() { if ($(id)) { $(id).show(); } };
                request.onComplete = this.oncomplete_callback;
            }
            if (auth && auth.length > 0) {
                var headers = ['X-Ravn-Authorization', 'RAVN '+auth];
                request.requestHeaders = headers;
            }
            var method_param = '';
            if (this.method == 'put' || this.method == 'delete') {
                method_param = '?_method='+this.method;
            }
            var tmp = new Ajax.Request(this.rest_handler + method_param, request);
        }
    },

    on_success: function(transport) {
        var response = transport.responseText || "no response text";
        // DEBUG: $(this.msg_container_id).insert({top: response});
        if (this.success_callback) {
            this.success_callback(response);
        }
        if (this.success_url) {
            document.location = this.success_url;
        }
    },

    on_failure: function(transport) {
        var response = transport.responseText || "no response text";
        try {
            res = response.evalJSON(true);
        } catch (e) {
            if (!e instanceof SyntaxError) { throw e; }
        }
        if (this.failure_callback) {
            this.failure_callback(response, this.msg_container_id);
        } else {
            this.msgbox.show_message(res.error+': '+res.errorMessage, 'feilmelding');
        }
    },

    on_exception: function(request, e){
        if (console && console.dir) {
            console.dir(e);
        }
    },

    set_fields: function(fields) {
        this.fields = fields;
    },

    // Felt som alltid skal sendes med (uansett hva formen inneholder)
    add_static_field: function(field_hash) {
        this.additional_fields[this.additional_fields.length] = field_hash;
    },

    // JSON kan settes for en request. json er et objekt og ikke en
    // serialisert streng. Denne settes først, etterpå legges til feltene
    set_json: function(json) {
        this.json = json;
    },

    // Setter HTTP-methoden
    set_method: function(method) {
        this.method = method;
    },

    // Setter URL som det skal POSTes, PUTtes, .. til.
    set_rest_handler: function(rest_handler) {
        this.rest_handler = rest_handler;
    },

    // Resetter alle felt og verdier (og json hvis det er satt).
    // Kan brukes når det skal kjøres flere requests med forskjellig
    // konfigurasjon. OBS! Setter også method til POST.
    reset: function() {
        this.method = 'post';
        this.json = null;
        this.fields = [];
        this.additional_fields = [];
    },

    set_success_url: function(url) {
        this.success_url = url;
    },

    set_success_callback: function(callback) {
        this.success_callback = callback;
    },

    set_failure_callback: function(callback) {
        this.failure_callback = callback;
    },

    set_id_prefix: function(prefix) {
        this.id_prefix = prefix;
    }
};



LoginHandler = Class.create();
LoginHandler.prototype = {
    initialize: function(next_url) {
        this.next_url = next_url;
        this.teacher_default = '/larer/';
        this.student_default = '/elev/me/';
    },

    success: function(response, msg_container_id) {
        res = response.evalJSON(true);
        this.token = res.authtoken;

        Cookie.set_second('RavnAuth', this.token, '', '/', '.ravn.no');
        Cookie.set_second('RavnAuth', this.token, '', '/', '.cappelen.no');
        Cookie.set_second('RavnAuth', this.token, '', '/', '.cappelendamm.no');
        Cookie.set_second('RavnAuth', this.token, '', '/', '.naturfag.no');
        Cookie.set_second('RavnAuth', this.token, '', '/', '.viten.no');
        Cookie.set_second('LearningModuleLang', res.language, '', '/');

        if ($('login-notification')) {
            $('login-notification').show();
        }

        url = this.next_url;
        if (!url && res.usertype) {
            if (res.usertype=='teacher') {
                url = this.teacher_default;
            } else {
                url = this.student_default;
            }
        }
        document.location = url;
        return false;
    },

    failure: function(response, msg_container_id) {
        if ($('login-notification')) {
            $('login-notification').hide();
            }
        var msgbox = new MessageBox(msg_container_id);
        res = response.evalJSON(true);
        var message;
        if (res.httpstatus == '401') {
            message = GT._('Feil brukernavn eller passord.');
        } else {
            message = res.error+': '+res.errorMessage;
        }
        msgbox.show_message(message, 'feilmelding');
    }
};

RegisterGroupHandler = Class.create();
RegisterGroupHandler.prototype = {
    initialize: function() {
    },

    failure: function(response, msg_container_id) {
        var msgbox = new MessageBox(msg_container_id);
        var res = response.evalJSON(true);
        var message;
        if (res.httpstatus == '404') {
            message = GT._('Ugyldig kode. Be læreren din om en gyldig kode.');
        } else if (res.httpstatus == '401') {
            message = GT._('Klassen er stengt. Det er derfor ikke mulig å registrere seg som ny bruker.');
        } else {
            message = res.error+': '+res.errorMessage;
        }
        msgbox.show_message(message, 'feilmelding');
    }
};

TeacherLearningModuleHandler = Class.create();
TeacherLearningModuleHandler.prototype = {
    // OBS! msg_activated og msg_deactivated må være URL-encodet
    initialize: function(msg_activated, msg_deactivated) {
        this.msg_activated = msg_activated;
        this.msg_deactivated = msg_deactivated;
        this.activate_program_form = new FormHandler('activate-program', 'feilmelding', null);
        this.success_url = '/larer/program.html';
    },

    activate_program: function(group_id) {
        var program_id = $F('group_'+group_id);
        var json = {};
        json.group = group_id;
        json.program = program_id;

        this.activate_program_form.set_rest_handler('/__elevapi/services/activate-program');
        this.activate_program_form.set_success_url(this.success_url+
            '?msg='+encodeURIComponent(this.msg_activated));
        this.activate_program_form.set_json(json);
        this.activate_program_form.submit_handler();
        return false; // stop click event
    },

    activate_program_failure: function(transport) {
        alert("Ikke implementert - failure");
        // Her må vi teste på 409 conflict (hvis man prøver å aktivere
        // samme program flere ganger)
    },

    deactivate_program: function(group_id, program_id) {
        if (confirm(GT._("Vil du virkelig deaktiverte programmet for denne klassen?"))) {
            var json = {};
            json.group = group_id;
            json.program = program_id;
            this.activate_program_form.set_rest_handler('/__elevapi/services/deactivate-program');
            this.activate_program_form.set_json(json);
            this.activate_program_form.set_success_url(this.success_url+
                '?msg='+encodeURIComponent(this.msg_deactivated));
            this.activate_program_form.submit_handler();
        }
        return false; // stop click event
    }
};

GroupHandler = Class.create();
GroupHandler.prototype = {
    initialize: function(elevapi_data) {
        this.program_form = new FormHandler('edit-group', 'feilmelding', null);
        this.msg_container_id = 'feilmelding';
        this.elevapi_data = elevapi_data;
        this.remove_success_url = '/larer/klasser.html';

    },

    send_update: function(id) {
        var input = $('group_update_'+id);
        if (!input) { return false; }
        var json = {};
        json.groupclosed = !input.checked;
        var request = { method: 'post',
            onSuccess: this.group_closed_success.bind(this),
            onFailure: this.group_closed_failure.bind(this),
            postBody: Object.toJSON(json)};
        var auth = Cookie.get('RavnAuth');
        if (auth && auth.length > 0) {
            var headers = ['X-Ravn-Authorization', 'RAVN '+auth];
            request.requestHeaders = headers;
        }
        return new Ajax.Request(
            this.elevapi_data+'/group/'+id+'?_method=put',
            request);
    },

    group_closed_success: function(transport) {
        var response = transport.responseText;
        var json = response.evalJSON();
        var message;
        var msgbox = new MessageBox('msg-'+json.id);
        if (json.groupclosed) {
            message = GT._("Innmelding i klassen har blitt stengt.");
        } else {
            message = GT._("Innmelding i klassen har blitt åpnet.");
        }
        msgbox.show_message(message, 'feilmelding');
    },

    group_closed_failure: function(transport) {
        alert(GT._("Innmeldingstatus kunne ikke endres. ")+transport.responseText);
    },

    tittel_lagre: function(elem) {
        if (elem && elem.value && elem.value.value) {
            var json = {name: elem.value.value};
            return Object.toJSON(json);
        }
        return null;
    },

    inplace_success: function(transport) {
        var response = transport.responseText || "no response text";
        var json = response.evalJSON();
        var elem = $('group_title_'+json.id);
        if (elem) {
            var name = '';
            if (json.name) { name = json.name.escapeHTML(); }
            elem.update();
            elem.insert({top: name});
        }
    },

    inplace_failure: function() {
        alert(GT._("Intern feil ved lagring."));
    },

    remove_group: function(group_id) {
        if (confirm('Vil du virkelig slette klassen?')) {
            this.program_form.set_rest_handler('/__elevapi/group/'+group_id);
            this.program_form.set_success_url(this.remove_success_url+'?msg='+
                                              encodeURIComponent(GT._('Klassen har blitt fjernet')));
            this.program_form.set_method('delete');
            this.program_form.set_failure_callback(this.failure);
            this.program_form.submit_handler();
        }
        return false; // stop click event
    },

    failure: function(response, msg_container_id) {
        var msgbox = new MessageBox(msg_container_id);
        res = response.evalJSON(true);
        var message;
        if (res.httpstatus == '409') {
            message = GT._('Kan ikke slette klasser med elever.');
        } else {
            message = res.error+': '+res.errorMessage;
        }
        msgbox.show_message(message, 'feilmelding');
    }
};


/* TODO: Her burde det ryddes. Noen av funksjonene er bare i bruk
   for viten (fjern, remove_student_*), men noen er skrevet om for
   cappelen.
   På viten skal det brukes VitenTeacherStudentHandler() som
   overstyrer bl.a. show_add_new_student();
*/
TeacherStudentHandler = Class.create();
TeacherStudentHandler.prototype = {
    initialize: function(elevdata_api) {
        this.elevdata_api = elevdata_api;
    },

    fjern: function(groupid, studentname) {
        var ret = null;
        if (confirm(GT._('Vil du virkelig fjerne eleven fra klassen?'))) {
            var json = {};
            json.username = studentname; // OK - kan være usershortname eller email
            json.groupid = groupid;
            var request = { method: 'post',
                onSuccess: this.remove_student_success.bind(this),
                onFailure: this.remove_student_failure.bind(this),
                postBody: Object.toJSON(json)
                };
            var auth = Cookie.get('RavnAuth');
            if (auth && auth.length > 0) {
                var headers = ['X-Ravn-Authorization', 'RAVN '+auth];
                request.requestHeaders = headers;
            }
            ret = new Ajax.Request(
                 this.elevdata_api+'/services/unsubscribe-group',
                 request);
        }
        return ret;
    },

    remove_student_success: function(transport) {
        window.location.reload();
    },

    remove_student_failure: function(transport) {
        var msg = new MessageBox('feilmelding');
        msg.show_message(GT._('Kunne ikke fjerne eleven fra klassen'));
    },

    show_add_new_student: function(school_id) {
        $('add_new_student_link').hide();
        $('add_existing_student_link').hide();
        var div = $('student_form');
        div.update();
        var form = new Element('form', {method: 'post', action: '#', id: 'registrering'});
        form.insert('<p>Legg til elev:</p>');
        form.onsubmit = this.add_new_student_ok.bind(this, school_id);
        var p = this._get_register_form('new-');
        form.insert(p);
        var ok_btn = new Element('input',
            {type: 'submit',
            value: 'Registrer',
            id: 'register-student-button'});
        ok_btn.addClassName('button');
        form.insert(ok_btn).insert(' ');
        var cancel = new Element('input',
            {type: 'button',
            value: 'Avbryt',
            id: 'cancel-student-button'});
        cancel.addClassName('button');
        cancel.onclick = this.add_new_student_cancel.bind(this);
        form.insert(cancel);
        div.insert(form);
        return false;
    },

    /* password_msg er true hvis skjemaet skal bruke redigering av passordet */
    _get_register_form: function(id_prefix, usershortname, firstname, lastname, password_edit) {
        if (!usershortname) { usershortname = ''; }
        if (!firstname) { firstname = '';}
        if (!lastname) { lastname = ''; }
        var p = new Element('p');
        var t = new Template('<div class="inputCont"><label for="#{idprefix}#{id}">#{label}</label> <input id="#{idprefix}#{id}" name="#{id}" type="#{type}" value="#{value}"/><input type="hidden" name="validate[]" value="{#idprefix}#{id}:validate_nbstring:{min_length: #{minlength}, max_length: #{maxlength}}:#{feilmelding}" />#{eksempel}</div>');
        p.insert(t.evaluate(
            {idprefix: id_prefix,
            id: 'firstname',
            name: 'firstname',
            label: GT._('Fornavn'),
            minlength: '1',
            maxlength: '255',
            eksempel: '',
            type: 'text',
            feilmelding: GT._('Du må oppgi fornavnet.'),
            value: firstname.escapeHTML().sub('"', '&quot;')}));
        p.insert(t.evaluate(
            {idprefix: id_prefix,
            id: 'lastname',
            name: 'lastname',
            label: GT._('Etternavn'),
            minlength: '1',
            maxlength: '255',
            eksempel: '',
            type: 'text',
            feilmelding: GT._('Du må oppgi etternavnet.'),
            value:lastname.escapeHTML().sub('"', '&quot;')}));
        p.insert(t.evaluate(
            {idprefix: id_prefix,
            id: 'usershortname',
            name: 'usershortname',
            label: GT._('Brukernavn'),
            minlength: '1',
            maxlength: '255',
            eksempel: '<span class="eksempel">(e-postadresse)</span>',
            type: 'text',
            feilmelding: GT._('Du må oppgi e-postadressen.'),
            value: usershortname.escapeHTML().sub('"', '&quot;')}));
        if (password_edit) {
            p.insert(GT._('<p>Passordet trenger du kun å fylle ut hvis du vil endre passordet.</p>'));
            p.insert('<div class="inputCont"><label for="password">Passord</label> <input id="'+id_prefix+'password" name="password" type="password" /><span class="eksempel">må ha minst 6 tegn</span>');
            p.insert('<input type="hidden" name="validate[]" value="'+id_prefix+'password:validate_nbstring:{min_length: 6, max_length: 20, allow_empty: true}:Hvis du vil oppdatere passordet, så må det være mellom 6 og 20 tegn." />');
        } else {
            p.insert(t.evaluate(
                {idprefix: id_prefix,
                id: 'password',
                name: 'password',
                label: GT._('Passord'),
                minlength: '6',
                maxlength: '20',
                eksempel: '<span class="eksempel">'+ GT._('må ha minst 6 tegn') + '</span>',
                type: 'password',
                feilmelding: GT._('Du må oppgi passordet')}));
        }
        p.insert('<div class="inputCont"><label for="'+id_prefix+'password2">Gjenta passord</label> <input id="'+id_prefix+'password2" name="password2" type="password" /><input type="hidden" name="validate[]" value="'+id_prefix+'password:validate_equals:{otherfield: \''+id_prefix+'password2\'}:Passordbekreftelsen stemte ikke med passordet." /></div>');
        return p;
    },

    add_new_student_ok: function(school_id) {
        var register_form = new FormHandler('registrering', 'feilmelding', '/__elevapi/user/');
        var fields = ['usershortname', 'firstname', 'lastname', 'password', 'language'];
        register_form.set_id_prefix('new-');
        register_form.set_fields(fields);
        register_form.add_static_field({field: 'usertype', value: 'student'});
        if (school_id) {
            register_form.add_static_field({field: 'schoolid', value: school_id});
        }
        register_form.set_success_callback(this.add_new_student_success_callback.bind(this));
        register_form.set_failure_callback(this.add_new_student_failure_callback.bind(this));
        if (register_form.submit_handler()) {
            $('student_form').update();
            $('add_new_student_link').show();
            $('add_existing_student_link').show();
        }
        return false;
    },

    // Denne funksjonen overstyres for cappelen (i larer/elever.html)
    add_new_student_success_callback: function () {
        alert(GT._('Eleven har blitt registrert'));
        // TODO: Legg til eleven til gruppa
    },

    add_new_student_failure_callback: function(response, msg_container_id) {
        var msgbox = new MessageBox(msg_container_id);
        res = response.evalJSON(true);
        var message;
        if (res.httpstatus == '409') {
            message = GT._('Eleven er allerede registrert i systemet.');
        } else {
            message = res.error+': '+res.errorMessage;
        }
        msgbox.show_message(message, 'feilmelding');
    },

    add_new_student_cancel: function() {
        $('student_form').update();
        $('add_new_student_link').show();
        $('add_existing_student_link').show();
    },

    show_add_existing_student: function() {
        $('add_existing_student_link').hide();
        $('add_new_student_link').hide();
        var div = $('student_form');
        div.update();
        div.insert('Søk i elever: ');
        div.insert(new Element('br'));
        div.insert(new Element('input', {type: 'text', id: 'existing_student_input'}));
        div.insert(new Element('br'));
        var ok_btn = new Element('input', {type: 'button', value: 'OK', id: 'search-for-existing-student-button'});
        ok_btn.addClassName('button');
        ok_btn.onclick = this.add_existing_student_ok.bind(this);
        div.insert(ok_btn).insert(' ');
        var cancel = new Element('input', {type: 'button', value: 'Avbryt', id: 'canel-search-for-existing-student-button'});
        cancel.addClassName('button');
        cancel.onclick = this.add_existing_student_cancel.bind(this);
        div.insert(cancel);
        $('existing_student_input').focus();
        return false;
    },

    add_existing_student_ok: function() {
        $('student_form').update();
        $('add_new_student_link').show();
        $('add_existing_student_link').show();
    },

    add_existing_student_cancel: function() {
        $('student_form').update();
        $('add_new_student_link').show();
        $('add_existing_student_link').show();
    },

    show_add_new_teacher: function(school_id, teacher_access_pin) {
        $('add_new_teacher_link').hide();
        var div = $('teacher_form');
        div.update();
        var form = new Element('form', {method: 'post', action: '#', id: 'registrering'});
        form.insert(GT._('<p>Legg til lærer:</p>'));
        var id_prefix = 'new-';
        var p = this._get_register_form(id_prefix);
        form.insert(p);
        var ok_btn = new Element('input', {type: 'button', value: GT._('OK'), id: 'add-teacher-button'});
        ok_btn.addClassName('button');
        ok_btn.onclick = this.add_new_teacher_ok.bind(this, school_id, teacher_access_pin, id_prefix);
        form.insert(ok_btn).insert(' ');
        var cancel = new Element('input', {type: 'button', value: GT._('Avbryt'), id: 'cancel-add-teacher-button'});
        cancel.addClassName('button');
        cancel.onclick = this.add_new_teacher_cancel.bind(this);
        form.insert(cancel);
        div.insert(form);
        return false;
    },

    add_new_teacher_ok: function(school_id, teacher_access_pin, id_prefix) {
        var register_form = new FormHandler('registrering', 'feilmelding', '/__elevapi/user/');
        var fields = ['usershortname', 'firstname', 'lastname', 'password', 'language'];
        register_form.set_id_prefix(id_prefix);
        register_form.set_fields(fields);
        register_form.add_static_field({field: 'usertype', value: 'teacher'});
        register_form.add_static_field({field: 'teacher_access_pin', value: teacher_access_pin});
        if (school_id) {
            register_form.add_static_field({field: 'schoolid', value: school_id});
        }
        register_form.set_success_callback(this.add_new_teacher_success_callback.bind(this));
        register_form.set_failure_callback(this.add_new_teacher_failure_callback.bind(this));
        if (register_form.submit_handler()) {
            $('student_form').update();
            $('add_new_student_link').show();
            $('add_existing_student_link').show();
        }
        return false;
    },

    add_new_teacher_success_callback: function () {
        alert('Læreren har blitt registrert.');
    },

    add_new_teacher_cancel: function() {
        $('teacher_form').update();
        $('add_new_teacher_link').show();
    },

    add_new_teacher_failure_callback: function(response, msg_container_id) {
        var msgbox = new MessageBox(msg_container_id);
        res = response.evalJSON(true);
        var message;
        if (res.httpstatus == '409') {
            message = GT._('Læreren er allerede registrert i systemet.');
        } else {
            message = res.error+': '+res.errorMessage;
        }
        msgbox.show_message(message, 'feilmelding');
    }
};


/* Cappelen */
OrderTrialHandler = Class.create();
OrderTrialHandler.prototype = {
    initialize: function(modulename) {
        this.schools = null;
        this.message_box = new MessageBox('feilmelding');
        this.val = new Validator(this.message_box);
        this.postnr = null;
        this.modulename = modulename;
    },

    get_schools: function() {
        var postnr = $('postnr').getValue();
        this.postnr = postnr;
        var request = {
            method: 'GET',
            parameters: {'postnr': postnr, 'name': $('name').getValue()},
            onSuccess: this.get_schools_success.bind(this),
            onFailure: this.get_schools_failure.bind(this),
            onCreate: function() { $('postnrformmelding').show(); },
            onComplete: function() { $('postnrformmelding').hide(); },
            evalJSON: true
        };
        var tmp = new Ajax.Request('/login/schools.php', request);
        return false;
    },

    get_schools_success: function(transport) {
        var schools = transport.responseJSON;
        var school_cont = $('schoolcontainer');
        if ((!schools) || (!schools.status) || (!schools.schools)) {
            school_cont.update();
            this._insert_new_school_link(school_cont);
            this.message_box.show_message(GT._("Feil ved henting av skolene: ")+
                (schools && schools.message ? schools.message : GT._('Ukjent årsak')),
                "feilmelding");
            return; // Feilhåndtering?
        }
        school_cont.update(); // Slett innhold
        this.schools = schools.schools.toArray();
        var select = null;
        if (this.schools.length > 0) {
            select = new Element('select', {id: 'school_select', name: 'clientid', size: '10'});
            if (0 && this.schools.length > 1) {
                select.insert(new Element('option',
                    {value: ''}).insert(GT._('Velg skole')));
            }
            for (var i = 0; i<this.schools.length; i++) {
                select.insert(new Element('option',
                            {value: this.schools[i].ClientId}).insert(this.schools[i].Name.escapeHTML()));
            }
            select.onchange = this.school_select_change.bind(this);

            school_cont.insert(new Element('p').insert("Velg din skole fra listen"));

            school_cont.insert(select);
        } else {
            school_cont.insert(GT._('<p>Ingen skoler funnet.</p>'));
        }
        var div = new Element('div', {id: 'school_address'});
        school_cont.insert(div);
        this._insert_new_school_link(school_cont);
        // Mulig at det bare er et element i listen.
        // I så fall viser vi det med en gang!
        // fjernet fordi den ikke virker -og fordi det er "riktigere" å velge, selv i en liste med bare ett element:)
        if (0 && select && this.schools.length == 1) {
            this.school_select_change();
            select.hide();
        }
    },

    _insert_new_school_link: function(elem) {
        var not_found_div = new Element('div', {id: 'school_not_found'});

        // XXX
        var a = new Element('a', {
           href:  'nykunde.html?postnr='+
                (this.postnr !== null ? encodeURIComponent(this.postnr) : '')+
                '&modulename='+encodeURIComponent(this.modulename)
            }).insert(GT._('Finner ikke din skole? Registrer ny skole hos Cappelen Damm (vil medføre ventetid)'));
        not_found_div.insert(a);
        elem.insert(not_found_div);
    },

    get_schools_failure: function(transport) {
        var school_cont = $('schoolcontainer');
        school_cont.update();
        this._insert_new_school_link(school_cont);
        this.message_box.show_message(GT._("Feil ved henting av skoler"), "feilmelding");
    },

    school_select_change: function() {
        var select = $('school_select');
        if (!select) { return; }
        if (!this.schools) { return; }
        var value = $F('school_select');
        var div;
        if (value) {
            var school = null;
            for (var i = 0; i < this.schools.length; i++) {
                if (this.schools[i].ClientId == value) {
                    school = this.schools[i];
                    break;
                }
            }
            if (!school) {
                alert(GT._('Kunne ikke finne skole. Intern feil.'));
            }
            div = $('school_address');
            div.update();
            div.insert('<div id="school_name">'+school.Name.escapeHTML()+'</div>');
            if (!school.Adr1.empty()) {
                div.insert('<div id="school_adr1">'+school.Adr1.escapeHTML()+'</div>');
            }
            if (!school.Adr2.empty()) {
                div.insert('<div id="school_adr2">'+school.Adr2.escapeHTML()+'</div>');
            }
            if (!school.Adr3.empty()) {
                div.insert('<div id="school_adr3">'+school.Adr3.escapeHTML()+'</div>');
            }
            div.insert('<div id="school_city">'+school.ZipCode.escapeHTML()+' '+school.City.escapeHTML()+'</div>');

            var order_con = new Element('div', {'id': 'jegerlarersubmit'});
            order_con.addClassName('SubmitCont');
            order_con.insert(new Element('div').addClassName('SubmitOneLineLeft'));
            var orderbtn = new Element('input', {type: 'submit', id: 'school-order-button', value: GT._('Jeg er lærer ved denne skolen')});
            orderbtn.addClassName('SubmitButtonOneLine');
            order_con.insert(orderbtn);
            order_con.insert(new Element('div'));
            order_con.addClassName('SubmitOneLineRight');
            div.insert(order_con);

        } else {
            // Deaktiver bestill-knappen hvis value er null
            div = $('school_address');
            if (div) {
                div.update();
            }
        }
    },

    submit_new_school: function() {
        if (!this.val.validate('register_new_school_form')) {
            return false;
        }
        var url = 'bestill.php';
        var request = {
            method: 'post',
            parameters: $('register_new_school_form').serialize(),
            onSuccess: this.submit_new_school_success.bind(this),
            onFailure: this.submit_new_school_failure.bind(this)
        };
        var tmp = new Ajax.Request(url, request);
        return false;
    },

    submit_new_school_success: function(transport) {
        var res = transport.responseJSON;
        if (res.status) {
            $('register_new_school').hide();
            $('register_new_school_ok').show();
        } else {
            this.message_box.show_message(GT._("Feil ved sending av skjemaet: ")+
                (res.message ? res.message : GT._('Ukjent feil')),
                "feilmelding");
        }
    },

    submit_new_school_failure: function(transport) {
        var res = transport.responseJSON;
        this.message_box.show_message(GT._("Feil ved sending av skjemaet: ")+
                                      (res.message ? res.message : GT._('Ukjent feil')));
    }
};


SchoolSearchHandler = Class.create();
SchoolSearchHandler.prototype = {
    initialize: function(msg_id) {
        this.message_box = new MessageBox(msg_id);
    },

    sok: function(zipcodeid) {
        var zipcode = $(zipcodeid).value;
        var val = new Validator(this.message_box);
        if (!val.validate($('zipcodeform'))) { return false; }
        var request = {
            method: 'GET',
            parameters: {'postnr': zipcode},
            onSuccess: this.get_schools_success.bind(this),
            onFailure: this.get_schools_failure.bind(this),
            onCreate: function() { $('zipform-notification').show(); },
            onComplete: function() { $('zipform-notification').hide(); },
            evalJSON: true
        };
        var tmp = new Ajax.Request('/login/schools.php', request);
        return false;
    },

    get_schools_success: function(transport) {
        $('personaldataform').show();
        var schools = transport.responseJSON;
        var school_cont = $('schoolcontainer');
        if ((!schools) || (!schools.status) || (!schools.schools)) {
            school_cont.update();
            this.message_box.show_message(GT._("Feil ved henting av skolene: ")+
                                          (schools && schools.message ? schools.message : GT._('Ukjent årsak')),
                "feilmelding");
            return; // Feilhåndtering?
        }
        school_cont.update(); // Slett innhold
        this.schools = schools.schools.toArray();
        if (this.schools.length > 1) {
            var select = new Element('select', {id: 'cim_client_id', name: 'cim_client_id'});
            for (var i = 0; i<this.schools.length; i++) {
                select.insert(new Element('option',
                            {value: this.schools[i].ClientId}).insert(this.schools[i].Name.escapeHTML()));
            }
            school_cont.insert(select);
        } else {
            school_cont.insert(GT._('Ingen skoler funnet.'));
        }
    },

    get_schools_failure: function(transport) {
        this.message_box.show_message(GT._("Kunne ikke hente liste over skolene."), "feilmelding");
    }
};


/* Cappelen: Bestilling av prøveabo */
OrderTrialFormHandler = Class.create();
OrderTrialFormHandler.prototype = {
    initialize: function() {
        this.message_box = new MessageBox('order_result');
        this.clientid = null;
        this.modulename = null;
    },


    make_order: function() {
        var clientid = $('clientid').getValue();
        var modulename = $('modulename').getValue();
        this.clientid = clientid;
        this.modulename = modulename;

        $('order_button').disable();
        this.message_box.show_message(GT._('Vent, ordren prosesseres...'), '');

        var request = {
            method: 'POST',
            parameters: {'clientid': clientid,
                         'modulename': modulename,
                         'op': 'order_trial',
                         'kontaktperson_fornavn': $('kontaktperson_fornavn').getValue(),
                         'kontaktperson_etternavn': $('kontaktperson_etternavn').getValue(),
                         'kontaktperson_epost': $('kontaktperson_epost').getValue()
            },
            onSuccess: this.make_order_success.bind(this),
            onFailure: this.make_order_failure.bind(this),
            evalJSON: true
        };
        var tmp = new Ajax.Request('/login/bestill.php', request);
        return false;
    },


    make_order_success: function(transport) {
        var orderresult = transport.responseJSON;
        var orderform = $('bekreft_abo');


        if (orderresult.success) {
            orderform.update(); // Slett innhold
            this.message_box.show_message(GT._(' Takk for bestillingen!')+
                                          GT._(' Ditt lisensnummer er ')+orderresult.result.LicenseKey.escapeHTML()+
                                          GT._(' Ta godt vare på det. Du vil også få tilsendt en mail fra oss med lisensnummeret. '),
                                          'melding');

        } else {
            this.message_box.show_message(orderresult.message, 'feilmelding');
            $('order_button').enable();
        }

        return;
    },

    make_order_failure: function(transport) {
        $('order_button').enable();
        this.message_box.show_message(GT._('Feil oppsto ved kommunikasjon med tjeneren. Prøv igjen senere.'), 'feilmelding');
    }
};

// Viten/elevgrensesnitt
UserEditHandler = Class.create();
UserEditHandler.prototype = {
    initialize: function(elevdata_api) {
        this.elevdata_api = elevdata_api;
        this.user = null;
    },

    set_user: function(user) {
        this.user = user;
    },

    // Viser redigeringsskjemaet. id er id'en til div'en som skal
    // inneholde skjemaet.
    create_edit_form: function(id) {
        var cont = $(id);
        this._insert_usershortname(cont);
        this._insert_email(cont);
        this._insert_field(cont, 'even', 'firstname', GT._('Fornavn'));
        this._insert_field(cont, 'odd', 'lastname', GT._('Etternavn'));
        if (this.user.usertype === 'teacher') {
            this._insert_field(cont, 'even', 'schoolname', GT._('Skole'));
            this._insert_field(cont, 'odd', 'schoolplace', GT._('Sted'));
        }
        //        this._insert_field(cont, 'even', 'language', GT._('Ønsket språk'));
        this._insert_language(cont, 'even');
        this._insert_password(cont);
    },


    _insert_language: function(elem, cl) {
        var div = new Element('div');
        div.addClassName(cl);
        var label = new Element('label').insert(GT._('Ønsket språk'));
        div.insert(label);
        var field = new Element('div', {'id': 'text-language'});
        field.addClassName('personalia');
        this._insert_language_field(field);
        div.insert(field);
        elem.insert(div);
    },

    _insert_language_field: function(elem) {
        elem.update();
        var edit;
        var langs = {
            'nob': 'Norsk bokmål',
            'nno': 'Norsk nynorsk',
            'dan': 'Dansk',
            'eng': 'English',
            'swe': 'Svenska'
        };

        edit = new Element('a', {href: '#'}).insert(GT._('rediger'));
        if (this.user.language) {
            elem.insert(langs[this.user.language]+' ');
        } else {
            elem.insert(GT._("Standard")+' ');
        }
        edit.onclick = this._edit_language.bind(this, 'language', this._insert_language_field.bind(this, elem));
        elem.insert(edit);
    },

    _insert_usershortname: function(elem) {
        var div = new Element('div');
        div.addClassName('even');
        var label = new Element('label').insert(GT._('Brukernavn'));
        div.insert(label);
        var field = new Element('div', {'id': 'text-usershortname'});
        field.addClassName('personalia');
        this._insert_usershortname_field(field);
        div.insert(field);
        elem.insert(div);
        return false;
    },

    _insert_usershortname_field: function(elem) {
        elem.update();
        var edit;
        if (this.user.usershortname) {
            elem.insert(this.user.usershortname.escapeHTML()+" ");
            edit = new Element('a', {'href': '#'}).insert(GT._('rediger'));
            edit.onclick = this._edit_field.bind(this, 'usershortname', this._insert_usershortname_field.bind(this, elem));
            elem.insert(edit);
        } else {
            elem.insert(GT._("Samme som e-postadresse")+" ");
            edit = new Element('a', {'href': '#'}).insert(GT._('legg til'));
            edit.onclick = this._edit_field.bind(this, 'usershortname', this._insert_usershortname_field.bind(this, elem));
            elem.insert(edit);
        }
        return false;
    },

    _insert_email: function(elem) {
        var div = new Element('div');
        div.addClassName('odd');
        var label = new Element('label').insert(GT._('E-postadresse'));
        div.insert(label);
        var field = new Element('div', {'id': 'text-email'});
        field.addClassName('personalia');
        this._insert_email_field(field);
        div.insert(field);
        div.insert(new Element('br'));
        div.insert(new Element('p').insert(GT._('Oppgir du e-postadresse kan du få tilsendt nytt passord hvis du skulle glemme det.')));
        div.insert(new Element('p').insert(GT._('PS! Du kan logge inn med både brukernavn og e-postadressen.')));
        elem.insert(div);
    },

    _insert_email_field: function(elem) {
        var edit;
        elem.update();
        if (this.user.email) {
            elem.insert(this.user.email.escapeHTML()+" ");
            edit = new Element('a', {'href': '#'}).insert(GT._('rediger'));
            edit.onclick = this._edit_field.bind(this, 'email',
                this._insert_email_field.bind(this, elem));
            elem.insert(edit);
        } else {
            elem.insert(GT._("Ingen registrert ")+" ");
            edit = new Element('a', {'href': '#'}).insert(GT._('legg til'));
            edit.onclick = this._edit_field.bind(this, 'email',
                this._insert_email_field.bind(this, elem));
            elem.insert(edit);
        }
    },

    // Legger til hele raden med label, felt, etc. i visningsmodus
    _insert_field: function(elem, odd_or_even, fieldname, fieldlabel /* , edit_function */) {
        var div = new Element('div');
        div.addClassName(odd_or_even);
        var label = new Element('label').insert(fieldlabel);
        div.insert(label);
        var field = new Element('div', {'id': 'text-'+fieldname});
        field.addClassName('personalia');
        this._update_field_value(field, fieldname);
        div.insert(field);
        elem.insert(div);
    },

    // Legger til selve feltet i visningsmodus (kalles fra avbryt-funksjonene og
    // _insert_XXX-funksjonene
    _update_field_value: function(elem, fieldname /* , edit_function */) {
        elem.update(); // Slett gamelt innhold
        elem.insert(this.user[fieldname].escapeHTML()+" ");
        var edit = new Element('a', {'href': '#'}).insert(GT._('rediger'));
        edit.onclick = this._edit_field.bind(this, fieldname, null);
        elem.insert(edit);
        return false;
    },

    _insert_password: function(elem) {
        var div = new Element('div');
        div.addClassName('even');
        var label = new Element('label').insert(GT._('Passord'));
        div.insert(label);
        var field = new Element('div', {'id': 'text-password'});
        field.addClassName('personalia');
        var edit = new Element('a', {href: '#'}).insert(GT._('rediger'));
        edit.onclick = this._edit_password.bind(this);
        field.insert(edit);
        div.insert(field);
        elem.insert(div);
        return false;
    },

    _insert_notification: function(elem, fieldname) {
        var span = new Element('span', {'id': fieldname+'-notification', 'style': 'display: none;'});
        var img = new Element('img', {'src': '/images/indicator.gif', 'alt': GT._('Vennligst vent')});
        span.insert(img);
        span.insert(GT._(" Vennligst vent..."));
        elem.insert(span);
    },

    _edit_language_submit: function(cancel_func) {
        var message_box = new MessageBox('edit-message');
        //var val = new Validator(message_box);
        //if (!val.validate('text-language')) {
        //    return false;
        //}

        var json = {};
        json.language = $('sel-language').getValue();
        Cookie.set_second('LearningModuleLang', json.language, '', '/');
        return this._submit_json(this.user.usertid, json, 'language', cancel_func);
    },

    _edit_language_cancel: function(fieldname /* dummy */) {
        var div = $('text-language');
        div.update();
        var edit = new Element('a', {'href': '#'}).insert(GT._('rediger'));
        edit.onclick = this._edit_language.bind(this);
        div.insert(edit);
        this._insert_language_field(div);
        return false;
    },

    _edit_language: function() {
        var div = $('text-language');

        var langs = {
            'nob': 'Norsk bokmål',
            'nno': 'Norsk nynorsk',
            'dan': 'Dansk',
            'eng': 'English',
            'swe': 'Svenska'
        };

        div.update();
        var dd = new Element('select', {'id': 'sel-language', 'name': 'language'});
        for (var lcode in langs) {
            if (langs.hasOwnProperty(lcode)) {
                op = new Element('option', {'value': lcode});
                op.insert(langs[lcode]);
                if (lcode === this.user.language) {
                    op.setAttribute('selected', 'selected');
                }
                dd.insert(op);
            }
        }

        div.insert(dd);
        var ok = new Element('input', {'type': 'button', 'value': GT._('Lagre')});
        ok.addClassName('button');
        ok.onclick = this._edit_language_submit.bind(this, this._edit_language_cancel.bind(this));
        div.insert(ok);

        div.insert(' ');
        var a = new Element('input', {type: 'button', value: GT._('Avbryt')});
        a.addClassName('button');
        a.onclick = this._edit_language_cancel.bind(this);
        div.insert(a);
        this._insert_notification(div, 'language');
        return false;
    },

    _edit_password_cancel: function(fieldname /* dummy */) {
        var div = $('text-password');
        div.update();
        var edit = new Element('a', {'href': '#'}).insert(GT._('rediger'));
        edit.onclick = this._edit_password.bind(this);
        div.insert(edit);
        return false;
    },

    _edit_password: function() {
        var div = $('text-password');
        div.update();
        // Legg til felt for gamelt passord + 2 ganger nytt passord
        // pluss validering av passord
        div.insert(new Element('input', {'type': 'hidden', 'name': 'validate[]',
            'value': 'oldpassword:validate_nbstring:{max_length: 20, min_length: 6}:'+GT._('Du må oppgi ditt gammelt passord.')}));
        div.insert(new Element('input', {'type': 'hidden', 'name': 'validate[]',
            'value': 'password:validate_nbstring:{max_length: 20, min_length: 6}:'+GT._('Passordet må være 6-20 tegn.')}));
        div.insert(new Element('input', {'type': 'hidden', 'name': 'validate[]',
            'value': 'password2:validate_equals:{otherfield: \'password\'}'}));
        div.insert(new Element('br'));
        div.insert(new Element('label', {}).insert(GT._("Gammelt passord")));
        var oldpassword = new Element('input', {'type': 'password', 'id': 'oldpassword', 'name': 'oldpassword'});
        div.insert(oldpassword);
        div.insert(new Element('br'));
        div.insert(new Element('label', {}).insert(GT._("Nytt passord")));
        div.insert(new Element('input', {'type': 'password', 'id': 'password', 'name': 'password'}));
        div.insert(new Element('br'));
        div.insert(new Element('label', {}).insert(GT._("Gjenta passord")));
        div.insert(new Element('input', {'type': 'password', 'id': 'password2', 'name': 'password2'}));
        div.insert(' ');
        var ok = new Element('input', {'type': 'button', 'value': GT._('Lagre')});
        ok.addClassName('button');
        ok.onclick = this._edit_password_submit.bind(this, this._edit_password_cancel.bind(this));
        div.insert(ok);
        div.insert(' ');
        var a = new Element('input', {'type': 'button', 'value': GT._('Avbryt')});
        a.addClassName('button');
        a.onclick = this._edit_password_cancel.bind(this);
        div.insert(a);
        oldpassword.focus();
        this._insert_notification(div, 'password');
        return false;
    },

    _edit_field: function(fieldname, cancel_func /* Validation function */) {
        var div = $('text-'+fieldname);
        div.update();
        var edit = new Element('input', {'type': 'text', 'id': fieldname, 'value': this.user[fieldname]});
        div.insert(edit);
        var hidden = new Element('input', {'type': 'hidden', 'value': fieldname+':validate_nbstring:{max_length: 60, min_length: 1}', 'name': 'validate[]'});
        div.insert(hidden);
        div.insert(" ");
        var ok = new Element('input', {'type': 'button', 'value': GT._('Lagre')});
        ok.addClassName('button');
        ok.onclick = this._edit_field_submit.bind(this, fieldname, cancel_func);
        div.insert(ok);
        div.insert(" ");
        var a = new Element('input', {'type': 'button', 'value': GT._('Avbryt')});
        a.addClassName('button');
        if (cancel_func === null) {
            a.onclick = this._edit_field_cancel.bind(this, fieldname);
        } else {
            a.onclick = cancel_func;
        }
        div.insert(a);
        edit.focus();
        this._insert_notification(div, fieldname);
        return false;
    },

    _edit_field_cancel: function(fieldname) {
        this._update_field_value($('text-'+fieldname), fieldname);
        return false;
    },

    _edit_field_submit: function(fieldname, cancel_func) {
        var message_box = new MessageBox('edit-message');
        var val = new Validator(message_box);
        if (!val.validate('text-'+fieldname)) {
            return false;
        }
        return this._submit_field(this.user.usertid, fieldname, cancel_func);
    },

    _edit_password_submit: function(cancel_func) {
        var message_box = new MessageBox('edit-message');
        var val = new Validator(message_box);
        if (!val.validate('text-password')) {
            return false;
        }
        var json = {};
        json.password = $F('password');
        json.oldpassword = $F('oldpassword');

        return this._submit_json(this.user.usertid, json, 'password', cancel_func);
    },

    _submit_json: function(usertid, json, fieldname, cancel_func) {
        var auth = Cookie.get('RavnAuth');
        var request = {
            method: 'POST',
            postBody: Object.toJSON(json),
            onSuccess: this._change_field_success.bind(this, usertid, fieldname, cancel_func),
            onFailure: this._change_field_failure.bind(this, usertid, fieldname, cancel_func),
            onCreate: this._show_notification.bind(this, fieldname),
            onComplete: this._hide_notification.bind(this, fieldname),
            evalJSON: true
        };
        if (auth && auth.length > 0) {
            var headers = ['X-Ravn-Authorization', 'RAVN '+auth];
            request.requestHeaders = headers;
        }
        var tmp = new Ajax.Request(this.elevdata_api+'/user/'+usertid+'?_method=put', request);
        return false;
    },

    _submit_field: function(usertid, fieldname, cancel_func) {
        var json = {};
        json[fieldname] = $F(fieldname);
        return this._submit_json(usertid, json, fieldname, cancel_func);
    },

    _show_notification: function(fieldname) {
        $(fieldname+'-notification').show();
    },

    _hide_notification: function(fieldname) {
        $(fieldname+'-notification').hide();
    },

    _change_field_success: function(usertid, fieldname, cancel_func, transport) {
        var res = transport.responseJSON;
        this.user[fieldname] = res[fieldname];
        var message_box = new MessageBox('edit-message');
        message_box.show_message(GT._("Endringen har blitt lagret"), "melding");
        if (cancel_func !== null) {
            cancel_func(fieldname);
        } else {
            // Default-cancel-funksjon
            this._edit_field_cancel(fieldname);
        }
    },

    _change_field_failure: function(usertid, fieldname, cancel_func, transport) {
        var json = transport.responseJSON;
        var message_box = new MessageBox('edit-message');
        message_box.show_message(json.errorMessage, "feilmelding");
        /* Ikke fjern redigeringsfeltene - cancel_func kalles ikke */
    }
};

// Cappelen
UserListHandler = Class.create();
UserListHandler.prototype = {
    // mode kan være teacher eller student (for å kunne bruke samme
    // klasse fra både elever.html og lærere.html)
    initialize: function(elevapi_data, school_id, select_id, mode) {
        this.message_box = new MessageBox('feilmelding');
        this.school_id = school_id;
        this.elevapi_data = elevapi_data;
        this.select_id = select_id;
        this.mode = mode;
        this.current_user = null;
    },

    // group_id kan enten være 'all' (alle elever på skolen)
    // eller en integer med gruppe-id (alle elever som tilhører en gruppe
    // TODO: Denne funksjonen kan utvides med offset=XXX og row_count=YYY
    // og muligens også en spørring etter navnet.
    update_list: function(group_id) {
        if (this.mode != 'student' && this.mode != 'teacher') {
            return false;
        }
        if (!group_id) {
            if (this.mode == 'student' && $(this.select_id)) {
                group_id = $(this.select_id).getValue();
            } else {
                group_id = 'all';
            }
        }
        if (group_id == 'all') {
            var url = this.elevapi_data+'/school/'+this.school_id+'/'+this.mode+'s';
            var request = { method: 'get',
                onSuccess: this.list_success.bind(this),
                onFailure: this.list_failure.bind(this),
                onCreate: function() { $('list-notification').show(); },
                onComplete: function() { $('list-notification').hide(); },
                evalJSON: true};
            var auth = Cookie.get('RavnAuth');
            if (auth && auth.length > 0) {
                var headers = ['X-Ravn-Authorization', 'RAVN '+auth];
                request.requestHeaders = headers;
            }
            var tmp = new Ajax.Request(url, request);
        }
        return false;
    },

    list_success: function(transport) {
        var users = transport.responseJSON;
        var t_cont = $(this.mode+'-table');
        t_cont.update(); // Slett innhold
        this.users = {};
        if (users) {
            var table = new Element('table');
            table.insert(new Element('thead').insert('<tr><th>' + GT._('Brukernavn') +
                                                     '</th><th>' + GT._('Fornavn') +
                                                     '</th><th>' + GT._('Etternavn') +
                                                     '</th></tr>'));
            var tbody = new Element('tbody');
            users = users.toArray();
            var t = new Template('<tr id="row-#{usertid}"><td id="usershortname-#{usertid}">#{usershortname}</td><td id="firstname-#{usertid}">#{firstname}</td><td id="lastname-#{usertid}">#{lastname}</td><td id="edit-#{usertid}"></td></tr>');
            var i;
            for (i = 0; i < users.length; i++) {
                var s = users[i];
                this.users[s.usertid] = users[i];
                tbody.insert(t.evaluate(
                    {usershortname: s.usershortname.escapeHTML(),
                     firstname: s.firstname.escapeHTML(),
                     lastname: s.lastname.escapeHTML(),
                     usertid: s.usertid}));
            }
            table.insert(tbody);
            t_cont.insert(table);

            for (i = 0; i < users.length; i++) {
                var a = new Element('a', {href: '#', style: ''}).insert(GT._('Rediger'));
                a.onclick = this.change_user.bind(this, users[i].usertid);
                $('edit-'+users[i].usertid).update(a);
            }
        }
    },

    list_failure: function(transport) {
        alert("Det oppstod en intern feil.");
    },

    change_user: function(usertid) {
        // TODO: Legg til toggling av formen når en annen rediger-lenke klikkes
        var handler = new TeacherStudentHandler(this.elevapi_data); // For gjenbruk av kode
        if (this.current_user && $('edit-row-'+this.current_user)) {
            $('edit-row-'+this.current_user).remove();
        }
        this.current_user = null;
        if (this.users[usertid]) {
            this.current_user = usertid;
            var u = this.users[usertid];
            var div = $('row-'+usertid);
            div.insert({after: '<tr id="edit-row-'+u.usertid+'"><td colspan="4"><div id="edit-content-'+u.usertid+'"></div></td></tr>'});
            var editdiv = $('edit-content-'+usertid);
            editdiv.insert('<div style="display: none;" id="edit-message"></div>');
            var form = new Element('form', {method: 'post', action: '#', id: 'edit-form'});
            var id_prefix = 'edit-';
            form.onsubmit = this.change_user_post.bind(this, usertid, id_prefix);
            form.insert(handler._get_register_form(id_prefix, u.usershortname, u.firstname, u.lastname, true));
            var okbtn = new Element('input', {type: 'submit', value: GT._('Lagre'), id: 'save-user-button'});
            okbtn.addClassName('button');
            form.insert(okbtn);
            var cancelbtn = new Element('input', {type: 'button', value: GT._('Avbryt'), id: 'avbryt-user-button'});
            cancelbtn.addClassName('button');
            cancelbtn.onclick = function() { $('edit-row-'+usertid).remove(); };
            form.insert(cancelbtn);
            form.insert(new Element('span', {id: 'rediger-melding', style: 'display: none;'}).insert('<img src="/images/indicator.gif" alt="Vennligst vent..." />' +  GT._('Vennligst vent...')));
            editdiv.insert(form);
        }
    },

    change_user_post: function(usertid, id_prefix) {
        // TODO: validering
        var message_box = new MessageBox('edit-message');
        var val = new Validator(message_box);
        if (!val.validate('edit-form')) {
            return false;
        }
        var json = {
            firstname: $(id_prefix+'firstname').value,
            lastname: $(id_prefix+'lastname').value,
            usershortname: $(id_prefix+'usershortname').value
        };
        if ($(id_prefix+'password').value && $(id_prefix+'password2').value &&
            $(id_prefix+'password').value == $(id_prefix+'password2').value &&
            $(id_prefix+'password').value.strip().length >= 6) {
            json.password = $(id_prefix+'password').value.strip();
        }
        var auth = Cookie.get('RavnAuth');
        var request = {
            method: 'POST',
            postBody: Object.toJSON(json),
            onSuccess: this.change_user_post_success.bind(this, usertid),
            onFailure: this.change_user_post_failure.bind(this, usertid),
            onCreate: function() { $('rediger-melding').show(); },
            onComplete: function() { $('rediger-melding').hide(); },
            evalJSON: true
        };
        if (auth && auth.length > 0) {
            var headers = ['X-Ravn-Authorization', 'RAVN '+auth];
            request.requestHeaders = headers;
        }
        var tmp = new Ajax.Request('/__elevapi/user/'+usertid+'?_method=put', request);
        return false;
    },

    change_user_post_success: function(usertid, transport) {
        $('edit-row-'+usertid).remove();
        this.current_user = null;
        this.update_list();
    },

    change_user_post_failure: function(usertid, transport) {
        var msg = GT._("Kunne ikke lagre (intern feil)");
        if (transport && transport.responseJSON && transport.responseJSON.errorMessage) {
            msg = msg + ": " + transport.responseJSON.errorMessage;
        }
        message_box = new MessageBox('edit-message');
        message_box.show_message(msg, "feilmelding");
    }
};

