/**
 * Általános (böngészőfüggetlen) eseménykezelő függvények
 */
 

// Függőségek
if ("undefined" == typeof AITIA) {
	alert("AITIA include missing!");
} else if ("undefined" == typeof AITIA_BROWSER) {
	alert("AITIA_BROWSER include missing!");
} else if ("undefined" == typeof AITIA_POSITION) {
	alert("AITIA_POSITION include missing!");
}

// Többszörös include
if ("undefined" != typeof AITIA_EVENT) {
	alert("AITIA_EVENT multiple insert!");
}

AITIA_EVENT = 1;
Aitia.Event = {};

/**
 * Elementhez esemenykezelő csatolása
 */
Aitia.Event.addEvent = function(el, evname, func) {
	if (el.attachEvent) {
		el.attachEvent("on" + evname, func);
	}
	else if (el.addEventListener) {
		el.addEventListener(evname, func, false);	//bubbling
	}
} //addEvent


/**
 * Elemről eseménykezelő törlése
 */
Aitia.Event.removeEvent = function(el, evname, func) {
	if (el.detachEvent) {
		el.detachEvent("on" + evname, func);
	}
	else if (el.removeEventListener) {
		if (typeof nsDOM != "undefined" && nsDOM && evname.toLowerCase() == 'submit') {
			el.onsubmit = function () {};
		}
		else {
			el.removeEventListener(evname, func, false); //ha false volt az attach-ban, akkor itt is az kell
		}
	}
} //removeEvent


/**
 * Event propagation stop: ez csak azt intezi el, hogy a dom fában felfelé haladva a
 * többi node ne kapja meg az esemenyt. Ettől még a böngesző elkapja (pl.: egy linkre
 * klikkelést). Ehhez return false, vagy returnValue kell vagy event.preventDefault().
 */
Aitia.Event.stopPropagation = function(e) {
	if (!e) {
		var e = window.event;
	}
	e.cancelBubble = true;
	if (e.stopPropagation) {
		e.stopPropagation();
	}
	return e;
} // stopPropagation


/**
 * Megakadályozza, hogy az esemény alapértelmezett hatása kiváltódjon.
 */
Aitia.Event.preventDefault = function(e) {
	if (!e) {
		var e = window.event;
	}
	e.returnValue = false;
	if (e.preventDefault) {
		e.preventDefault();
	}
	return e;
} // preventDefault


/**
 * Adott esemény abszolut koordinátait adja vissza.
 */
Aitia.Event.getAbsolutePosition = function(e) {
	var posx = 0;
	var posy = 0;
	if (!e) {
		var e = window.event;
	}
	if (e.pageX || e.pageY)  {
		posx = e.pageX;
		posy = e.pageY;
	} else if (e.clientX || e.clientY) {
		var scrollPos = Aitia.Position.getScrollPosition();
		posx = e.clientX + scrollPos.left;
		posy = e.clientY + scrollPos.top;
	}
	return {top: posy, left: posx};
} // getAbsolutePosition


/**
 * Adott esemény relatív koordinátait adja vissza.
 *  mode: 0  (def) content lesz a 0,0
 *  mode: 1  border lesz a 0,0
 *
 *  @todo: test IE!
 */
Aitia.Event.getRelativePosition = function(e, mode) { 
	var posx = 0;
	var posy = 0;
	if (!e) {
		e = window.event;
	}
	if (null == mode) {
		mode = 0;
	}

	var target = this.getTarget(e);
	if (Aitia.Browser.ieDom) {
		if (0 == mode) {
			// content az origo
			posx = e.offsetX + Aitia.Style.getStyle(target,"border-left-width",true);
			posy = e.offsetY + Aitia.Style.getStyle(target,"border-top-width",true);
		} else if (1 == mode) {
			// border
			posx = e.offsetX - Aitia.Style.getStyle(target,"padding-left",true);
			posy = e.offsetY - Aitia.Style.getStyle(target,"padding-top",true);
		}
	} else if (Aitia.Browser.operaDom) {
		// content bal felso a 0,0, margin is kell
		if (0 == mode) {
			posx = e.offsetX + Aitia.Style.getStyle(target,"border-left-width",true) + Aitia.Style.getStyle(target,"padding-left",true);
			posy = e.offsetY + Atiai.Style.getStyle(target,"border-top-width",true) + Aitia.Style.getStyle(target,"padding-top",true);
		} else if (1 == mode) {
			posx = e.offsetX;
			posy = e.offsetY;
		}
	} else if (Aitia.Browser.nsDom) {
		//NS: egyik sem jo, ha editor frameworkben a kep center-re van igazitva
/*
		var Element=e.target;
		var CalculatedTotalOffsetLeft = CalculatedTotalOffsetTop = 0;
		while (Element.offsetParent) {
			CalculatedTotalOffsetLeft += Element.offsetLeft;
			CalculatedTotalOffsetTop += Element.offsetTop;
			Element = Element.offsetParent;
		}
		var posx=e.pageX - CalculatedTotalOffsetLeft;
		var posy=e.pageY - CalculatedTotalOffsetTop;
*/
/*
		posx=e.layerX-getStyle(target,"margin-left",true);  //border is benne van 0,0-ban
		posy=e.layerY-getStyle(target,"margin-top",true);
*/
/*
		posx=e.layerX;  //border is benne van 0,0-ban
		posy=e.layerY;
*/

		//scroll ertekekert figyelembe kell venni!!!
		var eventPos = this.getAbsolutePosition(e);
		var targetPos = Aitia.Position.getPositionBorder(target,2);  //overflow esetben gaz van, container border bekavar, ez frissult getPos-ban scroll is bekevar, ez is frissult

		posx = eventPos.left - targetPos.left;
		posy = eventPos.top - targetPos.top;

		if (1 == mode) {
			// border az origo
			posx -= Aitia.Style.getStyle(target,"border-left-width",true) + Aitia.Style.getStyle(target,"padding-left",true);
			posy -= Aitia.Style.getStyle(target,"border-top-width",true) + Aitia.Style.getStyle(target,"padding-top",true);
		}
	} else if (Atiai.Browser.konquerorDom) {
		var eventPos = this.getAbsolutePosition(e);
		var targetPos = Aitia.getPositionBorder(target,2);

		posx = eventPos.left - targetPos.left;
		posy = eventPos.top - targetPos.top;

		if (1 == mode) {
			posx -= Aitia.Style.getStyle(target,"border-left-width",true) + Aitia.Style.getStyle(target,"padding-left",true);
			posy -= Aitia.Style.getStyle(target,"border-top-width",true) + Aitia.Style.getStyle(target,"padding-top",true);
		}
	}
	return {top: posy, left: posx};
} // getRelativePosition


/**
 * A lenyomott billentyű karakter kódját adja vissza
 */
Aitia.Event.getKeyCode = function(e) {
	if (!e) {
		var e = window.event;
	}
	
	//(e.keyCode ? e.keyCode : (e.charCode ? e.charCode : e.which));
	if (e.keyCode) {
		return e.keyCode;
	} else if (e.charCode) {
		return e.charCode;
	} else if (e.which) {
		return e.which;
	}
	return 0;
} // getKeyCode


/**
 * Egéresemény esetén az egérgombokat adja vissza
 */
Aitia.Event.getButton = function(e) {
	var button = "";
	if (!e) {
		var e = window.event;
	}

	if (Aitia.Browser.ieDom) {
		//mousedown eseten: 1,4,2
		//click eseten: 0
		if ("click" == e.type) {
			switch (e.button) {
				case 0: button = "left";
					break;
				case 4: button = "middle";
					break;
				case 2: button = "right";
					break;
			}
		} else {
			switch (e.button) {
				case 1: button = "left";
					break;
				case 4: button = "middle";
					break;
				case 2: button = "right";
					break;
			}
		}
	} else if (Aitia.Browser.nsDom) {
		switch (e.button) {
			case 0: button = "left";
				break;
			case 1: button = "middle";
				break;
			case 2: button = "right";
				break;
		}
	} else if (Aitia.Browser.operaDom) {
		switch (e.button) {
			case 0: button = "left";
				break;
			case 1: button = "middle";
				break;
			case 2: button = "right";
				break;
		}
	} else if (Aitia.Browser.konquerorDom || Aitia.Browser.safariDom) {
		switch (e.button) {
			case 1: button = "left";
				break;
			case 4: button = "middle";
				break;
			case 2: button = "right";
				break;
		}
	}
	return button;
} // getbutton


/** 
 * mouseover, mouseout event-ek esetere
 * target: az az element, amelyiknel az esemeny letrejott (ha onmouseover van, akkor ennek az onmouseover esemenykezeloje hivodna meg legeloszor)   outer -> inner (mouseover) from -> to 
 * currentTarget: az az element, amire propagal az esemeny, tehat ahogy megy felfele (kontenerek fele) ez mindig az adott kontenert jeloli, a target viszont tartalmazza az eredeti esemeny elemet
 *
 * @todo: test focus, blur
 */
Aitia.Event.getFromToElements = function(e) {
	var fromto = {from: null, to: null};
	if (!e) {
		var e = window.event;
	}
	if (e.fromElement) {
		fromto.from = e.fromElement;
	}
	if (e.toElement) {
		fromto.to = e.toElement;
	}
	if (e.relatedTarget) {
		if ("mouseover" == e.type) {
			fromto.from = e.relatedTarget;
			fromto.to = e.target;
		} else if ("mouseout" == e.type) {
			fromto.to = e.relatedTarget;
			fromto.from = e.target; 
		}
	} else {
	}

	return fromto;
} // getFromToElements


/**
 * Azt az elemet adja vissza, amin letrejott az eredeti esemeny
 */
Aitia.Event.getTarget = function(e) {
	if (!e) {
		var e = window.event;
	}
	if (e.target) {
		return e.target;
	} else if (e.srcElement) {
		return e.srcElement;
	}
	return null;
} // getTarget


/**
 * Az vizsgálja,hogy az esemény közben le volt e nyomva a SHIFT billentyű
 */
Aitia.Event.isShiftKeyPressed = function(e) {
	if (!e) {
		var e = window.event;
	}
	return e.shiftKey;
} // isShiftKeyPressed

/**
 * Az vizsgálja,hogy az esemény közben le volt e nyomva a SHIFT billentyű
 */
Aitia.Event.isAltKeyPressed = function(e) {
	if (!e) {
		var e = window.event;
	}
	return e.altKey;
} // isAltKeyPressed

/**
 * Az vizsgálja,hogy az esemény közben le volt e nyomva a SHIFT billentyű
 */
Aitia.Event.isCtrlKeyPressed = function(e) {
	if (!e) {
		var e = window.event;
	}
	return e.ctrlKey;
} // isCtrlKeyPressed

/**
 * Elindít egy eseményt. 
 */
Aitia.Event.fireEvent = function(fireOnThis, options) {

	// default értékek
	options = options || {};
	options.eventType = options.eventType || 'HTMLEvents';
	options.eventName = options.eventName || 'click';
	options.bubbles = options.bubbles || true;
	options.cancelable = options.cancelable || true;
	options.detail = options.detail || 0;
	options.screenX = options.screenX || 0;
	options.screenY = options.screenY || 0;
	options.clientX = options.clientX || 0;
	options.clientY = options.clientY || 0;
	options.ctrlKey = options.ctrlKey || false;
	options.altKey = options.altKey || false;
	options.shiftKey = options.shiftKey || false;
	options.metaKey = options.metaKey || false;
	options.button = options.button || 0;
	options.relatedTarget = options.relatedTarget || null;
	
	if( document.createEvent ) {
		var evObj = document.createEvent(options.eventType);
		if (options.eventType == 'HTMLEvents'){
			evObj.initEvent(options.eventName, options.bubbles, options.cancelable);
		} else if (options.eventType == 'MouseEvents') {
			evObj.initMouseEvent( options.eventName, options.bubbles, options.cancelable, window, 
			options.detail, options.screenX, options.screenY, options.clientX, options.clientY, 
			options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, options.relatedTarget );
		}
		fireOnThis.dispatchEvent(evObj);
	} else if( document.createEventObject ) {
		var evObj = document.createEventObject();
		evObj.detail = options.detail;
		evObj.screenX = options.screenX;
		evObj.screenY = options.screenY;
		evObj.clientX = options.clientX;
		evObj.clientY = options.clientY;
		evObj.ctrlKey = options.ctrlKey;
		evObj.altKey = options.altKey;
		evObj.shiftKey = options.shiftKey;
		evObj.metaKey = options.metaKey;
		evObj.button = options.button;
		evObj.relatedTarget = options.relatedTarget;
		fireOnThis.fireEvent('on' + options.eventName,evObj);
	}	
}

/**
 * Elindít egy HTML eseményt. 
 */
Aitia.Event.fireHTMLEvent = function(fireOnThis, eventName) {
	if( document.createEvent ) {
		var evObj = document.createEvent('HTMLEvents');
		evObj.initEvent( eventName, true, true );
		fireOnThis.dispatchEvent(evObj);
	} else if( document.createEventObject ) {
		fireOnThis.fireEvent('on' + eventName);
	}
}


