//Copyright (c) 2007 Encoded Media (UK) Limited. All Rights Reserved. For more information, visit www.encodedmedia.com //
//$Revision: 1.1.2.21 $

var debugstr;
var dodgyreferences = {};
var cacheTimes = {};


function D(id){
	return document.getElementById(id);
}

///////////////////////////////////////////////////////////////////////////////
// handleAjaxXml

function handleAjaxXml(req)
{
	var dataElts = req.responseXML.getElementsByTagName('serialized')[0];
	debug(getContent(req.responseXML.getElementsByTagName('message')[0]));
	var builtObj = new Object();
	unserialize(dataElts, builtObj);		
	return builtObj;
}

///////////////////////////////////////////////////////////////////////////////
// loadXMLDoc

function loadXMLDoc(url, handler, async, errorHandler)
{
	var hid = Math.random();

    var rscFunc = function () {	doReadyStateChange(hid, handler, errorHandler) };
	
	//secret closure so we don't give the above fn direct access to xmlhttp	
	(function () {
	    if (window.XMLHttpRequest)
		{
			var xmlhttp = new XMLHttpRequest();		
		}
		else if (window.ActiveXObject)
		{
			var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
		
		if (xmlhttp)
		{
			dodgyreferences[hid] = {};
			dodgyreferences[hid].URL = url;
			dodgyreferences[hid].xhr = xmlhttp;
			xmlhttp.onreadystatechange = rscFunc;
            xmlhttp.open("GET", url, async);
            
			if(cacheTimes[url]){
			    xmlhttp.setRequestHeader( "If-Modified-Since", cacheTimes[url].toGMTString() );
				//debug('Getting: ' + url + ' with if-modified-since: ' + cacheTimes[url].toGMTString() );
            } else {
				//debug('Getting: ' + url + ' with NO IF-MODIFIED-SINCE' );
			}
            try{
				xmlhttp.send(null);				
			}catch(e){
				if(errorHandler){
					errorHandler(xmlhttp);
				}
			} 
			
		}
	})();
}

function doReadyStateChange(hid, handler, errorHandler)
{
	var req = dodgyreferences[hid].xhr;
	if(!req || !req.readyState){
		return;
	}

	if(showStatus)
	{
		if(req.readState == 4 || !isIE){
			showStatus(req.responseText.length + ' bytes loaded');
		}
	}
	if (req.readyState == 4){
		try{
			if (req.status && (req.status == 200 || req.status == 304)){
                if (handler){
					if(req.status == 200){
						var d = new Date(req.getResponseHeader('Last-Modified'));					
						if (d+'' != 'NaN') {
							//debug(dodgyreferences[hid].URL + ' came back with a ' + req.status + ' , and a lastmodified of: ' + d);
							cacheTimes[dodgyreferences[hid].URL] = d;
						} else {
							//debug(dodgyreferences[hid].URL + ' came back with a ' + req.status + ' , and NO LAST_MODIFIED');
							if (!cacheTimes[dodgyreferences[hid].URL]){
								//debug('***' + cacheTimes[dodgyreferences[hid].URL]);
								cacheTimes[dodgyreferences[hid].URL] = new Date(0);
							}
						}
					}
						
					//debug(cacheTimes);
					handler(req, dodgyreferences[hid].URL);
				}
			}else{
				if (errorHandler){
					errorHandler(req, dodgyreferences[hid].URL);
				}else{
					//debug("There was a problem retrieving: ["+ dodgyreferences[hid].URL + "]\n&nbsp;" + req.statusText);
				}
			}
		}finally
		{
			req = null;
			delete(dodgyreferences[hid]);
		}
	}
}


///////////////////////////////////////////////////////////////////////////////
// getContent

function getContent(node)
{
	if (!node || !node.firstChild)
	{
		return '';
	}
	else if (node.childNodes.length > 1)
	{
		return node.childNodes[1].nodeValue;
	}
	else
	{
		return node.firstChild.nodeValue;	   
	}
}

///////////////////////////////////////////////////////////////////////////////
// getElementsByClass

function getElementsByClass(elt, theClass)
{
	var ret = new Array();
	var stack = new Array();
	stack[0] = 0;
	var i = 0;
	
	while (stack.length > 0)
	{
		if (elt.getAttribute('class') == theClass)
		{
			ret[ret.length] = elt;
		}
		var downNode;

		downNode = false;
		while (i < elt.childNodes.length)
		{
			if (elt.childNodes[i].nodeType == 1/*element*/)
			{
				stack[stack.length] = i;
				elt = elt.childNodes[i];
				i = 0;
				downNode = true;
				break;
			}
			i++;
		}
		if (!downNode)
		{
			elt = elt.parentNode;				
			i = stack[stack.length - 1] + 1;
			stack.length--;
		}
	}
	//debug(ret);
	return ret;
}

///////////////////////////////////////////////////////////////////////////////
// debug

function debug(obj)
{
	var line = '';
	
	if (typeof(obj) == 'object')
	{			
		line += obj + '\n';
		try
		{
			for (var i in obj) {
			line += '  ' + i + ' => ' + obj[i] + '\n';
			}
		}
		catch(e)
		{
			;
		}
	}
	else
	{
		line += obj + '\n';
	}

	line = line.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br />');
	debugstr = (new Date()).toLocaleTimeString() + ': ' + line + '<br />' + debugstr;			
	if (debugging)
	{
		dbg = D('debug');
		if (dbg)
		{
			dbg.innerHTML = line + dbg.innerHTML;
		}
	}
	return line;
}

///////////////////////////////////////////////////////////////////////////////
// unserialize

function unserialize(elt, currentObj)
{
	for(i = 0; i < elt.childNodes.length; i++)
	{
		var e = elt.childNodes[i];
		if (e.nodeType != 1) continue;

		var name = e.getAttribute('name');
		if (String(name).match('^[^a-zA-Z]'))
		{
			name = '_' + name;				
		}

		if (e.tagName == 'object')
		{
			currentObj[name] = new Object();
			unserialize(e, currentObj[name]);
		}
		else
		{
			currentObj[name] = getContent(e);				
		}			
	}
}
