// Attach event handler to elements
// Author: John Resig 
// From John Resig's submission to the quirksmode.org addEvent recording contest
// Example 1: addEvent(document.getElementById("username"), 'keyup', function() { alert('key up event'); } );
// Example 2: addEvent(myele, 'keyup', keyupListener);
function addEvent( obj, type, fn ) { 
  if ( obj.attachEvent ) { // for IE to ensure that ref to 'this' in fn returns the parent obj and not the window
    obj['ie'+type+fn] = fn; 
    obj[type+fn] = function(){obj['ie'+type+fn]( window.event );};
    obj.attachEvent( 'on'+type, obj[type+fn] ); 
  } else {
    obj.addEventListener( type, fn, false ); 
  }
  delete obj;
} 

// Remove event handler from element
// Author: John Resig 
// From John Resig's submission to the quirksmode.org addEvent recording contest
function removeEvent( obj, type, fn ) { 
  if ( obj.detachEvent ) { 
    obj.detachEvent( 'on'+type, obj[type+fn] ); 
    obj[type+fn] = null; 
  } else {
    obj.removeEventListener( type, fn, false ); 
  }
  delete obj;
}

// Add a CSS class name to an element's class list
// Arguments:
// ele - the element to apply the CSS class to
// className - the class name string
// returns: null
function addCssClass(ele, className) {

  if (ele == undefined) return;

  var classList = ele.className.split(" ");

  if (classList == undefined) {
    ele.className = className;
  } else {
    var newClassName = "";

    var i = 0;
    if (classList[0] == '') {
      i = 1;
    }

    var len = classList.length;
    while (i < len) {
      if (classList[i] != className) {
        newClassName += classList[i] + " ";
      }
      i++;
    }
    ele.className = newClassName + className;
  } 
}

// Remove a CSS class name from an element's class list
// Arguments:
// ele - the element to remove the CSS class from
// className - the class name string
// returns: null
function removeCssClass(ele, className) {
  if (ele == undefined) return;
  
  if (ele.className == undefined) return;

  var classList = ele.className.split(" ");

  if (classList != undefined) {
    var newClassName = "";

    var i = 0;
    if (classList[0] == '') {
      i = 1;
    }

    var len = classList.length;
    while (i < len) {
      if (classList[i] != className) {
        newClassName += classList[i] + " ";
      } 
      i++;
    }
    ele.className = newClassName.substr(0, newClassName.length-1);
  }
}

// Determins if a CSS class is in an element's className list
// ele - the element to query
// className - the class name string
// returns: true if className exists in the element's className list
// false if the className does not exist in the element's className list
function cssClassExists(ele, className) {
  if (ele == undefined) return;

  var ret = false;
  
  var classList = ele.className.split(" ");
  if (classList != undefined) {
    for (i = 0; i < classList.length; i++) {
      if (classList[i] == className) {
        ret = true;
        break;
      }
    }
  }
  return ret;
}

function supressEvent(evt) {
  if (typeof(evt.preventDefault) != "undefined") {
    evt.preventDefault();
  } else {
    evt.cancelBubble = true;
    evt.returnValue = 0;
  }
}