//--------------------------------------------------------------------------------------------------
// Funziona alla stessa maniera della explode php.
// Se non viene passato il delimitatore, viene utilizzato quello utilizzato per desired.
//--------------------------------------------------------------------------------------------------
function explode(IString,IDelimiter) {
	WDelimiter = (IDelimiter) ? IDelimiter : "<!--AJAXJCodeSeparator-->";
	return IString.split(WDelimiter);
}
//------------------------------------------------------------------------------
function $(IObjId){ return  document.getElementById(IObjId) }
function $N(IObjName){ return  document.getElementsByName(IObjName) }
//------------------------------------------------------------------------------
function DataManager() {
	// Properties
	var self = this;
	self.RequestCompleteEvent = null;
	this.RequestCompleteEvent = self.RequestCompleteEvent;
    this.RequestCompleteEvent = self.RequestCompleteEvent;
	self.RequestFailedEvent = null;
	this.RequestFailedEvent = self.RequestFailedEvent;
    self.WaitObject = null;
	this.WaitObject = self.WaitObject;

	// ----------------------------------------------------------------------------
	// begin Overall update
	// ----------------------------------------------------------------------------
	// IdName da caricare
	self.IdName = null;
	this.IdName = self.IdName;
    //Funzione da eseguire dopo il completamento di tutte le operazioni REQUEST
    this.FuncAfter= null;
    //Dati da inviare con la richiesta post
    this.Data=null;
    //Tipo di Richiesta POST o GET(default)
    this.Type="GET";
	// ----------------------------------------------------------------------------
	// end Overall update
	// ----------------------------------------------------------------------------

	// Param is a property where you can store information which you may require
	// once the datahandler is complete. For example, the translation of the
	// word "complete" for alerting that something is finished. It can be
	// referenced from within the RequestCompleteEvent or RequestFailedEvent
	// events with this.Param.
	self.Param = null;
	this.Param = self.Param;


	// Methods
	this.CreateDataHandler = function(Request, IWaitObject) {
		var DataHandler = function() {
			if (Request.readyState == 4) {
              if (Request.status == 200) {
                    self.RequestCompleteEvent(Request);
                    if (IWaitObject!=null)
                        IWaitObject.HideWait();
				} else {
					self.RequestFailedEvent(Request);
				}
			}
		}
		DataHandler.Request = Request;
		DataHandler.RequestCompleteEvent = self.RequestCompleteEvent;
		DataHandler.RequestFailedEvent = self.RequestFailedEvent;
		DataHandler.Param = self.Param;
		// ----------------------------------------------------------------------------
		// begin Overall update
		// ----------------------------------------------------------------------------
		DataHandler.IdName = self.IdName;
		// ----------------------------------------------------------------------------
		// begin Overall update
		// ----------------------------------------------------------------------------
		return DataHandler;
	}
	this.InitiateXmlHttpRequest = function() {
		var Request = null;
		try {
			Request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				Request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(oc) {
				Request = null;
			}
		}
		if (!Request && typeof(XMLHttpRequest) != "undefined")
            Request = new XMLHttpRequest();
		if (!Request)
            alert("Creazione ajax request fallita, Il Tuo Browser non supporta tale caratteristica.");
		return Request;
	}
	this.LoadData = function(DataSource) {
		// Debug
		//document.location = DataSource;
        if (this.WaitObject!=null)
            this.WaitObject.ShowWait();
		var Request = this.InitiateXmlHttpRequest();
		if (Request != null) {
			try {
				Request.onreadystatechange = this.CreateDataHandler(Request, this.WaitObject);

                if (this.Type.toLowerCase()=="post"){
                    Request.open("POST", DataSource, true);
                    Request.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
				    Request.send(this.Data);
                }else{
                   Request.open("GET", DataSource, true);
                   Request.send(null);
                }
			} catch(oc) {
				alert(oc);
			}
		}
	}
}
//------------------------------------------------------------------------------
function HandleFailure(Request) {
	alert("Failed: ("+Request.status+") "+Request.statusText);
    if (this.WaitObject!=null)
            this.WaitObject.HideWait();
}
//--------------------------------------------------------------------------------------------------
// Funzione generalizzata che effettua la richiesta ajax.
// Parametri di input :
// 		IUrl			Url della pagina da caricare
// 		IGet			Parametri di Get da accoppiare a IUrl
// 		IIdName			Nome dell'id da richiamare in
//--------------------------------------------------------------------------------------------------
function ajaxReq(IUrl, IGet, IIdName,IWaitObj, IFunctionAfter, IType, IData ) {
    var dm = new DataManager();
	dm.RequestCompleteEvent = ajaxRes;
	dm.RequestFailedEvent = HandleFailure;
	dm.IdName = IIdName;
    dm.Data= IData;
    dm.WaitObject = IWaitObj;
    if ((IType!=null)&&(IType!=""))
        dm.Type= IType;
    if ( IFunctionAfter!=null)
        dm.FuncAfter= IFunctionAfter;

	if (IGet){
		// sono valorizzati i parametri di GET li accoppia all'url della pagina da richiamare
		dm.LoadData(IUrl + IGet);
	}	else	{
		// pagina da richiamare solo con l'indirizzo senza parametri di GET
		dm.LoadData(IUrl);
	}
}

function ajaxReq2(IUrl, IIdName, IOptions){
  this.Options ={
      method:       'get',
      asynchronous: true,
      parameters:   '',
      waitObj:  null,
      OnCompletate: function() {},
      OnCompletateTimer: -1
  }
  for (var property in IOptions)
    this.Options[property] = IOptions[property];

    var dm = new DataManager();
	dm.RequestCompleteEvent = ajaxRes;
	dm.RequestFailedEvent = HandleFailure;
	dm.IdName = IIdName;
    dm.Data= this.Options.parameters;
    dm.WaitObject = this.Options.waitObj;
    dm.Type= this.Options.method;
    if( this.Options.OnCompletateTimer!=-1){
        function onComp(IResp){
            function Sub(){
                this.Options.OnCompletate(IResp)
            }
            window.setTimeout(Sub, this.Options.OnCompletateTimer);
        }
        dm.FuncAfter= onComp;

    }else
       dm.FuncAfter= this.Options.OnCompletate;

	if (this.Options.method.parameters){
		// sono valorizzati i parametri di GET li accoppia all'url della pagina da richiamare
		dm.LoadData(IUrl + '?' + this.Options.parameters);
	}	else	{
		// pagina da richiamare solo con l'indirizzo senza parametri di GET
		dm.LoadData(IUrl);
	}
}

//--------------------------------------------------------------------------------------------------
// Funzione generalizzata che effettua il richiamo all'id richiesto. Prima controlla se esiste
// del codice javascript da eseguire, in tal caso lo esegue.
// Parametri di input :
// 		IRequest 		Dati della richiesta
// 		IIdName			Nome dell'id da richiamare
//--------------------------------------------------------------------------------------------------
function ajaxRes(IRequest) {
	// Separa eventuale codice Javascript dal contenuto restituito
	var ARes = explode(IRequest.responseText);
	var i = 0;
	if (ARes.length > 1) {
		eval(ARes[i]);
		i++;
	}
	// Richiame l'id passatogli in input
	if (this.IdName!=null) {
        var WObj=null;
        WObj = document.getElementById(this.IdName);
        if (WObj!=null)
			WObj.innerHTML = ARes[i];
	}
	
    //Se è contemplata una funzione da eseguire dopo l'esecuzione
    if (this.FuncAfter!=null)
        this.FuncAfter(IRequest.responseText);
}
//Parametri:
//  IObj    : Id dell'oggetto che si vuove nascondere
//            Puo essere Id dell'oggetto oppere un riferimento all'oggetto stesso
//  IFrase  : Frase che si vuole mostarre durante l'attesa
function WaitDialog(IObj, IFrase){
    //Se è stato passato gia l'oggetto
    if (typeof(IObj)=='object')
        this.Obj= IObj;
    else
        //Altrimenti recupera il riferimento
        this.Obj= $(IObj);

    this.Timer=null;

    //Immagine di Attesa
    this.ImgWait= '../img/bigwait.gif';

    //Controlla che i div non esistano gia
    var ExtContainer= $('interVeil');
    if (ExtContainer==null){
	  var head = document.getElementsByTagName('head')[0];
      var WCSS = document.createElement('style');
      WCSS.setAttribute('media', 'screen');
      WCSS.setAttribute('type', 'text/css');
      head.appendChild(WCSS);
      var WCSSRule1= new Array('div.LVinterContainer' , 'font-family: "Lucida Grande", "Lucida Sans", "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;  font-size: 13px;  color: #CC0000;  vertical-align: middle;  text-align: center;  position: absolute;  width: 300px;  background-color: #FFFFFF; padding: 5px;  border: 1px dotted #666666;  visibility: hidden;  z-index: 6;  display: none;');
      var WCSSRule2= new Array('div.LVinterVeil','position: absolute;  background: #FFFFFF;  right: 0;  width: 10px;  top: 0;  z-index: 5;  visibility: hidden;   filter:progid:DXImageTransform.Microsoft.alpha(opacity=70);  opacity: 0.7;  display: none;');
      if ((document.all)&&(!window.opera)){
        document.styleSheets[0].addRule( WCSSRule1[0] , WCSSRule1[1], -1);
        document.styleSheets[0].addRule( WCSSRule2[0] ,  WCSSRule2[1],-1);
      }else{
        document.styleSheets[0].insertRule( WCSSRule1[0] + '{' + WCSSRule1[1] + '}',0);
        document.styleSheets[0].insertRule( WCSSRule2[0] + '{' + WCSSRule2[1] + '}' ,0);
      }


      //Non esitono quindi li creo
      var ExtContainer = document.createElement('div');
	  ExtContainer.className= 'LVinterVeil';
      ExtContainer.setAttribute('id', 'interVeil');
      ExtContainer.innerHTML="<br><br>";
      var IntContainer = document.createElement('div');
      IntContainer.setAttribute('id', 'interContainer');
      IntContainer.className= 'LVinterContainer';
	  IntContainer.innerHTML="<img src='" + this.ImgWait +"' border='0' width='32' height='32' alt='' title='' ><br>" + IFrase;
      document.body.insertBefore(ExtContainer, document.body.firstChild);
      document.body.insertBefore(IntContainer, document.body.firstChild);
    }else  //Gia esistono
        var IntContainer= $('interContainer') ;

    /*
    var ExtContainer = document.getElementById('WMExtContainer');
    var IntContainer = document.getElementById('WMIntContainer');
    */
    IntContainer.innerHTML="<img src='" + this.ImgWait +"' border='0' width='32' height='32' alt='' title='' ><br>" + IFrase;

    this.ShowWait=function(){
                    if(this.Obj==null) return;
                    //Calcolo del top e left della tabella di ricoprire
                    var curleft = 0;
                    var curtop=0;
                    obj=this.Obj;
                    if (obj.offsetParent) {
                        while (obj.offsetParent) {
                            curtop += obj.offsetTop;
                            curleft += obj.offsetLeft;
                            obj = obj.offsetParent;
                        }
                    }else
                        if (obj.y){
                            curtop += obj.y;
                            curleft += obj.x;
                        }

					//Iposte le coordinate del div con lo sfondo strasparente
                    ExtContainer.style.width= this.Obj.offsetWidth  +"px";
                    ExtContainer.style.height= this.Obj.offsetHeight  +"px";
                    ExtContainer.style.left= curleft + "px";
                    ExtContainer.style.top=curtop  +"px";
                    ExtContainer.style.visibility="visible";
                    ExtContainer.style.display="block";

                    //Imposta le coordinate del Msg di Attesa;
                    var WNewContaWidth= parseInt(this.Obj.offsetWidth * 0.50);
                    IntContainer.style.width= WNewContaWidth;
                    IntContainer.style.left= curleft +  (this.Obj.offsetWidth - WNewContaWidth) / 2;
                    IntContainer.style.top= curtop +40 + "px";
                    IntContainer.style.visibility="visible";
                    IntContainer.style.display="block";
                   }

    this.HideWait= function(){
            //Nascnde i due div di attesa
            ExtContainer.style.visibility="hidden";
            IntContainer.style.visibility="hidden";
            ExtContainer.style.display="none";
            IntContainer.style.display="none";
            this.Timer=null;
                            }

    this.AutoWait= function(ISecond){
            this.ShowWait();
            this.Timer= window.setTimeout(this.HideWait, ISecond*1000);
                                    }

    this.ClearTimer=function(){
                               window.clearTimeout(this.Timer);
                               }

}

function WaitDialogSmall(IObj, IFrase){
    //Se è stato passato gia l'oggetto
    if (typeof(IObj)=='object')
        this.Obj= IObj;
    else
        //Altrimenti recupera il riferimento
        this.Obj= $(IObj);

    this.Timer=null;

    //Immagine di Attesa
    this.ImgWait= '../img/base/smallwait.gif';

    //Controlla che i div non esistano gia
    var ExtContainer= $('interVeil');
    if (ExtContainer==null){
	  var head = document.getElementsByTagName('head')[0];
      var WCSS = document.createElement('style');
      WCSS.setAttribute('media', 'screen');
      WCSS.setAttribute('type', 'text/css');
      head.appendChild(WCSS);
      var WCSSRule1= new Array('div.LVinterContainerSmall' , 'font-family: "Lucida Grande", "Lucida Sans", "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;  font-size: 11px;  color: #CC0000;  vertical-align: middle;  text-align: center;  position: absolute;  width: 50px;  background-color: #FFFFFF; padding: 3px;  border: 1px dotted #666666;  visibility: hidden;  z-index: 6;  display: none;');
      var WCSSRule2= new Array('div.LVinterVeilSmall','position: absolute;  background: #FFFFFF;  right: 0;  width: 0px;  top: 0;  z-index: 5;  visibility: hidden;   filter:progid:DXImageTransform.Microsoft.alpha(opacity=70);  opacity: 0.7;  display: none;');
      if ((document.all)&&(!window.opera)){
        document.styleSheets[0].addRule( WCSSRule1[0] , WCSSRule1[1], -1);
        document.styleSheets[0].addRule( WCSSRule2[0] ,  WCSSRule2[1],-1);
      }else{
        document.styleSheets[0].insertRule( WCSSRule1[0] + '{' + WCSSRule1[1] + '}',0);
        document.styleSheets[0].insertRule( WCSSRule2[0] + '{' + WCSSRule2[1] + '}' ,0);
      }


      //Non esitono quindi li creo
      var ExtContainer = document.createElement('div');
	  ExtContainer.className= 'LVinterVeilSmall';
      ExtContainer.setAttribute('id', 'interVeil');
      ExtContainer.innerHTML="<br><br>";
      var IntContainer = document.createElement('div');
      IntContainer.setAttribute('id', 'interContainer');
      IntContainer.className= 'LVinterContainerSmall';
	  IntContainer.innerHTML="<img src='" + this.ImgWait +"' border='0' width='16' height='16' alt='' title='' >" + IFrase;
      document.body.insertBefore(ExtContainer, document.body.firstChild);
      document.body.insertBefore(IntContainer, document.body.firstChild);
    }else  //Gia esistono
        var IntContainer= $('interContainer') ;

    /*
    var ExtContainer = document.getElementById('WMExtContainer');
    var IntContainer = document.getElementById('WMIntContainer');
    */
    IntContainer.innerHTML="<img src='" + this.ImgWait +"' border='0' width='16' height='16' alt='' title='' >" + IFrase;

    this.ShowWait=function(){
                    if(this.Obj==null) return;
                    //Calcolo del top e left della tabella di ricoprire
                    var curleft = 0;
                    var curtop=0;
                    obj=this.Obj;
                    if (obj.offsetParent) {
                        while (obj.offsetParent) {
                            curtop += obj.offsetTop;
                            curleft += obj.offsetLeft;
                            obj = obj.offsetParent;
                        }
                    }else
                        if (obj.y){
                            curtop += obj.y;
                            curleft += obj.x;
                        }

					//Iposte le coordinate del div con lo sfondo strasparente
                    ExtContainer.style.width= this.Obj.offsetWidth  +"px";
                    ExtContainer.style.height= this.Obj.offsetHeight +"px";
                    ExtContainer.style.left= curleft + "px";
                    ExtContainer.style.top=curtop  +"px";
                    ExtContainer.style.visibility="visible";
                    ExtContainer.style.display="block";

                    //Imposta le coordinate del Msg di Attesa;
                    var WNewContaWidth= parseInt(this.Obj.offsetWidth * 1);
                    IntContainer.style.width= WNewContaWidth;
                    IntContainer.style.left= curleft +  (this.Obj.offsetWidth - WNewContaWidth) / 2;
                    IntContainer.style.top= curtop -1 + "px";
                    IntContainer.style.visibility="visible";
                    IntContainer.style.display="block";
                   }

    this.HideWait= function(){
            //Nascnde i due div di attesa
            ExtContainer.style.visibility="hidden";
            IntContainer.style.visibility="hidden";
            ExtContainer.style.display="none";
            IntContainer.style.display="none";
            this.Timer=null;
                            }

    this.AutoWait= function(ISecond){
            this.ShowWait();
            this.Timer= window.setTimeout(this.HideWait, ISecond*1000);
                                    }

    this.ClearTimer=function(){
                               window.clearTimeout(this.Timer);
                               }

}
