/**
 * Title:       Event handlers
 * 
 * Project:     mikeshomepage 4.0
 * Created by:  Mike
 * Created on:  04.12.2006
*/

/**
 * Error messages
 */
var msgPasswordInvalid = 'Passwort ist ungültig. Es muss zwischen 8 und 16 Zeichen bestehen und sollte Ziffern, Buchstaben und Sonderzeichen enthalten.';
var msgNoReceiverEmail = 'Keine Empfänger E-Mail-Adresse eingegeben.';
var msgReceiverEmailInvalid = 'Empfänger E-Mail-Adresse ist ungültig.';
var msgNoSenderEmail = 'Keine Absender E-Mail-Adresse eingegeben.';
var msgSenderEmailInvalid = 'Absender E-Mail-Adresse ist ungültig.';
var msgCommentTooLong = 'Der Kommentar darf maximal 250 Zeichen umfassen.';
var msgNoEmail = 'Keine E-Mail-Adresse eingegeben.';
var msgEmailInvalid = 'E-Mail-Adresse ist ungültig.';
var msgURLInvalid = 'Homepage-URL ist ungültig.';
var msgNoSubject = 'Kein Betreff eingegeben.';
var msgNoEmailBody = 'Kein E-Mail-Text eingegeben.';
var msgNoNewsletterBody = 'Kein Newsletter-Inhalt eingegeben.';
var msgNoPassword = 'Kein Passwort eingegeben.';

/**
 * Global variables
 */
var globalAlbumId = null;

/**
 * Recommend page handler class
 */
var RecommendPageHandler = {
    /**
     * Recommend page button action
     */
    recommendPageAction: function() {
       if ($('box-recommend').style.display=='none') {
            new Effect.SlideDown('box-recommend');
       }
    },
    /**
     * Recommend page send action
     */
    recommendPageSendAction: function() {
        success = false;
        // check for receiver email
        if (!Field.present('recommend-receiver-email')) {
            msg = msgNoReceiverEmail;
            element = $('recommend-receiver-email');
        // check for valid email address
        } else if (!validateEmail($('recommend-receiver-email').value)) {
            msg = msgReceiverEmailInvalid
            element = $('recommend-receiver-email');
        // check for sender
        } else if (!Field.present('recommend-sender-email')) {
            msg = msgNoSenderEmail
            element = $('recommend-sender-email');
        // check for valid sender address
        } else if (!validateEmail($('recommend-sender-email').value)) {
            msg = msgSenderEmailInvalid
            element = $('recommend-sender-email');
        // check for comment text length
        } else if ($('recommend-comment').value.length>250) {
            msg = msgCommentTooLong
            element = $('recommend-comment');
        } else {
            success = true;
        }
        if (success) {
            $('recommend-message').innerHTML = '';
            new Ajax.Request(ajaxReqRecommendPage, {postBody:  Form.serialize($('form-recommend')),
                                                    onLoading: this.recommendPageOnLoadingHandler,
                                                    onFailure: this.recommendPageErrorResponseHandler,
                                                    onSuccess: this.recommendPageResponseHandler});
        } else {
            $('recommend-message').innerHTML = msg;
            element.style.backgroundColor='white';
            new Effect.Highlight(element, {afterFinish: function(){element.style.backgroundColor='white';}});
            // select element
            // focus() instead of select() because select() does not work in Opera
            element.focus();
        }
    },
    /**
     * The recommend page error response handler, shows the error message
     * @param r The response
     */
    recommendPageErrorResponseHandler: function(r) {
        Form.enable($('form-recommend')); 
        hideLoading($('recommend-loading-icon'), $('button-recommend'))
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqRecommendPage);    
    },
    /** 
     * The send email onLoading handler, disables the form
     * and shows the loading icon
     */
    recommendPageOnLoadingHandler: function() { 
        Form.disable($('form-recommend'));
        showLoading($('recommend-loading-icon'), $('button-recommend'));
    },
    /**
     * The recommend page response handler, shows the response message
     * @param r The response
     */
    recommendPageResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'recommendPage');
    }
}
/**
 * Link action handler class
 */
var LinkActionHandler = {
    /**
     * Home link
     */
    logoAction: function() {
        window.location.href = '/';
    },
    /**
     * MYkeshomepage register link action
     */
    lnkRegisterAction: function() {
        if ($('box-register').style.display=='none') {
            new Draggable('box-register');
            new Effect.Appear('box-register', {afterFinish: function() {Field.activate($('register-email'));}});
        }
    },
    /**
     * MYkeshomepage password lost action
     */
    lnkPasswordLostAction: function() {
        if ($('box-password-lost').style.display=='none') {
            var loginEmail = $('login-email').value;
            if (loginEmail!='E-Mail-Adresse') {
                $('password-lost-email').value = loginEmail;
            }
            new Draggable('box-password-lost');
            new Effect.Appear('box-password-lost', {afterFinish: function() {Field.activate($('password-lost-email'));}});
        }
    },
    /**
     * MYkeshomepage account link action
     */
    lnkAccountAction: function() {
        if ($('box-account').style.display=='none') {
            if ($('delete-account')) {
                $('delete-account').style.display = 'none';
            }
            new Draggable('box-account');
            new Effect.Appear('box-account', {afterFinish: function() {Field.activate($('update-account-password'));}});
        }
    },
    /**
     * MYkeshomepage delete account link action
     */
    lnkDeleteAccountAction: function() {
        if ($('delete-account').style.display=='none') {
            new Effect.SlideDown('delete-account');
        }
    },
    /**
     * MYkeshomepage close link action
     * @param effect The effect
     * @param el The element
     */
    lnkCloseAction: function(el, effect) {
        // Effect.SlideUp
        if (effect=='slideUp') {
            new Effect.SlideUp(el);
        // Effect.Puff
        } else if (effect=='puff') {
            new Effect.Puff(el);
        // default is Fade    
        } else {
            new Effect.Fade(el);
        }
        
    }
}
/**
 * Send contact email handler class
 */
var SendEmailHandler = {
    /**
     * Checks for propely filled fields and sends email request
     * or returns an alert box
     */
    sendEmailAction: function() {
        success = false;
        // check for email
        if (!Field.present('email')) {
            msg = msgNoEmail;
            element = $('email');
        // check for valid email address
        } else if (!validateEmail($('email').value)) {
            msg = msgEmailInvalid;
            element = $('email');
        // check for homepage url
        } else if (Field.present('homepage') && !validateURL($('homepage').value)) {
            msg = msgURLinvalid;
            element = $('homepage');
        // check for subject
        } else if (!Field.present('subject')) {
            msg = msgNoSubject;
            element = $('subject');
        // check for body
        } else if (!Field.present('body')) {
            msg = msgNoEmailBody;
            element = $('body');
        } else {
            success = true;
        }
        // fields ok, send request
        if (success) {
            $('contact-message').innerHTML = '';
            new Ajax.Request(ajaxReqEmail, {postBody:  Form.serialize($('form-email')), 
                                            onLoading: this.sendEmailOnLoadingHandler,
                                            onSuccess: this.sendEmailResponseHandler,
                                            onFailure: this.sendEmailErrorResponseHandler});
        // fields invalid, show message
        } else {
            $('contact-message').innerHTML = msg;
            element.style.backgroundColor='white';
            new Effect.Highlight(element, {afterFinish: function(){element.style.backgroundColor='white';}});
            // select element
            // focus() instead of select() because select() does not work in Opera
            element.focus();
        }
    },
    /** 
     * The send email onLoading handler, disables the form
     * and shows the loading icon
     */
    sendEmailOnLoadingHandler: function() { 
        Form.disable($('form-email'));
        showLoading($('contact-loading-icon'), $('button-send-email'));
    },
    /**
     * The send email response handler, shows the response message
     * @param r The response
     */
    sendEmailResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'sendEmail');
    },
    /**
     * The send email error response handler, enables the form 
     * and shows the error message
     * @param r The response
     */
    sendEmailErrorResponseHandler: function(r) {
        Form.enable($('form-email')); 
        hideLoading($('contact-loading-icon'), $('button-send-email'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqEmail);    
    }
}
/**
 * Load album handler class
 */
var LoadAlbumHandler = {
    /**
     * Sends the load images request
     */
    loadAlbum: function () {
        if ($('select-album').value) {
            // hide image container
            $('image-container').style.display = 'none';
            // send ajax request
            new Ajax.Request(ajaxReqAlbumLoader, {postBody:  'albumPath='+$('select-album').value, 
                                                  onLoading: this.loadAlbumOnLoadingHandler,
                                                  onSuccess: this.loadAlbumResponseHandler,
                                                  onFailure: this.loadAlbumErrorResponseHandler});
        }
    },
    /**
     *  The load album onLoading handler
     */
    loadAlbumOnLoadingHandler: function() {
        showLoading($('privacy-loading-icon'));
    },
    /**
     * The load album response handler, shows the response message
     * @param r The response
     */
    loadAlbumResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'loadAlbum');
    },
    /**
     * The load album error response handler
     * @param r The response
     */
    loadAlbumErrorResponseHandler: function(r) {
        hideLoading($('privacy-loading-icon'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqLoadAlbum);    
    }
}
/**
 * Load scripts handler class
 */
var LoadScriptsHandler = {
    /**
     * Sends the load images request
     */
    loadScripts: function () {
        if ($('select-scripts').value) {
            // hide scripts container
            $('scripts-container').style.display = 'none';
            // send ajax request
            new Ajax.Request(ajaxReqLoadScripts, {postBody:  'subject='+$('select-scripts').value, 
                                                  onLoading: this.loadScriptsOnLoadingHandler,
                                                  onSuccess: this.loadScriptsResponseHandler,
                                                  onFailure: this.loadScriptsErrorResponseHandler});
        }
    },
    /**
     *  The load scripts onLoading handler
     */
    loadScriptsOnLoadingHandler: function() {
        showLoading($('scripts-loading-icon'));
    },
    /**
     * The load scripts response handler, shows the response message
     * @param r The response
     */
    loadScriptsResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'loadScripts');
    },
    /**
     * The load scripts error response handler
     * @param r The response
     */
    loadScriptsErrorResponseHandler: function(r) {
        hideLoading($('scripts-loading-icon'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqScripts);    
    }
}
/**
 * Admin handler class
 */
var AdminHandler = {
    /**
     * The sub pages
     */
    selectStatistics: 'statistics',
    selectNewsletter: 'newsletter',
    selectAlbumEditor: 'albumEditor',
    /**
     * Sends the sub page request
     */
    load: function () {
        if ($('select-admin').value) {
            // hide statistics container
            $('admin-container').style.display = 'none';
			var chkboxValue = $('select-admin').value;
            // statistics
            if (chkboxValue==this.selectStatistics) {
                // send ajax request
                new Ajax.Request(ajaxReqStatisticsLoader, {onLoading: this.onLoadingHandler,
	                                                       onSuccess: this.responseHandler,
	                                                       onFailure: this.errorResponseHandler});
            // newsletter
            } else if (chkboxValue==this.selectNewsletter) {
                // send ajax request
                new Ajax.Request(ajaxReqNewsletterLoader, {onLoading: this.onLoadingHandler,
	                                                       onSuccess: this.responseHandler,
	                                                       onFailure: this.errorResponseHandler});
            // album editor
            } else if (chkboxValue==this.selectAlbumEditor) {
                // send ajax request
                new Ajax.Request(ajaxReqAlbumEditor, {onLoading: this.onLoadingHandler,
	                                                  onSuccess: this.responseHandler,
	                                                  onFailure: this.errorResponseHandler});
            }
        }
    },
    /**
     * Checks for propely filled fields and sends newsletter request
     * or returns an alert box
     */
    sendNewsletterAction: function() {
        success = false;
        // check for subject
        if (!Field.present('subject')) {
            msg = msgNoSubject;
            element = $('subject');
        // check for body
        } else if (!Field.present('body')) {
            msg = msgNoNewsletterBody;
            element = $('body');
        } else {
            success = true;
        }
        // fields ok, send request
        if (success) {
            if (confirm('Newsletter an '+$('countOfSubscribers').value+' Abonennten versenden?')) {
                $('send-newsletter-message').innerHTML = '';
                new Ajax.Request(ajaxReqSendNewsletter, {postBody: Form.serialize($('form-newsletter')),
                                                         onLoading: this.sendNewsletterOnLoadingHandler,
                                                         onSuccess: this.sendNewsletterResponseHandler,
                                                         onFailure: this.sendNewsletterErrorResponseHandler});
            }
        // fields invalid, show message
        } else {
            $('send-newsletter-message').innerHTML = msg;
            element.style.backgroundColor='white';
            new Effect.Highlight(element, {afterFinish: function(){element.style.backgroundColor='white';}});
            // select element
            // focus() instead of select() because select() does not work in Opera
            element.focus();
        }
    },    
    /**
     *  The load admin onLoading handler
     */
    onLoadingHandler: function() {
        showLoading($('admin-loading-icon'));
    },
    /**
     * The load admin response handler, shows the response message
     * @param r The response
     */
    responseHandler: function(r) {
        evaluateResponse(r.responseText, 'loadAdmin');
    },
    /**
     * The load admin error response handler
     * @param r The response
     */
    errorResponseHandler: function(r) {
        hideLoading($('admin-loading-icon'));
        if ($('select-admin').value==this.selectStatistics) {
            showAjaxErrorMessage(r.status, r.statusText, ajaxReqStatistics);    
        } else if ($('select-admin').value==this.selectNewsletter) {
            showAjaxErrorMessage(r.status, r.statusText, ajaxReqNewsletterFactory);    
        }
    },
    /**
     *  The send newsletter onLoading handler
     */
    sendNewsletterOnLoadingHandler: function() {
        Form.disable($('form-newsletter'));
        showLoading($('send-newsletter-loading-icon'), $('button-send-newsletter'));
    },
    /**
     * The send newsletter response handler, shows the response message
     * @param r The response
     */
    sendNewsletterResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'sendNewsletter');
    },
    /**
     * The send newsletter error response handler
     * @param r The response
     */
    sendNewsletterErrorResponseHandler: function(r) {
        Form.enable($('form-newsletter'));
        hideLoading($('send-newsletter-loading-icon'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqNewsletterFactory);    
    },
    /**
     * Show a selected newsletter from database
     */
    showNewsletterAction: function() {
        if ($('select-newsletters').value) {
            $('send-newsletter-message').innerHTML = '';
            new Ajax.Request(ajaxReqGetNewsletter, {postBody: Form.serialize($('form-newsletter')),
                                                    onLoading: this.showNewsletterOnLoadingHandler,
                                                    onSuccess: this.showNewsletterResponseHandler,
                                                    onFailure: this.showNewsletterErrorResponseHandler});
        }
    },
    /**
     *  The show newsletter onLoading handler
     */
    showNewsletterOnLoadingHandler: function() {
        Form.disable($('form-newsletter'));
        showLoading($('send-newsletter-loading-icon'), $('button-send-newsletter'));
    },
    /**
     * The show newsletter response handler, shows the response message or evalutes the xml
     * @param r The response
     */
    showNewsletterResponseHandler: function(r) {
        if (r.responseXML!=null) {
            response = r.responseXML;
        } else {
            response = r.responseText;
        }
        evaluateResponse(response, 'showNewsletter');
    },
    /**
     * The show newsletter error response handler
     * @param r The response
     */
    showNewsletterErrorResponseHandler: function(r) {
        Form.enable($('form-newsletter'));
        hideLoading($('send-newsletter-loading-icon'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqNewsletterFactory);    
    },
    /**
     * Update an album
     * @param albumId The album id
     */
    updateAlbumAction: function(albumId) {
        if (albumId) {
            globalAlbumId = albumId;
            new Ajax.Request(ajaxReqAlbumEditor, {postBody: Form.serialize($('form-album-'+albumId)),
                                                  onLoading: this.updateAlbumOnLoadingHandler,
                                                  onSuccess: this.updateAlbumResponseHandler,
                                                  onFailure: this.updateAlbumErrorResponseHandler});
        }
    },
    /**
     *  The update album onLoading handler
     */
    updateAlbumOnLoadingHandler: function() {
    },
    /**
     * The update album response handler, shows the response message
     * @param r The response
     */
    updateAlbumResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'updateAlbum');
    },
    /**
     * The update album error response handler
     * @param r The response
     */
    updateAlbumErrorResponseHandler: function(r) {
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqAlbumEditor);
    }
}
/**
 * Account handler class
 */
var AccountHandler = {
    /**
     * Sends the login request
     */
    loginAction: function() {
        success = false;
        // check for email
        if (!Field.present('login-email')) {
            msg = msgNoEmail;
            element = $('login-email');
        // check for password
        } else if (!Field.present('login-password')) {
            msg = msgNoPassword;
            element = $('login-password');
        } else {
            success = true;
        }
        // fields ok, send request
        if (success) {
            $('login-message').innerHTML = '';
            // send ajax request
            new Ajax.Request(ajaxReqLogin, {postBody:  Form.serialize($('form-login')),
                                            onLoading: this.loginOnLoadingHandler,
                                            onSuccess: this.loginResponseHandler,
                                            onFailure: this.loginErrorResponseHandler});
        } else {
            $('login-message').innerHTML = msg;
            element.style.backgroundColor='white';
            new Effect.Highlight(element, {afterFinish: function(){element.style.backgroundColor='white';}});
            // select element
            // focus() instead of select() because select() does not work in Opera
            element.focus();
        }
    },
    /**
     *  The load scripts onLoading handler
     */
    loginOnLoadingHandler: function() {
        showLoading($('login-loading-icon'), $('button-login'));
    },
    /**
     * The load scripts response handler, shows the response message
     * @param r The response
     */
    loginResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'login');
    },
    /**
     * The load scripts error response handler
     * @param r The response
     */
    loginErrorResponseHandler: function(r) {
        hideLoading($('login-loading-icon'), $('button-login'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqLogin);    
    },
    /**
     * Sends the register account request
     */
    registerAccount: function () {
        success = false;
        // check for email
        if (!Field.present('register-email')) {
            msg = msgNoEmail;
            element = $('register-email');
        // check for valid email address
        } else if (!validateEmail($('register-email').value)) {
            msg = msgEmailInvalid;
            element = $('register-email');
        // check for password
        } else if (!Field.present('register-password')) {
            msg = msgNoPassword;
            element = $('register-password');
        // check for valid password
        } else if (!validatePassword($('register-password').value)) {
            msg = msgPasswordInvalid;
            element = $('register-password');
        } else {
            success = true;
        }
        // fields ok, send request
        if (success) {
            $('register-account-message').innerHTML = '';
            // send ajax request
            new Ajax.Request(ajaxReqRegisterAccount, {postBody:  Form.serialize($('form-register-account')), 
                                                      onLoading: this.registerAccountOnLoadingHandler,
                                                      onSuccess: this.registerAccountResponseHandler,
                                                      onFailure: this.registerAccountErrorResponseHandler});
        // fields invalid, show message
        } else {
            $('register-account-message').innerHTML = msg;
            element.style.backgroundColor='white';
            new Effect.Highlight(element, {afterFinish: function(){element.style.backgroundColor='white';}});
            // select element
            // focus() instead of select() because select() does not work in Opera
            element.focus();
        }
    },
    /**
     *  The register account onLoading handler
     */
    registerAccountOnLoadingHandler: function() {
        showLoading($('register-account-loading-icon'), $('button-register-account'));
    },
    /**
     * The register account response handler, shows the response message
     * @param r The response
     */
    registerAccountResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'registerAccount');
    },
    /**
     * The register account error response handler
     * @param r The response
     */
    registerAccountErrorResponseHandler: function(r) {
        hideLoading($('register-account-loading-icon'), $('button-register-account'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqRegisterAccount);    
    },
    /**
     * Sends the update account request
     */
    updateAccount: function () {
        success = false;
        // check for valid password
        if (Field.present('update-account-password') && !validatePassword($('update-account-password').value)) {
            msg = msgPasswordInvalid;
            element = $('update-account-password');
        } else {
            success = true;
        }
        // fields ok, send request
        if (success) {
            $('update-account-message').innerHTML = '';
            // send ajax request
            new Ajax.Request(ajaxReqUpdateAccount, {postBody:  Form.serialize($('form-update-account')), 
                                                    onLoading: this.updateAccountOnLoadingHandler,
                                                    onSuccess: this.updateAccountResponseHandler,
                                                    onFailure: this.updateAccountErrorResponseHandler});
        // fields invalid, show message
        } else {
            $('update-account-message').className = 'message-error-nomargin small';
            $('update-account-message').innerHTML = msg;
            $('update-account-message').style.display = 'none';
            // message block appears
            Effect.Appear($('update-account-message'), {duration: 0.5});
            element.style.backgroundColor='white';
            new Effect.Highlight(element, {afterFinish: function(){element.style.backgroundColor='white';}});
            // select element
            // focus() instead of select() because select() does not work in Opera
            element.focus();
        }
    },
    /**
     *  The update account onLoading handler
     */
    updateAccountOnLoadingHandler: function() {
        showLoading($('update-account-loading-icon'), $('button-update-account'));
    },
    /**
     * The update account response handler, shows the response message
     * @param r The response
     */
    updateAccountResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'updateAccount');
    },
    /**
     * The update account error response handler
     * @param r The response
     */
    updateAccountErrorResponseHandler: function(r) {
        hideLoading($('update-account-loading-icon'), $('button-update-account'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqUpdateAccount);    
    },
    /**
     * Sends the delete account request
     */
    deleteAccount: function () {
        // send ajax request
        new Ajax.Request(ajaxReqDeleteAccount, {postBody:  Form.serialize($('form-update-account')), 
                                                onLoading: this.deleteAccountOnLoadingHandler,
                                                onSuccess: this.deleteAccountResponseHandler,
                                                onFailure: this.deleteAccountErrorResponseHandler});
    },
    /**
     *  The delete account onLoading handler
     */
    deleteAccountOnLoadingHandler: function() {
        showLoading($('update-account-loading-icon'), $('button-update-account'));
    },
    /**
     * The delete account response handler, shows the response message
     * @param r The response
     */
    deleteAccountResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'deleteAccount');
    },
    /**
     * The delete account error response handler
     * @param r The response
     */
    deleteAccountErrorResponseHandler: function(r) {
        hideLoading($('update-account-loading-icon'), $('button-update-account'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqDeleteAccount);    
    },
    /**
     * Sends the recreate password request
     */
    recreatePassword: function () {
        success = false;
        // check for email
        if (!Field.present('password-lost-email')) {
            msg = msgNoEmail;
            element = $('password-lost-email');
        // check for valid email address
        } else if (!validateEmail($('password-lost-email').value)) {
            msg = msgEmailInvalid;
            element = $('password-lost-email');
        } else {
            success = true;
        }
        // fields ok, send request
        if (success) {
            $('password-lost-message').innerHTML = '';
            // send ajax request
            new Ajax.Request(ajaxReqRecreatePassword, {postBody:  Form.serialize($('form-password-lost')), 
                                                       onLoading: this.recreatePasswordOnLoadingHandler,
                                                       onSuccess: this.recreatePasswordResponseHandler,
                                                       onFailure: this.recreatePasswordErrorResponseHandler});
        // fields invalid, show message
        } else {
            $('password-lost-message').innerHTML = msg;
            element.style.backgroundColor='white';
            new Effect.Highlight(element, {afterFinish: function(){element.style.backgroundColor='white';}});
            // select element
            // focus() instead of select() because select() does not work in Opera
            element.focus();
        }
    },
    /**
     *  The recreate password onLoading handler
     */
    recreatePasswordOnLoadingHandler: function() {
        showLoading($('password-lost-loading-icon'), $('button-password-lost'));
    },
    /**
     * The recreate password response handler, shows the response message
     * @param r The response
     */
    recreatePasswordResponseHandler: function(r) {
        evaluateResponse(r.responseText, 'recreatePassword');
    },
    /**
     * The recreate password error response handler
     * @param r The response
     */
    recreatePasswordErrorResponseHandler: function(r) {
        hideLoading($('password-lost-loading-icon'), $('button-password-lost'));
        showAjaxErrorMessage(r.status, r.statusText, ajaxReqRecreatePassword);    
    }
}
/** 
 * Evalutes the AJAX response
 * @param r The response
 * @param type The request name
 */
var evaluateResponse = function(r, type) {
    // message with error code as prefix
    if ((typeof r)=='string' && r.charAt(1)=='#') {
        state = r.charAt(0);
        msg = r.substring(2);
        // response message state
        switch (state) {
            // code ERROR
            case '0':
                // request type
                switch (type) {
                    // sendEmail response
                    case 'sendEmail':
                        Form.enable($('form-email'));
                        hideLoading($('contact-loading-icon'), $('button-send-email'));
                        showMessage(msg);
                        break;
                    // recommendPage response
                    case 'recommendPage':
                        Form.enable($('form-recommend')); 
                        hideLoading($('recommend-loading-icon'), $('button-recommend'))
                        showMessage(msg);
                        break;
                    // registerAccount response
                    case 'registerAccount':
                        Form.enable($('form-register-account')); 
                        hideLoading($('register-account-loading-icon'), $('button-register-account'))
                        $('register-account-message').innerHTML = msg;
                        break;
                    // updateAccount response
                    case 'updateAccount':
                        Form.enable($('form-update-account')); 
                        hideLoading($('update-account-loading-icon'), $('button-update-account'))
                        $('update-account-message').innerHTML = msg;
                        break;
                    // deleteAccount response
                    case 'deleteAccount':
                        Form.enable($('form-update-account')); 
                        hideLoading($('update-account-loading-icon'), $('button-delete-account'))
                        $('update-account-message').innerHTML = msg;
                        break;
                    // recreatePassword response
                    case 'recreatePassword':
                        Form.enable($('form-password-lost')); 
                        hideLoading($('password-lost-loading-icon'), $('button-password-lost'))
                        $('password-lost-message').innerHTML = msg;
                        break;
                    // login response
                    case 'login':
                        hideLoading($('login-loading-icon'), $('button-login'))
                        $('login-message').innerHTML = msg;
                        $('login-email').style.backgroundColor='white';
                        new Effect.Highlight($('login-email'), {afterFinish: function(){$('login-email').style.backgroundColor='white';}});
                        Field.activate($('login-email'));
                        break;
                    // sendNewsletter response
                    case 'sendNewsletter':
                        Form.enable($('form-newsletter'));
                        hideLoading($('send-newsletter-loading-icon'), $('button-send-newsletter'));
                        showMessage(msg);
                        break;
                    // showNewsletter resopnse
                    case 'showNewsletter':
                        Form.enable($('form-newsletter'));
                        hideLoading($('send-newsletter-loading-icon'));
                        showMessage(msg);
                        break;
                    // unknown type
                    default:
                        showMessage(msg);
                }
                break;
            // code OK
            case '1':
                // request type
                switch (type) {
                    //  sendEmail response
                    case 'sendEmail':
                        Effect.Fade($('content-block'), {
                            afterFinish: function() {
                                // set message
                                $('content-block').innerHTML = '<p class="block">'+msg+'</p>';
                                // message appears
                                Effect.Appear($('content-block'));
                            }, 
                            duration: 0.5
                        });
                        break;
                    // recommendPage response
                    case 'recommendPage':
                        Effect.Fade($('box-recommend-inner'), {
                            afterFinish: function() {
                                // set message
                                $('box-recommend-inner').innerHTML = 'Die Empfehlung wurde erfolgreich an '+$('recommend-receiver-email').value+' versendet.';
                                // mesage appears
                                Effect.Appear($('box-recommend-inner'), {
                                    afterFinish: function() {
                                        // slide up box after 2.5 seconds
                                        window.setTimeout("new Effect.SlideUp('box-recommend')", 2500);
                                    }
                                });
                            },
                            duration: 0.5
                        });
                        break;
                    // registerAccount response
                    case 'registerAccount':
                        // register block disappears
                        Effect.Fade($('register-account-block'), {
                            afterFinish: function() {
                                // set message
                                $('register-account-block').innerHTML = '<div class="block">'+msg+'</div>';
                                // hide register account icon
                                $('lnk-register').style.display = 'none';
                                // message block appears
                                Effect.Appear($('register-account-block'), {
                                    afterFinish: function() {
                                        // fade box after 10 seconds
                                        window.setTimeout("new Effect.Fade('box-register')", 10000);
                                    },
                                    duration: 0.5
                                });
                            }, 
                            duration: 0.5
                        });
                        break;
                    // updateAccount response
                    case 'updateAccount':
                        hideLoading($('update-account-loading-icon'), $('button-update-account'))
                        $('update-account-message').style.display = 'none';
                        $('update-account-message').innerHTML = msg;
                        $('update-account-message').className = 'message-ok-nomargin small';
                        // message block appears
                        Effect.Appear($('update-account-message'), {duration: 0.5});
                        // fade box after 5 seconds
                        window.setTimeout("new Effect.Fade($('update-account-message'), {afterFinish: function() {$('update-account-message').className = 'message-error-nomargin small';},duration: 0.5})", 5000);
                        break;
                    // deleteAccount response
                    case 'deleteAccount':
                        // account block disappears
                        Effect.Fade($('update-account-block'), {
                            afterFinish: function() {
                                oldContent = $('update-account-block').innerHTML.value;
                                // set message
                                $('update-account-block').innerHTML = '<div class="block">'+msg+'</div>';
                                // message block appears
                                Effect.Appear($('update-account-block'), {
                                    afterFinish: function() {
                                        // fade box after 10 seconds
                                        window.setTimeout("new Effect.Fade('box-account')", 10000);
                                    },
                                    duration: 0.5
                                });
                            }, 
                            duration: 0.5
                        });
                        break;
                    // recreatePassword response
                    case 'recreatePassword':
                        // register block disappears
                        Effect.Fade($('password-lost-block'), {
                            afterFinish: function() {
                                // set message
                                $('password-lost-block').innerHTML = '<div class="block">'+msg+'</div>';
                                // hide password lost icon
                                $('lnk-password-lost').style.display = 'none';
                                // message block appears
                                Effect.Appear($('password-lost-block'), {
                                    afterFinish: function() {
                                        // fade box after 10 seconds
                                        window.setTimeout("new Effect.Fade('box-password-lost')", 10000);
                                    },
                                    duration: 0.5
                                });
                            }, 
                            duration: 0.5
                        });
                        break;
                    // loginResponse
                    case 'login':
                        // relocate to avoid performing action twice
                        if (document.location.href.indexOf('ConfirmAccountCreation')>-1 ||
                            document.location.href.indexOf('ConfirmAccountDeletion')>-1) {
                            document.location.href = '/';;
                        // reload page to refresh login status and menu
                        } else {
                            document.location.reload();
                        }
                        break;
                    // sendNewsletter response
                    case 'sendNewsletter':
                        var optionNode = document.createElement('option');
                        // get last newsletter id
                        var newsletters = $('select-newsletters').childNodes;
                        var countOfNewsletters = newsletters.length;
                        var maxId = -1;
                        for(i=0; i<countOfNewsletters; i++) {
                            if (newsletters[i].nodeType==1) {
                                var id = newsletters[i].value;
                                if (id>maxId) maxId = Number(id);
                            }
                        }
                        // add new newsletter option
                        optionNode.setAttribute('class', 'strong2');
                        optionNode.setAttribute('value', maxId+1);
                        var dateString = getDateString();
                        var textNode = document.createTextNode($('subject').value+' | '+dateString);
                        optionNode.appendChild(textNode);
                        optionNode.selected = true;
                        $('select-newsletters').appendChild(optionNode);
                        // increment newsletter counter
                        var countOfNewsletters = parseInt($('countOfNewsletters').innerHTML);
                        countOfNewsletters++
                        $('countOfNewsletters').innerHTML = String(countOfNewsletters);
                        // reset form and set message
                        Form.enable($('form-newsletter'));
                        $('send-newsletter-message').innerHTML = msg;
                        hideLoading($('send-newsletter-loading-icon'), $('button-send-newsletter'));
                        break;
                    // updateAlbum response
                    case 'updateAlbum':
                        // update the album name
                        var albumName = $('form-album-'+globalAlbumId).elements['album-name'].value;
                        $('album-'+globalAlbumId).innerHTML = albumName;
                        showMessage(msg);
                        break;
                    // unknown type
                    default:
                        showMessage(msg);
                }
                break;
            // other states or no error code
            default:
                // request type
                switch (type) {
                    // unknown type
                    default:
                        showMessage(msg);
                }
        }
    // default message
    } else {
        // request type
       switch (type) {
            // sendEmail response
            case 'sendEmail':
                Form.enable($('form-email'));
                hideLoading($('contact-loading-icon'), $('button-send-email'));
                showMessage(r);
                break;
            // loadAlbum response
            case 'loadAlbum':
                // append content
                $('image-container').innerHTML = r;
                // initialize lightbox
                initLightbox();
                // let container appear
                Effect.Appear($('image-container'), {
                    afterFinish: function() {
                        if ($('privacy-loading-icon')) hideLoading($('privacy-loading-icon'));
                    }
                });
                break;
            // recommendPage response
            case 'recommendPage':
                Form.enable($('form-recommend'));
                hideLoading($('recommend-loading-icon'), $('button-recommend'))
                showMessage(r);
                break;
            // loadScripts response
            case 'loadScripts':
                // append content
                $('scripts-container').innerHTML = r;
                // let container appear
                Effect.Appear($('scripts-container'), {
                    afterFinish: function() {
                        if ($('scripts-loading-icon')) hideLoading($('scripts-loading-icon'));
                    }
                });
                break;
            // loadAdmin response
            case 'loadAdmin':
                // append content
                $('admin-container').innerHTML = r;
                // let container appear
                Effect.Appear($('admin-container'), {
                    afterFinish: function() {
                        if ($('admin-loading-icon')) hideLoading($('admin-loading-icon'));
                    }
                });
                // initalize lightbox for album images
            	initLightbox();
                // add event handlers
                EventHandlerFactory.addEventHandlers();
                break;
            // sendNewsletter response
            case 'sendNewsletter':
                showMessage(r);
                break;
            // registerAccount response
            case 'registerAccount':
                Form.enable($('form-register-account'));
                hideLoading($('register-account-loading-icon'), $('button-register-account'));
                showMessage(r);
                break;
            // updateAccount response
            case 'updateAccount':
                Form.enable($('form-update-account'));
                hideLoading($('update-account-loading-icon'), $('button-update-account'));
                showMessage(r);
                break;
            // deleteAccount response
            case 'deleteAccount':
                Form.enable($('form-update-account'));
                hideLoading($('update-account-loading-icon'), $('button-delete-account'));
                showMessage(r);
                break;
            // login response
            case 'login':
                hideLoading($('login-loading-icon'), $('button-login'));
                showMessage(r);
                break;
            // showNewsletter resopnse
            case 'showNewsletter':
                // root element
                var newsletter = r.getElementsByTagName('Newsletter')[0];
                with (newsletter) {
                    // newsletter subject
                    $('subject').value = getAttribute('Subject');
                    // newsletter content
                    $('body').value = getElementsByTagName('Content')[0].firstChild.data;
                }
                Form.enable($('form-newsletter'));
                hideLoading($('send-newsletter-loading-icon'), $('button-send-newsletter'));
                break;            // unknown type
            default:
                showMessage(r);
        }
    }
}
/**
 * Updates a checkbox label dependent on the sate
 * @param checked The checkbox state
 * @param el The element to change the innerHTML
 * @param text The text
 */
var updateCheckboxLabelAction = function(checked, el, text) {
    if (checked) {
        el.innerHTML=text[1];
    } else {
        el.innerHTML=text[0];
    }
}
