// maschere.js
// validazione dati tramite maschere
// ereditato quasi completamente da maggioli.js (grazie)

var IE5 = (document.getElementById && document.all)? true:false;
var NS6 = (document.getElementById && navigator.appName.indexOf("Netscape")>=0 )? true: false;
var OPE = (document.getElementById && navigator.userAgent.indexOf("Opera")>=0 )? true: false;
var FF2 = (document.getElementById && navigator.userAgent.indexOf("Firefox/2")>=0 )? true: false;


//Elenco delle lettere che possono essere utilizzate per descrivere una mascheratura di un campo
var MASCHERE_LEGALI_FORMATTAZIONE="SNFDMQTHELZPGOY";

var WAIT        = false;       // regola lo scheduling di tutte le funzioni
// separatore cifre decimali per i  numeri float
var SEPCIFRE    = ",";         
//Colori dei campi
var COLORE_CAMPO_OBBLIGATORIO ="yellow";
var COLORE_CAMPO_STANDARD="white";
var REPSEPCIFRE = /,/g;        // espressione regolare del separatore cifre decimali per i  numeri float
var REPSEPUNITA = /'/g;        // espressione regolare del separatore cifre decimali per i  numeri float
var SEPDATA    = "/";         // separatore data
var SEPFIELD    = "~";         // separa le singole informazioni
var SEPOUT      = "|";         // separa le singole informazioni del primo blocco di informazione
var SEPRCD      = "#";         // separa i blocchi di informazione
var SEP_RECORD ="\u000E";			//Costante che deve essere sostituira al carattere # quando si passa il valore al client
var SEP_FIELD ="\u000C";			//Costante che deve essere sostituira al carattere ~ quando si passa il valore al client
var SEP_OUT ="\u000F";			//Costante che deve essere sostituira al carattere | quando si passa il valore al client
var YEARDATE = "20";
var valorecorrente="";
var ff2onchange="N";

var dtCh= "/";
var minYear=1900;
var maxYear=2999;

//Funzione utilizzata per inizializzare la formattazione dei campi di una form html
function InitFields()
{
	var maskInput = "";
	var index     = 0;
	var i;
	var itemcoll=document.getElementsByTagName("INPUT");
	var item;
	for(i=0;i<itemcoll.length;i++)
	{
		item = itemcoll[i];
		if ( item.type != "button" )
		{
			maskInput = item.getAttribute("_MASK");
			if ( maskInput != null && maskInput!= "") SetField( item, maskInput );
			else SetField( item);
			//SetField( item);
		}
	}
	itemcoll=document.getElementsByTagName("SELECT");
	for(i=0;i<itemcoll.length;i++)
	{
		item = itemcoll[i];
    	maskInput = item.getAttribute("_MASK");
    	if ( maskInput != null && maskInput!= "") SetField( item, maskInput );
    	else SetField( item);
    	//SetField( item);
	}
	itemcoll=document.getElementsByTagName("TEXTAREA");
	for(i=0;i<itemcoll.length;i++)
	{
		item = itemcoll[i];
    	maskInput = item.getAttribute("_MASK");
    	if ( maskInput != null && maskInput!= "") SetField( item, maskInput );
    	else SetField( item);
    	//SetField( item);
	}
}

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   }
   return this
}

function verificaData(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
  if (Trim(dtStr)=="/  /" || Trim(dtStr)=="") return true;
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth,10)
	day=parseInt(strDay,10)
	year=parseInt(strYr,10)
	if (pos1==-1 || pos2==-1){
		alert("La data deve essere nel seguente formato : dd/mm/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Mese non valido")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Giorno non valido")
		return false
	}
  //alert(strYear.length)
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
  //alert(strYear+"<>"+year+"<>"+strYear.length);
		alert("L'anno deve essere compreso tra il "+minYear+" e il "+maxYear)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("Data non valida")
		return false
	}
return true
}


//Funzione utilizzata per impostare gli eventi utili alla formattazione per il singolo campo passato come parametro
function SetField(el, mask)
{	
	var tagName="" + el.tagName;
	tagName=tagName.toUpperCase();
	if ( !((tagName=="INPUT") || (tagName=="SELECT") || (tagName=="TEXTAREA"))) return false;
	  el.onfocus    = _CheckOnFocus;
	  el.onkeypress = _CheckOnKeyPress;
	  el.onblur     = _CheckOnBlur;

	if ( SetField.arguments.length>1 )
	{
		var legalMask = MASCHERE_LEGALI_FORMATTAZIONE;
		if ( legalMask.indexOf(mask.split(":")[0].toUpperCase())==-1 ) alert("Mascheratura non corretta :"+mask+" - "+el.name );
		else if (mask.split(":")[0].toUpperCase()=="D"&&el.value=="") el.value = "  /  /"
		else if (mask.split(":")[0].toUpperCase()=="H"&&el.value=="") el.value = "  :"
		var mytextTransform = null;
		try{
		mytextTransform = el.getAttribute("_TEXTTRANSFORM");
		} catch(e){var nulla="";}
		if (mytextTransform==""){
			mytextTransform=null;
		}		
		if (mask.split(":")[0].toUpperCase()!="G"){
  			if (mask.split(":")[0].toUpperCase()!="Y"){
				if ( mytextTransform == null ) mytextTransform = "uppercase";//default
			}
		}else {
			if ( mytextTransform == null ) mytextTransform = "lowercase";//default
		}
		if (mytextTransform!=null){
  			el.style.textTransform=mytextTransform;
		}
		// FIX per OPERA 8.5 per far accettare lo stile, aggiungo una classe 'vuota'
		if (OPE){
			el.className=el.className+" fixopera";
		}
	}
}

//Funzione invocata da qualsiasi campo quando vi ? una perdita del fuoco
function _CheckOnBlur(e)
{
	var e = e||event;
	var el = e.srcElement||e.target;

    if (IE5){
      togliClasse(el,"focus");
    }
	CheckField(el);
	
  	var _BLUR = null;
  	try{
  	_BLUR = el.getAttribute("_BLUR");
 	} catch(e){var nulla="";}
 	
    try{
    if (el.value!=valorecorrente && _BLUR != null && _BLUR != "")
    	eval( _BLUR );
  	else{
  	    try {
    	_BLUR = el.getAttribute("_BLURF");
	 	} catch(e){var nulla="";}
    	if ( _BLUR != null  && _BLUR != "") eval( _BLUR );
  	}
    if (IE5||(FF2&&ff2onchange=="S")){
      try{
    	var maskInput = null;
    	ff2onchange="N";
    	try {
    	maskInput=el.getAttribute("_MASK");
	 	} catch(e){var nulla="";}
    	if ( maskInput != null && maskInput!= ""){
    	  if ( maskInput.substring(0,1)=="D"){
              if (el.onchange!=null&&el.onchange!=""){
                el.onchange();
              }    
    	  }
    	}
      } catch(e){var nulla="";}
    }
 	} catch(e){var nulla="";}
    return true;
}

function CheckField(el)
{
	var valold = el.value;
	
	element_lostfocus=el;
	
    if(el.type=="select-one") return true;

	var mask  =null;
	try{
  		mask= el.getAttribute("_MASK");
	} catch(e){var nulla="";}
	
	if (mask==""){
	  mask=null;
	}

	if ( mask != null ){
	    if ((!IE5)||(OPE)) {
	       var moz = ' '+el.value
	       moz = moz.substr(1);
		   if (mask.split(":")[0]=="G")
		       moz = moz.toLowerCase();
		   else if (mask.split(":")[0]!="M" && mask.split(":")[0]!="N" && mask.split(":")[0]!="Z" && mask.split(":")[0]!="Q" && mask.split(":")[0]!="Y")
		       moz = moz.toUpperCase();
	       el.value = moz;
	    }

	    var maschera = mask.split(":")[1];
	
	    if (mask.split(":")[0].toUpperCase()=="E")
	       var maskL = parseInt(maschera.split(",")[0],10) + parseInt(maschera.split(",")[1],10) + 1;
	    else 
	       var maskL = maschera;

	  
		if (changeLF_CRLF(el.value).length>maskL)
	    el.value=changeLF_CRLF(el.value).substring(0,maskL);
	
	    if (mask.split(":")[0]!="S" && mask.split(":")[0]!="M" && mask.split(":")[0]!="Z" && mask.split(":")[0]!="G" && mask.split(":")[0]!="O")
			{
			var value = trimblanks(el.value);
			el.value = value
			}
	    else if (mask.split(":")[0]!="Z" && mask.split(":")[0]!="G" && mask.split(":")[0]!="O")
 	        {
			var value = RTrim(el.value);
			el.value = value
			}
		else
			var value = el.value;

		if ( mask.split(":").length >= 3 ) var bFormat = (mask.split(":")[2].toUpperCase()=="S");
		else var bFormat = false;

		var mytextTransform = null;
		try{
		mytextTransform = el.getAttribute("_TEXTTRANSFORM");
	 	} catch(e){var nulla="";}
		if (mask.split(":")[0].toUpperCase()!="G"){
  			if (mask.split(":")[0].toUpperCase()!="Y"){
				if ( mytextTransform == null ) mytextTransform = "uppercase";//default
			}
		}else {
			if ( mytextTransform == null ) mytextTransform = "lowercase";//default
		}
		if (el.value!=""){
			if (mytextTransform=="uppercase") {
			  el.value=el.value.toUpperCase();
			} else if (mytextTransform=="uppercase") {
			  el.value=el.value.toLowerCase();
			} else if (mytextTransform=="capitalize") {
			  el.value=el.value.toLowerCase();
			  alert('DA CAPITALIZZARE!');
			}
		}
		switch ( mask.split(":")[0].toUpperCase() )
		{
			case "L"://VALUTA LIRE
				if ( el.value!="" && el.value.indexOf(".")=="-1")
				{
	               el.value = fnFormatEL(el.value,"L","")
				}
				break;
			case "E"://VALUTA EURO
					if ( el.value!="" && el.value.indexOf(".")=="-1")
	                  el.value = fnFormatEL(el.value,"E")
                return isNumber(el.value);
				break;
			case "D"://data 47
				el.value = _SetMaskDate( value );
				return verificaData(el.value);
				break;
			case "H"://data 47
				el.value = _SetMaskHour( value );
				break;
			case "N"://Aggiunto da SIPALInformatica
				if (el.value=="" && valold!=""){
					valorecorrente=valold;
				}
                return isNumber(el.value);
				break;
		}
	}
	return true;
}

function _CompareNumber(s1,s2,tp)
{
	if (WAIT) return false;
	var n1 = ( typeof(s1)=="string" )?parseInt(s1,10):s1;
	var n2 = ( typeof(s2)=="string" )?parseInt(s2,10):s2;
	return(((n1>=n2 && tp == "MAX")||(n1<n2 && tp == "MIN"))?n1:n2);
}

function _GetDayMount(mount)
{
	if (WAIT) return false;
	var m = ( typeof(mount)=="string" )?parseInt(mount,10):s1;
	var m31 ="135781012";
	if (m==2) return 28;
	return( (m31.indexOf(m)>-1)?"31":"30");
}

function _SetMaskDate( value )
{
	if (WAIT) return false;
	value = value.replace(/\//g,"");
	var date = "";
	switch (value.length)
	{
		case 4://gmaa
			date = "0"+value.charAt(0)+"/0"+value.charAt(1)+((_CompareNumber(value.substr(2),YEARDATE,"MIN")==YEARDATE)?"/19"+value.substr(2):"/20"+value.substr(2));
			break;
		case 5://ggmaa gmmaa
			var maxDay = _GetDayMount(value.substr(2,1));
			if (_CompareNumber(value.substr(0,2),maxDay,"MIN")==parseInt(maxDay,10)) {// si considera gmmaa
				date = "0"+value.charAt(0)+"/"+value.substr(1,2)+((_CompareNumber(value.substr(3),YEARDATE,"MIN")==YEARDATE)?"/19"+value.substr(3):"/20"+value.substr(3));
			}
			else {//si considera ggmaa
				date = value.substr(0,2)+"/0"+value.charAt(2)+((_CompareNumber(value.substr(3),YEARDATE,"MIN")==YEARDATE)?"/19"+value.substr(3):"/20"+value.substr(3));
			}
			break;
		case 6://ggmmaa
			date = value.substr(0,2)+"/"+value.substr(2,2)+((_CompareNumber(value.substr(4),YEARDATE,"MIN")==YEARDATE)?"/19"+value.substr(4):"/20"+value.substr(4));
			break;
		case 7://gmmaaaa ggmaaaa
			var maxDay = _GetDayMount(value.substr(2,1));
			if (_CompareNumber(value.substr(0,2),maxDay,"MIN")==parseInt(maxDay,10)) // si considera gmmaaaa
				date = "0"+value.charAt(0)+"/"+value.substr(1,2)+"/"+value.substr(3);
			else //si considera ggmaa
				date = value.substr(0,2)+"/0"+value.charAt(2)+"/"+value.substr(3);
			break;
		case 8://ggmmaaaa
			date = value.substr(0,2)+"/"+value.substr(2,2)+"/"+value.substr(4);
			break;
		default:
			date = "  /  /";
	}
	return date;
}

function _SetMaskHour( value )
{
	if (WAIT) return false;
	value = value.replace(/\:/g,"");
	var date = "";
	switch (value.length)
	{
		case 1://h
			date = "0"+value.charAt(0)+":00";
			break;
		case 2://hm
			date = "0"+value.charAt(0)+":0"+value.charAt(1);
			break;
		case 3://hhm
			date = value.charAt(0)+value.charAt(1)+":0"+value.charAt(2);
      break;
  	case 4://hhmm
			date = value.charAt(0)+value.charAt(1)+":"+value.charAt(2)+value.charAt(3);
			break;
		default:
			date = "  :  ";
	}
	return date;
}



//Funzione invocata da un qualsiasi campo al quale ? stata impostata una formattazione
function _CheckOnKeyPress(e)
{
	var e = e||event;
 	var el = e.srcElement||e.target;
 
    if(el.type=="select-one") return true;
    
    try {
     	if(el.readOnly==true) return true;
 	} catch (e) {
   		var nulla="";
 	}
 
 	if (IE5)
  		var charCode = e.keyCode;
 	else
    	var charCode = e.charCode;

	var mask  =null;
	try{
  		mask= el.getAttribute("_MASK");
	} catch(e){var nulla="";}
	if ( mask == null || mask=="") return true;
	var spmask = mask.split(":");

    if (spmask[0]!="S" && spmask[0]!="M" && spmask[0]!="Z" && spmask[0]!="G" && spmask[0]!="O")
	  	var value    = trimblanks(el.value);
	else if (spmask[0]!="Z" && spmask[0]!="G" && spmask[0]!="O")
	    var value = RTrim(el.value);
	else
	    var value = el.value;

	if ( spmask.length == 4 ) 
	   var bNumber = (spmask[3].toUpperCase()=="S");
  	else 
  	   var bNumber = false;
	
	if (spmask[0].toUpperCase()=="P")
		var noCharSet = '"<>|~?';
    else
		var noCharSet = '"<>|~?\\';

	//Blocco di codice utile a controllare se c'? del testo selezionato o meno
	var selezionato=true;
  	if(IE5){
    	var seltext = null;
    	seltext = (document.all)? document.selection.createRange() : document.getSelection();
    	var selit = (document.all)? document.selection.createRange().text : document.getSelection();
    	if (selit.length>=1){
      		selezionato=false;
    	}
  	}
	switch (spmask[0].toUpperCase() )
	{
		case "S":case "G": case "O": case "T": case "Y"://stringa 
  			if(selezionato){
	       		if ( (changeLF_CRLF(el.value).length >= parseInt(spmask[1],10) ) && (charCode!=0))
	       		{
		        	e.returnValue = false;
		        	return false;
	       		}
  			}
	    	if (IE5)
				var char1 = String.fromCharCode(e.keyCode);
			else
		   		var char1 = String.fromCharCode(e.charCode);
			var find = false;
			var i = 0;
			while ( i<noCharSet.length && !find )
			{
				find = (noCharSet.charAt(i)==char1);
				i++;
			}
			if (find) {
				e.returnValue = false;
			  	return false;
			}else{
/* spostato a livello di stile
			//TRASFORMA I VALORI DIGITATI IN MAIUSCOLO
				var textTransform = el.getAttribute("_TEXTTRANSFORM");
				if (spmask[0].toUpperCase()!="G"){
					if ( textTransform == null ) textTransform = "uppercase";//default
				}else {
					if ( textTransform == null ) textTransform = "lowercase";//default
				}
				switch (  textTransform.toLowerCase() ){
					case "capitalize":
						if (value.length>0) e.keyCode = (char1.toLowerCase()).charCodeAt();
						else e.keyCode = (char1.toUpperCase()).charCodeAt();
						break;
					case "uppercase":
	    	            if (IE5)
		    				e.keyCode = (char1.toUpperCase()).charCodeAt();
	                    else  
			        	    e.charCode = 90; //(char1.toUpperCase()).charCodeAt(0);
						break;
					case "lowercase":
						e.keyCode = (char1.toLowerCase()).charCodeAt();
						break;
					case "normal":
						e.keyCode = char1.charCodeAt();
						break;
					}
			*/
			}
			break;
		case "F"://float
			var nCfrdx = parseInt(spmask[1].split(",")[1],10);
			var nCfrsx = parseInt(spmask[1].split(",")[0],10);
			var posSep = el.value.indexOf(SEPCIFRE);
			if ( posSep>-1)
			{
	    		if (IE5) {
					var curpos = _GetCursorPos(el);
					if (curpos>posSep) //cursore a dx del separatore
					{
						var m = el.value.substr(el.value.indexOf(SEPCIFRE)+1);
						if (nCfrdx<=m.length) {
							e.returnValue = false;
							return false;
						}
					}
					else if (nCfrsx<=el.value.substr(0,el.value.indexOf(SEPCIFRE)).length)
					{
						e.returnValue = false;
						return false;
					}
				}
			}
			else //non ? stato inserito il separatore di cifre
				if ((nCfrsx<=el.value.length ) && (charCode!=0) && (charCode!=44)) {
					e.returnValue = false;
				  	return false;
				}
			var returnValue = false;

			if (charCode==44) //|| charCode==46)	// , .		col keydown sono 188 190   tolto . per gestione unificata con Mozilla
			{
				// i caratteri ',' e '.' sono quelli che vengono scritti nel campo e non il separatore SEPCIFRE
				var pos = el.value.indexOf(",");
				var posvirg = el.value.indexOf(",");

				if ( pos>-1 ) pos++;
				else
				{
					pos = el.value.indexOf(".");
					if ( pos>-1 ) pos++;
					else
					{
						if (el.value.length>0) pos = el.value.length;
						else pos = 0;
						returnValue = true;
					}
				}
			  	if (IE5) {
					_SetCursorPos(el,pos);
					e.keyCode = SEPCIFRE.charCodeAt();
			  	}
				e.returnValue = returnValue;
		    	if (!IE5 && posvirg==-1) {
					e.keyCode = SEPCIFRE;
			  	}
			  	else if (!IE5 && posvirg>-1)
					return false;
				break;
			}
			if (( charCode==43 || charCode==45 ) && bNumber)   // + - col keydown sono 187 189
			{
				el.value = (el.value.charAt(0)=="-" || el.value.charAt(0)=="+")?String.fromCharCode(e.keyCode)+el.value.substr(1):String.fromCharCode(e.keyCode)+el.value;
				_SetCursorPos(el,1);
				e.returnValue = false;
				return false;
			}
			else
				if ( (charCode<48 || charCode>57) && (charCode!=0) ) {
					e.returnValue = false;
					return false;
			  	}
			break;

		case "N"://numero intero

     		if(selezionato){
    			if ( (value.length >= parseInt(spmask[1],10)) && (charCode!=0) ) {
      				e.returnValue = false;
        			return false;
				}
     		}
			if ( (charCode<48 || charCode>57) && (charCode!=0) ) {
      			e.returnValue = false;
     			return false;
			}
			break;
		case "D"://data 47
		    if (charCode==68 || charCode==100){
    			el.value=odierna();
    			ff2onchange="S";
    		}
		    if (charCode==77 || charCode==109){
                var miomese = meseodierno(0);
                if (el.value==miomese){
                  el.value = meseodierno(1);
                } else {
                  el.value = miomese;
                }
    			ff2onchange="S";
            }
	        if (charCode==67 || charCode==99)
    			if (document.getElementById(el.name+"_a_cal")!=null){
    			    cal.select(el,el.name+"_a_cal",'dd/MM/yyyy');
    			}
			if (charCode==43){
    			el.value=aggiungigiorno(el.value);
    			ff2onchange="S";
    		}
			if (charCode==45){
    			el.value=togligiorno(el.value);
    			ff2onchange="S";
    		}
			if ( (charCode<48 || charCode>57) && (charCode!=0)) {
                e.returnValue = false;
                return false;
			}
			break;
		case "M": case "Z": case "Q": case "P":
    		if(selezionato){
				if ( (el.value.length >= parseInt(spmask[1],10) ) && (charCode!=0))
			 	{
			  		e.returnValue = false;
			  		return false;
			 	}
    		}
      		if (IE5)
				var char1 = String.fromCharCode(e.keyCode);
			else
			   	var char1 = String.fromCharCode(e.charCode);

			var find = false;
			var i = 0;
			while ( i<noCharSet.length && !find )
			{
				find = (noCharSet.charAt(i)==char1);
				i++;
			}
			if (find) {
				e.returnValue = false;
			  	return false;
			}
       		if (IE5)
        		e.keyCode = char1.charCodeAt();
      		else  {
        		e.charCode = e.charCode; //(char1.toUpperCase()).charCodeAt(0);
      		}
			break;


		case "E"://MASCHERATURA EURO
			var nCfrdx = parseInt(spmask[1].split(",")[1],10);
			var nCfrsx = parseInt(spmask[1].split(",")[0],10);
			var posSep = el.value.indexOf(SEPCIFRE);

			if ( posSep>-1)
			{
    			if (IE5) {
					var curpos = _GetCursorPos(el);
					if (curpos-1>posSep) //cursore a dx del separatore
					{
						var m = el.value.substr(el.value.indexOf(SEPCIFRE)+1);
						if (nCfrdx<=m.length && selezionato) {
							e.returnValue = false;
						  	return false;
						}
					}
					else if (nCfrsx<=el.value.substr(0,el.value.indexOf(SEPCIFRE)).length)
					{
						e.returnValue = false;
						return false;
					}
				}
			}
			else //non ? stato inserito il separatore di cifre
				if ((nCfrsx<=el.value.length ) && (charCode!=0) && (charCode!=44)) {
				  e.returnValue = false;
				  return false;
				}
			var returnValue = false;
			if (charCode==44) //|| charCode==46)	// , .		col keydown sono 188 190   tolto . per gestione unificata con Mozilla
			{
				// i caratteri ',' e '.' sono quelli che vengono scritti nel campo e non il separatore SEPCIFRE
				var pos = el.value.indexOf(",");
				var posvirg = el.value.indexOf(",");
				if ( pos>-1 ) pos++;
				else
				{
					pos = el.value.indexOf(".");
					if ( pos>-1 ) pos++;
					else
					{
						if (el.value.length>0) pos = el.value.length;
						else pos = 0;
						returnValue = true;
					}
				}
			  	if (IE5) {
					_SetCursorPos(el,pos);
					e.keyCode = SEPCIFRE.charCodeAt();
			  	}
				e.returnValue = returnValue;
		    	if (!IE5 && posvirg==-1) {
                    try{
					e.keyCode = SEPCIFRE;
					} catch(e){var nulla;}	
			  	}
			  	else if (!IE5 && posvirg>-1)
					return false;
				break;
			}
			if (( charCode==43 || charCode==45 ) /*&& bNumber*/)   // + - col keydown sono 187 189
			{
        		if (IE5)
					el.value = (el.value.charAt(0)=="-" || el.value.charAt(0)=="+")?String.fromCharCode(e.keyCode)+el.value.substr(1):String.fromCharCode(e.keyCode)+el.value;
				else
					el.value = (el.value.charAt(0)=="-" || el.value.charAt(0)=="+")?String.fromCharCode(e.charCode)+el.value.substr(1):String.fromCharCode(e.charCode)+el.value;
				
				e.returnValue = false;
				return false;
			}
			else
				if ( (charCode<48 || charCode>57) && (charCode!=0) ) {
					e.returnValue = false;
					return false;
			  	}
			break;
		case "L"://MASCHERATURA LIRE
    		if(selezionato){
				if ( (value.length >= parseInt(spmask[1],10)) && (charCode!=0) ) {
      				e.returnValue = false;
        			return false;
				}
    		}
			if (( charCode==43 || charCode==45 ) /*&& bNumber*/)   // + - col keydown sono 187 189
			{
        		if (IE5)
					el.value = (el.value.charAt(0)=="-" || el.value.charAt(0)=="+")?String.fromCharCode(e.keyCode)+el.value.substr(1):String.fromCharCode(e.keyCode)+el.value;
				else
					el.value = (el.value.charAt(0)=="-" || el.value.charAt(0)=="+")?String.fromCharCode(e.charCode)+el.value.substr(1):String.fromCharCode(e.charCode)+el.value;
				
				e.returnValue = false;
				return false;
			} else
				if ( (charCode<48 || charCode>57) && (charCode!=0) ) {
      				e.returnValue = false;
     				return false;
				}
			break;
		case "H"://ORA
			if ( (charCode<48 || charCode>57) && (charCode!=0)) {
               e.returnValue = false;
               return false;
			}
			break;

	}

	var _KEYPRESS = null;
	try{
	_KEYPRESS=el.getAttribute("_KEYPRESS");
 	} catch(e){var nulla="";}
	if ( _KEYPRESS != null && _KEYPRESS!="") eval( _KEYPRESS );
}

//Funzione invocata nell'onfocus del campo per la formattazione
function _CheckOnFocus(e)
{
	var e = e||event;
	var el = e.srcElement||e.target;
	
    if (IE5){
      aggiungiClasse(el,"focus");
    }
	
  	valorecorrente=el.value;
    
  	var mask  = null;
  	try {
  	mask=el.getAttribute("_MASK");
 	} catch(e){var nulla="";}

  	if (mask!=null && mask!=""){
		if (mask.split(":")[0]!="S" && mask.split(":")[0]!="M" && mask.split(":")[0]!="Z" && mask.split(":")[0]!="G" && mask.split(":")[0]!="O")
	  		var value    = trimblanks(el.value);
	  	else if (mask.split(":")[0]!="Z" && mask.split(":")[0]!="G" && mask.split(":")[0]!="O")
	    	var value = RTrim(el.value);
	  	else
	    	var value = el.value;
	
		if ( mask == null ) return false;
		switch ( mask.split(":")[0].toUpperCase() )
		{
			case 'D':
	    		if (IE5) {
					var curpos = _GetCursorPos(el);
				 	value = value.replace(/\//g,"");
				 	el.value = RTrim(value);
				 	_SetCursorPos(el,curpos-2);
	     		}
	     		else {
					value = value.replace(/\//g,"");
				 	el.value = RTrim(value);
	     		}
				break;
			case 'H':
				if (IE5) {
					var curpos = _GetCursorPos(el);
					value = value.replace(/\:/g,"");
					el.value = value;
					_SetCursorPos(el,curpos-2);
			    }
			    else {
					value = value.replace(/\:/g,"");
					el.value = value;
			    }
				break;
			case 'E':
	     		if (IE5) {
					var curpos = _GetCursorPos(el);
				 	value = 	value.replace(/\./g,"");
				 	if (el.value!=value){
					 	el.value = value;
					 	_SetCursorPos(el,curpos-2);
					}
	     		}
	     		else {
					value = value.replace(/\./g,"");
					if (el.value!=value){
					 	el.value = value;
					}
	     		}
				break;
			case 'L':
	     		if (IE5) {
					var curpos = _GetCursorPos(el);
				 	value = 	value.replace(/\./g,"");
				 	el.value = value;
				 	_SetCursorPos(el,curpos-2);
	     		}
	     		else {
					value = value.replace(/\./g,"");
				 	el.value = value;
	     		}
				break;
		}
	}
	//NON UTILIZZATE
	var _FOCUS = null;
	try {
	_FOCUS=el.getAttribute("_FOCUS");
 	} catch(e){var nulla="";}
	if ( _FOCUS != null && _FOCUS != "") eval( _FOCUS );
	return true;
}

//Funzione per impostare la posizione del cursore in un campo
function _SetCursorPos( el, pos )
{
	var str   = el.createTextRange();
	str.move( "character", pos );
	str.select();
}

//Metodo per ottenere la posizione del cursore in un campo
function _GetCursorPos( el )
{
	try{
		var tr  = el.createTextRange();
		var trd = tr.duplicate();
		var trcurpos = document.selection.createRange();
		var curpos = 0;
		while ( (curpos<el.value.length) && (tr.compareEndPoints("StartToStart",trcurpos) != 0) )
		{
			 tr.move("character",1);
			 curpos++;
		}
		curpos += 1;
		return(curpos);
	}catch(e){return 0;}	
}

//Funzione per rimuovere gli spazi a sinistra di una stringa
function LTrim(str)

{
   var whitespace = new String(" \t\n\r");

   var s = new String(str);

   if (whitespace.indexOf(s.charAt(0)) != -1) {
      // Se entro qui devo togliere gli spazi,le tabulazioni e linefeed a sinistra della stringa

      var j=0, i = s.length;

      while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
         j++;

      s = s.substring(j, i);
   }
   return s;
}

//Funzione per rimuovere gli spazi a destra di una stringa
function RTrim(str)

{
   var whitespace = new String(" \t\n\r");

   var s = new String(str);

   if (whitespace.indexOf(s.charAt(s.length-1)) != -1) {


      var i = s.length - 1;

      while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
         i--;
      s = s.substring(0, i+1);
   }

   return s;
}

//Funzione per rimuovere gli spazi a sinistra e a destra di una stringa
function Trim(str)
{
   return RTrim(LTrim(str));
}


function trimblanks( s )
{
	if (typeof(s) != "string" ) s = s.toString();
	s = s.replace( /^ */, "" );
	s = s.replace( / *$/, "" );
	return s;
}

function GetValue( el )
{
	var mask  =null;
	try{
  		mask= el.getAttribute("_MASK");
	} catch(e){var nulla="";}
//alert(mask)
	if ( mask == null || mask == "")
	{
		return(trimblanks(el.value));
	}
	if ( mask.split(":").length == 3 ) var bFormat = (mask.split(":")[2]=="S");
  else var bFormat = false;
	var value;// = "";
	switch ( mask.split(":")[0].toUpperCase() )
	{
		case "D"://data
			value = trimblanks(el.value);
			if (isEmpty(el)) value = "";
			break;
		case "F"://float
		case "N"://numero intero
			value = trimblanks(el.value);
			value = value.replace(".","");
			value = value.replace(REPSEPCIFRE,".");
			if ( bFormat ) value = value.replace(REPSEPUNITA,"");
			break;
		case "S"://string
//    prompt("",el.value)
		  value=RTrim(el.value);
//      prompt("",value);
			if (GetValue.arguments.length>1 && GetValue.arguments[1]) {
      	value = value.replace(/\'/,"''");
			}
      break;
		case "M"://string anche in piccolo
		  value=RTrim(el.value);
			if (GetValue.arguments.length>1 && GetValue.arguments[1]) value = value.replace(/\'/,"''");
      break;
      //string vergine, non trimmata, non upperata, non zadbodata
		case "Z": case "G": case "O":
		  value=el.value;
			if (GetValue.arguments.length>1 && GetValue.arguments[1]) value = value.replace(/\'/,"''");
      break;
		case "T"://string TRIMMATA
			value = trimblanks(el.value);
			if (GetValue.arguments.length>1 && GetValue.arguments[1]) value = value.replace(/\'/,"''");
      break;
		case "Y"://string TRIMMATA sia minuscola che maiuscola
			value = trimblanks(el.value);
			if (GetValue.arguments.length>1 && GetValue.arguments[1]) value = value.replace(/\'/,"''");
      break;
		case "Q"://string TRIMMATA anche in piccolo
			value = trimblanks(el.value);
			if (GetValue.arguments.length>1 && GetValue.arguments[1]) value = value.replace(/\'/,"''");
			break;
  	case "E"://Importi in euro
			value = trimblanks(el.value);
			//value = value.replace(/\./g,"");
      value = value.replace(/\'/g,"");
			value = value.replace(REPSEPCIFRE,".");
			break;
  	case "L"://Importi in lire
    	value = trimblanks(el.value);
    	value = value.replace(/\'/g,"");
		value = value.replace(REPSEPCIFRE,".");
      break;
		case "H"://string
		  value=RTrim(el.value);
		  if (value==":") value="";
			if (GetValue.arguments.length>1 && GetValue.arguments[1]) {
            	value = value.replace(/\'/,"''");
			}
      break;
		case "P"://string TRIMMATA anche in piccolo con carattere speciale \
			value = trimblanks(el.value);
			if (GetValue.arguments.length>1 && GetValue.arguments[1]) value = value.replace(/\'/,"''");
			break;
	}
	return value;
}

/**
 * Funzione per la suddivisione di stringhe separate da un qualsiasi carattere
 * @param str String stringona da suddividere
 * @param carattere char carattere che indica la separazione
 * @return ArrayList le stringhe separate vengono messe in un ArrayList
 */
  function split(str, carattere ){
    var par=new Array();
    var parkCarattere=new String (carattere);
    var ind=0;
    var p = 0;
    var parkStr=new String(str);
    p = parkStr.indexOf(parkCarattere);
    while (p != -1) {
    	par[ind]=convertiDalDatabasePerIlClient(parkStr.substring(0, p));
    	
    	parkStr = parkStr.substring(p + parkCarattere.length, parkStr.length);
    	p = parkStr.indexOf(parkCarattere);
    	ind++;
    }
    if (!((parkStr=="") || (typeof( parkStr ) == "undefined" )))
    	par[ind]=convertiDalDatabasePerIlClient(parkStr);
    else
    	par[ind]="";    
    return par;
  }

/*
Questa funzione prende la stringa che gli viene passata dal server e converte tutti i caratteri
speciali per poterli visualizzare sul client
*/
function convertiDalDatabasePerIlClient(valore){
  try{
  	var parkStr=new String("");
  	parkStr=parkStr + valore;
  	parkStr = replaceAll(parkStr,SEP_RECORD,SEPRCD);
  	parkStr = replaceAll(parkStr,SEP_FIELD,SEPFIELD);
  	parkStr = replaceAll(parkStr,SEP_OUT,SEPOUT);
  	return parkStr;
  }catch(Ex){
    return "";
  }
}

/*
Funzione che effettua il replace all
s: stringa da sostituire
fromStr:stringa da ricercare
toStr:stringa da sostituire
*/
function replaceAll (s, fromStr, toStr)
{
	try{
  	var st="";// = s;
	 	if (fromStr.length == 0)
  		return s;
    var idx = s.indexOf(fromStr);
    while (idx >= 0)
    {
  		st += s.substring(0,idx) + toStr;
     	s = s.substr(idx+fromStr.length);
  		idx = s.indexOf(fromStr);
    }
    st += s;
    return st;
  }catch(Ex){
    return "";
  }
}

function aggiungigiorno(pdata){
var myDate=new Date()
var data;
if (Trim(pdata)!="/  /" && Trim(pdata)!="") { 
var miadata;
miadata=pdata.replace(/\//g,"");
myDate.setYear(parseInt(miadata.substr(4,4),10));
myDate.setMonth(parseInt(miadata.substr(2,2),10)-1,parseInt(miadata.substr(0,2),10));
}
myDate.setDate(myDate.getDate()+1);
var dan = myDate.getMonth()+1;
data =  changeDate(myDate.getDate().toString()+"/"+dan.toString()+"/"+myDate.getFullYear().toString());
return data;
}

function togligiorno(pdata){
var myDate=new Date()
var data;
if (Trim(pdata)!="/  /" && Trim(pdata)!="") { 
var miadata;
miadata=pdata.replace(/\//g,"");
myDate.setYear(parseInt(miadata.substr(4,4),10));
myDate.setMonth(parseInt(miadata.substr(2,2),10)-1,parseInt(miadata.substr(0,2),10));
}
myDate.setDate(myDate.getDate()-1);
var dan = myDate.getMonth()+1;
data =  changeDate(myDate.getDate().toString()+"/"+dan.toString()+"/"+myDate.getFullYear().toString());
return data;
}
function daysInFebruary (year)
{
return ( ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}
function fnFormatEL(valore,valuta,stringa)
{
  return valore;
}
function isNumber(snumero) {
  var snumerotmp=snumero;
  if (snumero==""){
    return true;
  }
  snumerotmp=snumerotmp.replace(/\./g,"");
  snumerotmp=snumerotmp.replace(/\,/g,".");
  if (isNaN(snumerotmp)) {
	alert("Numero non valido")
    return false;
  } else {
    return true;
  }
}
function changeLF_CRLF(s){
  return replaceAll(replaceAll(s,"\r",""),"\n","\r\n");
}