/*
Copyright (c) 2007, PMP Concept
version: 1
*/

/*****************************************************************************
 *
 * 								Classe pmpEvent
 *
 *	Fonction : 	gestion des évenements standard
 *				gestion d'évement personnalisés
 *
 *  Paramètres
 *  	- event		: (string) Le type d'évenement
 *
*****************************************************************************/

PMP.util.pmpEvent = function(type, nom, bubble, cancelable) 
{
	var event;
	
	this.setEvent(type, nom, bubble, cancelable);
}


PMP.util.pmpEvent.prototype = {
	
	 setEvent : function(type, nom, bubble, cancelable) {
		if(PMP.common.isString(type) && PMP.common.isString(nom))
		{
			if( document.createEvent )
			{
				this.event = document.createEvent(type);
			
				if(PMP.common.isUndefined(bubble))
					var bubble = false;
			
				if(PMP.common.isUndefined(cancelable))
					var cancelable = false;
			
				this.event.initEvent(nom, bubble, cancelable);
			} 
			else if( document.createEventObject )
			{
				this.event = document.createEventObject();
				
				this.event.type = nom;
				this.event.detail = 0;
				this.event.screenX = 0;
				this.event.screenY = 0;
				this.event.clientX = 0;
				this.event.clientY = 0;
				this.event.ctrlKey = false;
				this.event.altKey = false;
				this.event.shiftKey = true;
				this.event.metaKey = false;
				this.event.button = 0;
				this.event.relatedTarget = null;
			}
		}
	},

	getEvent : function(event) {
		if (!event) event = window.event;
		
		if(event==undefined)
		{
			return null;
		}
		
		if (event.target) 
		{
			if (event.target.nodeType == 3) event.target = event.target.parentNode;
		} 
		else if (event.srcElement) 
		{
			event.target = event.srcElement;
		}

		this.event = event;
		
		return event;
	},

	addEventListener : function(element, type, func) 
	{
		if (element.addEventListener) 
		{
			element.addEventListener(type, func, false)
		} 
		else if (element.attachEvent) 
		{
			if (!element._listeners) element._listeners = new Array()
			if (!element._listeners[type]) element._listeners[type] = new Array()
			
			var workaroundFunc = function() 
			{
				func.apply(element, new Array())
			}
			element._listeners[type][func] = workaroundFunc
			element.attachEvent('on' + type, workaroundFunc)
		}
	},

	removeEventListener : function(element, type, func) 
	{
		if (element.removeEventListener) 
		{
			element.removeEventListener(type, func, false)
		} 
		else if (element.detachEvent) 
		{
			if (element._listeners 
					&& element._listeners[type] 
					&& element._listeners[type][func]) {

				element.detachEvent('on' + type, 
						element._listeners[type][func])
			}
		}
	},
	
	cancelEvent : function(evt)
	{
		if( PMP.common.isEvent(evt) )
			this.getEvent(evt);
			
		this.event.cancelBubble = true; 
		this.event.returnValue = false; 
		
		if (this.event.preventDefault)
			this.event.preventDefault();
		if (this.event.stopPropagation)
			this.event.stopPropagation();
	},
	
	
	dispatchEvent : function(element, type, nom, bubble, cancelable)
	{
		this.setEvent(type, nom, bubble, cancelable);
		
		if(element && PMP.common.isEvent(this.event))
		{
			if(element.dispatchEvent)
			{
				element.dispatchEvent(this.event);	
			}
			else if(element.fireEvent)
			{
				//element.fireEvent(this.event.type, this.event);
				//element.fireEvent("click");
			}
			else 
			{
            	//if(element[this.event.type] && PMP.common.isFunction(element[this.event.type]) ) 
				//	element[this.event.type].call();
			}
		}
	},
	
	getCoordinate: function()
	{
		var coord = {};
		
		if( PMP.common.isEvent(this.event) )
		{
			coord.x = this.event.pageX || ( PMP.common.truebody().scrollLeft + this.event.clientX );
			coord.y = this.event.pageY || ( PMP.common.truebody().scrollTop + this.event.clientY );
		}
		else
		{
			coord.x = 0;
			coord.y = 0;
		}
	
		return coord;
	}
}
