function addListener( objet, eventName, eventHandler ) {
  var ActiveBubbling = ( arguments.length > 3 )
    ? arguments[ 3 ] : false;
  if ( objet.addEventListener ) objet.addEventListener( eventName, eventHandler, ActiveBubbling );
  else if ( objet.attachEvent ) objet.attachEvent( 'on' + eventName, eventHandler );
  else {
    var oldHandler = null;
    eval( 'if ( objet.on' + eventName + ' ) oldHandler = objet.on' + eventName + '; objet.on' + eventName + ' = function() { if ( oldHandler != null ) oldHandler(); eventHandler() };' );
  }
}

function removeListener( objet, eventName, eventHandler ) {
  var ActiveBubbling = ( arguments.length > 3 )
    ? arguments[ 3 ] : false;
  if ( objet.removeEventListener )
    objet.removeEventListener( eventName, eventHandler, ActiveBubbling );
  else if ( objet.detachEvent )
    objet.detachEvent( 'on' + eventName, eventHandler );
}

var DOMEvent = {
  toString: function() {
    return '[DOMEvent]';
  },
  get: function( e ) {
    return ( !e )
      ? window.event : e;
  },
  getTarget: function( e ) {
    return ( e.srcElement )
      ? e.srcElement : e.target;
  },
  preventDefault: function( e ) {
    if ( typeof e.preventDefault != 'undefined' )
      e.preventDefault();
    e.returnValue = false;
  },
  stopPropagation: function( e ) {
    if ( typeof e.stopPropagation != 'undefined' )
      e.stopPropagation();
    e.cancelBubble = true;
  },
  stopEvent: function( e ) {
    this.stopPropagation( e );
    this.preventDefault( e );
  }
}

var Delegate = {
 /*
	*  @sample obj.addEventListener( 'click', Delegate.create( this, 'onTriggerClick' ) );
	*/
  create : function( obj, methodName ) {
    var args = new Array();
    if ( arguments.length > 2 ) {
      for( var i=2; i<arguments.length; i++ )
        args.push( arguments[ i ] );
    }
  	return function() {
  	  var a = new Array();
     	for( var i=0; i<arguments.length; i++ )
    	 	a.push( arguments[ i ] );
  	  for( var i=0; i<args.length; i++ )
  	    a.push( args[ i ] );
  		obj[ methodName ].apply( obj, a );
  	}
  },
 /*
	*  @sample obj.addEventListener( 'click', Delegate.bind( function() {
	*    alert( this.o.name );
	*  }, { o.name: 'Bond, James Bond !' } ) );
	*/
  bind: function( fn, props ) {
    return function() {
      for( var i in props )
        fn[ i ] = props[ i ];
      fn.apply( fn );
    }
  }
}