/**
 * Advanced dom events handling module
 *
 * Copyright (C) 2008-2010 Nikolay V. Nemshilov
 */
Event.extend({KEYS:{BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,INSERT:45,DELETE:46},BUTTONS:(Browser.IE||Browser.Konqueror)?{LEFT:1,MIDDLE:4,RIGHT:2}:{LEFT:0,MIDDLE:1,RIGHT:2}});Event.prototype.initialize=function(){var a=$A(arguments),e=a.shift(),o=a.pop()||{};if(isString(e)){var n=Event.cleanName(e);if(Event.Mouse.NAMES.includes(n))e=new Event.Mouse(n,o);else if(Event.Keyboard.NAMES.includes(n))e=new Event.Keyboard(n,o);else e=new Event.Custom(n,o)}return Event.ext(e)};Event.Base=new Class({extend:{Options:{bubbles:true,cancelable:true,altKey:false,ctrlKey:false,shiftKey:false,metaKey:false}},initialize:function(n,o){return this.build(this.options(n,o))},build:Browser.IE?function(o){var e=document.createEventObject();e.type=e.eventType="on"+o.name;e.altKey=o.altKey;e.ctrlKey=o.ctrlKey;e.shiftKey=o.shiftKey;return e}:null,options:function(n,o){o=Object.merge({},Event.Base.Options,this.Options,o);o.name=n;return o}});Event.Mouse=new Class(Event.Base,{extend:{NAMES:$w('click middleclick rightclick dblclick mousedown mouseup mouseover mouseout mousemove'),Methods:{isLeftClick:function(){return this.which==1},isRightClick:function(){return this.which==3},over:function(e){var d=$(e).dimensions(),x=this.pageX,y=this.pageY;return!(x<d.left||x>(d.left+d.width)||y<d.top||y>(d.top+d.height))}}},Options:{pointerX:0,pointerY:0,button:0},build:function(o){var e=Browser.IE?this.$super(o):document.createEvent("MouseEvent");this[Browser.IE?'initIE':'initW3C'](e,o);return e},options:function(n,o){o=this.$super(n,o);o.button=Event.BUTTONS[o.name=='rightclick'?'RIGHT':o.name=='middleclick'?'MIDDLE':'LEFT'];o.name=Event.realName(o.name);return o},initIE:function(e,o){e.clientX=o.pointerX;e.clientY=o.pointerY;e.button=o.button},initW3C:function(e,o){e.initMouseEvent(o.name,o.bubbles,o.cancelable,document.defaultView,name=='dblclick'?2:1,o.pointerX,o.pointerY,o.pointerX,o.pointerY,o.ctrlKey,o.altKey,o.shiftKey,o.metaKey,o.button,o.element)}});Event.include(Event.Mouse.Methods);Event.Keyboard=new Class(Event.Base,{extend:{NAMES:$w('keypress keydown keyup'),Methods:{}},Options:{keyCode:0,charCode:0},build:function(o){var a=null;if(Browser.IE){a=this.$super(o);this.initIE(a,o)}else try{a=document.createEvent('KeyboardEvent');this['init'+(Browser.WebKit?'Webkit':'Gecko')](a,o)}catch(e){a=document.createEvent('UIEvent');this.initDOM2(a,o)}return a},initGecko:function(e,o){e.initKeyEvent(o.name,o.bubbles,o.cancelable,document.defaultView,o.ctrlKey,o.altKey,o.shiftKey,o.metaKey,o.keyCode,o.charCode)},initWebkit:function(e,o){e.initKeyboardEvent(o.name,o.bubbles,o.cancelable,document.defaultView,null,0,o.ctrlKey,o.altKey,o.shiftKey,o.metaKey)},initDOM2:function(e,o){e.initUIEvent(o.name,o.bubbles,o.cancelable,document.defaultView,1);e.keyCode=o.keyCode;e.charCode=o.charCode;e.altKey=o.altKey;e.metaKey=o.metaKey;e.ctrlKey=o.ctrlKey;e.shiftKey=o.shiftKey},initIE:function(e,o){e.keyCode=o.keyCode;e.charCode=o.charCode}});(function(){for(var b in Event.KEYS)(function(k,a){Event.Keyboard.Methods[('is_'+k.toLowerCase()).camelize()]=function(){return this.keyCode==a}})(b,Event.KEYS[b]);;Event.include(Event.Keyboard.Methods)})();Element.include({fire:function(){var b=$A(arguments),e=new Event(b.shift(),Object.merge(b.shift(),{element:this}));if(e instanceof Event.Custom){(this.$listeners||[]).each(function(a){if(a.e==e.type)a.f.apply(this,[e].concat(a.a).concat(b))},this)}else if(this.dispatchEvent)this.dispatchEvent(e);else this.fireEvent(e.eventType,e);return this}});