/*********************************************************
  File: events.js
  Author: Eric B. Wright  
  Description: JavaScript utility functions for adding 
    multiple functions to JavaScript event handlers
  Date Last Updated: September 14, 2006
**********************************************************/

/** This function will allow you to stuff multiple 
    functions into a JavaScript object's event handler
    Arguments:
      
      object - String value representing object (e.g. document)
      handler - String value representing event handler (e.g. onload)
      func - Pointer to function object to add to event handler */      
function addEventHandler(object, handler, func) {
  //initialize handler array if necessary
  if (!document.handlers)
    document.handlers = new Array();  
  //locate current defined functions for handler
  var key = object + "." + handler;
  var handlerFunctions = document.handlers[key];  
  if (handlerFunctions == null) { //initialize if undefined
    document.handlers[key] = handlerFunctions = new Array();
    //alert("Initializing handler array element for key: " + key);
  }
  //initialize function array if empty and standard event handler defined in document
  if (handlerFunctions.length == 0 && eval(key)) {
    //alert("Initializing function array for handler for key: " + key);    
    handlerFunctions[0] = eval(key);
  }
  //alert("Adding function to array at index " + handlerFunctions.length + ":" + func);
  
  handlerFunctions[handlerFunctions.length] = func; 
 
  //ensure event handler properly set
  //alert(getHandlerMainFunction(key));  
  eval(key + "=" + getHandlerMainFunction(key));
}

/*function doHandler() {
  var functions = document.handlers[...];
  for (var i = 0; i < functions.length; i++)
    functions[i](); //invoke
}*/

//must create handler function dynamically since cannot parameterize event handlers
function getHandlerMainFunction(key) {
  var fBody = "var functions = document.handlers[\"";
  fBody += key;
  fBody += "\"]; "; //obtain handler via key
  fBody += "var retVal; "; //return value
  fBody += "for (var i = 0; i < functions.length; i++) { "; //loop thru functions for handler
  fBody += "retVal = functions[i](); } "; //invoke function
  fBody += "return retVal;"; //return value of last handler
  return new Function(fBody);
}

/* new and improved event stuffer - courtesy www.scottandrew.com */
function addEvent(obj, evType, fn, useCapture){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    //alert("Handler could not be attached");
  }
}

function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    //alert("Handler could not be removed");
  }
}

//event handler for enter key
function handleEnterKey(event, form) {
  if (event)
	{
		var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
		if (keyCode == 13) 
	    form.submit();		
	}
  else
    return true;
}


