*
ԭeventİװ
ȽNative
*/
var Event = new Native({

 //,Ϊ$typeṩ׼ж
 name: 'Event',

 initialize: function(event, win){
  win = win || window;
  var doc = win.document;
  event = event || win.event;
  
  //˽жǷѰװ
  if (event.$extended) return event;
  this.$extended = true;
  var type = event.type;

  //Բͬȡ¼Դ
  var target = event.target || event.srcElement;

  //nodeTypeΪ3ʱΪհ׽ڵ㣬ȻҪģϻȡ
  while (target && target.nodeType == 3) target = target.parentNode;
  
  if (type.test(/key/)){

   //Բͬȡļֵ
   var code = event.which || event.keyCode;
   var key = Event.Keys.keyOf(code);
   if (type == 'keydown'){

    //ԣμݴòƻbugϣ汾
    var fKey = code - 111;
    if (fKey > 0 && fKey < 13) key = 'f' + fKey;
   }
   key = key || String.fromCharCode(code).toLowerCase();
  } else if (type.match(/(click|mouse|menu)/i)){

   //DTDĲͬģʽʹdocָͬڵ
   doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
   var page = {

    x: event.pageX || event.clientX + doc.scrollLeft,
    y: event.pageY || event.clientY + doc.scrollTop
   };
   var client = {
    x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX,
    y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY
   };

   //֧
   if (type.match(/DOMMouseScroll|mousewheel/)){
    var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
   }

   //Ҽж
   var rightClick = (event.which == 3) || (event.button == 2);

   //¼ض
   var related = null;
   if (type.match(/over|out/)){
    switch (type){
     case 'mouseover': related = event.relatedTarget || event.fromElement; break;
     case 'mouseout': related = event.relatedTarget || event.toElement;
    }
    if (!(function(){
     while (related && related.nodeType == 3) related = related.parentNode;
     return true;
    }).create({attempt: Browser.Engine.gecko})()) related = false;
   }
  }

  return $extend(this, {
   event: event,
   type: type,
   
   page: page,
   client: client,
   rightClick: rightClick,
   
   wheel: wheel,
   
   relatedTarget: related,
   target: target,
   
   code: code,
   key: key,
   
   shift: event.shiftKey,
   control: event.ctrlKey,
   alt: event.altKey,
   meta: event.metaKey
  });
 }

});

//̴Ŀɶʾ
Event.Keys = new Hash({
 'enter': 13,
 'up': 38,
 'down': 40,
 'left': 37,
 'right': 39,
 'esc': 27,
 'space': 32,
 'backspace': 8,
 'tab': 9,
 'delete': 46
});

//Eventչʵ
Event.implement({

 //ֹ¼ðݺ¼
 stop: function(){
  return this.stopPropagation().preventDefault();
 },

 //ֹ¼ð
 stopPropagation: function(){
  if (this.event.stopPropagation) this.event.stopPropagation();
  else this.event.cancelBubble = true;
  return this;
 },

 //ֹ¼
 preventDefault: function(){
  if (this.event.preventDefault) this.event.preventDefault();
  else this.event.returnValue = false;
  return this;
 }

});

