function checkFRM(frm){
	// campi che terminano con __*   => Campi obbligatori
	// campi che iniziano con $		 => Campi crittati
	for(var i=0,tempName,newName;i<frm.elements.length;i++)
		if(frm.elements[i].name){
			tempName = frm.elements[i].name.split("__*");
			newName = decryptString(tempName[0]);
			if(tempName.length>1)
				newName += "__*";
			 frm.elements[i].name = newName;
		}
	
	var naz = "";
	var oCountry = frm["country"] || frm["country__*"];
	if(oCountry)
		naz = (oCountry.options[oCountry.selectedIndex].value||"").toUpperCase();
	
	var userTypeID = "";
	var oUserType = frm["userTypeID"] || frm["userTypeID__*"];
	if(oUserType)
		userTypeID = oUserType.options[oUserType.selectedIndex].value||"";
	
	var pIVA = "";
	var oPIVA = frm["companyCode"] || frm["companyCode__*"];
	if(oPIVA)
		pIVA = oPIVA.value||"";
	
	var emptyFields = [];
	var wrongFields = [];
	var bEmptyField;
	var bWrongField;
	for(var i=0,fldName='',requiredField,disabledField;i<frm.elements.length;i++){
		fldName = frm.elements[i].name;
		disabledField = frm.elements[i].disabled;
		if(!fldName || disabledField) 
			continue;
		
		fieldChecked(frm.elements[i]);
		requiredField = fldName.split("__*").length==2;
		bEmptyField = false;
		bWrongField = false;
		fldName = (frm.elements[i].name.replace(/__\*$/,""));
		
		switch(fldName){
			case "companyCode":
				requiredField = requiredField || userTypeID.charAt(0)=="1";
				if( requiredField || frm.elements[i].value.length )
					bWrongField = checkFldIVA(frm.elements[i],naz);
			break;
			case "personCode":
				requiredField = requiredField || userTypeID.charAt(1)=="1";
				if( requiredField || frm.elements[i].value.length )
					bWrongField = checkFldPersoneCode(frm.elements[i],naz,pIVA);
			break;
			case "postalCode":
				if( requiredField || frm.elements[i].value.length )
					bWrongField = checkPostalCodeFld(frm.elements[i],naz);
			break;
			case "birthDate":
				if( requiredField || frm.elements[i].value.length )
					bWrongField = !isDate(frm.elements[i].value);
			break;
			case "mail":
				if( requiredField || frm.elements[i].value.length )
					bWrongField = !isMail(frm.elements[i].value);
			break;
			case "mail_2": case "pwd_2":
				if( requiredField || frm.elements[i].value.length )
					bWrongField = frm.elements[i].value!=frm.elements[i-1].value;
			break;
			// LIBERI SEMPRE
			case "cmd_OK": case "cmd_RESET":
				requiredField = false;
			break;
		}
		
		// se il campo so gia' che e' errato lo aggiungo all'elenco e proseguo
		if( bWrongField ){
			fieldChecked(frm.elements[i],true);
			wrongFields.push(frm.elements[i]);
			continue;
		}
		
		if( requiredField ){
			switch(frm.elements[i].type){
				case "checkbox":
				case "radio":
					var checked = false;
					var list = frm[frm.elements[i].name];
					if(list && list.length){
						for(var r=0;r<list.length;r++){
							checked = list[r].checked;
							if(checked)
								break;
						}
					}else
						checked = frm.elements[i].checked;
					bEmptyField = !checked;
				break;
				case "select-one":
					bEmptyField = frm.elements[i].selectedIndex==0;
				break;
				default:
					bEmptyField = isEmpty(frm.elements[i].value);
				break;
			}
			if(bEmptyField){
				fieldChecked(frm.elements[i],true);
				emptyFields.push(frm.elements[i]);
			}
		}
	}
	
	if(emptyFields.length || wrongFields.length){
		alert(window["formFieldsErrorMessage"]);
		if( emptyFields[0] )
			emptyFields[0].focus();
		else if( wrongFields[0] )
			wrongFields[0].focus();
		return false
	}else
		return true;
}

function checkFldIVA(fld,naz){
	var bWrongField = false;
	switch(naz){
		case "SM": case "RSM":
			var re = eval("/^\\d{5}$/");
			bWrongField = fld.value.search(re)==-1;
		case "I": case "IT": case "ITA":
			bWrongField = !ControllaPIVA(fld.value);
		break;
	}
	return bWrongField;
}
function checkFldPersoneCode(fld,naz,pIVA){
	var bWrongField = false;
	switch(naz){
		case "I": case "IT": case "ITA":
			bWrongField = !ControllaCF(fld.value) && fld.value!=pIVA;
		break;
	}
	return bWrongField;
}
function checkPostalCodeFld(fld,naz){
	var bWrongField = false;
	switch(naz){
		case "I": case "IT": case "ITA":
		case "SM": case "RSM":
			var re = eval("/^\\d{5}$/");
			bWrongField = fld.value.search(re)==-1;
		break;
	}
	return bWrongField;
}

function fieldChecked(fld,bWrong){
	bWrong = !!bWrong;
	var checkOK = "ReadySkins/common/images/ico_ball_green2.gif";
	var checkKO = "ReadySkins/common/images/ico_ball_red2.gif";
	var icoID = fld.name+"_check";
	//var icoCheck = document.getElementById(icoID);
	// metto a verde solo i cami che erano stati segnalati
	if(!bWrong){
		fld.style.border = "1px solid #ccc";
		fld.style.backgroundColor = "#fff";
		//fld.style.width = "80%";
		//icoCheck.src = checkOK;
	}
	if(bWrong){
		fld.style.border = "1px solid #ff0000";
		fld.style.backgroundColor = "#ffcccc";
		/*
		fld.style.width = "80%";
		if(!icoCheck){
			icoCheck = new Image();
			icoCheck.setAttribute("id",icoID);
			icoCheck.setAttribute("hspace",5);
			insertAfter(icoCheck,fld);
		}
		icoCheck.src = checkKO;
		*/
	}
}
function insertAfter(new_node, existing_node) {
	// if the existing node has a following sibling, insert the current
	// node before it. otherwise appending it to the parent node
	// will correctly place it just after the existing node.
	
	if (existing_node.nextSibling) {
	// there is a next sibling. insert before it using the mutual
	// parent's insertBefore() method.
		existing_node.parentNode.insertBefore(new_node, existing_node.nextSibling);
	} else {
	// there is no next sibling. append to the end of the parent's
	// node list.
		existing_node.parentNode.appendChild(new_node);
	}
}
function ControllaCF(cf){
	var validi, i, s, set1, set2, setpari, setdisp;
    if( cf == '' )  return true;
    cf = cf.toUpperCase();
    if( cf.length != 16 )
		return false;
		/*
        return "La lunghezza del codice fiscale non ?\n"
        +"corretta: il codice fiscale dovrebbe essere lungo\n"
        +"esattamente 16 caratteri.\n";
		*/
    validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for( i = 0; i < 16; i++ ){
        if( validi.indexOf( cf.charAt(i) ) == -1 )
          return false;
		   /*
		    return "Il codice fiscale contiene un carattere non valido `" +
                cf.charAt(i) +
                "'.\nI caratteri validi sono le lettere e le cifre.\n";
		*/
    }
    set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
    setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
    s = 0;
    for( i = 1; i <= 13; i += 2 )
        s += setpari.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
    for( i = 0; i <= 14; i += 2 )
        s += setdisp.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
    if( s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0) )
       return false;
	   /*
	    return "Il codice fiscale non ? corretto:\n"+
            "il codice di controllo non corrisponde.\n";
		*/
    return true;
}

function ControllaPIVA(pi){
    if( pi == '' )  return true;
    if( pi.length != 11 )
     	return false;
	   /*
	    return "La lunghezza della partita IVA non ?\n" +
            "corretta: la partita IVA dovrebbe essere lunga\n" +
            "esattamente 11 caratteri.\n";
		*/
    validi = "0123456789";
    for( i = 0; i < 11; i++ ){
        if( validi.indexOf( pi.charAt(i) ) == -1 )
           return false;
		   /*
		    return "La partita IVA contiene un carattere non valido `" +
                pi.charAt(i) + "'.\nI caratteri validi sono le cifre.\n";
			*/
    }
    s = 0;
    for( i = 0; i <= 9; i += 2 )
        s += pi.charCodeAt(i) - '0'.charCodeAt(0);
    for( i = 1; i <= 9; i += 2 ){
        c = 2*( pi.charCodeAt(i) - '0'.charCodeAt(0) );
        if( c > 9 )  c = c - 9;
        s += c;
    }
    if( ( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0) )
        return false;
		/*
		return "La partita IVA non ? valida:\n" +
            "il codice di controllo non corrisponde.\n";
		*/
    return true;
}
function decryptString(s){
	s = s||"";
	var bDecrypt = true;
	var cryptPrefix = "$";
	var newString = "";
	var krypt1 = "23BuvC_67X5Zab-fg8mYD4pRdhi.M9AEQPlNjk01/FTGJwxHIyK LceOqrstSVUWzno";
	var krypt2 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-. /";
	if(bDecrypt){
		if( s.indexOf(cryptPrefix)!=0 )
			return s;
		var temp = krypt1;
		krypt1 = krypt2;
		krypt2 = temp;
		s = s.substr(1);
	}
	for(var i=0,reg,index;i<s.length;i++){
		reg = new RegExp(s.charAt(i));
		index = krypt2.search(reg);
		newString += krypt1.charAt(index);
	}
	return newString;
}
