/**
 * javascript function group for the event handling 
 */
function BCjsCommonEvents() {}

/**
 * @param element Element to which we want to add event
 * @param aType Type of event to listen to (e.g.: "click", "mouseover", ...)
 * @param aListener Function which listens to the event. The event then comes as the parameter of this function.
 */
BCjsCommonEvents_addEventListener = function(element, aType, aListener, aUseCapture) {
	if (element.addEventListener) {
		element.addEventListener(aType, aListener, aUseCapture);
	} else if (element.attachEvent) {
		element.attachEvent("on"+aType, aListener);
	}
};

BCjsCommonEvents_removeEventListener = function(element, aType, aListener, aUseCapture) {
	if (element.removeEventListener) {
		element.removeEventListener(aType, aListener, aUseCapture);
	} else if (element.detachEvent) {
		element.detachEvent("on"+aType, aListener);
	}
};

//call this, when you want to get event in event handler
BCjsCommonEvents_getEvent = function(e) {
	if (e==undefined) {
		if (window.event) {
			return window.event;
		} else {
			return null;
		}
	} else {
		return e;
	}
};

//wrapper funkce pouzita pro nezavisle ziskani currentTarget
BCjsCommonEvents_getCurrentTarget = function(e) {
	if (Browser.isIE) {
		return e.srcElement;
	} else {
		return e.currentTarget;
	}
};

//wrapper funkce pouzita pro nezavisle ziskani target
BCjsCommonEvents_getTarget = function(e) {
	if (Browser.isIE) {
		return e.srcElement;
	} else {
		return e.target;
	}
};

BCjsCommonEvents_getTargetElement = function(aEvent, aThis) {
	// According to DOM2 identifier "this" contains here event target and not object!!
	// But in MSIE "this" contains reference ti window
	var locElement = null;
	if (aThis == window) {
		 locElement = BCjsCommonEvents_getTarget(aEvent); // MSIE
	}
	else locElement = aThis;

	BCjsCommonEvents_syncEventCoordinates(aEvent, locElement);

	return locElement;
}

// updates properties to store values independently to browser
BCjsCommonEvents_syncEventCoordinates = function(aEvent, aTargetElement) {
	if (aEvent.pageX == undefined && aEvent.pageY == undefined) {
		// MSIE
		aEvent.pageX = aEvent.clientX;
		aEvent.pageY = aEvent.clientY;
	}
	else if (aEvent.clientX == undefined && aEvent.clientY == undefined && aEvent.pageX != undefined && aEvent.pageY != undefined) {
		// Firefox
		aEvent.clientX = aEvent.pageX;
		aEvent.clientY = aEvent.pageY;
	}
	
	// calculate event offset coordinates for Firefox
	if (aTargetElement && aEvent.offsetX == undefined && aEvent.offsetY == undefined) {
		locTargetElement = aTargetElement;
		var locOffsetTop = locTargetElement.offsetTop;
		if (locTargetElement.offsetParent) locOffsetTop -= locTargetElement.offsetParent.scrollTop;
		while (locTargetElement.offsetParent) {
			locOffsetTop += locTargetElement.offsetParent.offsetTop - locTargetElement.offsetParent.scrollTop;
			locTargetElement = locTargetElement.offsetParent;
		}

		locTargetElement = aTargetElement;
		var locOffsetLeft = locTargetElement.offsetLeft;
		while (locTargetElement.offsetParent) {
			locOffsetLeft += locTargetElement.offsetParent.offsetLeft - locTargetElement.scrollLeft;
			locTargetElement = locTargetElement.offsetParent;
		}
		
		aEvent.offsetX = Math.abs(aEvent.pageX - locOffsetLeft);
		aEvent.offsetY = Math.abs(aEvent.pageY - locOffsetTop);
	}
}
