var gShowDelay = 800;
var gTtHideDelay = 10000;
var gTooltip = null;
var gIframe = null;
var gTipElement = null;
var vIsIE = true;

/***********************************************************************/
/*Changes here need to be made to qjscrmain001 and qjscreels001 as well*/
/***********************************************************************/
var EventManager = {
    _registry: null,

    Initialise: function()
    {
        if (!this._registry) {
            this._registry = [];
            // Register the cleanup handler on page unload.
            EventManager.Add(window, "unload", this.CleanUp);
        }
    },

    /**
     * Registers an event and handler with the manager.
     *
     * @param  obj         Object handler will be attached to.
     * @param  type        Name of event handler responds to.
     * @param  fn          Handler function.
     * @param  useCapture  Use event capture. False by default.
     *                     If you don't understand this, ignore it.
     *
     * @return True if handler registered, else false.
     */
    Add: function(obj, type, fn, useCapture)
    {
        // If a string was passed in, it's an id.
        if (typeof obj == "string") {
            obj = document.getElementById(obj);
        }
        if (obj == null || fn == null) {
            return false;
        }
        if (obj.addEventListener) {
            vIsIE = false;
            obj.addEventListener(type, fn, useCapture);
            this._registry.push({obj: obj, type: type, fn: fn, useCapture: useCapture});
            return true;
        }
        if (obj.attachEvent && obj.attachEvent("on" + type, fn)) {
            this._registry.push({obj: obj, type: type, fn: fn, useCapture: false});
            return true;
        }

        return false;
    },
    /**
     * Removes all events attached to an object.
     *
     * @param  objIn         Object handler was attached to.
     * @param  typeIn       Name of event handler responds to (optional).
     * @param  fnIn         Handler function (optional).
     * 
     * If only the Object is supplied, then all registered events will be removed.  
     * If type or fn are supplied then only events matching the supplies values will be removed.
     */
    Remove: function (objIn, typeIn, fnIn, useCaptureIn){
         var returnValue = false;
         var o;
         for (var i = EventManager._registry.length -1; i >= 0 ; --i) {
             o = EventManager._registry[i];
            if (objIn == o.obj) {
                if ((!typeIn || typeIn == o.type) && (!fnIn || fnIn == o.fn)) {
                    try {
                        if (o.obj.removeEventListener) {
                            o.obj.removeEventListener(o.type, o.fn, o.useCapture);
                            returnValue = true;
                            EventManager._registry.splice(i, 1);
                        } else if (o.obj.detachEvent){ 
                            o.obj.detachEvent("on" + o.type, o.fn);
                            returnValue = true;
                            EventManager._registry.splice(i, 1);
                        }
                    } catch (ex) {}
                }
            }
        }
         if (!returnValue && typeof objIn == "object") { //remove the event even if it was not a registered event 
             try {
                 if (objIn.removeEventListener) { 
                     objIn.removeEventListener(typeIn, fnIn, useCaptureIn);
                 } else if (objIn.detachEvent) {
                     objIn.detachEvent("on" + typeIn, fnIn);
                 }
             } catch (ex){}
             
         }
         return returnValue;
    },

    /**
     * Cleans up all the registered event handlers.
     */
    CleanUp: function()
    {
        var o;
        if (EventManager._registry) {
            for (var i = 0; i < EventManager._registry.length; i++) {
                try {
                    o = EventManager._registry[i];
                    if (o.obj.removeEventListener) {
                        o.obj.removeEventListener(o.type, o.fn, o.useCapture);
                    } else if (o.obj.detachEvent) {
                        o.obj.detachEvent("on" + o.type, o.fn);
                    }
                } catch (ex) {}
            }
    
            // Kill off the registry itself to get rid of the last remaining
            // references.
    
            EventManager._registry = null;
        }
    }
};
EventManager.Initialise();

function addEvent(obj, type, fn, useCapture){
    EventManager.Add(obj, type, fn, useCapture);
}
function removeEvent(obj, type, fn){
    EventManager.Remove(obj, type, fn);
}
/***************************************/

function displayToolTip() {
   if (!gTooltip) {
       return;
   }
   if (gTooltip.innerHTML != "") {
       gTooltip.style.display = 'block';
       gTooltip.style.zIndex = 401;
   } else {
       gTooltip.style.display = 'none';
   }
}
function createTooltip(e) {
   var vTarget, tipText, imgSrc, img;
   if (vIsIE) {
      vTarget = e.srcElement;
       
   } else {
      vTarget = e.target;
      if(vTarget.nodeName=='#text' || vTarget.nodeName=='U') {
          vTarget = vTarget.parentNode;
      }
   }
   if(!vTarget) {
       deleteToolTip(null);
       return;
   }
   if(!vTarget.getAttribute('tooltip') || vTarget.getAttribute('tooltip') == "") {
	return;
   }
   if (!gTooltip) {
      gTooltip = document.getElementById("tipdiv");
      if (!gTooltip) {
          gTooltip = document.createElement('DIV');
          gTooltip.className = 'Tooltip';
          gTooltip.id= 'tipdiv';
          document.body.appendChild(gTooltip);
      }
   }
   tipText = vTarget.getAttribute('tooltip');
   gTooltip.innerHTML = tipText;
   
   if (vIsIE) {
      moveIEToolTip(e);
   } else {
      moveToolTip(e);
   }

   gTipElement = vTarget;
   window.setTimeout(displayToolTip,gShowDelay);
   return;
}
function deleteToolTip(e) {
    if(!gTooltip) {
        return;
    }
	if (!e) var e = window.event || null;
	if (e != null && gTipElement != null){
        try{
    		var relTarget = (e.relatedTarget) ? e.relatedTarget : e.toElement;
    		if (relTarget && relTarget.tagName) {
    			while (relTarget.tagName != 'BODY'){				
    				if (relTarget == gTipElement){
    					return;
    				}
    				relTarget = relTarget.parentNode;
    				if (!relTarget){
    					break;
    				}
    			}			
    		}	
        } catch(ex){}
	}
	gTipElement = null;	
    gTooltip.innerHTML = '';
    gTooltip.style.display='none';
}
function moveToolTip(e) {
   if(!gTooltip) {
       return;
   }

   var vWidth = window.innerWidth;
   var vHeight = window.innerHeight;
   var vLeft = e.pageX - e.clientX;

   if(vWidth - e.clientX > 100) {
      gTooltip.style.left=(e.pageX - 5) + 'px';
      gTooltip.style.right='';
      gTooltip.style.marginLeft='';
      gTooltip.style.marginRight=(20 - vLeft) + 'px';
   } else {
      gTooltip.style.right=(vWidth-(e.pageX + 5)) + 'px';
      gTooltip.style.left='';
      gTooltip.style.marginLeft=(vLeft + 20) + 'px';
      gTooltip.style.marginRight='';
   }

   if (vHeight - e.clientY > 50) {
       gTooltip.style.top=(e.pageY + 22) + 'px';
   } else {
       gTooltip.style.top=(e.pageY - 30) + 'px';
   }
}
function moveIEToolTip(e) {
   if (!gTooltip)
      return;

   if(!(e.srcElement.id || e.srcElement.name || e.srcElement.innerHTML || e.srcElement.src || e.srcElement.href)) {
       return;
   }
   var vWidth=document.body.clientWidth;
   var vHeight=document.body.clientHeight;
   var vLeft=e.clientX+document.body.scrollLeft;
   var vTop=e.clientY+document.body.scrollTop;

   if (vWidth - e.clientX > 100) {
      gTooltip.style.left=(vLeft - 5) + 'px';
      //gTooltip.style.right=(20 - document.body.scrollLeft) + 'px';
   }
   else {
      gTooltip.style.right=(vWidth-(e.clientX+10)) + 'px';
      gTooltip.style.left='';
   }

   if (vHeight - e.clientY > 50) {
       gTooltip.style.top=(vTop + 20) + 'px';
   } else {
       gTooltip.style.top=(vTop - 30) + 'px';
   }
}
function initToolTips(pElement) {
   //IE must delay or else errors will occur in IE6 with XP
   window.setTimeout(function(){initToolTipsContinued();}, 100);
}
function initToolTipsContinued(pElement) {
    addEvent(document, "mouseover", createTooltip, false);
    addEvent(document, "mouseout", deleteToolTip, false);
    if (vIsIE) {
        addEvent(document, "mousemove", moveIEToolTip, false);
    } else {
        addEvent(document, "mousemove", moveToolTip, false);
    }
}



