var glossaryTerms = new Array;

function addGlossaryTerm(id, title, txt) {
	glossaryTerms[glossaryTerms.length] = new Definition(id,title, txt);
}

function Definition(termClassName,title,defn) {
	this.termClassName = termClassName;
	this.title = title;
	this.defn = defn; 
}

function initGlossary() {
	if (document.getElementById("filter1-title") === null) {
		addCSSFile("/cards/wv/css/glossary.css");
	}
	overlay = document.getElementById('glossary-overlay');
	var offsetToBottom = new Point(-(overlay.offsetWidth/2)+25,0);
	var offsetToTop  = new Point(-(overlay.offsetWidth/2)+25,0);
	
	var tailUp = {
		tailEl: document.getElementById('overlay_arrow_up'), 
		offset: new Point(0,0)
	};
	var tailDown = {
		tailEl: document.getElementById('overlay_arrow_down'), 
		offset: new Point(0,0)
	};
	
	smallOverlays = new GlossOverlay('glossary-overlay', offsetToTop, offsetToBottom, tailUp, tailDown);
	
	var overlayLinks = getElementsByClassName(document.getElementsByTagName("body")[0],"a","glossary");
	var spanoverlays = getElementsByClassName(document.getElementsByTagName("body")[0],"span","glossary");
	for (var x = 0, y = spanoverlays.length; x < y; x++) {
		overlayLinks.push(spanoverlays[x]);
	}

	for(i=0;i<overlayLinks.length;i++){  
		if (overlayLinks[i].className.indexOf('mouseover') == -1) {
			Event.addEvent(overlayLinks[i], "click", smallOverlays.handleClick, smallOverlays);
			Event.addEvent(overlayLinks[i], "click", function(){document.getElementById('close-glossary').style.display = 'inline';}, this);
		}
		else {
			Event.addEvent(overlayLinks[i], "mouseover", smallOverlays.show, smallOverlays);
			Event.addEvent(overlayLinks[i], "mouseout", smallOverlays.hide, smallOverlays);
			Event.addEvent(overlayLinks[i], "mouseover", function(){document.getElementById('close-glossary').style.display = 'none';}, smallOverlays);
		}
	}
//	Event.addEvent("close-glossary", "click", smallOverlays.hide, smallOverlays);
	Event.addEvent("overlay_content", "click", smallOverlays.hide, smallOverlays);
	Event.addEvent("close-glossary", "focus", function(){this.blur()},this);
	Event.addEvent("close-glossary", 'mouseover', function(){this.style.cursor = "pointer"; }, this);
	Event.addEvent("close-glossary", 'mouseout',function(){this.style.cursor = "default"; }, this);
	overlayLinks = null;
}

function resetGlossaryEvents() {
	var overlayLinks = getElementsByClassName(document.getElementsByTagName("body")[0],"a","glossary");
	var spanoverlays = getElementsByClassName(document.getElementsByTagName("body")[0],"span","glossary");
	for (var x = 0, y = spanoverlays.length; x < y; x++) {
		overlayLinks.push(spanoverlays[x]);
	}
	
	for(var i=0, j=overlayLinks.length; i<j ;i++){
		if (overlayLinks[i].className.indexOf('mouseover') == -1) {
			Event.removeEvent(overlayLinks[i], "click", smallOverlays.handleClick);
			Event.removeEvent(overlayLinks[i], "click", function(){document.getElementById('close-glossary').style.display = 'inline';});
			Event.addEvent(overlayLinks[i], "click", smallOverlays.handleClick, smallOverlays);
			Event.addEvent(overlayLinks[i], "click", function(){document.getElementById('close-glossary').style.display = 'inline';}, this);
		}
		else {
			Event.removeEvent(overlayLinks[i], "mouseover", smallOverlays.show);
			Event.removeEvent(overlayLinks[i], "mouseout", smallOverlays.hide);
			Event.removeEvent(overlayLinks[i], "mouseover", function(){document.getElementById('close-glossary').style.display = 'none';});
			Event.addEvent(overlayLinks[i], "mouseover", smallOverlays.show, smallOverlays);
			Event.addEvent(overlayLinks[i], "mouseout", smallOverlays.hide, smallOverlays);
			Event.addEvent(overlayLinks[i], "mouseover", function(){document.getElementById('close-glossary').style.display = 'none';}, smallOverlays);
		}
	}
}

function getParentTd(el) {
	var parentEl = el.parentNode;
	while (parentEl && parentEl.nodeName != "TD") {
		parentEl = parentEl.parentNode;
	}
	return parentEl;
}

function getParentBlockEl(el) {
	var parentEl = el.parentNode;
	while (parentEl && parentEl.nodeName != "TD" && parentEl.nodeName != "DD" && parentEl.nodeName != "DIV" && parentEl.style["display"] != "block" && parentEl.style["display"] != "") {
		parentEl = parentEl.parentNode;
	}
	return parentEl;
}

GlossOverlay = function(displayContainer, offsetToTop, offsetToBottom, tailOnTop, tailOnBottom){
	this.container = document.getElementById(displayContainer);
	this.offsetToTop = offsetToTop;
	this.offsetToBottom = offsetToBottom;
	this.tailOnTop = tailOnTop;
	this.tailOnBottom = tailOnBottom;
	this.tailToUse = tailOnBottom;
};
GlossOverlay.prototype = {
	isShowing: false,
	currTermX: -1,
	currTermY: -1,
	currentCompare: -1,
	setChangeContentCallback: Overlay.prototype.setChangeContentCallback,
	_moveContainer: Overlay.prototype._moveContainer,
	_calculateOverlayPositionAndSize:  Overlay.prototype._calculateOverlayPositionAndSize,
	show: function(e, obj, that) {
		var term = that || this;
		this.localObj = obj;
		this.localObj.tailToUse.tailEl.style.visibility = "hidden";
		this.localObj.tailOnTop.tailEl.style.visibility = "hidden";
		this.localObj.tailToUse = this.localObj.tailOnBottom;
		this.localObj.offsetX = parseInt(this.localObj.offsetToTop.x);
		this.localObj.offsetY = parseInt(this.localObj.offsetToTop.y);
		var parentBlock = getParentBlockEl(term);
		if (term.nodeName == "SPAN") this.localObj.defaultPositionX = parseInt(term.offsetWidth / 2 - 25);
		else {
			parentBlock = getParentBlockEl(term);
			var termx = term.offsetLeft;
			var termWidth = term.offsetWidth;
			var parentWidth = parentBlock.offsetWidth;
			if (parentBlock == term.offsetParent) {
				if (parentWidth >= (termx + termWidth)) {
					this.localObj.defaultPositionX = parseInt(term.offsetWidth / 2 - 25);
				} else {
					this.localObj.defaultPositionX = parseInt((parentWidth - termx) / 2 - 25);
				}
			} else {
				this.localObj.defaultPositionX = parseInt(term.offsetWidth / 2 - 25);
			}
		}
		this.localObj.defaultPositionY = parseInt(term.offsetHeight);
		this.localObj._changeContent(term);
		this.localObj._calculateOverlayPositionAndSize(term);
		if ( this.localObj.isOverlayOutside()) {
			this.localObj.offsetX = parseInt(this.localObj.offsetToBottom.x);
			this.localObj.offsetY = parseInt(this.localObj.offsetToBottom.y);
			this.localObj.tailToUse = this.localObj.tailOnTop;
			this.localObj._calculateOverlayPositionAndSize(term);
		}
		this.localObj._moveTail(term);
		this.localObj._moveContainer(term);
		this.localObj.container.style.visibility = "visible";
		this.localObj.tailToUse.tailEl.style.visibility = "visible";
		this.isShowing = true;
		this.currTermX = Event.getPageX(term);
		this.currTermY = Event.getPageY(term);
		if (parentBlock.nodeName == "TD") this.currentCompare = parentBlock.cellIndex;
		Event.stopEvent(e);
	},
	hide: function(e,obj){
		obj.container.style.visibility = "hidden";
		obj.tailToUse.tailEl.style.visibility = "hidden";
		obj.isShowing = false;
		this.currentCompare = -1;
		if (e) Event.stopEvent(e);
	},
	handleClick: function(e,obj) {
		if (typeof(e.stopPropagation) == "function" || !document.getElementById("card_result_table")) {
			if (!smallOverlays.isShowing) smallOverlays.show(e, smallOverlays, this);
			else if (smallOverlays.currTermX != Event.getPageX(this) || smallOverlays.currTermY != Event.getPageY(this)) {
				smallOverlays.show(e, smallOverlays, this);
			}
			else smallOverlays.hide(e, smallOverlays);
		} else {
			var resultsTableYPos = Event.getPageY(document.getElementById("card_result_table"));
			if (Event.getPageY(this) > resultsTableYPos) {
				if (!smallOverlays.isShowing) smallOverlays.show(e, smallOverlays, this);
				else if (smallOverlays.currTermX != Event.getPageX(this) || smallOverlays.currTermY != Event.getPageY(this)) {
					smallOverlays.show(e, smallOverlays, this);
				}
				else smallOverlays.hide(e, smallOverlays);
			} else {
				Event.stopEvent(e);
			}
		}
	},
		isOverlayOutside: function(obj) {
		pageContainer = document.getElementById("container");
		return(this.posY < this._getScrollingPosition()[1]); 
	},
	_changeContent: function(obj) {
		var termClass = "";
		var h4, p;
		var div_overlay_content = document.getElementById('overlay_content');
		var classes = obj.className.split(" ");
		for (var j=0,k=classes.length;j<k;j++) {
			if (classes[j].indexOf("glossary-") > -1) {
				var glossaryTermClass = classes[j];
			}
		}
		for (i=0; i<glossaryTerms.length; i++ ) {
			if (glossaryTermClass === glossaryTerms[i].termClassName) {
				termClass = glossaryTerms[i].termClassName;
				if (document.getElementById('glossary-term-title')) {
					h4 = document.getElementById('glossary-term-title');
					h4.style.display = 'block';
					if(glossaryTerms[i].title == '') h4.innerHTML = '';
					else h4.innerHTML = glossaryTerms[i].title;
				}
				else{
					h4 = document.createElement('h4');
					h4.style.display = 'block';
					h4.id = 'glossary-term-title';
					h4.innerHTML = glossaryTerms[i].title;
					div_overlay_content.appendChild(h4);
				}
				if(glossaryTerms[i].title == ''){
					h4 = document.getElementById('glossary-term-title');
					h4.innerHTML = '';
					h4.style.display = 'none';
				}
				if(glossaryTerms[i].defn !== ''){
					if (!document.getElementById('glossary-definition')){
						newP = document.createElement('p');
						newP.id = 'glossary-definition';
						newP.innerHTML = glossaryTerms[i].defn;
						div_overlay_content.appendChild(newP);
					}
					else document.getElementById('glossary-definition').innerHTML = glossaryTerms[i].defn;
				}
				break;
			}
		}
	},
	_moveTail: function(obj){
		var scrollPos = this._getScrollingPosition();
		if (document.documentElement.clientWidth < this.posX + this.container.offsetWidth) {
			this.tailToUse.tailEl.style.left = (((this.container.offsetWidth + 15) - Math.abs(document.documentElement.clientWidth - Event.getPageX(obj))) - scrollPos[0]) +"px";
		} else if (this.posX <= 0) {
			this.tailToUse.tailEl.style.left = ((100 + this.posX) - scrollPos[0]) +"px";
		} else {
			this.tailToUse.tailEl.style.left = "100px";
		}
	},
	_getScrollingPosition: function(){
		var position = [0, 0];
		if (typeof window.pageYOffset != 'undefined') {
		   position = [window.pageXOffset,window.pageYOffset];
		}
		else if (typeof document.documentElement.scrollTop != 'undefined' && document.documentElement.scrollTop > 0) {
			position = [document.documentElement.scrollLeft,document.documentElement.scrollTop];
		}
		else if (typeof document.body.scrollTop != 'undefined') {
			position = [document.body.scrollLeft,document.body.scrollTop];
		}
		return position;
	}
};

function addCSSFile(file) {
	var newcss = document.createElement("link");
	newcss.setAttribute("rel", "stylesheet");
	newcss.setAttribute("type", "text/css");
	newcss.setAttribute("href", "/cards/wv/css/glossary.css");
	var docHead = document.getElementsByTagName("head")[0];
	docHead.appendChild(newcss);
}

Event.removeEvent(window,"load", initGlossary);
Event.addEvent(window,"load", initGlossary);