//Crea il metodo pad per l'oggetto string
String.prototype.pad = function(l, s, t){
    return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length) + 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2)) 	+ this + s.substr(0, l - t) : this;
};
        
//Crea il metodo indexOf all'oggetto Array a tutti i browser che non hanno tale metodo.
if(!Array.indexOf){
    Array.prototype.indexOf = function(obj, start){
        for(var i=(start||0); i<this.length; i++){
            if(this[i]==obj){
                return i;
            }
        }
    }
}

//Restituisce un array con le coordinate x e y del componente passato come parametro.
function findPos(obj) 
{
	var curleft = curtop = 0;
	if (obj.offsetParent){
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent){
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	} else if (obj.x) {
		curleft += obj.x;
		curtop  += obj.y;
	}
	 
	return [curleft,curtop];
}

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function xserver()
{
    this._server_remote = null;
    this._server_form   = null;
    this._server_par_nm = new Array();
    this._server_par_val = new Array();	   
	this._server_is_raise = false;
	
    // istanziazione oggetto http   
    if (window.ActiveXObject)
    {
        this._server_remote = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest)
    {
        this._server_remote = new XMLHttpRequest();
    }
                            
    // aggiunge i parametri da inviare al servizio
    this.add = function (nm,val)
    {
        this._server_par_nm [this._server_par_nm.length]  = nm;
        this._server_par_val[this._server_par_val.length] = val;
    }
   
    // imposta il form da cui andare a prelevare i parametri
    this.set_form = function (lfrm)
    {
        this._server_form = lfrm;
    }
 
    // imposta il comportamento del server
    // in caso di errore ad emettere una eccezione
    this.set_raise = function(val)
    {
        if (val==undefined) val = true;
        this._server_is_raise = val;
    }

    this.display_message = function (msg,container_typ,container)
    {
        if (msg != '')
        {                                              
            if (container == undefined || container == null)
            {
               container ='err_msg';
            }						                       
			
			if (container_typ == 'div')
			{
			    if (document.getElementById(container) == null)
	            {
                   document.body.innerHTML += '<div id="'+container+'" style="position: absolute; left: 10%; top: 10%; background-color: white; border: 1px solid blue; display: none; font-family: Verdana; font-size: 12px; padding: 10px" onClick="this.style.display=\'none\';">&nbsp;</div>';        
    	        }
				 var cont = document.getElementById(container);
					 cont.innerHTML = msg + '<br>' + '<input type="button" name="btn_close_dialog" onClick="document.getElementById(\'' + container + '\').style.visibility = \'hidden\';" class="chiudi" value="Chiudi">';
                     cont.style.display = '';
			}
			 else if(container_typ == 'popup')
			{
				var cont = window.open('','popup','width=640,height=480');
					cont.document.write(msg);
					cont.document.close();
			}
			 else
			{
				alert(msg);
			}			 								           
        }
    }
	
	this.load_all_element = function ()
	{
        if (this._server_form)
        {
			var elem = null;     
            // se è impostata un form di riferimento allora
            // allineo i parametri con i suoi valori
            for (var i = 0; i < this._server_form.length; i++)
            {
                elem = this._server_form.elements[i];
                switch(elem.type)
                {
                	case 'checkbox':
	                case 'radio':
    	                // se non è impostato allora non lo inserisco come parametro
        			            if(!elem.checked) continue;
                    			break;
                }
                if (elem.disabled) continue;
                this.add(elem.name, elem.value);
            }
        }
	}
	
	this.make_param = function ()
	{
		var str = '';
		if (this._server_par_nm.length > 0)
        {
            for(var i = 0; i < this._server_par_nm.length; i++)
            {
                str += this._server_par_nm[i]+'='+escape(this._server_par_val[i]) + '&';
            }
            str = str.substring(0,str.length-1);
        }
		/*
		 * Resetto gli array che  che ho usato per costruire i parametri da inviare all chiamata.
		 */
		this._server_par_nm.length  = 0;
		this._server_par_val.length = 0;
		return str;
	}
	
    this.call = function (srv,resp)
    {
        if (!this._server_remote)
        {
            alert('Chiamata as servizio '+srv+' impossibile.\nServer non inizializzato.');
            return;
        }       
        
        //Richiamo la funzione che carica gli eventuali elementi della form.
		this.load_all_element();
        var str = this.make_param();
              
        if (resp==undefined)
        {
            // sincrono
            this._server_remote.open("POST", srv, false);            
			this._server_remote.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            this._server_remote.send(str);
            if (this._server_is_raise)
            {
                var xml = this.get_xml();
                if (xml && xml.tagName=='error')
                {
                    throw new Error('Si è verificato un errore');
                    return;
                }
            }
               
        }
         else
        {
            // asincrono
            this._server_remote.open("POST", srv, true);
            this._server_remote.onreadystatechange = resp;            
			this._server_remote.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            this._server_remote.send(str);
        }
       
        return;
    }

    this.get_text = function ()
    {
        return this._server_remote.responseText;
    }
       
    this.get_xml = function ()
    {
        if (this._server_remote.responseXML)
        {
            return this._server_remote.responseXML.documentElement;
        }
        return null;
    }

    return this;
}

var server = xserver(); 

