/**
 * Adding a getElementsByClassName function
 * to the document, so it can be called
 * to populate it with tooltips
 *
 * @param the classname to gather
 */
document.getElementsByClassName = function(cl) {
  var retnode = [];
  var myclass = new RegExp('\\b'+cl+'\\b');
  var elem = this.getElementsByTagName('*');
  for (var i = 0; i < elem.length; i++) {
    var classes = elem[i].className;
    if (myclass.test(classes)) retnode.push(elem[i]);
  }
  return retnode;
}; 

/**
 * Adds a tooltip to the given element of
 * a special type, adds events to the element
 *
 * @param eventw the event, just for firefox
 */
function addToolTip(eventw, el) {
  //check for the correct source object
  if (typeof event != "undefined") {
    var element = event.srcElement;
  } else {
    var element = eventw.target;
  }
  if (el != null) element = el;
  var type = element.className;
  if (type.indexOf("smallTip") >= 0) {
    type = "smallTip";
    var relText = "";
  } else {
    type = "bigTip";
    var relText = element.getAttribute("rel");
  }
  //get text information from given element
  var text = element.title;
  toolTipText = text;
  element.title = "";
  //create the element
  var el = document.createElement("div");
  var at = document.createAttribute("class");
  at.nodeValue = type + "Element";
  el.setAttributeNode(at);
  var te = document.createElement("div");
  at = document.createAttribute("class");
  at.nodeValue = "tip-title";
  te.setAttributeNode(at);
  var tx = document.createTextNode(text);
  te.appendChild(tx);
  //special handling for big tooltips
  var be = document.createElement("div");
  at = document.createAttribute("class");
  at.nodeValue = "tip-text";
  be.setAttributeNode(at);
  be.innerHTML = relText;
  //put it all together
  el.appendChild(te);
  el.appendChild(be);
  actToolTip = el;
  //add it
  document.body.appendChild(el);
}

/**
 * Removes every tooltip from the page
 * to save rendering time
 */
function removeToolTips() {   
  var el1 = document.getElementsByClassName("smallTipElement");
  var el2 = document.getElementsByClassName("bigTipElement");
  var el = el1.concat(el2);
  for (var i = 0; i < el.length; i++) {
    document.body.removeChild(el[i]);
  }
  //set the text back into the empty tip  
  el1 = document.getElementsByClassName("smallTip");
  el2 = document.getElementsByClassName("bigTip");
  el = el1.concat(el2);
  for (i = 0; i < el.length; i++) {
    if (el[i].title == "") {
      el[i].title = toolTipText;
      break;
    }
  }
  actToolTip = null;
}

/**
 * Moves the tooltip around, according
 * to mouse position
 *
 * @param eventw the firefox event
 */
function moveToolTip(eventw, el) { 
  if (actToolTip == null) {
    addToolTip(eventw, el);
  }
  //check for the correct source object
  if (typeof event != "undefined") {
    var element = event.srcElement;
    var scrTop = 0;
    var scrLeft = 0;
    //chrome and ie workaround
    if (document.body.scrollTop != 0) {
      //chrome, safari
      scrTop = document.body.scrollTop;
    } else {
      //ie
      if (document.documentElement.scrollTop != 0) {
        scrTop = document.documentElement.scrollTop;
      }      
    }
    if (document.body.scrollLeft != 0) {
      //chrome, safari
      scrLeft = document.body.scrollLeft;
    } else {
      //ie
      if (document.documentElement.scrollLeft != 0) {
        scrLeft = document.documentElement.scrollLeft;
      }      
    }
    var mousePosX = event.clientX + scrLeft;
    var mousePosY = event.clientY + scrTop;
  } else {
    var element = eventw.target;
    var mousePosX = eventw.pageX;
    var mousePosY = eventw.pageY;
  }
  if (el != null) {
    element = el;
  }
  var type = element.className;
  //check tip width and height
  if (type.indexOf("smallTip") >= 0) {
    type = "smallTip";
    var tipheight = 10;
    var tipwidth = 90;
  } else {
    var tipheight = -25;
    var tipwidth = 65;
  }
  //move it
  actToolTip.style.top = (mousePosY - tipheight) + "px";
  actToolTip.style.left = (mousePosX - tipwidth) + "px";
}

/**
 * Adds two types of tooltips to the page
 * the small tips and the large ones
 */
function addToolTips() {
  //get all elements with tooltip class
  var el1 = document.getElementsByClassName("smallTip");
  var el2 = document.getElementsByClassName("bigTip");
  var el = el1.concat(el2);
  for (var i = 0; i < el.length; i++) {
    var current = el[i];   
    //enhance the element with mouse over/out events
    if (current.addEventListener) {
      current.removeEventListener("mouseout", removeToolTips, false);
      current.addEventListener("mouseout", removeToolTips, false);
      current.removeEventListener("mousemove", moveToolTip, false);
      current.addEventListener("mousemove", moveToolTip, false);
    } else {
      current.detachEvent("onmouseout", removeToolTips);
      current.attachEvent("onmouseout", removeToolTips);
      current.detachEvent("onmousemove", moveToolTip);
      current.attachEvent("onmousemove", moveToolTip);
    }
  }
}

toolTipText = "";
actToolTip = null;