var vocabLoaded;

if(vocabLoaded != 1) {

var crossBrowser = {
	
	addEventListener : function (element, eventName, func) {
		if ( element.addEventListener ) {
			element.addEventListener(eventName, func, false);
		} else if ( element.attachEvent ) {
			element.attachEvent("on" + eventName, func);
		}
	},
	
	removeEventListener : function (element, eventName, func) {
		if ( element.removeEventListener ) {
			element.removeEventListener(eventName, func, false);
		} else if ( element.detatchEvent ) {
			element.detatchEvent("on" + eventName, func);
		}
	},
	
	getTarget : function (e) {
		var targ;
		if (!e) var e = window.event;
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		if (targ.nodeType == 3)
			targ = targ.parentNode;
		
		return targ;
	},
	
	getMousePosition : function (e) {
		var posx = 0;
		var posy = 0;
		
		if (!e) var e = window.event;
		if (e.pageX || e.pageY) {
			posx = e.pageX;
			posy = e.pageY;
		}
		else if (e.clientX || e.clientY) {
			posx = e.clientX + document.body.scrollLeft
				+ document.documentElement.scrollLeft;
			posy = e.clientY + document.body.scrollTop
				+ document.documentElement.scrollTop;
		}
		
		return [posx, posy];
	},
	
	getPosition : function (theElement) {
		var positionY=0;
		var positionX=0;

		while(theElement!=null) {
			positionX+=theElement.offsetLeft;
			positionY+=theElement.offsetTop;
			theElement=theElement.offsetParent;
		}
		
		return [positionX, positionY];
	},
	
	containsPoint : function (element, mousePos) {
		var elementPos = crossBrowser.getPosition(element);
		var pad = 0;
		
		// Hack for vocab.tooltip issues in IE6	
		if(element.entryMousePos != null) {
			pad = element.entryMousePos[1]+1;
		}
	
		if(mousePos[0] > elementPos[0]-4 && mousePos[0] < elementPos[0]+4 + element.offsetWidth) {
			if(mousePos[1] > elementPos[1]-4 && mousePos[1] < Math.max(elementPos[1]+4 + element.offsetHeight, pad)) {
				return true;
			}
		}
	
		return false;
	},
	
	toggleClass : function (element, className) {
		var oldClassName = ""
		if(element.className != null) { oldClassName = element.className; }
		if(oldClassName.match(className) != -1) {
			element.className = oldClassName + " " + className;
		} else {
			element.className = oldClassName.replace(new RegExp(className), "");
		}
	},
	
	addClass : function (element, className) {
		if(element.className.match(className) != -1) {
			element.className = element.className + " " + className;
		}
	},
	
	removeClass : function (element, className) {
		element.className = element.className.replace(new RegExp(className), "");
	},
	
	getElementsByClassName : function (className, tag, elm) {
		if (document.getElementsByClassName) {
			getElementsByClassName = function (className, tag, elm) {
				elm = elm || document;
				var elements = elm.getElementsByClassName(className),
					nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
					returnElements = [],
					current;
				for(var i=0, il=elements.length; i<il; i+=1){
					current = elements[i];
					if(!nodeName || nodeName.test(current.nodeName)) {
						returnElements.push(current);
					}
				}
				return returnElements;
			};
		}
		else if (document.evaluate) {
			getElementsByClassName = function (className, tag, elm) {
				tag = tag || "*";
				elm = elm || document;
				var classes = className.split(" "),
					classesToCheck = "",
					xhtmlNamespace = "http://www.w3.org/1999/xhtml",
					namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
					returnElements = [],
					elements,
					node;
				for(var j=0, jl=classes.length; j<jl; j+=1){
					classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
				}
				try	{
					elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
				}
				catch (e) {
					elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
				}
				while ((node = elements.iterateNext())) {
					returnElements.push(node);
				}
				return returnElements;
			};
		}
		else {
			getElementsByClassName = function (className, tag, elm) {
				tag = tag || "*";
				elm = elm || document;
				var classes = className.split(" "),
					classesToCheck = [],
					elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
					current,
					returnElements = [],
					match;
				for(var k=0, kl=classes.length; k<kl; k+=1){
					classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
				}
				for(var l=0, ll=elements.length; l<ll; l+=1){
					current = elements[l];
					match = false;
					for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
						match = classesToCheck[m].test(current.className);
						if (!match) {
							break;
						}
					}
					if (match) {
						returnElements.push(current);
					}
				}
				return returnElements;
			};
		}
		return getElementsByClassName(className, tag, elm);
	}
	
};

var vocab = {

	highlightedWord : null,
	title : "",
	timeout : "",
	tooltip : "",
	moreInfoURL : "",
	stack : new Array(),
	status : "off",
	
	attachTooltip : function (collection, hideLink) {
		if(arguments.length == 1) { hideLink = 0; }
		if(!collection) { return; }
		collection = collection.length ? collection : [collection];
		for(var i = collection.length-1; i >= 0; i--) {
			if(!collection[i].definition) {
				collection[i].definition = "";
				collection[i].definition = collection[i].getAttribute('title');
				collection[i].hideLink = hideLink;
				collection[i].removeAttribute('title');
				crossBrowser.addEventListener(collection[i], "mouseover", vocab.displayTooltip);
				crossBrowser.addEventListener(collection[i], "mouseout", vocab.mousemove);
			}
		}	
	},
	
	displayTooltip : function (e) {
		var targ = crossBrowser.getTarget(e);
		
		if(vocab.highlightedWord != null && vocab.highlightedWord != targ) { vocab.hideTooltip(); }
		if(vocab.highlightedWord != null) { return; }
		
		vocab.highlightedWord = targ;
		vocab.highlightedWord.entryMousePos = crossBrowser.getMousePosition(e);
		
		if(vocab.highlightedWord.hideLink == 1) {
			if(document.getElementById('vocab-moreinfo')) {
				document.getElementById('vocab-moreinfo').style.display = 'none';
			}
		} else {
			if(document.getElementById('vocab-moreinfo')) {
				document.getElementById('vocab-moreinfo').style.display = '';
			}
		}
		
		document.getElementById('vocab-definition').innerHTML = 
			vocab.highlightedWord.definition.replace(/(.*) : (.*)/, "<b>$1</b> : $2");
		
		//console.log("MIU: " + vocab.moreInfoURL);
		if(document.getElementById('vocab-moreinfo') != null) {
			document.getElementById('vocab-moreinfo').setAttribute('href',
				vocab.moreInfoURL + vocab.highlightedWord.definition.split(":")[0]);
		}
		
		vocab.tooltip.style.left = crossBrowser.getPosition(vocab.highlightedWord)[0] - 30 + 
			(vocab.highlightedWord.offsetWidth/2) + 'px';

		vocab.tooltip.style.top = 1 + crossBrowser.getPosition(vocab.highlightedWord)[1] - 
			vocab.tooltip.offsetHeight + 'px';
		
		var tipclass = "vocab";
		
		if(crossBrowser.getPosition(document.getElementsByTagName('body')[0])[0] + 
			document.getElementsByTagName('body')[0].offsetWidth -
				crossBrowser.getPosition(vocab.highlightedWord)[0] <= 250) {

			crossBrowser.addClass(vocab.tooltip, 'vocab-tipleft');
			vocab.tooltip.style.left = crossBrowser.getPosition(vocab.highlightedWord)[0] - 
				vocab.tooltip.offsetWidth + 30 + (vocab.highlightedWord.offsetWidth/2) + 'px';
			
			tipclass = tipclass + "-tipleft";
		} else {
			tipclass = tipclass + "-tipright";
		}
		
		if(crossBrowser.getPosition(vocab.highlightedWord)[1] < vocab.tooltip.offsetHeight + 20) {
			crossBrowser.addClass(vocab.tooltip, 'vocab-tipunder');
			vocab.tooltip.style.top = 4 + crossBrowser.getPosition(vocab.highlightedWord)[1] + 
				vocab.highlightedWord.offsetHeight + 'px';
			
			tipclass = tipclass + "-tipunder";
		} else {
			tipclass = tipclass + "-tipabove";
		}
		
		crossBrowser.addClass(vocab.tooltip, tipclass);
		
		crossBrowser.removeClass(vocab.tooltip, 'vocab-hidden');
	
		crossBrowser.addEventListener(document, "mousemove", vocab.mousemove);
	},
	
	hideTooltip : function () {
		crossBrowser.addClass(vocab.tooltip, 'vocab-hidden');
		crossBrowser.removeClass(vocab.tooltip, 'vocab-tipleft');
		crossBrowser.removeClass(vocab.tooltip, 'vocab-tipunder');
		
		crossBrowser.removeClass(vocab.tooltip, 'vocab-tipright-tipabove');
		crossBrowser.removeClass(vocab.tooltip, 'vocab-tipleft-tipabove');
		crossBrowser.removeClass(vocab.tooltip, 'vocab-tipright-tipunder');
		crossBrowser.removeClass(vocab.tooltip, 'vocab-tipleft-tipunder');
		
		vocab.highlightedWord = null;
		crossBrowser.removeEventListener(document, "mousemove", vocab.mousemove);
	},
	
	mousemove : function (e) {
		if(vocab.highlightedWord == null) { return; }
		
		var mousePos = crossBrowser.getMousePosition(e);
		
		if(!crossBrowser.containsPoint(vocab.highlightedWord, mousePos)) {
			if(!crossBrowser.containsPoint(vocab.tooltip, mousePos)) {
				vocab.hideTooltip();
			}
		}
	},

	on : function () {
		return window.location.href.match(/http:\/\/[^\/]+\.bbc\.co\.uk\/apps\/nr\/vocab\//);
	},
	
	preInit : function (e) {
		vocab.tooltip = document.getElementById('vocab-tooltip');
		if(vocab.tooltip == undefined || vocab.tooltip == null) {
			var body = document.getElementsByTagName('body')[0];

			vocab.tooltip = document.createElement('span');
			vocab.tooltip.setAttribute('id', 'vocab-tooltip');
			vocab.tooltip.className = 'vocab-hidden vocab-tooltip';
			vocab.tooltip.innerHTML = '<span id="vocab-top" class="vocab-top"></span><span id="vocab-content" class="vocab-content"><span id="vocab-definition" class="vocab-definition"></span></span><span id="vocab-bottom" class="vocab-bottom">&nbsp;</span>';

			body.appendChild(vocab.tooltip);
		}
		
		if(document.getElementById("vbswitch")) {
				vocab.attachTooltip(document.getElementById("vbswitch"),1);
		}
	},
	
	init : function (e) {
		crossBrowser.addEventListener(vocab.tooltip, "mousemove", vocab.mousemove);
		if(vocab.tooltip.getElementsByTagName('a').length > 0 && vocab.tooltip.getElementsByTagName('a')[0].getAttribute('href')) {
			//console.log(vocab.tooltip.getElementsByTagName('a')[0].getAttribute('href'));
			vocab.moreInfoURL = vocab.tooltip.getElementsByTagName('a')[0].getAttribute('href');
		}
		
		vocab.attachTooltip(crossBrowser.getElementsByClassName('vocabHW'));
		vocab.status = "on";
		crossBrowser.toggleClass(document.getElementById("vbswitch"), "vbswitchoff");
		crossBrowser.toggleClass(document.getElementById("vbswitch"), "vbon");
	},
	
	onloadStack : function (e) {
		for (var i=0; i<vocab.stack.length; i++) {
			var foo = vocab.stack[i]();
		}
	}
	
};

	if (window.onload != null) {
		vocab.stack.push(window.onload);
	}
	vocab.stack.push(function(){vocab.preInit()});
	window.onload = function(){vocab.onloadStack()};
	vocabLoaded = 1;
}

