// PheliX <phelix.truba@gmail.com> http://savs.sytes.net
// http://www.metaleks.lv

// + event + ===================================================================
if( !CACHE ) var CACHE   = new Object();
if( !CACHE.ev ) CACHE.ev = new Object();

CACHE.ev.type = function( e ){
 if( e.type ){
  CACHE.ev.type = function( e ){
   return e.type;
  }
  return CACHE.ev.type( e );
 }
 return null;
}

CACHE.ev.target = function( e ){
 if( e.target ){
  CACHE.ev.target = function( e ){
   return e.target;
  }
  return CACHE.ev.target( e );
 }else if( e.srcElement ){
  CACHE.ev.target = function( e ){
   return e.srcElement;
  }
  return CACHE.ev.target( e );
 }
 return document.createElement( 'div' );
}

CACHE.ev.button = function( e ){
 if( e.button ){
  CACHE.ev.button = function( e ){
   return e.button;
  }
  return CACHE.ev.button( e );
 }else if( e.which ){
  CACHE.ev.button = function( e ){
   return e.which;
  }
  return CACHE.ev.button( e );
 }
 return null;
}

CACHE.ev.keyCode = function( e ){
 if( e.keyCode ){
  CACHE.ev.keyCode = function( e ){
   return e.keyCode;
  }
  return CACHE.ev.keyCode( e );
 }else if( e.which ){
  CACHE.ev.keyCode = function( e ){
   return e.which;
  }
  return CACHE.ev.keyCode( e );
 }
 return null;
}

CACHE.ev.pageX = function( e ){
 if( e.pageX ){
  CACHE.ev.pageX = function( e ){
   return e.pageX;
  }
  return CACHE.ev.pageX( e );
 }else if( e.clientX && document.body.scrollLeft ){
  CACHE.ev.pageX = function( e ){
   return e.clientX + document.body.scrollLeft;
  }
  return CACHE.ev.pageX( e );
 }
 return null;
}

CACHE.ev.pageY = function( e ){
 if( e.pageY ){
  CACHE.ev.pageY = function( e ){
   return e.pageY;
  }
  return CACHE.ev.pageY( e );
 }else if( e.clientY && document.body.scrollTop ){
  CACHE.ev.pageY = function( e ){
   return e.clientY + document.body.scrollTop;
  }
  return CACHE.ev.pageY( e );
 }
 return null;
}

CACHE.ev.altKey = function( e ){
 if( e.altKey ){
  CACHE.ev.altKey = function( e ){
   return e.altKey;
  }
  return CACHE.ev.altKey( e );
 }else if( e.modifiers ){
  CACHE.ev.altKey = function( e ){
   return ( e.modifiers & 1 ) > 0;
  }
  return CACHE.ev.altKey( e );
 }
 return null;
}

CACHE.ev.ctrlKey = function( e ){
 if( e.ctrlKey ){
  CACHE.ev.ctrlKey = function( e ){
   return e.ctrlKey;
  }
  return CACHE.ev.ctrlKey( e );
 }else if( e.modifiers ){
  CACHE.ev.ctrlKey = function( e ){
   return ( e.modifiers & 2 ) > 0;
  }
  return CACHE.ev.ctrlKey( e );
 }
 return null;
}

CACHE.ev.shiftKey = function( e ){
 if( e.shiftKey ){
  CACHE.ev.shiftKey = function( e ){
   return e.shiftKey;
  }
  return CACHE.ev.shiftKey( e );
 }else if( e.modifiers ){
  CACHE.ev.shiftKey = function( e ){
   return ( e.modifiers & 4 ) > 0;
  }
  return CACHE.ev.shiftKey( e );
 }
 return null;
}

CACHE.ev.event = function( e ){
 if( e ){
  CACHE.ev.event = function( e ){
   return e;
  }
  return CACHE.ev.event( e );
 }else if( window.event ){
  CACHE.ev.event = function( e ){
   return window.event;
  }
  return CACHE.ev.event( e );
 }
 return null;
}

function ev( evn ){
 var evnt = new Object();
 var e = CACHE.ev.event( evn );
 if( e ){
  evnt.target  = CACHE.ev.target( e );
  evnt.type    = CACHE.ev.type( e );
  evnt.pageX   = CACHE.ev.pageX( e );
  evnt.pageY   = CACHE.ev.pageY( e );
  evnt.button  = CACHE.ev.button( e );
  evnt.keyCode = CACHE.ev.keyCode( e );
 }else{
  evnt.target  = null;
  evnt.type    = null;
  evnt.pageX   = null;
  evnt.pageY   = null;
  evnt.button  = null;
  evnt.keyCode = null;
 }
 return e;
}
// - event - ===================================================================

// + event handlers + ==========================================================
function addEv( obj, type, fn ){
 if( !obj.events ) obj.events = new i();
 if( !obj.events.v( type ) ) obj.events.v( type, new l() );
 obj.events.v( type ).add( fn );
 obj[ 'on' + type ] = doOnEvent;
}

function rmEv( obj, type, fn ){
 if( obj.events ){
  if( obj.events.v( type ) ){
   obj.events.v( type ).rm( fn );
  }
 }
}

function doOnEvent( e ){
 var e = ev( e );
 if( this.events ){
  var typeEvents;
  if( typeEvents = this.events.v( e.type ) ){
   var evnt;
   while( evnt = typeEvents.next() ){
    this.doEvent = evnt;
    this.doEvent( e );
   }
   this.doEvent = null;
  }
 }
}
// - event handlers - ==========================================================

function enter( e ){  
 if( ev( e ).keyCode == 13 ) this.onEnter();
 if( ev( e ).keyCode == 27 ) if( this.onEsc ) this.onEsc();
}
