var EventManager = {

    initialize : function () 
    {
        // Om performance redenenen willen we slechts ��n keer kijken welk 
        // event model we kunnen gebruiken. Hiervoor maken we een anonieme 
        // functie welke, afhankelijk van de browser, een add functie voor het 
        // beste beschikbare event model teruggeeft.
        
        // addEventListener
        this.add = function ()
        {	
        	// Ideaal gezien zouden we deze if-else constructie beginnen met de meest
        	// gebruikte optie: attachEvent van IE. Opera ondersteund echter beide 
        	// modellen, maar we willen wel dat opera gebruikt maakt van het W3C model
        	// daarom staat de addEventListener if voor de attachEvent if.
	        if (document.addEventListener) {
                return function (object, type, func) 
                {   	        
                    // Het W3C model.
                    object.addEventListener (type, func, false);
                }        
            } else if (document.attachEvent) {
                return function (object, type, func)
                {   
                    // IE model
                
                    // We creeren een anonieme functie. Deze anonieme functie 
                    // roept de func referentie aan via de call methode. Deze 
                    // methode krijgt de scope mee van het object.                  
                    object.attachEvent ('on' + type, function () { func.call (object, window.event); });
                } 
            } else {
                // Eventueel DOM0 model gebruiken, welke browsers ondersteunen
                // alleen DOM0?
                //throw new Exception ('Neither attachEvent nor addEventListener are supported');
            }
        } ();
        
        // removeEventListener
        this.remove = function ()
        {
        	if (document.removeEventListener) {
        		return function (object, type, func)
        		{       		        		
        			object.removeEventListener (type, func, false);
        		}
        	} else if (document.detachEvent) {
        		return function (object, type, func)
        		{
        			object.detachEvent('on' + type, func)
        		}
        	} else {
        		alert('Not implemented');
        		//throw new Exception ('Not implemented');
        	}
        } ();
        
        /* HE: Vraagje waar wordt deze methode gebruikt en wat is het doel? */
        // dispatchEvent 
        this.dispatch = function ()
        {
        	if (document.fireEvent) {
        		return function (element, type) {
        			element.fireEvent("on" + type);
        		}
        	} else if (document.dispatchEvent) {
        		return function (element, type) {
        			var event = document.createEvent("MouseEvents");
        			event.initMouseEvent(type, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
					element.dispatchEvent(event);
        		}
        	} else {
        		//throw new Exception ('Not implemented');
        	}
        } ();
    }  
}
EventManager.initialize ();