/** * Á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; } if (typeof e!='undefined') { 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); } }