window.onerror = function (e,s,l) { alert('Error: '+e+" \n["+s+' ('+l+')]'); return true; }

var req = new Array();
var reqref = 0;

if (document.images)
{
	var flippies = new Array();
	flippies.closed = new Image();
	flippies.closed.src = '/buttons/flippyr';
	flippies.open = new Image();
	flippies.open.src = '/buttons/flippyd';
	flippies.wait = new Image();
	flippies.wait.src = '/buttons/flippyw';
}

function getArticle(itemid,expand)
{
	var ok = false;
	if (document.images && document.getElementsByTagName && document.getElementById)
	{
		var b = document.getElementsByTagName('body');
		if ( b && b.length > 0 && b[0].innerHTML )
		{
			if (window.XMLHttpRequest || (window.ActiveXObject && navigator.platform != 'MacPPC') )
			{
				ok = true;
				var ref = findItemid(itemid);
				if ( !ref )
				{
					var d = new Date();
					ref = 'r' + d.getTime() + ++reqref;
					if (req[ref] = new Array())
					{
						req[ref].itemid = itemid;
						var url = '/scribblings/xml?itemid=' + itemid + '&e=' + expand + '&r=' + ref;
						hg_start(ref,expand);
						req[ref].xmlreq = new xmlReq(url, 'GET', '', processReqChange, ref);
						if (req[ref].xmlreq && req[ref].xmlreq.req)
							req[ref].xmlreq.send();
						else
						{
							hg_off(ref);
							delete req[ref];
						}
					}
				}
				else if ( req[ref] && req[ref].state == 'wait' )
					cancelRequest(ref);
			}
		}
	}
	if (!ok)
		alert("The expand/compact feature will not work on this browser.\n\nUse the 'Read article' link instead");
	return false;
}


function findItemid(itemid)
{
	for ( var i in req )
	{
		if (req[i].itemid == itemid)
			return i;
	}
	return false;
}


function xmlReq(url, method, data, reqChange, ref)
{
	this.req = null;
	if ( window.XMLHttpRequest )
		this.req = new XMLHttpRequest;
	else if (window.ActiveXObject && navigator.platform != 'MacPPC')
	{
		this.req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (this.req)
	{
		this.data = data;
		this.req.onreadystatechange = function () { reqChange(ref) }
		this.req.open(method.toUpperCase(), url, true);
		this.req.setRequestHeader("Content-type", "text/xml");
		this.sendp = function () { this.req.send(this.data) }
		this.send = this.sendp;
	}
}


function processReqChange(ref)
{
	if (req[ref] && req[ref].xmlreq && req[ref].xmlreq.req)
	{
		if (req[ref].state != 'done')
		{
			var r = req[ref].xmlreq.req;
			if (r.readyState && r.readyState == 4)
			{
				var done = false;
				if (r.status && r.status == 200)
				{
					var myref = r.responseXML.getElementsByTagName("yourref");
					if (myref && myref.length > 0)
					{
						if (ref == trimStr(textData(myref[0])))
						{
							var articles = r.responseXML.getElementsByTagName("article");
							if (articles && articles.length > 0)
							{
								var itemid = articles[0].getElementsByTagName('itemid');
								if (itemid && itemid.length > 0)
								{
									itemid = 'art'+trimStr(textData(itemid[0]));
									var artNode = document.getElementById(itemid);
									if (artNode)
									{
										var body = articles[0].getElementsByTagName("body");
										if (body && body.length > 0)
										{
											hg_off(ref);
											done = true;
											artNode.innerHTML = textData(body[0]);
										}
										else
											codingError("No article body in response");
									}
									else
										codingError("Can't find article on this page");
								}
								else
									codingError("Missing itemid in response");
							}
							else
								codingError("No article tag in response");
						}
						else
							codingError("Mismatched references");
					}
					else
						codingError("No reference in response");
				}
				else
					alert( r.status );
				if (!done)
					cancelRequest(ref);
				setTimeout("deleteRequest('"+ref+"')", 250);
			}
		}
	}
}

function textData(fromNode)
{
	var str = '';
	if (fromNode.childNodes)
	{
		if (fromNode.childNodes.length > 1)
			str = fromNode.childNodes[1].nodeValue;
		else if (fromNode.firstChild)
			str = fromNode.firstChild.nodeValue;
	}
	return str;
}

function cancelRequest(ref)
{
	if ( req[ref] )
	{
		var i = document.getElementById(req[ref].icon);
		if (i)
		{
			if (req[ref].expand)
				i.setAttribute('src', flippies.closed.src);
			else
				i.setAttribute('src', flippies.open.src);
			hg_off(ref);
			delete req[ref];
		}
	}
}

function deleteRequest(ref)
{
	if (req[ref])
		delete req[ref];
}

function codingError(msg)
{
	alert("Coding error:\n" + msg);
}

function hg_start(ref,expand)
{
	req[ref].state = 'pend';
	req[ref].icon = 'flp'+req[ref].itemid;
	req[ref].expand = expand;
	setTimeout("hg_on('"+ref+"')", 750);
}

function hg_on(ref)
{
	hourglass_setwait(req[ref]);
}

function hg_off(ref)
{
	hourglass_setdone(req[ref]);
}


function hourglass_setwait(obj)
{
	if ( obj && obj.state == 'pend' )
	{
		if (obj.icon)
		{
			var i = document.getElementById(obj.icon);
			if (i)
				i.setAttribute('src', flippies.wait.src);
		}
		obj.state = 'wait';
	}
}

function hourglass_setdone(obj)
{
	if (obj)
		obj.state = 'done';
}


function trimStr( str )
{
  for (var i=0;
       str.charAt(i)==" " || str.charAt(i)=='\n' || str.charAt(i)=='\r' || str.charAt(i)=='\t';
       i++);
    str = str.substring( i, str.length );
  for (var i=str.length-1;
       str.charAt(i)==" " || str.charAt(i)=='\n' || str.charAt(i)=='\r' || str.charAt(i)=='\t';
       i--);
    str = str.substring( 0, i + 1 );
  return(str);
}
