// Meta functions for events management.

var addListener; // (ob, eventName, listenerFunction) add event listener eventName without "on" prefix.
var removeListener; // (ob, eventName, listenerFunction) remove event listener .
var raiseMouseEvent; // (ob, eventName) raise mouse event (without "on" prefix) on object.

var getTargetedObject; // (event) retrieves the object that fired the event. Event parameter is optional.
var disableDefault; // (event) disable default event's action. Event parameter is optional.
var disablePropagation; // (event) disable event propagation or bubbling.

function buildMetaFunctions() {
	addListener = _build_addListener();
	removeListener = _build_removeListener();
	raiseMouseEvent = _build_raiseMouseEvent();

	getTargetedObject = _build_getTargetedObject();
	disableDefault = _build_disableDefault();
	disablePropagation = _build_disablePropagation();
}


function _build_addListener(){
    if (browser.isIE55 || browser.isIE6up) {
    	var _ie_addListener = function(ob, eventName, listenerFunction) {
	    	eventName = "on" + eventName;
	    	ob.attachEvent(eventName, listenerFunction);
	    }
	    return _ie_addListener;
    }
    else if (browser.isDOM2Event) {
    	var _appleWebKit_addListeter = function(ob, eventName, listenerFunction) {
    		ob["on" + eventName] = listenerFunction;
    	}
    	var _dom2_addListener = function(ob, eventName, listenerFunction) {
	    	ob.addEventListener(eventName, listenerFunction, false); // only bubbling events :-(
	    }
	    return (browser.isAppleWebKit) ? _appleWebKit_addListeter : _dom2_addListener;
    }
}

function _build_removeListener() {
    if (browser.isIE55 || browser.isIE6up) {
    	var _ie_removeListener = function(ob, eventName, listenerFunction) {
	    	eventName = "on" + eventName;
	    	ob.detachEvent(eventName, listenerFunction);
	    }
	    return _ie_removeListener;
    }
    else if (browser.isDOM2Event) {
    	var _dom2_removeListener = function(ob, eventName, listenerFunction) {
	    	ob.removeEventListener(eventName, listenerFunction, false); // only bubbling events :-(
	    }
	    return _dom2_removeListener;
    }
}

function  _build_raiseMouseEvent() {
    if (browser.isIE55 || browser.isIE6up) {
    	var _ie_raiseMouseEvent = function(ob, eventName) {
	    	ob.fireEvent("on" + eventName);
	    }
	    return _ie_raiseMouseEvent;
    }
    else if (browser.isDOM2Event) {
    	var _dom2_raiseMouseEvent = function(ob, eventName) {
	    	var event = document.createEvent("MouseEvents");
	    	event.initEvent(eventName, true, true);
	    	ob.dispatchEvent(event);
	    }
	    return _dom2_raiseMouseEvent;
    }
}

function _build_getTargetedObject(){
    if (browser.isIE55 || browser.isIE6up) {
    	var _ie_getTargetedObject = function() {
    		return window.event.srcElement;
	    }
	    return _ie_getTargetedObject;
    }
    else if (browser.isDOM2Event) {
    	var _appleWebKit_getTargetedeObject = function(evt) {
    		var target = evt.target;
    		// is it really safe ?...
    		return (target.nodeType == 3) ? target.parentNode : target;
    	}
    	var _dom2_getTargetedObject = function(evt) {
    		return evt.target
	    }
	    return (browser.isAppleWebKit) ? _appleWebKit_getTargetedeObject : _dom2_getTargetedObject;
    }
}

function _build_disableDefault(){
    if (browser.isIE55 || browser.isIE6up) {
    	var _ie_disableDefault = function() {
    		window.event.returnValue = false;
	    }
	    return _ie_disableDefault;
    }
    else if (browser.isDOM2Event) {
    	var _dom2_disableDefault = function(evt) {
    		evt.preventDefault();
	    }
	    return _dom2_disableDefault;
    }
}

function _build_disablePropagation() {
    if (browser.isIE55 || browser.isIE6up) {
    	var _ie_disablePropagation = function() {
    		window.event.cancelBubble = true;
	    }
	    return _ie_disablePropagation;
    }
    else if (browser.isDOM2Event) {
    	var _dom2_disablePropagation = function(evt) {
    		evt.stopPropagation();
	    }
	    return _dom2_disablePropagation;
    }
}


buildMetaFunctions();
