/* *** externalLinks: mark external links w/ icon and open new window *** */
function externalLinks()
{
	if (!document.getElementsByTagName) return;
	var anchors = document.getElementsByTagName("a");
	for (var i=anchors.length-1; i>=0; i--)
	{
		var anchor = anchors[i];
		if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external")
		{
			anchor.target = "_blank";
			if(!document.createElement) continue;
			var img = document.createElement("img");
			img.src = "themes/colors/images/new_window.png";
			img.title = "Offsite link, opens in a new window";
			img.style.paddingLeft = '3px';
			var parent = anchor.parentNode;
			parent.insertBefore(img,anchor.nextSibling);
		}
	}
}

/* *** footnoteLinks: add a footnote for each link (useful for printouts) *** */
function trim(c) {
	if (c)
		c = c.replace(/^\s*|\s*$/,'');
	return c;
}
function hasClass(obj, c) {
	if (!obj || !c) return false;
	c = trim(c);
	var oldC = trim(obj.className);
	if (c && oldC && oldC.match('\\b'+c+'\\b'))
		return true;
	else
		return false;
}
function addClass(obj, c) { 
	if (!obj || !c || hasClass(obj, c)) return;
	c = trim(c);
	var oldC = trim(obj.className);
	if (!c) return;
	obj.className = (oldC) ? oldC + ' ' + c :  c;
	return;
}
function lastChildContainingText(obj) { 
	var testChild = obj.lastChild;
	var contentCntnr = ['p','li','dd'];
	while (testChild.nodeType != 1) { testChild = testChild.previousSibling; }
	var tag = testChild.tagName.toLowerCase();
	var tagInArr = inArray.apply(contentCntnr, [tag]);
	if (!tagInArr && tagInArr!==0) { testChild = lastChildContainingText(testChild); }
	return testChild;
}
function walk(parent, list, contained) {
	if (!document.getElementById || 
		!document.getElementsByTagName ||
		!document.createElement) return false;
	if (!parent || !list || !contained) return false;
	var num = 0;
	for (var j in contained) {
		num = Math.max(num, contained[j]);
	}
	for (var i=0; i < parent.childNodes.length; i++) {
		if (parent.childNodes[i].nodeType != 1) continue;
		var child = parent.childNodes[i];
		if (hasClass(child, 'ignore')) continue;
		if (hasClass(child, 'displayonly')) continue;
		else if ( child.getAttribute('href') || child.getAttribute('cite')) {
			var thisLink = (child.getAttribute('href') ? child.href : child.cite).replace(/^mailto:\s*/, "");
			if (thisLink == window.location + '#' || thisLink.match('^javascript:') || thisLink == child.innerHTML)
				continue;
			// if (thisLink.match('/' + window.location.hostname + '/')) continue;
			if (thisLink == window.location) continue;
			var note = document.createElement('sup');
			addClass(note,'printOnly');
			var note_txt;
			if (contained[thisLink]) { 
				note_txt = document.createTextNode('['+contained[thisLink]+']');
			} else {
				var li = document.createElement('li');
				var li_txt = document.createTextNode(thisLink);
				li.appendChild(li_txt);
				list.appendChild(li);
				num++;
				contained[thisLink] = num;
				note_txt = document.createTextNode('['+num+']');
			}      
			note.appendChild(note_txt);
			if (child.tagName.toLowerCase() == 'blockquote') {
				var lastChild = lastChildContainingText(child);
				lastChild.appendChild(child);
			} else {
				parent.insertBefore(note, child.nextSibling);
			}
		} else {
			walk(child, list, contained);
		}
	}
}
function footnoteLinks(containerID,targetID) {
	if (!document.getElementById || 
		!document.getElementsByTagName ||
		!document.createElement) return false;
	if (!document.getElementById(containerID) ||
		!document.getElementById(targetID)) return false;
	var container = document.getElementById(containerID);
	var target    = document.getElementById(targetID);
	var h2        = document.createElement('h2');
	addClass(h2, 'printOnly');
	var h2_txt    = document.createTextNode('Links');
	h2.appendChild(h2_txt);
	var ol   = document.createElement('ol');
	addClass(ol, 'printOnly');
	var myArr = new Array();
	walk(container, ol, myArr);
	if (ol.getElementsByTagName('li').length) {
		target.appendChild(h2);
		target.appendChild(ol);
	}
	addClass(document.getElementsByTagName('body')[0], 'noted');
	return true;
}

/* *** createTOC: create table of contents dynamically for current page *** */
var toBeTOCced = new Array();

function traverseTOC(tree,tocID)
{
	if (tree.id == tocID) return;
	if (tree.nodeName.search(/^h[234]/i) != -1)
		toBeTOCced.push(tree);
	if (tree.hasChildNodes())
	{
		for(var i=0; i<tree.childNodes.length; i++)
			traverseTOC(tree.childNodes[i]);
	}
}

function createTOC(contentsID,tocID)
{
	if (!document.getElementById) return; // no DOM
	if (!document.createElement) return; // no DOM
	var contentsObj = document.getElementById(contentsID);
	var tocObj = document.getElementById(tocID);
	if (!contentsObj) return; // no object to traverse!
	if(!tocObj) return; // we don't have a toc element
	var x = contentsObj.childNodes;
	for (var i=0;i<x.length;i++)
	{
		traverseTOC(x[i],tocID,toBeTOCced);
	}

	if (toBeTOCced.length < 2) return;

	var a = document.createElement('h2');
	addClass(a,'toc');
	addClass(a,'bg_medium');
	a.appendChild(document.createTextNode('Page Contents'));
	var b = document.createElement('a');
	b.name = 'tocarea';
	b.rel = 'table of contents';
	b.accessKey = '7';
	a.appendChild(b);
	tocObj.appendChild(a);

	// we have content to add
	for (var i=0;i<toBeTOCced.length;i++)
	{
		var tmp = document.createElement('a');
		for (var j=0;j<toBeTOCced[i].childNodes.length;j++)
			tmp.appendChild(toBeTOCced[i].childNodes[j].cloneNode(true));
		tmp.appendChild(document.createElement('br'));
		tmp.href = '#toclink' + i;
		tmp.className = 'tocitem';
		if (toBeTOCced[i].nodeName == 'H3')
			addClass(tmp,'indent');
		if (toBeTOCced[i].nodeName == 'H4')
			addClass(tmp,'doubleindent');
		tocObj.appendChild(tmp);
		var tmp2 = document.createElement('a');
		tmp2.id = 'toclink' + i;
		toBeTOCced[i].parentNode.insertBefore(tmp2,toBeTOCced[i]);
	}
}

/* *** styleAbbr: fix IE (lack of) handling of abbr tags *** */
function styleAbbr() {
	var oldBodyText, newBodyText, reg;
	if (document.all) {
		// document.all is a test for IE
		oldBodyText = document.body.innerHTML;
		reg = /<ABBR([^>]*)>([^<]*)<\/ABBR>/g;
		newBodyText = oldBodyText.replace(reg, '<ABBR $1><SPAN class=\"abbr\" $1>$2</SPAN></ABBR>');
		document.body.innerHTML = newBodyText;
	}
}

/* *** makeNiceTitles: for a, ins, abbr - generate nice "popup" titles *** */
var XHTMLNS = "http://www.w3.org/1999/xhtml";
var CURRENT_NICE_TITLE;

function makeNiceTitles() {
    if (!document.createElement || !document.getElementsByTagName) return;
    // add namespace methods to HTML DOM; this makes the script work in both
    // HTML and XML contexts.
    if(!document.createElementNS)
    {
        document.createElementNS = function(ns,elt) {
            return document.createElement(elt);
        }
    }

    if( !document.links )
    {
        document.links = document.getElementsByTagName("a");
    }
    for (var ti=0;ti<document.links.length;ti++) {
        var lnk = document.links[ti];
        if (lnk.title) {
            lnk.setAttribute("nicetitle",lnk.title);
            lnk.removeAttribute("title");
            addEvent(lnk,"mouseover",showNiceTitle);
            addEvent(lnk,"mouseout",hideNiceTitle);
            addEvent(lnk,"focus",showNiceTitle);
            addEvent(lnk,"blur",hideNiceTitle);
        }
    }
    var instags = document.getElementsByTagName("ins");
    if (instags) {
        for (var ti=0;ti<instags.length;ti++) {
            var instag = instags[ti];
            if (instag.dateTime) {
                var strDate = instag.dateTime;
                var dtIns = new Date(strDate.substring(0,4),parseInt(strDate.substring(4,6)-1),strDate.substring(6,8),strDate.substring(9,11),strDate.substring(11,13),strDate.substring(13,15));
                instag.setAttribute("nicetitle","Added on "+dtIns.toString());
                addEvent(instag,"mouseover",showNiceTitle);
                addEvent(instag,"mouseout",hideNiceTitle);
                addEvent(instag,"focus",showNiceTitle);
                addEvent(instag,"blur",hideNiceTitle);
            }
        }
    }
    var abbrtags = document.getElementsByTagName("abbr");
    if (abbrtags) {
        for (var ab=0;ab<abbrtags.length;ab++) {
            var abbrtag = abbrtags[ab];
            if (abbrtag.title) {
              abbrtag.setAttribute("nicetitle",abbrtag.title);
              abbrtag.removeAttribute("title");
              addEvent(abbrtag,"mouseover",showNiceTitle);
              addEvent(abbrtag,"mouseout",hideNiceTitle);
              addEvent(abbrtag,"focus",showNiceTitle);
              addEvent(abbrtag,"blur",hideNiceTitle);
            }
        }
    }
    var acrotags = document.getElementsByTagName("acronym");
    if (acrotags) {
        for (var ac=0;ac<acrotags.length;ac++) {
            var acrotag = acrotags[ac];
            if (acrotag.title) {
              acrotag.setAttribute("nicetitle",acrotag.title);
              acrotag.removeAttribute("title");
              addEvent(acrotag,"mouseover",showNiceTitle);
              addEvent(acrotag,"mouseout",hideNiceTitle);
              addEvent(acrotag,"focus",showNiceTitle);
              addEvent(acrotag,"blur",hideNiceTitle);
            }
        }
    }
}

function findPosition( oLink ) {
  if( oLink.offsetParent ) {
    for( var posX = 0, posY = 0; oLink.offsetParent; oLink = oLink.offsetParent ) {
      posX += oLink.offsetLeft;
      posY += oLink.offsetTop;
    }
    return [ posX, posY ];
  } else {
    return [ oLink.x, oLink.y ];
  }
}

function showNiceTitle(e) {
    if (CURRENT_NICE_TITLE) hideNiceTitle(CURRENT_NICE_TITLE);
    if (!document.getElementsByTagName) return;
    if (window.event && window.event.srcElement) {
        lnk = window.event.srcElement
    } else if (e && e.target) {
        lnk = e.target
    }
    if (!lnk) return;
    if (lnk.nodeType == 3) {
        // lnk is a textnode -- ascend parents until we hit a link
        lnk = getParent(lnk,"A");
    }
    if (!lnk) return;
    nicetitle = lnk.getAttribute("nicetitle");
    
    var d = document.createElementNS(XHTMLNS,"div");
    d.className = "nicetitle";
    tnt = document.createTextNode(nicetitle);
    pat = document.createElementNS(XHTMLNS,"p");
    pat.className = "titletext";
    pat.appendChild(tnt);
    d.appendChild(pat);
    if (lnk.href) {
        tnd = document.createTextNode(lnk.href);
        pad = document.createElementNS(XHTMLNS,"p");
        pad.className = "destination";
        pad.appendChild(tnd);
        d.appendChild(pad);
    }
    
    STD_WIDTH = 300;
    if (lnk.href) {
        h = lnk.href.length;
    } else { h = nicetitle.length; }
    if (nicetitle.length) {
      t = nicetitle.length;
    }
    h_pixels = h*6; t_pixels = t*10;
    
    if (h_pixels > STD_WIDTH) {
        w = h_pixels;
    } else if ((STD_WIDTH>t_pixels) && (t_pixels>h_pixels)) {
        w = t_pixels;
    } else if ((STD_WIDTH>t_pixels) && (h_pixels>t_pixels)) {
        w = h_pixels;
    } else {
        w = STD_WIDTH;
    }
        
    d.style.width = w + 'px';    

    mpos = findPosition(lnk);
    mx = mpos[0];
    my = mpos[1];
    
    d.style.left = (mx+15) + 'px';
    d.style.top = (my+35) + 'px';
    if (window.innerWidth && ((mx+w) > window.innerWidth)) {
        d.style.left = (window.innerWidth - w - 25) + "px";
    }
    if (document.body.scrollWidth && ((mx+w) > document.body.scrollWidth)) {
        d.style.left = (document.body.scrollWidth - w - 25) + "px";
    }
    document.getElementsByTagName("body")[0].appendChild(d);
    CURRENT_NICE_TITLE = d;
}

function hideNiceTitle(e) {
    if (!document.getElementsByTagName) return;
    if (CURRENT_NICE_TITLE) {
        document.getElementsByTagName("body")[0].removeChild(CURRENT_NICE_TITLE);
        CURRENT_NICE_TITLE = null;
    }
}

function getParent(el, pTagName) {
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
		return el;
	else
		return getParent(el.parentNode, pTagName);
}

/* *** library functions *** */
function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}

var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

addEvent(window,'unload',EventCache.flush);
