// generic event listener handler registration
//############################################
//############################################
//############################################

// efxEventRunner - constructor
///////////////////////////////
function efxEventRunner( runnerObj, eventType ) {
  this.runnerObj = runnerObj;
  this.eventType = eventType.toLowerCase();
  this.listeners = new Array();
  runnerObj[eventType+"EventRunner"] = this;
  this.setupOnEventCallback(); }

// efxEventRunner.addEventListener - registers new listener function
////////////////////////////////////////////////////////////////////
efxEventRunner.prototype.addEventListener
= function( listener ) {
  this.listeners.push(
    listener ); }

// efxEventRunner.run - runs the list of registered event listeners
///////////////////////////////////////////////////////////////////
efxEventRunner.prototype.run
= function( evt ) {

  // run all event functions
  //------------------------
  for( var funcIdx = 0;
       funcIdx < this.listeners.length;
       ++funcIdx ) {
    try {
      this.listeners[funcIdx].call(
        this,
        evt );
    } catch( err ) {} } }

// efxEventRunner.setupOnEventCallback - register onEventCallback as event handler
//////////////////////////////////////////////////////////////////////////////////
efxEventRunner.prototype.setupOnEventCallback
= function() {

  var runnerObj
    = this.runnerObj;
  var eventType
    = this.eventType;

  var onEventCallback
    = efxEventRunner[eventType+"Callback"];
  if( !onEventCallback )
    onEventCallback
      = efxEventRunner.onEventCallback;

  if( runnerObj.addEventListener )
    runnerObj.addEventListener(
      eventType.replace( "^on", "" ),
      onEventCallback,
      false );
  else
  if( runnerObj.attachEvent )
    runnerObj.attachEvent(
      eventType,
      onEventCallback );
  else
    runnerObj[eventType]
      = onEventCallback; }

// efxEventRunner.onEventCallbacks - runner DOM object onEvent callbacks
////////////////////////////////////////////////////////////////////////
efxEventRunner.onEventCallback = function( evt ) { this.onEventRunner.run( evt || window.event ); }
efxEventRunner.onabortCallback = function( evt ) { this.onabortEventRunner.run( evt || window.event ); }
efxEventRunner.onblurCallback = function( evt ) { this.onblurEventRunner.run( evt || window.event ); }
efxEventRunner.onchangeCallback = function( evt ) { this.onchangeEventRunner.run( evt || window.event ); }
efxEventRunner.onclickCallback = function( evt ) { this.onclickEventRunner.run( evt || window.event ); }
efxEventRunner.ondblclickCallback = function( evt ) { this.ondblclickEventRunner.run( evt || window.event ); }
efxEventRunner.onerrorCallback = function( evt ) { this.onerrorEventRunner.run( evt || window.event ); }
efxEventRunner.onfocusCallback = function( evt ) { this.onfocusEventRunner.run( evt || window.event ); }
efxEventRunner.onkeydownCallback = function( evt ) { this.onkeydownEventRunner.run( evt || window.event ); }
efxEventRunner.onkeypressCallback = function( evt ) { this.onkeypressEventRunner.run( evt || window.event ); }
efxEventRunner.onkeyupCallback = function( evt ) { this.onkeyupEventRunner.run( evt || window.event ); }
efxEventRunner.onloadCallback = function( evt ) { this.onloadEventRunner.run( evt || window.event ); }
efxEventRunner.onmousedownCallback = function( evt ) { this.onmousedownEventRunner.run( evt || window.event ); }
efxEventRunner.onmousemoveCallback = function( evt ) { this.onmousemoveEventRunner.run( evt || window.event ); }
efxEventRunner.onmouseoutCallback = function( evt ) { this.onmouseoutEventRunner.run( evt || window.event ); }
efxEventRunner.onmouseoverCallback = function( evt ) { this.onmouseoverEventRunner.run( evt || window.event ); }
efxEventRunner.onmouseupCallback = function( evt ) { this.onmouseupEventRunner.run( evt || window.event ); }
efxEventRunner.onresetCallback = function( evt ) { this.onresetEventRunner.run( evt || window.event ); }
efxEventRunner.onresizeCallback = function( evt ) { this.onresizeEventRunner.run( evt || window.event ); }
efxEventRunner.onselectCallback = function( evt ) { this.onselectEventRunner.run( evt || window.event ); }
efxEventRunner.onsubmitCallback = function( evt ) { this.onsubmitEventRunner.run( evt || window.event ); }
efxEventRunner.onunloadCallback = function( evt ) { this.onunloadEventRunner.run( evt || window.event ); }

