function trim(s)    { return s.replace(/^\s*/, "").replace(/\s*$/, ""); }
function hasText(s) { return trim(s) != ""; }
function isCodiceFiscale(s) { 
	/[a-zA-Z]{6}\d{2}[a-zA-Z]\d{2}[a-zA-Z]\d{3}[a-zA-Z]/;
	return s.length == 16 && s.match(s)
};

function isPartitaIva(s) { return s.length == 11; };

function validateMinLength(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMinLength = new minlength();
    for (x in oMinLength) {
        if (form[oMinLength[x][0]].type == 'text' ||
            form[oMinLength[x][0]].type == 'textarea') {
            var iMin = parseInt(oMinLength[x][2]("minlength"));
            if (form[oMinLength[x][0]].value.length < iMin) {
                if (i == 0) {
                    focusField = form[oMinLength[x][0]];
                }
                fields[i++] = oMinLength[x][1];
                bValid = false;
            }
        }
    }
    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }
    return bValid;
}

function validateMaxLength(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oMaxLength = new maxlength();
    for (x in oMaxLength) {
    	if (form[oMaxLength[x][0]] !=null) {
            if (form[oMaxLength[x][0]].type == 'text' || form[oMaxLength[x][0]].type == 'textarea') {
                var iMax = parseInt(oMaxLength[x][2]("maxlength"));
                if (form[oMaxLength[x][0]].value.length > iMax) {
                    if (i == 0) {
                        focusField = form[oMaxLength[x][0]];
                    }
                    fields[i++] = oMaxLength[x][1];
                    bValid = false;
                }
            }
    	}                    
    }
    if (fields.length > 0) {
       focusField.focus();
       alert(fields.join('\n'));
    }
	return bValid;
}

function validateRequired(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    var isCheckbox=false;
    oRequired = new required();
	for (x in oRequired) {
	if (form[oRequired[x][0]] !=null) {
        var field = form[oRequired[x][0]];
        if (field.type == 'text' || field.type == 'textarea' ||  field.type == 'select-one' || field.type == 'radio' ||
            field.type == 'password' || field.type == 'hidden') 
        {
                        
            var value;
			// get field's value
			if (field.type == "select-one") {
				var si = field.selectedIndex;
				if (si == -1) {
					value = '';
				} else {
					value = field.options[si].value;
				}
			} else {
				value = field.value;
			}
            
            if (value == '') {
                if (i == 0) {
                    focusField = field;
                }
                fields[i++] = oRequired[x][1];
                bValid = false;
            }
        } else {
		    // STEFANO: aggiunto per gestire i campi obbligatori nel caso di checkbox.
			var cont = 0;
			
			if ((field.length==0) || (field.length==null) || (field.length==undefined)) {
				if (field.type == 'checkbox') {
					isCheckbox=true;
					if (field.checked)
						cont = cont +1;
				}
			} else {
				for (k=0; k < field.length; k++) {
					if (field[k].type == 'checkbox') {
						isCheckbox = true;
						if (field[k].checked) cont += 1;
					}
				}
			}
			if (cont == 0)	{
                if (i == 0) {
                    focusField = field;
		        }
		        fields[i++] = oRequired[x][1];
		        bValid = false;
			}
		}
    }
	} // for
    if (fields.length > 0) {
	   if (!isCheckbox && (focusField.type != 'hidden')) focusField.focus();
       alert(fields.join('\n'));
    }
    return bValid;
}

function validateInteger(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oInteger = new IntegerValidations();
    for (x in oInteger) {
       if (form[oInteger[x][0]] != null) {
        	var field = form[oInteger[x][0]];
            if (field.type == 'text' || field.type == 'textarea' || field.type == 'select-one' || field.type == 'radio') {
                var value;
        		if (field.type == "select-one") {
		        	var si = field.selectedIndex;
			        value = field.options[si].value;
		        } else {
			        value = field.value;
		        }
                if (value.length > 0) {
                    var iValue = parseInt(value);
                    if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
                        if (i == 0) focusField = field;
                        fields[i++] = oInteger[x][1];
                        bValid = false;
                    }
                }
            }
	    }                    
	} // end for

    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
	}
    return bValid;
}
    
function validateDate(form) {
       var bValid = true;
       var focusField = null;
       var i = 0;
       var fields = new Array();
       oDate = new DateValidations();
       for (x in oDate) {
           if (form[oDate[x][0]] != null) {               
            var value = form[oDate[x][0]].value;
            var datePattern = oDate[x][2]("datePattern");
                   
            if (datePattern=="HH:mm") {
                   	
                if ((value.length > 0) && (!isValidHour(value))) {
                  if (i == 0) {
                      focusField = form[oDate[x][0]];
                  }
                  fields[i++] = oDate[x][1];
                  bValid =  false;
                }

             } else if ((form[oDate[x][0]].type == 'text' || form[oDate[x][0]].type == 'hidden' ||
                        form[oDate[x][0]].type == 'textarea') && (value.length > 0) && (datePattern.length > 0)) {                          var MONTH = "MM";
               var DAY = "dd";
               var YEAR = "yyyy";
               var orderMonth = datePattern.indexOf(MONTH);
               var orderDay = datePattern.indexOf(DAY);
               var orderYear = datePattern.indexOf(YEAR);
               if ((orderDay < orderYear && orderDay > orderMonth)) {
                    var iDelim1 = orderMonth + MONTH.length;
                    var iDelim2 = orderDay + DAY.length;
                    var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                    var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                    if (iDelim1 == orderDay && iDelim2 == orderYear) {
                        dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                    } else if (iDelim1 == orderDay) {
                        dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                    } else if (iDelim2 == orderYear) {
                       dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                    } else {
                       dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                    }
                    var matched = dateRegexp.exec(value);
                    if(matched != null) {
                       if (!isValidDate(matched[2], matched[1], matched[3])) {
                          if (i == 0) {
                               focusField = form[oDate[x][0]];
                          }
                          fields[i++] = oDate[x][1];
                          bValid =  false;
                      }
                    } else {
                       if (i == 0) {
                           focusField = form[oDate[x][0]];
                       }
                       fields[i++] = oDate[x][1];
                       bValid =  false;
                    }
                } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
                     var iDelim1 = orderDay + DAY.length;
                     var iDelim2 = orderMonth + MONTH.length;
                     var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                     var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                     if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                         dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                     } else if (iDelim1 == orderMonth) {
                         dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                     } else if (iDelim2 == orderYear) {
                         dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                     } else {
                         dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                     }
                     var matched = dateRegexp.exec(value);
                     if(matched != null) {
                         if (!isValidDate(matched[1], matched[2], matched[3])) {
                             if (i == 0) {
                                 focusField = form[oDate[x][0]];
                             }
                             fields[i++] = oDate[x][1];
                             bValid =  false;
                          }
                     } else {
                         if (i == 0) {
                             focusField = form[oDate[x][0]];
                         }
                         fields[i++] = oDate[x][1];
                         bValid =  false;
                     }
                 } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
                     var iDelim1 = orderYear + YEAR.length;
                     var iDelim2 = orderMonth + MONTH.length;
                     var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                     var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
                     if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                         dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
                     } else if (iDelim1 == orderMonth) {
                         dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
                     } else if (iDelim2 == orderDay) {
                         dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
                     } else {
                         dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
                     }
                     var matched = dateRegexp.exec(value);
                     if(matched != null) {
                         if (!isValidDate(matched[3], matched[2], matched[1])) {
                             if (i == 0) {
                                 focusField = form[oDate[x][0]];
                              }
                              fields[i++] = oDate[x][1];
                              bValid =  false;
                          }
                      } else {
                          if (i == 0) {
                              focusField = form[oDate[x][0]];
                          }
                          fields[i++] = oDate[x][1];
                          bValid =  false;
                          }
                     } else {
                         if (i == 0) {
                             focusField = form[oDate[x][0]];
                         }
                         fields[i++] = oDate[x][1];
                         bValid =  false;
                     }
                  }
                  
            }                  
        }
        if (fields.length > 0) {
		    if (focusField.type != 'hidden')
                  focusField.focus();
                  alert(fields.join('\n'));
            }
            return bValid;
        }

function isValidHour(ora) {	    
	if ((ora.indexOf(":")!=2)||(ora.length!=5)) 
		return false;	    		
	hh=parseInt(ora.substring(0,2),10);
	mm=parseInt(ora.substring(3,5),10);
	return ((hh>=0&&hh<24)&&(mm>=0&&mm<60)) ? true : false;
}
	
function isValidDate(day, month, year) {
    if (month < 1 || month > 12) {
            return false;
    }
    if (day < 1 || day > 31) {
        return false;
    }
    if ((month == 4 || month == 6 || month == 9 || month == 11) && (day == 31)) {
        return false;
    }
    if (month == 2) {
        var leap = (year % 4 == 0 &&
                   (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day == 29 && !leap)) {
            return false;
        }
    }
    return true;
}
    
function validateIntRange(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oRange = new intRange();
    for (x in oRange) {
        if ((form[oRange[x][0]].type == 'text' ||
             form[oRange[x][0]].type == 'textarea') &&
            (form[oRange[x][0]].value.length > 0)) {
            var iMin = parseInt(oRange[x][2]("min"));
            var iMax = parseInt(oRange[x][2]("max"));
            var iValue = parseInt(form[oRange[x][0]].value);
            if (!(iValue >= iMin && iValue <= iMax)) {
                if (i == 0) {
                    focusField = form[oRange[x][0]];
                }
                fields[i++] = oRange[x][1];
                bValid = false;
            }
        }
    }
    if (fields.length > 0) {
        focusField.focus();
        alert(fields.join('\n'));
    }
    return bValid;
}

function checkDenominazione(field) {
    var val = trim(field.value); 
    var res = false;

    if (val.match(/[()]/g)) {
    	alert("La denominazione contiene dei caratteri non validi. Non sono accettati '(' e ')'");
    } else if (val.length < 2 || val.length > 50) {
         alert("La denominazione dev'essere compresa tra 2 e 50 caratteri.");
    } else {
        res = true;
    }
    if (res == false) field.focus();

    return res;
}

function checkCognome(field) {
    var val = trim(field.value); 
    if (val.match(/[()]/g)) {
    	alert("Il cognome contiene dei caratteri non validi. Non sono accettati '(' e ')'");
        field.focus();
    	return false;
    } else if (val.length < 2 || val.length > 25) {
        alert("Il cognome dev'essere compreso tra 2 e 25 caratteri.");
        field.focus();
        return false;
    }
    return true;
}

/** usato in homepage nella ricerca PB. Da sostituire con pageScroll */
function scroll(newPos, newQueryId) {
    document.getElementById("pos").value = newPos;
    document.getElementById("queryId").value = newQueryId;
    document.searchFrm.submit();	
}

/**  
 *  - Paginazione -
 *  
 *  formId - id del form che incorpora le funzione next/prev page
 *  offsetId - campo del form che memorizza il nuovo offset
 *  offset - intero. Il nuovo offset
 */
function pageScroll(formId, offsetId, offset) {
    document.getElementById(offsetId).value = offset;
    document.getElementById(formId).submit();	
}


function checkFormPagineBianche(theForm) {
	if ((trim(theForm.azienda.value).length == 0) &&
	    (trim(theForm.cognome.value).length == 0)) {	
		alert("Compilare il campo obbligatorio.");
		return false;
	}
	return true;
}

/** 
 * Esegue il submit del form una volta selezionato un item della combo
 * (se il value dell'item non è vuoto)
 */
function submitOnSelection(formId, combo) {
	if (combo.options[combo.selectedIndex].value != "")
		document.getElementById(formId).submit();
}

/** toggle visibility of block identified by id */
function doToggle(id) {
    var elt = document.getElementById(id);
    if (elt.style.display == 'none') {
        elt.style.display = 'block';
        //document.getElementById('showLnk').style.display = 'none';
        //document.getElementById('hideLnk').style.display = 'block';
    } else {
        elt.style.display = 'none';
        //document.getElementById('showLnk').style.display = 'block';
        //document.getElementById('hideLnk').style.display = 'none';
    }
}

/** Mostra il blocco identificato da idOn e nasconde il blocco identificato da idOff */
function doToggle2(idOn, idOff) {
    var eltOn = document.getElementById(idOn);
    var eltOff = document.getElementById(idOff);
    eltOn.style.display == 'block';
    eltOff.style.display == 'none';
}

function popup(url, width, height) { 
	var pw = width ? width : 450;
    var ph = height ? height : 300;
    var ie = navigator.userAgent.indexOf("MSIE") > 0;
    var w = ie ? document.body.clientWidth + document.body.scrollLeft : window.innerWidth;
    var h = ie ? document.body.clientHeight + document.body.scrollTop : window.innerHeight;
	var leftPos = (w - pw)/2;
	var topPos = (h - ph)/2;
    var popup = window.open(url, '', 'width='+pw+',height='+ph+',top='+topPos+',left='+leftPos+',scrollbars=yes,resizable=yes');
    popup.moveTo(leftPos, topPos);
    popup.focus();
}

function soloSediPrincipali(sedi) {
	if(sedi.value==0){
		sedi.value=1;
 	 	//alert("Solo sedi principali");
 	}
 	else{
		sedi.value=0;
 	 	//alert("Tutte le sedi");
 	}	
}

function soloDitteNonCessate(cessate) {
	if(cessate.value==0){
		cessate.value=1;
 	 	//alert("Solo ditte non cessare");
 	}
 	else{
		cessate.value=0;
 	 	//alert("Tutte le ditte");
 	}	
}
