/**
 * Title: 		Event factory
 * 
 * Project:    	mikeshomepage 4.0
 * Created by: 	Mike
 * Created on: 	04.12.2006
*/

/**
 * Paths to Ajax actions
 */
var ajaxReqEmail = '/action/?action=SendEmail';
var ajaxReqRecommendPage = '/action/?action=RecommendPageEmail';
var ajaxReqAutoComplete = '/action/?action=AutoComplete';
var ajaxReqAlbumLoader = '/action/?action=AlbumLoader';
var ajaxReqLoadScripts = '/action/?action=ScriptsLoader';
var ajaxReqStatisticsLoader = '/action/?action=StatisticsLoader';
var ajaxReqLogin = '/action/?action=Login';
var ajaxReqLogout = '/action/?action=Logout';
var ajaxReqRegisterAccount = '/action/?action=RegisterAccount';
var ajaxReqUpdateAccount = '/action/?action=UpdateAccount';
var ajaxReqDeleteAccount = '/action/?action=RemoveAccount';
var ajaxReqRecreatePassword = '/action/?action=RecreatePassword';
var ajaxReqNewsletterLoader = '/action/?action=NewsletterLoader';
var ajaxReqSendNewsletter = '/action/?action=SendNewsletter';
var ajaxReqGetNewsletter = '/action/?action=GetNewsletter';
var ajaxReqAlbumEditor = '/action/?action=AlbumEditor';

/**
 * Register event handlers when page is loaded
 */
var loadEventHandlerFactory = function() {
    EventHandlerFactory.addEventHandlers();
}
// implicit call of EventHandlerFactory, explicit would not work
window.onload = loadEventHandlerFactory;

/** 
 * Event handler factory class
 */
var EventHandlerFactory = {
    /**
     * Add event handlers
     */
    addEventHandlers: function() {
        // back home
        this.addEvent($('logo'), 'click', function(){LinkActionHandler.logoAction()});
        // login/logout
        if ($('button-login')) {
            this.addEvent($('button-login'), 'click', function(){AccountHandler.loginAction();});
        }
        // MYkeshomepage
        if ($('lnk-register')) {
            this.addEvent($('lnk-register'), 'click', function(){LinkActionHandler.lnkRegisterAction();});
            this.addEvent($('lnk-password-lost'), 'click', function(){LinkActionHandler.lnkPasswordLostAction();});
        }
        if ($('lnk-account')) {
            this.addEvent($('lnk-account'), 'click', function(){LinkActionHandler.lnkAccountAction();});
        }
        this.addEvent($('lnk-close-register'), 'click', function(){LinkActionHandler.lnkCloseAction('box-register');});
        this.addEvent($('lnk-close-password-lost'), 'click', function(){LinkActionHandler.lnkCloseAction('box-password-lost');});
        this.addEvent($('lnk-close-account'), 'click', function(){LinkActionHandler.lnkCloseAction('box-account');});
        this.addEvent($('lnk-delete-account'), 'click', function(){LinkActionHandler.lnkDeleteAccountAction();});
/*        var labelText1 = new Array('Kein Zugang zur <strong>Skripten-Seite</strong>', 'Zugang zur <strong>Skripten-Seite</strong>');
        this.addEvent($('checkbox-register-scripts'), 'click', 
            function() {
                updateCheckboxLabelAction($('checkbox-register-scripts').checked,
                                          $('label-register-scripts'), 
                                          labelText1);
            });
        var labelText2 = new Array('Newsletter nicht abonnieren', 'Newsletter abonnieren');
        this.addEvent($('checkbox-register-newsletter'), 'click', 
            function() {
                updateCheckboxLabelAction($('checkbox-register-newsletter').checked,
                                          $('label-register-newsletter'), 
                                          labelText2);
            });
        var labelText3 = new Array('Newsletter ist abbestellt', 'Newsletter ist abonniert');
        this.addEvent($('checkbox-account-newsletter'), 'click', 
            function() {
                updateCheckboxLabelAction($('checkbox-account-newsletter').checked,
                                          $('label-account-newsletter'),
                                          labelText3)
            });*/
        this.addEvent($('checkbox-register-scripts'), 'click', function(){if($('checkbox-register-scripts').checked){Effect.SlideDown($('term'));}else{Effect.SlideUp($('term'));}});
        this.addEvent($('button-register-account'), 'click', function(){AccountHandler.registerAccount();});
        this.addEvent($('button-password-lost'), 'click', function(){AccountHandler.recreatePassword();});
        this.addEvent($('button-update-account'), 'click', function(){AccountHandler.updateAccount();});
        this.addEvent($('button-delete-account'), 'click', function(){AccountHandler.deleteAccount();});
        // page button bar
        if ($('lnk-print')) {
            this.addEvent($('lnk-print'), 'click', function(){window.print()});   
            this.addEvent($('lnk-recommend'), 'click', function(){RecommendPageHandler.recommendPageAction();});
        }
        // recommend page
        if ($('box-recommend')) {
            this.addEvent($('button-recommend'), 'click', function(){RecommendPageHandler.recommendPageSendAction();});
            this.addEvent($('recommend-sender-email'), 'focus', function(){Field.activate($('recommend-sender-email'));});   
            this.addEvent($('recommend-receiver-email'), 'focus', function(){Field.activate($('recommend-receiver-email'));});   
            this.addEvent($('recommend-comment'), 'focus', function(){Field.activate($('recommend-comment'));});   
            this.addEvent($('lnk-close-recommend'), 'click', function(){LinkActionHandler.lnkCloseAction('box-recommend', 'slideUp');});
        }
        // send email
        if ($('form-email')) {
            this.addEvent($('button-send-email'), 'click', function(){SendEmailHandler.sendEmailAction();});   
            // input text fields
            this.addEvent($('email'), 'focus', function(){Field.activate($('email'));});   
            this.addEvent($('homepage'), 'focus', function(){Field.activate($('homepage'));});   
            this.addEvent($('subject'), 'focus', function(){Field.activate($('subject'));});   
            this.addEvent($('body'), 'focus', function(){Field.activate($('body'))});   
            // ajax auto completion
            new Ajax.Autocompleter('subject', 'subject-list', ajaxReqAutoComplete+'&name=subjectList');
        }
        // privacy album
        if ($('image-container')) {
            this.addEvent($('select-album'), 'change', function(){LoadAlbumHandler.loadAlbum();});   
        }
        // study scripts
        if ($('box-scripts')) {
            this.addEvent($('select-scripts'), 'change', function(){LoadScriptsHandler.loadScripts();});   
        }
        // administration
        if ($('box-admin')) {
            this.addEvent($('select-admin'), 'change', function(){AdminHandler.load();});   
            // send newsletter
            if ($('form-newsletter')) {
                this.addEvent($('select-newsletters'), 'change', function(){AdminHandler.showNewsletterAction();});   
                this.addEvent($('button-send-newsletter'), 'click', function(){AdminHandler.sendNewsletterAction();});   
                this.addEvent($('subject'), 'focus', function(){Field.activate($('subject'));});   
                this.addEvent($('body'), 'focus', function(){Field.activate($('body'))});   
            }
        }
        // apply UI patches (mouse/click events, display)
        this.patchUI();
    },
    /**
     * Patches the UI, applies mouse/click events to form element etc.
     */
    patchUI: function() {
        // blur all ankers, buttons and labels
        var ankers = document.getElementsByTagName('a');
        for(i=0; i<ankers.length; i++) {
            ankers[i].onfocus = new Function("this.blur()");
        }
        var labels = document.getElementsByTagName('label');
        for(i=0; i<labels.length; i++) {
            labels[i].onfocus = new Function("this.blur()");
        }
        var buttons = document.getElementsByTagName('button');
        for(i=0; i<buttons.length; i++) {
            buttons[i].onfocus = new Function("this.blur()");
        }
        // patch form fields
        var inputs = document.getElementsByTagName('input');
        for(i=0; i<inputs.length; i++) {
            // pointer cursor for all checkboxes
            if (inputs[i].type=='checkbox' ||
                inputs[i].type=='radio') {
                inputs[i].style.cursor = 'pointer';
                inputs[i].onfocus = new Function("this.blur()");
            // blur all image input buttons on focus
            } else if (inputs[i].type=='image') {
                inputs[i].onfocus = new Function("this.blur()");
            // activate on focus for all register and MYkeshomepage text inputs
            } else if (inputs[i].name.indexOf('login-')!=-1 ||
                       inputs[i].name.indexOf('register-')!=-1 ||
                       inputs[i].name.indexOf('album-')!=-1) {
                inputs[i].onfocus = function() {Field.activate(this);};
            }
        }
        // default cursor for all legends
        var legends = document.getElementsByTagName('legend');
        for(i=0; i<legends.length; i++) {
            legends[i].style.cursor = 'default';
        }
    },
    /**
     * Adds an event to an object
     * @param obj The object
     * @param eventType The event type
     * @param eventHandler The event handler function
     */
    addEvent: function(obj, eventType, eventHandler) { 
    	// Gecko
        if (obj.addEventListener) { 
            obj.addEventListener(eventType, eventHandler, false); 
        // IE
        } else if (obj.attachEvent) { 
            obj.attachEvent("on"+eventType, eventHandler); 
        // others (Opera...)
    	} else {
    		obj["on"+eventType] = eventHandler;    
    	}
    }
}

