var wiki_xmlhttp;
var wiki_searchText;
var wiki_element;
var wiki_event;
var wiki_open = false;

function wiki_close()
{
	var responseDiv = document.getElementById('Response');
	if (wiki_open)
	{
		responseDiv.style.display='none';
		wiki_open = false;
	}
}

function wiki_lookup(searchText, element, event)
{
	if (!wiki2html)
	{
		alert('The Wikipedia interpreter is no longer available.  Wikipedia links will not work.');
		return;
	}
	
	try
	{
		var responseDiv = document.getElementById('Response');
		if (responseDiv == null)
		{
			var responseDiv = document.createElement('div');
			responseDiv.id = 'Response';
			responseDiv.style.position = 'absolute';
			responseDiv.style.left = '-100px';
			responseDiv.style.top = '-100px';
			responseDiv.style.width = '300px';
			responseDiv.style.borderStyle = 'solid';
			responseDiv.style.borderTopWidth = '1px';
			responseDiv.style.borderBottomWidth = '1px';
			responseDiv.style.borderLeftWidth = '1px';
			responseDiv.style.borderRightWidth = '1px';
			responseDiv.style.borderTopColor = '#000000';
			responseDiv.style.borderBottomColor = '#000000';
			responseDiv.style.borderLeftColor = '#000000';
			responseDiv.style.borderRightColor = '#000000';
			responseDiv.style.display = 'none';
			responseDiv.style.color = '#000000';
			responseDiv.style.paddingTop = '4px';
			responseDiv.style.paddingBottom = '4px';
			responseDiv.style.paddingLeft = '4px';
			responseDiv.style.paddingRight = '4px';
			responseDiv.style.fontSize = '8pt';
			responseDiv.style.fontFamily = 'Arial, Helvetica';
			responseDiv.style.backgroundColor = '#ffff99';
			
			if (document.body.childNodes.length > 0)
				document.body.insertBefore(responseDiv, document.body.childNodes[0]);
			else
				document.body.insertBefore(responseDiv);
		}
		
		responseDiv.style.display = 'block';
		
		if (event.pageX)
		{
			responseDiv.style.top = parseInt(event.pageY) + 'px';
			responseDiv.style.left = parseInt(event.pageX) + 'px';
		}
		else
		{
			var scrollLeft = 0;
			var scrollTop = 0;
			var parent;
		
			try
			{
				parent = event.srcElement.parentNode;
				
				while (parent)
				{
					if (parent.scrollTop)
						scrollTop += parseInt(parent.scrollTop);
						
					if (parent.scrollLeft)
						scrollLeft += parseInt(parent.scrollLeft);
					
					parent = parent.parentNode;
				}			
			}
			catch (err)
			{
			}		
			
			responseDiv.style.top = (parseInt(event.y) + scrollTop) + 'px';
			responseDiv.style.left = (parseInt(event.x) + scrollLeft) + 'px';
		}
		
		wiki_open = true;
		
		if (wiki_element == element)
			return;
		else
			responseDiv.innerHTML = 'Loading... (please wait)';
			
		wiki_searchText = searchText;
		wiki_element = element;
		wiki_event = event;
		
		var url = window.location.href;
		if (url.indexOf('?') > -1)
			url += "&WikipediaQuery=";
		else
			url += "?WikipediaQuery=";

		if (window.XMLHttpRequest)
		{
			wiki_xmlhttp = new XMLHttpRequest();
			wiki_xmlhttp.onreadystatechange=wiki_lookupcallback;
			wiki_xmlhttp.open('GET', url + encodeURIComponent(wiki_searchText), true);
			wiki_xmlhttp.send(null);
		}
		else if (window.ActiveXObject)
		{
			wiki_xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
			if (wiki_xmlhttp)
			{
				wiki_xmlhttp.onreadystatechange=wiki_lookupcallback;
				wiki_xmlhttp.open('GET', url + encodeURIComponent(wiki_searchText), true);
				wiki_xmlhttp.send(null);
			}
		}
	}
	catch (err)
	{
		alert('The following error occured that prevented Wikipedia links from working properly: ' + err.message);
		if (responseDiv)
			responseDiv.style.display = 'none';
	}
	
	return false;
}

function wiki_lookupcallback()
{
	if (wiki_xmlhttp.readyState == 4)
	{
		var responseDiv = document.getElementById('Response');
		
		if (wiki_xmlhttp.status == 200)
		{
			try
			{
				var text = wiki_xmlhttp.responseText;
			}
			catch (err)
			{
				responseDiv.innerHTML = 'No additional information about \'' + wiki_searchText + '\' is available at <a href="http://www.wikipedia.org/">Wikipedia</a>.<p />[<a href="#" onclick="wiki_close(); return false;">Close this window</a>]';
				return;
			}
			
			if (!text)
			{
				responseDiv.innerHTML = 'No additional information about \'' + wiki_searchText + '\' is available at <a href="http://www.wikipedia.org/">Wikipedia</a>.<p />[<a href="#" onclick="wiki_close(); return false;">Close this window</a>]';
				return;
			}

			var textLength = -1;
			while (textLength != text.length)
			{
				textLength = text.length;
				text = text.replace(/\{\{[^\}\{]*?\}\}/g, '');
			}
			
			text = text.replace(/\:\'\'[^\n]*?\n/g, '\n');
			
			textLength = -1
			while (textLength != text.length)
			{
				textLength = text.length;
				text = text.replace(/\[\[Image:[^\n]*?\n/ig, '\n');
			}
			
			text = wiki2html(text);
			text = text.replace(/\<img[^\>]*?\>/gi, '');
			
			re = /href=(\"|\')[^\'\"\>]*?\/wiki\//g;
			while ((arr = re.exec(text)) != null)
			{
				text = text.replace(arr[0], 'href=' + arr[1] + 'http://en.wikipedia.org/wiki/');
			}
			
			var inTag = false;
			var newText = '';
			var done = false;
			var i = 0, newLength = 0;
			var c;
			while (!done && i < text.length)
			{
				c = text.substr(i, 1);
				if (c == '<')
					inTag = true;

				if (!inTag)
					newLength++;
					
				if (c == '>')
					inTag = false;
				
				newText += c;
					
				if (newLength > 250 && !inTag && c.match(/[^a-zA-Z0-9]/))
					done = true;
					
				i++;
			}		
			
			if (newText.length < text.length)	
				newText += '...<p />[<a href=\'http://en.wikipedia.org/wiki/' + encodeURIComponent(wiki_searchText) + '\'>Read more at wikipedia.org...</a>]';
			else
				newText += '<p />[<a href=\'http://en.wikipedia.org/wiki/' + encodeURIComponent(wiki_searchText) + '\'>Read the full article at wikipedia.org...</a>]';
				
			newText += '<br />[<a href="#" onclick="wiki_close(); return false;">Close this window</a>]';

			responseDiv.innerHTML = '<i>From <a href="http://www.wikipedia.org/">Wikipedia</a>...</i>' + newText;
		}
		else
		{
			responseDiv.innerHTML = 'An error occured while retrieving information from <a href="http://www.wikipedia.org/">Wikipedia</a><p />[<a href="#" onclick="wiki_close(); return false;">Close this window</a>]';
		}
	}
}