// JavaScript Document

function getXMLDoc(xml)
{
	var xmlDoc = null;
	
	try //Firefox, Mozilla, Opera, etc.
	{
		var parser = new DOMParser();
		xmlDoc = parser.parseFromString(xml, 'text/xml');
		xmlDoc.async = false;
	}
	catch(e) //Internet Explorer
	{
		var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = false;
		xmlDoc.loadXML(xml);
	}
	
	return xmlDoc;
}

function getXmlHttpObject()
{	
	var xmlHttp = null;
	
	try
	{// Firefox, Opera 8.0+, Safari
		xmlHttp = new XMLHttpRequest();
	}
	catch(e)
	{// Internet Explorer
		try
		{
			xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch(e1)
		{
			try
			{
				xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
			}
			catch(e2)
			{
				alert("Your browser doesn't support AJAX.");;
			}
		}
	}
	
	return xmlHttp;
}

function genericCallback(ajax, xmlDoc)
{
	delete ajax;
}

function ajaxObject(url, id)
{
	var me = this;
	
	this.element_id = id;
	this.updating = false;
	this.callback = genericCallback;
	this.url = url;
	
	this.abort = function()
	{
		if(me.updating)
		{
			me.updating = false;
			me.xmlHttp.abort();
			delete me.xmlHttp;
		}
	}
	
	this.update = function(passData)
	{
		if (me.updating == true)
		{
			return false;
		}
		
		me.updating = true;
		me.xmlHttp = getXmlHttpObject();
		
		if (me.xmlHttp == null)
		{
			return false;
		}
		else
		{
			me.xmlHttp.onreadystatechange = function()
			{
				if(me.xmlHttp.readyState == 4 || me.xmlHttp.readyState == "complete")
				{
					var status = 1;
					var message = null;
					
					switch(me.xmlHttp.status)
					{
						case 0:
							return;
						case 200:
							try
							{
								var xmlDoc = getXMLDoc(me.xmlHttp.responseText);
								delete me.xmlHttp;
								me.updating = false;
								me.callback(me, xmlDoc);
								return;
							}
							catch(e)
							{
								message = 'Error Parsing XML';
							}
							break;
						case 400:
							message = 'Error 400: Bad Request';
							break;
						case 401:
							message = 'Error 401: Authentication Required';
							break;
						case 403:
							message = 'Error 403: Access Forbidden';
							break;
						case 404:
							message = 'Error 404: Not Found';
							break;
						case 408:
							message = 'Error 408: Request Timeout';
							break;
						case 500:
							message = 'Error 500: Server Error';
							break;
						default:
							message = 'Unknown Error: ' + xmlHttp.status;
							break;
					}
					
					delete me.xmlHttp;
					me.updating = false;
					
					var xml = '<ajax_return>\
						<status>'+status+'</status>\
						<message>'+message+'</message>\
					</ajax_return>';
					
					var xmlDoc = getXMLDoc(xml);
					if(xmlDoc != null)
						me.callback(me, xmlDoc);
				}
				else
				{
					// still loading...
				}
			}
			
			var timestamp = new Date();
			var rand = Math.floor(Math.random()*10000);
			var uri = url+'?'+(passData ? passData+'&' : '')+'timestamp='+(timestamp*1)+'&tamid_sid='+rand;
			me.xmlHttp.open('GET', uri, true);
			me.xmlHttp.send(null);
			return true;
		}              
	}
}

function getTagValue(node, tagName)
{
	var tags = node.getElementsByTagName(tagName);
	if(tags.length == 0)
		return null;
	var childNodes = tags[0].childNodes;
	if(childNodes.length == 0)
		return null;
	return childNodes[0].nodeValue;
}