/*
*--	Constants and Globals
*		Global used for flagging the validateBlank() function within most other validation functions
*/		var blankOK = false;
/*		Global used for class switching.  Do not modify
*/		var revertClass = '';
/*		Change this to the classname you want for the error highlighting
*/		var errorClass = 'errHilite';
/*		If the bConfirm flag is set to true, the users will be prompted with CONFIRM box with this message
*/		var confirmMsg = 'Your Data is about to be sent.\nPlease click \'Ok\' to proceed or \'Cancel\' to abort.';
/*		If user cancels CONFIRM, then this message will be alerted.  If you don't want this alert to show, then
*		empty the variable (  var confirmAbortMsg = '';  )
*/		var confirmAbortMsg = 'Submission cancelled.  Data has not been sent.';
/*		Enter the name/id of your form's submit button here (works with type=image too)
*/		var submitButton = 'Submit';
/*		Enter the name/id of your form's reset button here (works with type=image too)
*/		var resetButton = 'Reset';
/*
*******************************************************************************************************/

function validateForm(Frm, bConfirm, bDisable, bDisableR)
	{
	var testOk;
	
	for (var i=0; i<Frm.elements.length; i++)						// Loops through all the form's elements
		{
		if (Frm.elements[i].alt)									// Gets the ALT text if it exists, starting the validation
			{
			var validateType = Frm.elements[i].alt;
			var validateObj = Frm.elements[i];
			testOk = false;			
			var params = validateType.split(/[|]/);					// Separates validation string into parameters
		
			if (params[0] == 'money')								// Sets flags for money syntax
				{
				var dollarsign	= (params[1].indexOf('$') != -1);
				var grouping	= (params[1].indexOf(',') != -1);
				var decimal		= (params[1].indexOf('.') != -1);
				}
			
			if (params[params.length-1] == 'bok')					// Sets flag if field is allowed to be blank
				blankOK = true;
	
			switch (params[0])										// Calls appropriate validation function based on type
				{
				case 'blank'	: if (validateBlank(validateObj)) testOk = true; break;
				case 'equalto'	: if (validateEqualTo(validateObj, params[1], Frm)) testOk = true; break;
				case 'length'	: if (validateLength(validateObj, params[1])) testOk = true; break;
				case 'number'	: if (validateNumber(validateObj)) testOk = true; break;
				case 'numberl'	: if (validateNumberL(validateObj, params[1])) testOk = true; break;
				case 'decimal'	: if (validateDecimal(validateObj, params[1], params[2] )) testOk = true; break;
				case 'decimalr'	: if (validateDecimalR(validateObj, params[1], params[2], params[3], params[4] )) testOk = true; break;				
				case 'money'	: if (validateMoney(validateObj, dollarsign, grouping, decimal)) testOk = true; break;
				case 'zip'		: if (validateZip(validateObj)) testOk = true ;break;
				case 'jpeg'		: if (validateJpeg(validateObj)) testOk = true ;break;
				case 'phone'	: if (validatePhone(validateObj)) testOk = true; break;
				case 'email'	: if (validateEmail(validateObj)) testOk = true; break;
				case 'cc'		: if (validateCC(validateObj)) testOk = true; break;
				case 'select'	: if (validateSelect(validateObj)) testOk = true; break;
				case 'selectm'	: if (validateSelectM(validateObj, params[1], params[2])) testOk = true; break;
				case 'selecti'	: if (validateSelectI(validateObj, params[1])) testOk = true; break;
				case 'checkbox'	: if (validateCheckbox(validateObj, Frm.name, validateObj.name, params[1], params[2])) testOk = true; break;
				//case 'privacy'	: if (validatePrivacy(validateObj, Frm.name)) testOk = true; break;
				case 'privacy'	: if (validatePrivacy(validateObj)) testOk = true; break;
				case 'condizioni'	: if (validateCondizioni(validateObj)) testOk = true; break;
				case 'radio'	: if (validateRadio(validateObj, Frm.name, validateObj.name)) testOk = true; break;
				// Add additional cases here
				default			: alert('Validation Type Not Found');
				}
			if (!testOk) return false;
			}		
		}
/*******************************************************
*	Any special conditions you have can be added here
********************************************************/		
		
	if (typeof bConfirm == 'undefined') bConfirm = 0;				// Checks for submission flags
	if (typeof bDisable == 'undefined') bDisable = 0;	
	if (typeof bDisableR == 'undefined') bDisableR = 0;	
	if (bConfirm)
		{
		if(!confirm(confirmMsg))
			{
			if (confirmAbortMsg != '') alert(confirmAbortMsg);		// Displays confim if requested
			return false;
			}
		}
	if (bDisable) Frm.elements[submitButton].disabled=true;			// Disables submit if requested
	if (bDisableR) Frm.elements[resetButton].disabled=true;			// Disables reset if requested
	return true;													// Form has been validated
	}

/***************************************************************************/
function validateBlank(formObj)
	{
	var objName = formatName(formObj.name);
	if (formObj.value == "")
		{
		alert('Il campo '+objName+' non puņ essere vuoto');
		errorProcess(formObj,0,1);
		return false;
		}
	var regex = new RegExp(/\S/);
	if (!regex.test(formObj.value))
		{
		alert('Il campo '+objName+' non puņ essere vuoto');
		errorProcess(formObj,1,1);
		return false;			
		}
	return true;
	}
/***************************************************************************/
// Special function used for bok
function checkBlank(formObj)
	{
	if (formObj.value == "")
		return true;
	var regex = new RegExp(/\S/);
	if (!regex.test(formObj.value))
		return true;			
	return false;
	}
		

/***************************************************************************/
function validateLength(formObj,len)
	{
	var objName = formatName(formObj.name);	
	if (blankOK && checkBlank(formObj))
		{ blankOK=false; return true; }
	
	if (formObj.value.length < parseInt(len))
		{
		alert('The '+objName+' must be at least '+len+' characters long');
		errorProcess(formObj,1,1);
		return false;
		}		
	return true;
	}
	
/***************************************************************************/
function validateNumber(formObj)
	{
	var objName = formatName(formObj.name);
	if (blankOK && checkBlank(formObj))
		{ blankOK=false; return true; }
	
	numReg = "^[0-9]*$"
	var regex = new RegExp(numReg);
	if (!regex.test(formObj.value))
		{
		window.alert('Only numeric values are valid for the '+objName);
		errorProcess(formObj,1,1);
		return false;
		}
	return true;
	}
/***************************************************************************/
function validateNumberL(formObj, len)
	{
	var objName = formatName(formObj.name);
	if (blankOK && checkBlank(formObj))
		{ blankOK=false; return true; }
	
	numReg = "^[0-9]{"+parseInt(len)+",}$"
	var regex = new RegExp(numReg);
	if (!regex.test(formObj.value))
		{
		window.alert('Sono richieste almeno '+len+' cifre numeriche per il campo: '+objName);
		errorProcess(formObj,1,1);
		return false;
		}
	return true;
	}

/***************************************************************************/
function validateSelect(formObj)
	{
	var objName = formatName(formObj.name);
	if (formObj.selectedIndex == 0)
		{
		alert('Seleziona una '+objName);
		errorProcess(formObj,0,1);
		return false;
		}
	return true;
	}
	
/***************************************************************************/
function validateSelectM(formObj, minS, maxS)
	{
	var objName = formatName(formObj.name);
	var selectCount = 0;
	if (maxS == 999) maxS = formObj.length;
	for (var i=0; i<formObj.length; i++)
		{
		if (formObj.options[i].selected)
			selectCount++; 
		}
	if (selectCount < minS || selectCount > maxS)
		{
		alert('Please select between '+minS+' and '+maxS+' '+objName+'.\nYou currently have '+selectCount+' selected');
		errorProcess(formObj,0,1);
		return false;
		}
	return true;
	}
	
/***************************************************************************/
function validateSelectI(formObj, indexes)
	{
	var objName = formatName(formObj.name);
	var arrIndexes =indexes.split(/[,]/);
	var selectOK = true;
	for (var i=0; i<arrIndexes.length; i++)
		{
		if (formObj.selectedIndex == arrIndexes[i])
			selectOK = false;
		}

	if (!selectOK)
		{
		alert('Please select a valid option for '+objName);
		errorProcess(formObj,0,1);
		return false;
		}
	return true;
	}
		
/***************************************************************************/
function validateZip(formObj)
	{
	var objName = formatName(formObj.name);	
	if (blankOK && checkBlank(formObj))
		{ blankOK=false; return true; }
	
	zipReg = "^[0-9]{5}(|[\- ]?[0-9]{4})$"
	var regex = new RegExp(zipReg);
	if (!regex.test(formObj.value))
		{
		window.alert("Inserire un CAP valido ");
		errorProcess(formObj,1,1);
		return false;
		}
	return true;
	}
/***************************************************************************/
function validateJpeg(formObj){
	var objName = formatName(formObj.name);	
	//if (blankOK && checkBlank(formObj)){ 
	if (checkBlank(formObj)){ 
		blankOK=false; 
		return true; 
	}
	imgReg = "\.(jpg|JPG|jpeg|JPEG|bmp|BMP|gif|GIF|png|PNG)$"
	var regex = new RegExp(imgReg);
	if (!regex.test(formObj.value)){
		window.alert("L'immagine deve essere di tipo JPG, GIF, PNG o BMP");
		errorProcess(formObj,1,1);
		return false;
	}
return true;
}

/***************************************************************************/
function validateEmail(formObj)
	{	
	if (blankOK && checkBlank(formObj))
		{ blankOK=false; return true; }

	var emailStr = formObj.value;
	var emailReg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
	var emailReg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid
	if (!emailReg1.test(emailStr) && emailReg2.test(emailStr)) // if syntax is valid
		{
		return true;
		}
	else
		{
		window.alert("L'indirizzo Email immesso non č valido.\n Ex. nome.cognome@dominio.it");
		errorProcess(formObj,1,1);
		return false;
		}
	return true;
	}
	

/***************************************************************************/
function validatePrivacy(formObj)
	{
	var objName = formatName(formObj.name);
	if (formObj.checked){
		//alert('Il campo '+objName+' va bene');
		//errorProcess(formObj,0,1);
		return true;
	}else{
		alert('E\' necessario dare il consenso al trattamento \ndei dati personali (L. 675/96)');
		return false;
	}
}

function validateCondizioni(formObj)
	{
	var objName = formatName(formObj.name);
	if (formObj.checked){
		//alert('Il campo '+objName+' va bene');
		//errorProcess(formObj,0,1);
		return true;
	}else{
		alert('E\' necessario dare il consenso alle condizioni del servizio');
		return false;
	}
}


/***************************************************************************/
function formatName(wStr)
	{
	wStr = wStr.replace(/_/g," ");
	return wStr;
	}
/***************************************************************************/	
function errorProcess(tempObj, sel, foc)
	{
	revertClass = tempObj.className;
	tempObj.className = errorClass;
	if (sel) tempObj.select();
	if (foc) tempObj.focus();
	}
/***************************************************************************/
function clearStyle(tempObj)
	{
	if (tempObj.className == errorClass) tempObj.className = revertClass;
	}