/*
*  checkForm.js
* ----------------------------------------------------------------------------
*	Copyright © 1995-2003 Intesys S.r.l. Verona (I). All rights reserved.
* ----------------------------------------------------------------------------
*  Data e versione:
*	11/11/2004 - 2.7
* ----------------------------------------------------------------------------
*  Descrizione:
*	Libreria Javascript per gestire i controlli sui campi di una form.
* ----------------------------------------------------------------------------
*
*	\n = new line
*	\r = carriage return
*	\t = tab
*	\n = form feed
*	\v = vertical tab
*	\w = [a-zA-Z0-9_]
*	\s = [ \t\n\r\f\v]
*	\d = [0-9]
*	.  = [^\n]
*/


// Basic Regular Expression Definition
var reSelect        = /^select/
var reNotEmpty      = /\w/
var reName          = /^[a-z][a-zàèìòùéçñ\`\'\.\s]*$/i
var reWord          = /^\w[\wàèìòùéçñ\`\'\.,\-\°]*$/i
var reWords         = /^\w[\wàèìòùéçñ\`\'\.,\-\°\s]*$/i
var reInt           = /^\-?\d+$/
var reNaturalInt    = /^[1-9]\d*$/
var reNatural0Int   = /^\d+$/
var reDay           = /^(0?[1-9]|[12][0-9]|3[01])$/
var reMonth         = /^(0?[1-9]|1[0-2])$/
var reYear          = /^(20|19)?\d\d$/
var reCAP           = /^\d\d\d\d\d$/
var reSiglaProv     = /^[a-z][a-z]$/i
var reEmail         = /^\w[\w\-\.]*@\w[\w\-\.]*\.[a-z]{2,4}$/i
var reTarga         = /^[a-z0-9]{5,10}$/i
var rePassword      = /^.{4,16}$/
var reCodiceFiscale = /^[A-Z]{6,6}\d\d[A-EHLMPRST]([04][1-9]|[1256][0-9]|[37][01])[A-ILM]\d\d\d[A-Z]$/i

// To think about
var reTelFisso      = /^0\d{6,13}$/
var reTelCell       = /^\d{7,15}$/
var reTel           = reTelCell
var rePercento      = /^(100|[1-9]?[0-9])$/
var reIdentifier    = /[a-z_]\w{3,16}/i
//var rePartitaIva  = /^\w{6,6}\d\d\w\d\d\w\d\d\d\w$/
//var rePatente     = /\w/



function showError(e, value, type, label, par1, par2) {
	switch (type) {
		case 'text':
			if (value) alert('"' + value + '" non è un valore valido per il campo "' + label + '".')
			else alert('Non è stato specificato un valore valido per il campo "' + label + '".')
			break;

		case 'date':
			if (value) alert('"' + value + '" non è una data valida per il campo "' + label + '".')
			else alert('Non è stata specificata una data valida per il campo "' + label + '".')
			break;

		case 'cmpdate':
			if (par2) { // focusOn_e1
				alert('La "' + label + '" non deve essere posteriore alla "' + par1 + '".')
			} else {
				alert('La "' + par1 + '" non deve essere anteriore alla "' + label + '".')
			}
			break;

		case 'int':
			if (value) alert('"' + value + '" non è una numero compreso tra '+par1+' e '+par2+' per il campo "' + label + '".')
			else alert('Non è stato specificata un numero compreso tra '+par1+' e '+par2+' per il campo "' + label + '".')
			break;

		case 'checkbox':
			alert('Il campo "' + label + '" non è stato spuntato')
			break;

		case 'confirmPassword':
			alert('Il valore del campo '+label+' non coincide con '+par1+'.')
			break;

		case 'password':
			if (value) alert('"' + value + '" non è una password valida per il campo "' + label + '".')
			else alert('Non è stato specificato nessuna password per il campo "' + label + '".')
			break;

		case 'radio':
		case 'select':
			alert('Non è stata selezionata nessuna voce per il campo "' + label + '".')
			break;

		case 'singleRadio':
			alert('Il campo "' + label + '" non è stato selezionato')
			break;
	}
	if (type != 'radio' && type != 'singleRadio') e.focus()
	return false
}


function testRE(e, re, label) {
	if (e.value && re.test(e.value)) return true
	else return (label ? showError(e, e.value, 'text', label) : false)
}


function testOptRE(e, re, label) {
	if (e.value == null || e.value == '') return true
	else return testRE(e, re, label)
}


function testInt(e, min, max, label) {
	if (e.value == '' + parseInt(e.value, 10) && e.value >= min && e.value <=max) return true
	else return (label ? showError(e, e.value, 'int', label, min, max) : false)
}


function testOptInt(e, min, max, label) {
	if (e.value==null || e.value=='') return true
	else return testInt(e, min, max, label)
}


function testSelect(e, firstValidIndex, label) {
	if (e.selectedIndex >= firstValidIndex) return true
	else return (label ? showError(e, false, 'select', label) : false)
}


function testSelectOption(e, value) {
	for (var i=0; i<e.options.length; i++) {
		if (e.options[i].selected && e.options[i].value == value) return true
	}
	return false
}


function testDate(e, label) {
	var dmy = e.value.split('/')
	if (reDay.test(dmy[0]) && reMonth.test(dmy[1]) && reYear.test(dmy[2])) {

		var d = parseInt(dmy[0], 10)
		var m = parseInt(dmy[1], 10)
		var y = parseInt(dmy[2], 10)

		// Con il passare degli anni aggiustare l'assegnazione automatica del secolo
		if (y < 10) y += 2000
		else if (y < 100) y += 1900

		var bisestile = (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0) ? 1 : 0);

		if ( m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12 || (m==2 && d<=28+bisestile) ||
			 ((m==4 || m==6 || m==9 || m==11) && d <=30) ) {
			e.value = (d < 10 ? '0' : '') + d + '/' + (m < 10 ? '0' : '') + m + '/' + y
			return true
		}
	}
	return (label ? showError(e, e.value, 'date', label) : false)
}


function testOptDate(e, label) {
	if (e.value == null || e.value == '') return true
	else return testDate(e, label)
}


function testCmpDate(e1, e2, label1, label2, focusOn_e1) {
	if (testDate(e1, label1) && testDate(e2, label2)) {
		var dmy1= e1.value.split('/')
		var d1 = parseInt(dmy1[0], 10)
		var m1 = parseInt(dmy1[1], 10)
		var y1 = parseInt(dmy1[2], 10)

		var dmy2= e2.value.split('/')
		var d2 = parseInt(dmy2[0], 10)
		var m2 = parseInt(dmy2[1], 10)
		var y2 = parseInt(dmy2[2], 10)

		if (y2>y1) return true
		else if (y2==y1 && m2>m1) return true
		else if (y2==y1 && m2==m1 && d2>=d1) return true
		else return (label1 && label2
						? showError(  focusOn_e1 ? e1 : e2
									, focusOn_e1 ? e1.value : e2.value
									, 'cmpdate'
									, label1
									, label2
									, focusOn_e1)
						: false)
	} else return false
}


function testOptCmpDate(e1, e2, label1, label2, focusOn_e1) {
	var e1Full = (e1.value != null && e1.value != '')
	var e2Full = (e2.value != null && e2.value != '')
	if (e1Full && e2Full) return testCmpDate(e1, e2, label1, label2, focusOn_e1)
	else if (e1Full) return testDate(e1, label1)
	else if (e2Full) return testDate(e2, label2)
	else return true
}


function testPasswords(e1, e2, label1, label2) {
	if (!rePassword.test(e1.value)) return (label1 ? showError(e1, e1.value, 'password', label1) : false)
	if (e1.value != e2.value) {
		if (label1 && label2) showError(e1, e1.value, 'confirmPassword', label1, label2)
		e2.focus()
		return false
	} else return true
}


function testCheckBox(e, label) {
	if (label && !e.checked) showError(e, e.value, 'checkbox', label)
	return e.checked
}


function testRadio(e, label) {
	if (e.type) {
		if (e.checked) return true
		return (label ? showError(e, e.value, 'singleRadio', label) : false)
	} else {
		for (var i=0; i<e.length; i++) {
			if (e[i].checked) return true
		}
		return  (label ? showError(e[0], false, 'radio', label) : false)
	}
}


function testRadioElement(e, value) {
	for (var i=0; i<e.length; i++) {
		if (e[i].checked && e[i].value == value) return true
	}
	return false
}


function checkForm(formId, checksToDo) {
	var v
	if (typeof checksToDo != 'object') return true
	for (var i=0; i<checksToDo.length; i++) {
		eval('v = '+checksToDo[i])
		if (!v) return false
	}
	return true
}


function checkAndSubmit(formId, checksToDo) {
	if (checkForm(formId, checksToDo)) {
		formId.submit()
		return true
	} else return false
}
