///////// domready.js
if (typeof Event == 'undefined') Event = new Object();
Event.domReady = {
  add: function(fn) {

    //-----------------------------------------------------------
    // Already loaded?
    //-----------------------------------------------------------
    if (Event.domReady.loaded) return fn();

    //-----------------------------------------------------------
    // Observers
    //-----------------------------------------------------------
    var observers = Event.domReady.observers;
    if (!observers) observers = Event.domReady.observers = [];
    // Array#push is not supported by Mac IE 5
    observers[observers.length] = fn;

    //-----------------------------------------------------------
    // domReady function
    //-----------------------------------------------------------
    if (Event.domReady.callback) return;
    Event.domReady.callback = function() {
      if (Event.domReady.loaded) return;

      Event.domReady.loaded = true;
      if (Event.domReady.timer) {
        clearInterval(Event.domReady.timer);
        Event.domReady.timer = null;
      }

      var observers = Event.domReady.observers;
      for (var i = 0, length = observers.length; i < length; i++) {
        var fn = observers[i];
        observers[i] = null;
        fn(); // make 'this' as window
      }
      Event.domReady.callback = Event.domReady.observers = null;
    };

    //-----------------------------------------------------------
    // Emulates 'onDOMContentLoaded'
    //-----------------------------------------------------------
    var ie = !!(window.attachEvent && !window.opera);
    var webkit = navigator.userAgent.indexOf('AppleWebKit/') > -1;

    if (document.readyState && webkit) {

      // Apple WebKit (Safari, OmniWeb, ...)
      Event.domReady.timer = setInterval(function() {
        var state = document.readyState;
        if (state == 'loaded' || state == 'complete') {
          Event.domReady.callback();
        }
      }, 50);

    } else {

      if (window.addEventListener) {
        // for Mozilla browsers, Opera 9
        document.addEventListener("DOMContentLoaded", Event.domReady.callback, false);
        // Fail safe
        window.addEventListener("load", Event.domReady.callback, false);
      } else if (window.attachEvent) {
        window.attachEvent('onload', Event.domReady.callback);
      } else {
        // Legacy browsers (e.g. Mac IE 5)
        var fn = window.onload;
        window.onload = function() {
          Event.domReady.callback();
          if (fn) fn();
        }
      }

    }

  }
}

///////// tabs.js
function addEvent(elm, evType, fn, useCapture) {
  if (elm.addEventListener) {
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent) {
    var r = elm.attachEvent('on' + evType, fn);
    return r;
  }
  else {
    elm['on' + evType] = fn;
  }
}

function preventDefault(e) {
  if (e.preventDefault) {
      e.preventDefault();
  }

  try {
    e.returnValue = false;
  } catch (e) {
  }
}

function ltarget(e) {
  var tmp;

  try {
    tmp = e.target;
    if (tmp != undefined) { return tmp; }
  } catch(e) {
  }

  try {
    tmp = e.srcElement;
    return tmp;
  } catch(e) {
  }

  return tmp;
}



function activa_tab(e) {
  //window.event.cancelBubble();
  preventDefault(e);
  var my_target = ltarget(e);
  var c = document.getElementById(my_target.href.substr(my_target.href.indexOf("#") + 1));
  if (c) {
    //reset all tabs
    for (var i = 0; i < my_target.tabs.length; i++) {
      document.getElementById(my_target.tabs[i].href.substr(my_target.tabs[i].href.indexOf("#") + 1)).style.display = "none";
      my_target.tabs[i].className = my_target.tabs[i].className.replace("active", "");
    }
    my_target.className += " active";
    c.style.display = "block";
	}
  return false;
}

function initTabs() {
  var sets = document.getElementsByTagName("ul");
  for (var i = 0; i < sets.length; i++) {
    if (sets[i].className.indexOf("tabset") != -1) {
      var tabs = [];
      var links = sets[i].getElementsByTagName("a");
      for (var j = 0; j < links.length; j++) {
        if (links[j].className.indexOf("tab") != -1) {
          tabs.push(links[j]);
          links[j].tabs = tabs;
          if (links[j].className.indexOf("active") != -1) {
            var c = document.getElementById(links[j].href.substr(links[j].href.indexOf("#") + 1));
            if (c)
              c.style.display = "block";
          }
          addEvent(links[j], 'click', activa_tab, false);
        }
      }
    }
  }
}
Event.domReady.add(initTabs);

///////// nav.js
function initPageNav()
{
	var nav = document.getElementById("navigation");
	if (nav)
	{
		var nodes = nav.getElementsByTagName("li");
		for (var i = 0; i < nodes.length; i++)
		{
			if (nodes[i].parentNode.id == "navigation")
			{
				nodes[i].onmouseover = function ()
				{
					this.className += " hover";
				}
				nodes[i].onmouseout = function ()
				{
					this.className = this.className.replace(" hover", "");
				}
			}
		}
	}
}
if (window.attachEvent && !window.opera)
	Event.domReady.add(initPageNav);

///////// nicetitle.js
/* =================================================================================================
* NiceTitles
* 21st January 2004
* http://neo.dzygn.com/code/nicetitles
*
* NiceTitles turns your boring (X)HTML tags into a dynamic experience
*
* Copyright (c) 2003 - 2004 Stuart Langridge, Paul McLanahan, Peter Janes, Brad Choate, Dunstan Orchard, Ethan Marcotte, Mark Wubben
*
* Licensed under MIT - http://www.opensource.org/licenses/mit-license.php
==================================================================================================*/

function NiceTitles(sTemplate, nDelay, nStringMaxLength, nMarginX, nMarginY, sContainerID, sClassName){
	var oTimer;
  var isActive = false;
  var sNameSpaceURI = "http://www.w3.org/1999/xhtml";

  if(!sTemplate){ sTemplate = "attr(nicetitle)";}
  if(!nDelay || nDelay <= 0){ nDelay = false;}
  if(!nStringMaxLength){ nStringMaxLength = 80; }
  if(!nMarginX){ nMarginX = 15; }
  if(!nMarginY){ nMarginY = 15; }
  if(!sContainerID){ sContainerID = "nicetitlecontainer";}
  if(!sClassName){ sClassName = "nicetitle";}

  var oContainer = document.getElementById(sContainerID);
  if(!oContainer){
    oContainer = document.createElementNS ? document.createElementNS(sNameSpaceURI, "div") : document.createElement("div");
    oContainer.setAttribute("id", sContainerID);
    oContainer.className = sClassName;
    oContainer.style.display = "none";
    document.getElementsByTagName("body").item(0).appendChild(oContainer);
  }

	//=====================================================================
	// Method addElements (Public)
	//=====================================================================
	this.addElements = function addElements(collNodes, sAttribute){
		var currentNode, sTitle;
	
		for(var i = 0; i < collNodes.length; i++){
			currentNode = collNodes[i];
	
			sTitle = currentNode.getAttribute(sAttribute);
			if(sTitle){
				currentNode.setAttribute("nicetitle", sTitle);
				currentNode.removeAttribute(sAttribute);
				addEvent(currentNode, 'mouseover', show);
				addEvent(currentNode, 'mouseout', hide);
				addEvent(currentNode, 'focus', show);
				addEvent(currentNode, 'blur', hide);
			}
		}
	
	}
	
	//=====================================================================
	// Other Methods (All Private)
	//=====================================================================
	function show(e){
		if(isActive){ hide(); }
	
		var oNode = window.event ? window.event.srcElement : e.currentTarget;
		if(!oNode.getAttribute("nicetitle")){
			while(oNode.parentNode){
				oNode = oNode.parentNode; // immediately goes to the parent, thus we can only have element nodes
				if(oNode.getAttribute("nicetitle")){ break;        }
			}
		}
	
		var sOutput = parseTemplate(oNode);
		setContainerContent(sOutput);
		var oPosition = getPosition(e, oNode);
		oContainer.style.left = oPosition.x;
		oContainer.style.top = oPosition.y;
	
		if(nDelay){
			oTimer = setTimeout(function(){oContainer.style.display = "block";}, nDelay);
		} else {
			oContainer.style.display = "block";
		}
	
		isActive = true;
		// Let's put this event to a halt before it starts messing things up
		window.event ? window.event.cancelBubble = true : e.stopPropagation();
	}
	
	function hide(){
		clearTimeout(oTimer);
		oContainer.style.display = "none";
		removeContainerContent();
		isActive = false;
	}
	
	function setContainerContent(sOutput){
		sOutput = sOutput.replace(/&/g, "&amp;");
		if(document.createElementNS && window.DOMParser){
			var oXMLDoc = (new DOMParser()).parseFromString("<root xmlns=\""+sNameSpaceURI+"\">"+sOutput+"</root>", "text/xml");
			var oOutputNode = document.importNode(oXMLDoc.documentElement, true);
			var oChild = oOutputNode.firstChild;
			var nextChild;
			while(oChild){
				nextChild = oChild.nextSibling; // One's the child is appended, the nextSibling reference is gone
				oContainer.appendChild(oChild);
				oChild = nextChild;
		}
		} else {
			oContainer.innerHTML = sOutput;
		}
	}
	
	function removeContainerContent(){
		var oChild = oContainer.firstChild;
		var nextChild;
	
		if(!oChild){ return; }
		while(oChild){
			nextChild = oChild.nextSibling;
			oContainer.removeChild(oChild);
			oChild =  nextChild;
		}
	}
	
	function getPosition(e, oNode){
					var oViewport = getViewport();
					var oCoords;
					var commonEventInterface = window.event ? window.event : e;
	
					if(commonEventInterface.type == "focus"){
									oCoords = getNodePosition(oNode);
									oCoords.x += nMarginX;
									oCoords.y += nMarginY;
					} else {
									oCoords = { x : commonEventInterface.clientX + oViewport.x + nMarginX, y : commonEventInterface.clientY + oViewport.y + nMarginY};
					}
	
					oContainer.style.visiblity = "hidden"; // oContainer needs to be displayed before width and height can be retrieved
					oContainer.style.display =  "block";
					var containerWidth = oContainer.offsetWidth;
					var containerHeight = oContainer.offsetHeight;
					oContainer.style.display = "none"; // hide it again
					oContainer.style.visiblity = "visible";
	
					if(oCoords.x + containerWidth + 10 >= oViewport.width + oViewport.x){
									oCoords.x = oViewport.width + oViewport.x - containerWidth - 10;
					}
					if(oCoords.y + containerHeight + 10 >= oViewport.height + oViewport.y){
									oCoords.y = oViewport.height + oViewport.y - containerHeight - oNode.offsetHeight - 10;
					}
	
					oCoords.x += "px";
					oCoords.y += "px";
	
					return oCoords;
	}
	
	function parseTemplate(oNode){
		var sAttribute, collOptionalAttributes;
		var oFound = {};
		var sResult = sTemplate;
	
		if(sResult.match(/content\(\)/)){
			sResult = sResult.replace(/content\(\)/g, getContentOfNode(oNode));
		}
	
		var collSearch = sResult.split(/attr\(/);
		for(var i = 1; i < collSearch.length; i++){
			sAttribute = collSearch[i].split(")")[0];
			oFound[sAttribute] = oNode.getAttribute(sAttribute);
			if(oFound[sAttribute] && oFound[sAttribute].length > nStringMaxLength){
				oFound[sAttribute] = oFound[sAttribute].substring(0, nStringMaxLength) + "...";
			}
		}
	
		var collOptional = sResult.split("?")
		for(var i = 1; i < collOptional.length; i += 2){
			collOptionalAttributes = collOptional[i].split("attr(");
			for(var j = 1; j < collOptionalAttributes.length; j++){
				sAttribute = collOptionalAttributes[j].split(")")[0];
	
				if(!oFound[sAttribute]){ sResult = sResult.replace(new RegExp("\\?[^\\?]*attr\\("+sAttribute+"\\)[^\\?]*\\?", "g"), "");        }
			}
		}
		sResult = sResult.replace(/\?/g, "");
	
		for(sAttribute in oFound){
			sResult = sResult.replace("attr\("+sAttribute+"\)", oFound[sAttribute]);
		}
	
		return sResult;
	}
	
	function getContentOfNode(oNode){
		var sContent = "";
		var oSearch = oNode.firstChild;
	
		while(oSearch){
			if(oSearch.nodeType == 3){
				sContent += oSearch.nodeValue;
			} else if(oSearch.nodeType == 1 && oSearch.hasChildNodes){
				sContent += getContentOfNode(oSearch);
			}
			oSearch = oSearch.nextSibling
		}
	
		return sContent;
	}
	
	function getNodePosition(oNode){
		var x = 0;
		var y = 0;
	
		do {
			if(oNode.offsetLeft){ x += oNode.offsetLeft }
			if(oNode.offsetTop){ y += oNode.offsetTop }
		} while((oNode = oNode.offsetParent) && !document.all) // IE gets the offset 'right' from the start
	
		return {x : x, y : y}
	}

// Idea from 13thParallel: http://13thparallel.net/?issue=2002.06&title=viewport
  function getViewport(){
    var width = 0;
    var height = 0;
    var x = 0;
    var y = 0;

    if(document.documentElement && document.documentElement.clientWidth){
      width = document.documentElement.clientWidth;
      height = document.documentElement.clientHeight;
      x = document.documentElement.scrollLeft;
      y = document.documentElement.scrollTop;
    } else if(document.body && document.body.clientWidth){
      width = document.body.clientWidth;
      height = document.body.clientHeight;
      x = document.body.scrollLeft;
      y = document.body.scrollTop;
    }
    // we don't use an else if here, since Opera 7 tends to get the height on the documentElement wrong
    if(window.innerWidth){
      width = window.innerWidth - 18;
      height = window.innerHeight - 18;
    }

    if(window.pageYOffset){
      x = window.pageXOffset;
      y = window.pageYOffset;
    } else if(window.scrollY){
      x = window.scrollX;
      y = window.scrollY;
    }

    return {width : width, height : height, x : x, y : y };
  }
}

//=====================================================================
// Here the default nice titles are created
//=====================================================================
NiceTitles.autoCreation = function(){
  if(!document.getElementsByTagName){ return; }
  NiceTitles.autoCreated = new Object();
  NiceTitles.autoCreated.anchors = new NiceTitles("<p class=\"titletext\">attr(nicetitle)?</p>", 300, 500);
  NiceTitles.autoCreated.anchors.addElements(document.getElementsByTagName("a"), "title");
}

Event.domReady.add(NiceTitles.autoCreation);