// AJAX
var ajaxReferer=null;
var isIE=false;

// Creacio de l'objecte XMLHTTP
function newAjaxInterface()
{
	var intf;
	
	try
	{
		intf=new XMLHttpRequest();	
	}
	catch (error)
	{
		try
		{
			intf=new ActiveXObject("Microsoft.XMLHTTP");
			isIE=true;
		}
		catch (error)
		{
			return false;
		}
	}
	
	return intf;
}

// Gestio de canvi d'estat
function ajaxStateChange(ajax, responseHandler)
{
	if (ajax.readyState==4 && ajax.status==200)
	{
		try
		{
			eval(responseHandler+'(ajax)');
		}
		catch (error)
		{
			// de moment res
		}
	}
}

// Get d'un doc
function ajaxGet(url, responseHandler, async)
{
    var ajax=newAjaxInterface();
	
	if (ajax)
	{
		ajax.open("GET", url, async);
		ajax.setRequestHeader("Connection", "close");
		if (ajaxReferer!=null)
			ajax.setRequestHeader("Referer", ajaxReferer);
		if (responseHandler!=null)
			ajax.onreadystatechange = function() { ajaxStateChange(ajax, responseHandler); };
		ajax.send(null);
	}
	
	return ajax;
}

// Gestio de canvi d'estat per un Get amb Info Addicional
function ajaxStateChangeWithExtraInfo(ajax, responseHandler, info)
{
	if (ajax.readyState==4 && ajax.status==200)
	{
		try
		{
			eval(responseHandler+'(ajax, info)');
		}
		catch (error)
		{
			// de moment res
		}
	}
}

// Get d'un doc Amb info addicional pel proces del resultat
function ajaxGetWithExtraInfo(url, responseHandler, info, async)
{
    var ajax=newAjaxInterface();
	
	if (ajax)
	{
		ajax.open("GET", url, async);
		ajax.setRequestHeader("Connection", "close");
		if (responseHandler!=null)
			ajax.onreadystatechange = function() { ajaxStateChangeWithExtraInfo(ajax, responseHandler, info); };
		ajax.send(null);
		
		if (async==false)
			return ajax;
	}
}

// retrieve text of an XML document element, including
// elements using namespaces
function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix && isIE) {
        // IE/Windows way of handling namespaces
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        // the namespace versions of this method 
        // (getElementsByTagNameNS()) operate
        // differently in Safari and Mozilla, but both
        // return value with just local name, provided 
        // there aren't conflicts with non-namespace element
        // names
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
			if (result.firstChild!=undefined)
				return result.firstChild.nodeValue;
			else
				return '';
        }
    } else {
        return "n/a";
    }
}

// Per fer POSTs, quan hi ha info addicional a enviar per la peticio
// que no conve passar a la URL
function ajaxPost(url, body, contentType, optResponseHandler, async)
{
	var ajax=newAjaxInterface();
	
	if (ajax)
	{
		ajax.open("POST", url, async);
		ajax.setRequestHeader("Content-Type", contentType);
		ajax.setRequestHeader("Accept-Charset", "utf-8");
		ajax.setRequestHeader("Content-length", body.length);
		ajax.setRequestHeader("Connection", "close");
		if (optResponseHandler!=null)
		{
			ajax.onreadystatechange = function() { ajaxStateChange(ajax, optResponseHandler); };
		}
		ajax.send(body);
	}
	
	return ajax;
}


