function addEvent(obj, evType, fn, useCapture) {
  	if (obj.addEventListener) {
    	obj.addEventListener(evType, fn, useCapture);
    	return true;
  	} 
  	else if (obj.attachEvent) {
    	var r = obj.attachEvent("on"+evType, fn);
    	return r;
  	} 
  	else {
    	alert("Handler could not be attached");
  	}
}

function removeEvent(obj, evType, fn, useCapture) {
  	if (obj.removeEventListener) {
    	obj.removeEventListener(evType, fn, useCapture);
    	return true;
  	} 
  	else if (obj.detachEvent) {
    	var r = obj.detachEvent("on"+evType, fn);
    	return r;
  	} 
  	else {
    	alert("Handler could not be removed");
  	}
}

var descrArr = new Array();

function initDescr(selfurl) {
	//alert("Initialising Descriptions");
	msg="";	
	// loop through all anchors looking for a class item of "descr"
	// For each of these anchors, get the internal href reference (stuff after the #)
	// Get the element referenced by this particular id
	// link the .descr link to this div and hide it
	
	descrLinks = document.getElementsByTagName('a');
	for (var i=0; i<descrLinks.length; i++) { 	
		descrLink = descrLinks[i];		
		if (descrLink.getAttribute("rel") == "descr") {		
			// Extract the id of this item from the href.
			descrId = descrLink.href.substring(descrLink.href.indexOf("#") + 1);			
			msg += "Description: " + descrLink.href + "[" + descrId + "]\n";
			descrRef = document.getElementById(descrId);
			if (descrRef) {
				// 1. Add an event handler to the link to toggle the description
				descrLink.onclick = function() {
					toggleDescr(this);
				}
				// 2. Hide the element
				descrRef.style.display = "none";
				// 3. Create a close link (MSIE5.0 doesn't support array.push() )
				//helpArr.push(descrId);
				descrArr[descrArr.length] = descrId;
				msg += "Description container: " + descrId + "\n";				
			} 
			else {
				msg += "Could not find element with an id of " + descrId + "\n";
			}		
		}	
	}	
	msg += "\nAdding close links to description windows\n";
	for (var i=0; i<descrArr.length; i++) { 
		descr = descrArr[i];		
		descrRef = document.getElementById(descr);		
		if (descrRef) {
			msg += "Descr Win: " + descr + "\n";
			var closeLinkBar = document.createElement('div');
			closeLinkBar.className = "descr_close";
			closeLink = document.createElement('a');
			closeLink.className = "action";
			closeLink.setAttribute("href", selfurl + "#" + descr.substring(0, descr.length-5));
			closeLink.appendChild(document.createTextNode("[close description]"));
			closeLinkBar.appendChild(closeLink);
			descrRef.appendChild(closeLinkBar);			
			closeLink.onclick = function() {
				closeDescr(this);
				// disabled due to errors in Firefox //
				//var focusPoint = document.getElementById(this.href.substring(this.href.indexOf("#") + 1));
				//focusPoint.focus();
				return false;
			}
		}	
	}
	//alert("Messages:\n" + msg);
}

var descrOpen;

function showDescr(id) {
	var descrWin = document.getElementById(id);
	if (descrWin) {
		descrWin.style.display = "block";
		// hide the view description link
		document.getElementById("openp" + id).style.display = "none";
	} 
	else {
		alert("No description window called " + id + " found.");
	}
}

function hideDescr(id) {
	var descrWin = document.getElementById(id);
	if (descrWin) {
		descrWin.style.display = "none";
		descrOpen = null;
		// show the view description link
		document.getElementById("open" + id.substring(0, id.length-5)).style.display = "block";
	} 
	else {
		alert("No description window called " + id + " found.");
	}
}

function toggleDescr(anchorRef) {
	var descrId = anchorRef.href.substring(anchorRef.href.indexOf("#") + 1);
	if (descrOpen) {
		hideDescr(descrOpen); 
	}
	var descrWin = document.getElementById(descrId);
	if (descrWin) {
		if (descrWin.style.display == "none") {
			descrWin.style.display = "block";
			//descrId.focus(); // disabled due lack of Firefox support
			// hide the view description link
			document.getElementById("open" + descrId.substring(0, descrId.length-5)).style.display = "none";
		} 
		else {
			descrWin.style.display = "none";
			// show the view description link
			document.getElementById("open" + descrId.substring(0, descrId.length-5)).style.display = "block";
		}
		descrOpen = descrId;
	} 
	else {
		alert("No description window called " + id + " found.");
	}
}

function closeDescr(ref) {
	if (ref.href) { 
		var target = "open" + ref.href.substring(ref.href.indexOf("#") + 1); // our 'open' link
		var descrNode = ref.parentNode.parentNode;
		if (/\bdescr\b/.exec(descrNode.className)) {
			descrNode.style.display = "none";
			if(target && (document.getElementById(target).style.display = "none")) {		
				document.getElementById(target).style.display = "block"; // un-hide link
			}
			descrOpen = null;
		}		
	}
}