function getXmlHttp()
{
	try
	{
		// Firefox, Opera 8.0+, Safari
		return new XMLHttpRequest();
	}
	catch (e)
	{
		// Internet Explorer
		try
		{
			return new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				return new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{
				window.alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}
}

function getResponseXMLDocumentElement(xmlHttp)
{
	var xmlDoc;
	var responseText = xmlHttp.responseText;
	responseText = responseText.replace(/^.*?<\?xml/, '<?xml');
	xmlDoc = createXMLDocument(responseText);
	if (xmlDoc && xmlDoc.documentElement)
	{
		return xmlDoc.documentElement;
	}
	xmlDoc = createXMLDocument('<?xml version="1.0"?><ajax_response garbage="1" />');
	return xmlDoc.documentElement;
}

function createXMLDocument(text)
{
	var xmlDoc;
	try
	{
		parser = new DOMParser();
		xmlDoc = parser.parseFromString(text, "text/xml");
	}
	catch (e)
	{
		try
		{
			xmlDoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
			xmlDoc.loadXML(text);
		}
		catch (e)
		{
			try
			{
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.loadXML(text);
			}
			catch (e)
			{
			}
		}
	}
	return xmlDoc;
}
	

function htmlEntities(str)
{
	// based on a script by Dieter Raber <dieter@dieterraber.net>
	// http://www.dieterraber.net/includes/ghf8/Javascript/stringFunctions.js
	
	var chars = new Array ('&','à','á','â','ã','ä','å','æ','ç','è','é',
							'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',
							'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',
							'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',
							'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',
							'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\"','ß','<',
							'>','¢','£','¤','¥','¦','§','¨','©','ª','«',
							'¬','­','®','¯','°','±','²','³','´','µ','¶',
							'·','¸','¹','º','»','¼','½','¾');

	var entities = new Array ('amp','agrave','aacute','acirc','atilde','auml','aring',
								'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',
								'iacute','icirc','iuml','eth','ntilde','ograve','oacute',
								'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',
								'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',
								'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',
								'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',
								'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',
								'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',
								'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',
								'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',
								'sup2','sup3','acute','micro','para','middot','cedil','sup1',
								'ordm','raquo','frac14','frac12','frac34');

	newString = str;
	if (newString)
	{
		for (var i = 0; i < chars.length; i++)
		{
			myRegExp = new RegExp(chars[i],'g');
			newString = newString.replace (myRegExp, '&' + entities[i] + ';');
		}
	}
	return newString;
}

function formatText(text)
{
	if (!text) return "";
	text = htmlEntities(text);
	text = text.replace(/http:\/\/([^\s]*)/g, "<a href=\"http://$1\" onclick=\"window.open(this.href); return false;\">http://$1</a>");
	text = text.replace(/\n/g, "<br />");
	return text;
}
	
function formatBullets(text)
{
	if (!text) return "";
	text = htmlEntities(text);
	text = text.replace(/http:\/\/([^\s]*)/g, "<a href=\"http://$1\" onclick=\"window.open(this.href); return false;\">http://$1</a>");
	text = "<ul><li>" + text +"</li></ul>";
	text = text.replace(/\n/g, "</li><li>");
	return text;
}

function normaliseWidths(searchClass)
{
	var elements = document.getElementsByTagName("*");
	var maxWidth = 0;
	var resizeElements = new Array();
	for (i = 0; i < elements.length; i++)
	{
		var element = elements[i];
		var elementClasses = element.className.split(" ");
		for (var j = 0; j < elementClasses.length; j++)
		{
			if (elementClasses[j] == searchClass)
			{
				maxWidth = Math.max(maxWidth, element.offsetWidth);
				resizeElements[resizeElements.length] = element;
			}
		}
	}
	for (i = 0; i < resizeElements.length; i++)
	{
		resizeElements[i].style.width = maxWidth + "px";
	}
}

function windowReload()
{
	window.location.reload();
}

var originalButtonSrcs = new Array();

function disableButton(buttonID, csrBar)
{
	button = document.getElementById(buttonID);
	originalButtonSrcs[buttonID] = button.src;
	button.src = csrBar ? "/images/buttons/busy_r.png" : "/images/buttons/busy_y.png";
	button.disabled = true;
}

function enableButton(buttonID)
{
	button = document.getElementById(buttonID);
	button.src = originalButtonSrcs[buttonID];
	button.disabled = false;
}

function openWindow(url)
{
	var newWindow = window.open(url);
	return newWindow == null;
}

function hint(id, text)
{
	var element = document.getElementById(id);
	element.innerHTML = text;
	element.style.display = text ? "" : "none";
}

var SITE_NAME = "Catalogue Shopping Review";
var SITE_SHORT_NAME = "CSR";