libevent = this.libevent || {};
/*----------------------------------------------------------------------------*/



libevent._wrap_f = function( f, on )
{
  if ( ! f.ie_wrapper ) 
  {
    f.ie_wrapper = function( e )
    {
      e = e || window.event;
      if ( typeof e.target == "undefined" ) e.target = e.srcElement;
      return f( e );
    };
  }
  return f.ie_wrapper;
};

libevent._unwrap_f = function( f )
{
  
  if ( f.ie_wrapper )
  {
    var r = f.ie_wrapper;
    f.ie_wrapper = null;
    delete f;
    return r;
  }

  return f;
};




libevent._unpack_args = function( args )
{
  var on, name, f;
  if ( args.length == 2 )
  {
    name = args[0];
    on = name == "onload" ? window : libutil.root();
    f = args[1];
  }
  else if ( args.length != 3 )
  {
    throw new Error( "Arguments are [object/id], name, function" );
  }
  else
  {
    name = args[1];
    f = args[2];

    if ( typeof args[0] == "string" )
    {
      on = document.getElementById( args[0] );    
    }
    else
    {
      on = args[0];
    }
  }
  return { on : on, name : name, f : f };
}
/*----------------------------------------------------------------------------*/






/*onid, _name, _f */
libevent.add = function(  )
{
  var w = this._unpack_args( arguments );

  if ( ! w.on )
  {
    libutil.log( arguments[0], arguments[1], arguments[2] );
    return;
  }

  if ( w.on.addEventListener )
  {
    w.on.addEventListener( w.name.slice( 2 ), w.f, false );
  }
  else if ( w.on.attachEvent )
  {
    w.on.attachEvent( w.name, this._wrap_f( w.f, w.on ) );
  }
  else 
  {    
    w.on[ w.name ] = this._wrap_f( w.f, w.on );
  }  
};
/*----------------------------------------------------------------------------*/


libevent.remove = function( /* onid, _name, _f */ )
{
  var w = this._unpack_args( arguments );

  if ( w.on.addEventListener )
  {
    w.on.removeEventListener( w.name.slice( 2 ), w.f, false );
  }
  else if ( w.on.attachEvent )
  {
    w.on.detachEvent( w.name, this._unwrap_f( w.f ) );
  }
  else 
  {    
    w.on[ w.name ] = null;
  }  
};
/*----------------------------------------------------------------------------*/



libevent.stop_propagation = function( e )
{  
  if ( typeof e.stopPropagation != "undefined" ) 
  {
    e.stopPropagation();
  }
  else
  {
    e.cancelBubble = true;
  }
  
  return true;
}
/*----------------------------------------------------------------------------*/



libevent.prevent_default = function( e )
{  
  if ( typeof e.preventDefault != "undefined" )
  {
    e.preventDefault();
  }
  else
  {
    e.returnValue = false;
  }

  return false;
}
/*----------------------------------------------------------------------------*/


libevent.stop_event = function( e )
{
  return this.stop_propagation( e ) && this.prevent_default( e );
}
/*----------------------------------------------------------------------------*/

