// Oggetto di verifica stato
var readyState = { INATTIVO:	  0,
				   INIZIALIZZATO: 1,
 				   RICHIESTA:	  2,
				   RISPOSTA:	  3,
				   COMPLETATO:	  4	};

// Array descrittivo dei codici restituiti dal server.
// La scelta dell' array č per evitare problemi con vecchi browsers
var statusText = new Array();

statusText[100] = "Continue";
statusText[101] = "Switching Protocols";
statusText[200] = "OK";
statusText[201] = "Created";
statusText[202] = "Accepted";
statusText[203] = "Non-Authoritative Information";
statusText[204] = "No Content";
statusText[205] = "Reset Content";
statusText[206] = "Partial Content";
statusText[300] = "Multiple Choices";
statusText[301] = "Moved Permanently";
statusText[302] = "Found";
statusText[303] = "See Other";
statusText[304] = "Not Modified";
statusText[305] = "Use Proxy";
statusText[306] = "(unused, but reserved)";
statusText[307] = "Temporary Redirect";
statusText[400] = "Bad Request";
statusText[401] = "Unauthorized";
statusText[402] = "Payment Required";
statusText[403] = "Forbidden";
statusText[404] = "Not Found";
statusText[405] = "Method Not Allowed";
statusText[406] = "Not Acceptable";
statusText[407] = "Proxy Authentication Required";
statusText[408] = "Request Timeout";
statusText[409] = "Conflict";
statusText[410] = "Gone";
statusText[411] = "Length Required";
statusText[412] = "Precondition Failed";
statusText[413] = "Request Entity Too Large";
statusText[414] = "Request-URI Too Long";
statusText[415] = "Unsupported Media Type";
statusText[416] = "Requested Range Not Satisfiable";
statusText[417] = "Expectation Failed";
statusText[500] = "Internal Server Error";
statusText[501] = "Not Implemented";
statusText[502] = "Bad Gateway";
statusText[503] = "Service Unavailable";
statusText[504] = "Gateway Timeout";
statusText[505] = "HTTP Version Not Supported";
statusText[509] = "Bandwidth Limit Exceeded";

// Funzione per prendere un elemento con id univoco
function getItemById(id_elemento) 
{
	var elemento;
	
	if (document.getElementById)
	{
		elemento = document.getElementById(id_elemento);
	}
	else
	{
		elemento = document.all[id_elemento];
	}

	return elemento;
}

// funzione per assegnare l'oggetto XMLHttpRequest
// compatibile con i browsers pių recenti e diffusi
function getXMLHttpRequest() 
{
	// Variabile di ritorno, nulla di default
	var	XHR = null;
	
	// Informazioni sul nome del browser
	browserUtente = navigator.userAgent.toUpperCase();
	
	
	// Browser standard con supporto nativo. Non importa il tipo di browser
	if (typeof(XMLHttpRequest) === "function" || typeof(XMLHttpRequest) === "object")
	{
		XHR = new XMLHttpRequest();
	}
	else if (window.ActiveXObject && browserUtente.indexOf("MSIE 4") < 0) 
	{
		// Browser Internet Explorer. E' necessario filtrare la versione 4.
		// La versione 6 di IE ha un nome differente per il tipo di oggetto ActiveX
		if (browserUtente.indexOf("MSIE 5") < 0)
		{
			XHR = new ActiveXObject("Msxml2.XMLHTTP");
		}
		else
		{
			// Le versioni 5 e 5.5 invece sfruttano lo stesso nome
		   XHR = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	
	return XHR;
}

// Getting element dimensions
function getDimensions (elm) 
{
	var box = { x:0, y:0, w:0, h:0 };
	if (document.getBoxObjectFor)
	{
		var boxRef = document.getBoxObjectFor(elm);
		box.x = boxRef.x;
		box.y = boxRef.y;
		box.w = boxRef.width;
		box.h = boxRef.height;
	}
	else if (elm.getBoundingClientRect)
	{
		var rxIE50 = /MSIE 5\.0/g;
		//alert(rxIE50 + '.test("' + navigator.appVersion + '" = ' + rxIE50.test(navigator.appVersion));
		var boxRef = elm.getBoundingClientRect();
		box.x = boxRef.left;
		box.y = boxRef.top;
		box.w = (boxRef.right - boxRef.left);
		box.h = (boxRef.bottom - boxRef.top);
		// var s='';for(p in boxRef) s+=p+'    '; alert(s);
		// Damn IE...
		if (document.compatMode && document.compatMode != 'BackCompat') 
		{
			// IE6/compliance mode
			box.x += document.documentElement.scrollLeft - 2;
			box.y += document.documentElement.scrollTop - 2;
		}
		else if (!gClientIsIE5)
		{
			// IE5.5
			box.x += document.body.scrollLeft - 2;
			box.y += document.body.scrollTop - 2;
		}
	}
	else
	{
		// No known box information available, walking
		// manually through offsetParents to calculate x/y coordinates
		box.w = elm.offsetWidth;
		box.h = elm.offsetHeight;
		while (elm)
		{
			box.x += elm.offsetLeft;
			box.y += elm.offsetTop;
			if (elm.offsetParent) // Required for Safari 1.3 :(
			{
				elm = elm.offsetParent;
			}
			else
			{
				break;
			}
		}
	}
	var cc;
	if (cc = document.getElementById('bodyconstraint'))
	{
		box.x -= cc.offsetLeft;
	}
	return box;
}

var DOM = {
	isParentOf: function (parentElm, contextElm) {
		while(contextElm && (contextElm != parentElm))
			contextElm = contextElm.parentNode;
		return (contextElm == parentElm);
	},
	getParentOrSelf: function (contextElm, nodeName) {
		nodeName = nodeName.toLowerCase();
		while (contextElm.nodeName.toLowerCase() != nodeName && contextElm.parentNode)
			contextElm = contextElm.parentNode;
		return contextElm;
	},
	addClass: function (elm, className) {
		elm.className += ' '+className;
	},
	removeClass: function (elm, className) {
		var classMatch = new RegExp('\\b'+className+'\\b', 'g');
		if (classMatch.test(elm.className))
			elm.className = elm.className.replace(classMatch, ' ');
	}	
};

var gClientIsGecko = (window.controllers) ? true : false;
var gClientIsOpera = (window.opera) ? true : false;
var gClientIsIE    = (document.all && !gClientIsOpera) ? true : false;
var gClientIsIE5   = (gClientIsIE && /MSIE 5\.0/.test(navigator.appVersion)) ? true : false;
var gClientIsMac   = (/Mac/.test(navigator.appVersion)) ? true : false;

// Array functions for IE5
if (!Array.prototype.pop)
{
	Array.prototype.pop = function() {
		var item;
		if (this.length > 0) {
			item = this[this.length-1];
			this.length--;
		}
		return item;
	};
}

if (!Array.prototype.push)
{
	Array.prototype.push = function() {
		var start = this.length;
		for (var i = 0; i < arguments.length; i++)
			this[start + i] = arguments[i];
		return this.length;
	};
}

if (!Array.prototype.shift)
{
	Array.prototype.shift = function() {
		var item = this[0];
		if (item)
			this.splice(0,1);
		return item;
	};
}

if (!Array.prototype.unshift)
{
	Array.prototype.unshift = function() {
		this.reverse();
		for(var i=arguments.length-1;i>=0;i--)
			this[this.length]=arguments[i];
		this.reverse();
		return this.length;
	};
}

// Number functions for IE5
if (!Number.prototype.toFixed)
{
	Number.prototype.toFixed = function( dc ) {
		dc = (typeof(dc)=='number') ? dc : 0;
		return eval('Math.round(this * 1e' + dc + ') / 1e' + dc);
	};
}
