var Core = {};

Core.getElementById = function(elementId)
{
   var element = document.getElementById(elementId);
   if (element)
   {
      return element;
   }
   else
   {
      return false;
   }
};

Core.getNextSibling = function (startBrother)
{
  endBrother=startBrother.nextSibling;
  while(endBrother.nodeType!=1){
    endBrother = endBrother.nextSibling;
  }
  return endBrother;
}

Core.showHideElement = function(elementId)
{
   var nameHideClass = "hide_element";
   var nameShowClass = "show_element";
   var ElementToExpand = Core.getElementById(elementId); 
   var returnValue;

   if (Core.hasClass(ElementToExpand, nameHideClass))
   {
      Core.removeClass(ElementToExpand, nameHideClass);
      Core.addClass(ElementToExpand, nameShowClass);
      returnValue = "show"
   } 
   else 
   {
      Core.removeClass(ElementToExpand, nameShowClass);
      Core.addClass(ElementToExpand, nameHideClass);
      returnValue = "hide";
   }
   return returnValue;
};

Core.getElementsByClass = function (theClass)
{
   var elementArray = [];
   if (typeof document.all != "undefined") 
   {
      elementArray = document.all;
   }
   else 
   {
     elementArray = document.getElementsByTagName("*");
   }
   var matchedArray = [];
   var pattern = new RegExp("(^| )" + theClass + "( |$)");
   for (var i=0; i<elementArray.length; i++) {
      if (pattern.test(elementArray[i].className)) 
      {
         matchedArray[matchedArray.length] = elementArray[i];
      }
   }
   return matchedArray;
};

Core.hasClass = function (target, theClass) 
  {
   var pattern = new RegExp("(^| )" + theClass + "( |$)");
   if (pattern.test(target.className)) 
   {
      return true;
   }
   return false;
};

Core.addClass = function(target, theClass)
{
   if (!Core.hasClass(target, theClass))
   {
      if (target.className == "")
      {
         target.className = theClass;
      }
      else
      {
         target.className += " " + theClass;
      }
   }
};

Core.removeClass = function(target, theClass)
{
   var pattern = new RegExp("(^| )" + theClass + "( |$)");
   
   target.className = target.className.replace(pattern, "$1");
   target.className = target.className.replace(/ $/, "");
};

//w3c dom 2 events model
if (document.addEventListener) 
{
   Core.addEventListener = function (target, type, listener) 
   {
      target.addEventListener(type, listener, false);
   };
   
   Core.removeEventListener = function (target, type, listener) 
   {
      target.removeEventListener(type, listener, false);
   };
      
   Core.preventDefault = function(event) 
   {
      event.preventDefault();
   };
    
   Core.stopPropagation = function(event) 
   {
      event.stopPropagation();
   };
}

//Internet Explorer Events model
else if (document.attachEvent) 
{
   Core.addEventListener = function(target, type, listener) 
   {
      //prevent adding the same listener twice, since the Dom 2 model
      //events ignores duplicates like this
      if (Core._findListener(target, type, listener) != -1)
         return;
      //listener2 calls listener as a method of target in one of
      //two ways, depending on what this version of IE supports,
      //and passes it the global event object as an argument
      var listener2 = function() 
      {
         var event = window.event;
         if (Function.prototype.call) 
         {
            listener.call(target, event);
         } 
         else 
         {
            target._currentListener = listener;
            target._currentListener(event);
            target._currentListener = null;
         }
      };
      
      //add listener2 using IE'2 attachEvent method
      target.attachEvent("on" + type, listener2);
        
      //create an opject describing this listener so we can 
      //clean it up later
      var listenerRecord =
      {
         target: target,
         type: type,
         listener: listener,
         listener2: listener2
      };
      
      //get a reference to the window object containing target
      var targetDocument = target.document || target;
      var targetWindow = targetDocument.parentWindow;
      
      //create a unique Id for this listener
      var listenerId = "1" + Core._listenerCounter++;
      
      //store a record of this listener in the window object
      if (!targetWindow._allListeners)
         targetWindow._allListeners = {};
      targetWindow._allListeners[listenerId] = listenerRecord;
       
      //store this Listener ID in target
      if (!target._listeners) target._listeners = [];
      target._listeners[target._listeners.length] = listenerId;
      
      //set up Core._removeAllListeners to clean up all
      //Listeners on unload
      
      if (!targetWindow._unloadListenerAdded) 
      {
         targetWindow._unloadListenerAdded = true;
         targetWindow.attachEvent("onunload", Core._removeAllListeners);
      }
   };
    
   Core.removeEventListener = function (target, type, listener) 
   {
      //find out if the listener was actually added to target
      var listenerIndex = Core._findListener(target, type, listener);
      if (listenerIndex == -1) return;
       
      //get a reference to the window object containing target
      var targetDocument = target.document || target;
      var targetWindow = targetDocument.parentWindow;
      
      //obtain the record of the listener from the window object
      var listenerId = target._listeners[listenerIndex];
      var listenerRecord = targetWindow._allListeners[listenerId];
       
      //remove the listener, and remove its ID from target
      target.detaachEvent("on" + type, listenerRecord.listener2);
      target._listeners.splice(listenerIndex, 1);
      
      //remove the record of the listener from the window object
      delete targetWindow._allListeners[listenerId];
   };
    
   Core.preventDefault = function (event) 
   {
      event.returnValue = false;
   };
   
   Core.stopPropagation = function (event) 
   {
      event.cancelBubble = true;
   };
   
   Core._findListener = function(target, type, listener)
   {
      //get the array of listener Ids added to target
      var listeners = target._listeners;
      if (!listeners) return -1;
      
      //get a reference to the window objecct containing target
      var targetDocument = target.document || target;
      var targetWindow = targetDocument.parentWindow;
      
      //searching backward (to speed up onunload processing)
      //find the listener
      for (var i=listeners.length - 1; i>=0; i--)
      {
         //get the listeners Id from target
         var listenerId = listeners[i];
         
         //get the record of the listener from the window object
         var listenerRecord = targetWindow._allListeners[listenerId];
         
         //compare type and listener with the retrieved record
         if (listenerRecord.type == type && listenerRecord.listener == listener)
         {
            return i;
         }
      }
      return -1;
   };
   
   Core._removeAllListeners = function()
   {
      var targetWindow = this;
      for (id in targetWindow._allListeners)
      {
         var listenerRecord = targetWindow._allListeners[id];
         listenerRecord.target.detachEvent("on" + listenerRecord.type, listenerRecord.listener2);
         delete targetWindow._allListeners[id];
      }
   };
   
   Core._listenerCounter = 0;
}  
 
Core.start = function(runnable)
   {
      //when the first event Listener was successfully executed,
      //arguments.callee.done was set to true and therefore the second
      //eventlistener will not be executed
      var initOnce = function()
      {
         if (arguments.callee.done) return;
         arguments.callee.done = true;
         runnable.init();
      };
      
      Core.addEventListener(document, "DOMContentLoaded", initOnce);
      Core.addEventListener(window, "load", initOnce);
};

var Tooltips =
{
	init: function()
	{
		var links = Core.getElementsByClass("tlink"); //get tlink (tooltiplink) elements
		for (var i=0; i<links.length; i++)
		{
			var title = links[i].getAttribute("title");
			if (title && title.length > 0)
			{
				Core.addEventListener(links[i], "mouseover", Tooltips.showTipListener);
				Core.addEventListener(links[i], "focus", Tooltips.showTipListener);
				Core.addEventListener(links[i], "mouseout", Tooltips.hideTipListener);
				Core.addEventListener(links[i], "blur", Tooltips.hideTipListener);
			}
		}
	},
	showTipListener: function(event)
	{
		Tooltips.showTip(this);
		Core.preventDefault(event);
	},
	
	hideTipListener: function(event)
	{
		Tooltips.hideTip(this);
	},
	
	showTip: function(link)
	{
		Tooltips.hideTip(link);
		var tip = document.createElement("span");
		tip.className = "tooltip";
		var tipText = document.createTextNode(link.title);
		tip.appendChild(tipText);
		link.appendChild(tip);

		link._tooltip = tip;
		link.title = "";
		//fix for safari2 and opera9 repaint issue
		document.documentElement.style.position = "relative";
	},
	
	hideTip: function(link)
	{
		if (link._tooltip)
		{
			link.title = link._tooltip.childNodes[0].nodeValue;
			link.removeChild(link._tooltip);
			link._tooltip = null;
			//fix for safar2 and opera9 repaint issue
			document.documentElement.style.position = "static";
		}
	},
};
Core.start(Tooltips);

