var Tooltip = {
  // defaults
  followMouse: false,
  offX: 10,
  offY: 10,
  tipID: "tipDiv",
  showDelay: 100,
  hideDelay: 100,

  // system
  ready:false,
  timer:null,
  tip:null,
  init:function(){
    if(document.createElement&&document.body&&typeof document.body.appendChild!="undefined"){
      if(!document.getElementById(this.tipID)){
        var el=document.createElement("DIV");
        el.id=this.tipID;
        document.body.appendChild(el);
      }
      this.ready=true;
    }
  },
  show:function(e,msg){
     if(this.timer){
      clearTimeout(this.timer);
      this.timer=0;
    }
    this.tip=document.getElementById(this.tipID);
    if(this.followMouse)
      dw_event.add(document,"mousemove",this.trackMouse,true);
    this.writeTip("");
    this.writeTip(msg);
    viewport.getAll();
    this.positionTip(e);
    this.timer=setTimeout("Tooltip.toggleVis('"+this.tipID+"', 'visible')",this.showDelay);
  },
  writeTip:function(msg){
    if(this.tip&&typeof this.tip.innerHTML!="undefined")
      this.tip.innerHTML=msg;
  },
  positionTip:function(e){
    if(this.tip&&this.tip.style){
      var x=e.pageX?e.pageX:e.clientX+viewport.scrollX;
      var y=e.pageY?e.pageY:e.clientY+viewport.scrollY;
      if(x+this.tip.offsetWidth+this.offX>viewport.width+viewport.scrollX){
        x=x-this.tip.offsetWidth-this.offX;
        if(x<0)
          x=0;
      }else
        x=x+this.offX;
      if(y+this.tip.offsetHeight+this.offY>viewport.height+viewport.scrollY){
        y=y-this.tip.offsetHeight-this.offY;
        if(y<viewport.scrollY)
          y=viewport.height+viewport.scrollY-this.tip.offsetHeight;
      }else
        y=y+this.offY;
      this.tip.style.left=x+"px";
      this.tip.style.top=y+"px";
    }
  },
  hide:function(){
    if(this.timer){
      clearTimeout(this.timer);
      this.timer=0;
    }
    this.timer=setTimeout("Tooltip.toggleVis('"+this.tipID+"', 'hidden')",this.hideDelay);
    if(this.followMouse)
      dw_event.remove(document,"mousemove",this.trackMouse,true);
    this.tip=null;
  },
  toggleVis:function(id,vis){
    var el=document.getElementById(id);
    if(el){
      el.style.visibility=vis;
      // for IE, hide/show SELECTs
      var appVer = navigator.appVersion.toLowerCase();
      var iePos = appVer.indexOf('msie');
      if (iePos !=-1) {
        var is_minor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)));
        var is_major = parseInt(is_minor);
      }
      if(navigator.appName.substring(0,9)=="Microsoft") {// Check if IE version is 6 or older
        if (is_major <= 6) {
          var x=el.offsetLeft;var y=el.offsetTop;var w=el.offsetWidth;var h=el.offsetHeight;
          var selx,sely,selw,selh,i;
          var sel=document.getElementsByTagName("SELECT");
          for(i=0;i<sel.length;i++){
            selx=0;sely=0;var selp;
            if(sel[i].offsetParent){selp=sel[i];
              while(selp.offsetParent){selp=selp.offsetParent;selx+=selp.offsetLeft;sely+=selp.offsetTop;}}
            selx+=sel[i].offsetLeft;sely+=sel[i].offsetTop;selw=sel[i].offsetWidth;selh=sel[i].offsetHeight;
            if(selx+selw>x && selx<x+w && sely+selh>y && sely<y+h)
              sel[i].style.visibility=(vis=='visible')?'hidden':'visible';
  }}}}},
  trackMouse:function(e){
    e=dw_event.DOMit(e);
    Tooltip.positionTip(e);
  }
};

var viewport = {
  getWinWidth: function () {
    this.width = 0;
    if (window.innerWidth) this.width = window.innerWidth - 18;
    else if (document.documentElement && document.documentElement.clientWidth)
      this.width = document.documentElement.clientWidth;
    else if (document.body && document.body.clientWidth)
      this.width = document.body.clientWidth;
  },
  getWinHeight: function () {
    this.height = 0;
    if (window.innerHeight) this.height = window.innerHeight - 18;
    else if (document.documentElement && document.documentElement.clientHeight)
      this.height = document.documentElement.clientHeight;
    else if (document.body && document.body.clientHeight)
      this.height = document.body.clientHeight;
  },
  getScrollX: function () {
    this.scrollX = 0;
    if (typeof window.pageXOffset == "number") this.scrollX = window.pageXOffset;
    else if (document.documentElement && document.documentElement.scrollLeft)
      this.scrollX = document.documentElement.scrollLeft;
    else if (document.body && document.body.scrollLeft)
      this.scrollX = document.body.scrollLeft;
    else if (window.scrollX) this.scrollX = window.scrollX;
  },
  getScrollY: function () {
    this.scrollY = 0;
    if (typeof window.pageYOffset == "number") this.scrollY = window.pageYOffset;
    else if (document.documentElement && document.documentElement.scrollTop)
      this.scrollY = document.documentElement.scrollTop;
    else if (document.body && document.body.scrollTop)
      this.scrollY = document.body.scrollTop;
    else if (window.scrollY) this.scrollY = window.scrollY;
  },
  getAll: function () {
    this.getWinWidth(); this.getWinHeight();
    this.getScrollX();  this.getScrollY();
    //alert('width='+this.width+'\nheight='+this.height+'\nscrollx='+this.scrollX+'\nscrollY='+this.scrollY);
  }
}

var dw_event = {
  add: function(obj, etype, fp, cap) {
    cap = cap || false;
    if (obj.addEventListener) obj.addEventListener(etype, fp, cap);
    else if (obj.attachEvent) obj.attachEvent("on" + etype, fp);
  },
  remove: function(obj, etype, fp, cap) {
    cap = cap || false;
    if (obj.removeEventListener) obj.removeEventListener(etype, fp, cap);
    else if (obj.detachEvent) obj.detachEvent("on" + etype, fp);
  },
  DOMit: function(e) {
    e = e? e: window.event;
    e.tgt = e.srcElement? e.srcElement: e.target;
    if (!e.preventDefault) e.preventDefault = function () { return false; }
    if (!e.stopPropagation) e.stopPropagation = function () { if (window.event) window.event.cancelBubble = true; }
    return e;
  }
}



