
suffix = "IeHoverFix";


function IeHoverFix(classNames, hoverElementTypes) {
   this.classNames = classNames;
   this.hoverElementTypes = hoverElementTypes;
   this.eventHover = eventHover;
   this.eventUnHover = eventUnHover;
   this.getElementFromEvent = getElementFromEvent;
   this.addEventHandler = addEventHandler;
   this.arbitraryHoverHandlers = arbitraryHoverHandlers;
   this.classNameMatches = classNameMatches;
   this.addLoadEvent = addLoadEvent;
   this.addLoadEvent (arbitraryHoverHandlers);
}

function addLoadEvent(func) {
   var oldonload = window.onload;
   if (typeof window.onload != 'function') {
      window.onload = func;
   } else {
      window.onload = function() {
         oldonload();
         func();
      }
   }
}

function eventHover(event) {
   hoverElement = this.getElementFromEvent(event);
   var classes = hoverElement.className.split(" ");
   var newClassString = "";
   for (var index = 0; index < classes.length; index++) {
      if (this.classNameMatches(classes[index])) {
         if (index == 0) {
            newClassString += (classes[index] + suffix);
         }
         else {
            newClassString += (" " + classes[index] + suffix);
         }
      } else {
         if (index == 0) {
            newClassString += classes[index];
         }
         else {
            newClassString += (" " + classes[index]);
         }
      }
   }
   hoverElement.className = newClassString;
}


function eventUnHover(event) {
   hoverElement = this.getElementFromEvent(event);
   var regularExpression = new RegExp(suffix, "gi");
   hoverElement.className =
         hoverElement.className.replace(regularExpression, '');
}


function getElementFromEvent(event) {
   if (event.srcElement) {
      return event.srcElement;
   }
   return null;
}

function addEventHandler(element, eventName, functionName) {
   if (element.attachEvent) {
      element.attachEvent('on' + eventName, functionName);
   }
}

function arbitraryHoverHandlers() {
   var bodyElements;
   if (!document.body.getElementsByTagName) return;
   for (var i = 0; i < this.hoverElementTypes.length; i ++) {
      bodyElements =
            document.body.getElementsByTagName(this.hoverElementTypes[i]);
      for(j = 0; j < bodyElements.length; j++) {
         if (this.classNameMatches (bodyElements[j].className)) {
            this.addEventHandler(bodyElements[j], "mouseover", this.eventHover);
            this.addEventHandler(bodyElements[j], "mouseout", this.eventUnHover);
         }
      }
   }
}

function classNameMatches (className) {
   for (var index = 0; index < this.classNames.length; index ++) {
      if (className.indexOf(this.classNames [index]) >= 0) return true;
   }
   return false;     // No match!
}
