// var
var fieldsName = null;

function validateFormAndConfirm(form, fields, mesg)
{
	if (form.password1.value == form.password2.value)
	{
		if (validateForm(form, fields, 'La form non e\' stata compilata correttamente, per favore verificare che tutti i campi obbligatori siano stati compilati'))
		{
			if (confirm(mesg))
			{
				return true;
			}
			else
			{
				return false;
			}
		}
	}
	else
	{
		alert('le password inserite non coincidono');
	}
	return false;
}

function validateFormAndSubmit(form, fields, mesg)
{
	if (validateForm(form, fields, mesg))
	{
		//form.submit();
		return true;
	}
	else
	{
		return false;
	}
}

// Main
function validateForm(form, fields, mesg)
{
	if (fields != null)
	{
		fieldsName = fields;
	}
	else
	{
		pushFieldName(form);
	}
	for (var i = 0; i < form.elements.length; i++) 
	{
		if (form.elements[i].type == 'radio')
		{
			//alert(form.elements[i].name + '=' + checkRadio(form.elements[i]));
			if (checkRadio(form.elements[i]))
			{
				removeField(form.elements[i]);
			}
		}
		else if (form.elements[i].type == 'text')
		{
			//alert(form.elements[i].name + '=' + checkText(form.elements[i].type));
			if (checkText(form.elements[i]))
			{
				removeField(form.elements[i]);
			}
		}
		else if (form.elements[i].type == 'password')
		{
			//alert(form.elements[i].name + '=' + checkText(form.elements[i].type));
			if (checkText(form.elements[i]))
			{
				removeField(form.elements[i]);
			}
		}
		else if (form.elements[i].type == 'checkbox')
		{
			//alert(form.elements[i].name + '=' + checkCheckbox(form.elements[i]));
			if (checkCheckbox(form.elements[i]))
			{
				removeField(form.elements[i]);
			}
		}
		else if (form.elements[i].type == 'select-one')
		{
			//alert(form.elements[i].name + '=' + checkSelect(form.elements[i]));
			if (checkSelect(form.elements[i]))
			{
				removeField(form.elements[i]);
			}
		}
		else if (form.elements[i].type == 'submit')
		{
			removeField(form.elements[i]);
		}
		else if (form.elements[i].type == 'hidden')
		{
			// nope
		}
		else
		{
			alert('unhandled element: name=' + form.elements[i].name + ',type=' + form.elements[i].type);
		}
	}
	if (haveError())
	{
		alert(mesg);
		return false;
	}
	else
	{
		return true;
	}
}

// push form field name into Array
function pushFieldName(form)
{
	fieldsName = new Array(form.elements.length);
	for (var i = 0; i < form.elements.length; i++)
	{
		fieldsName[i] = form.elements[i].name;
	}
}

// remove element from field name Array
function removeField(field)
{
	for (var i = 0; i < fieldsName.length; i++)
	{
		if (field.name == fieldsName[i])
		{
			fieldsName[i] = null;
		}
	}
}

// check field
function haveError()
{
	for (var i = 0; i < fieldsName.length; i++)
	{
		if (fieldsName[i] != null)
		{
			alert(fieldsName[i] + ' is not null');
			return true;
		}
	}
	return false;
}

// input text validation validator
function checkText(field)
{
	if (field == null || field.value == null || field.value == '')
	{
		return false;
	}
	else
	{
		return true;
	}
}

// input type checkbox validator
function checkCheckbox(field)
{
	if (field == null || !field.checked)
	{
		return false;
	}
	else
	{
		return true;
	}
}

// input type radio validator
function checkRadio(field)
{
	if (field == null || !field.checked)
	{
		return false;
	}
	else
	{
		return true;
	}
}

// input type select validator
function checkSelect(field)
{
	if (field == null)
	{
		return false;
	}
	else
	{
		for (var i = 0; i < field.options.length; i++)
		{
			if (field.options[i].value!='' && field.options[i].selected) return true;
		}
		return false;
	}
}

function emailCheck(emailStr) 
{

   /* The following variable tells the rest of the function whether or not
   to verify that the address ends in a two-letter country or well-known
   TLD.  1 means check it, 0 means don't. */

   var checkTLD=1;

   /* The following pattern is used to check if the entered e-mail address
   fits the user@domain format.  It also is used to separate the username
   from the domain. */

   var emailPat=/^(.+)@(.+)$/;

   /* The following string represents the pattern for matching all special
   characters.  We don't want to allow special characters in the address. 
   These characters include ( ) < > @ , ; : \ " . [ ] */

   var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";

   /* The following string represents the range of characters allowed in a 
   username or domainname.  It really states which chars aren't allowed.*/
   
   var validChars="\[^\\s" + specialChars + "\]";
   
   /* The following pattern applies if the "user" is a quoted string (in
   which case, there are no rules about which characters are allowed
   and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
   is a legal e-mail address. */

   var quotedUser="(\"[^\"]*\")";
   
   /* The following pattern applies for domains that are IP addresses,
   rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
   e-mail address. NOTE: The square brackets are required. */
   
   var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
   
   /* The following string represents an atom (basically a series of non-special characters.) */

   var atom=validChars + '+';
   
   /* The following string represents one word in the typical username.
   For example, in john.doe@somewhere.com, john and doe are words.
   Basically, a word is either an atom or quoted string. */
   
   var word="(" + atom + "|" + quotedUser + ")";

   // The following pattern describes the structure of the user
   
   var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
   
   /* The following pattern describes the structure of a normal symbolic
   domain, as opposed to ipDomainPat, shown above. */
   
   var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");

   /* Finally, let's start trying to figure out if the supplied address is valid. */
   
   /* Begin with the coarse pattern to simply break up user@domain into
   different pieces that are easy to analyze. */
   
   var matchArray=emailStr.match(emailPat);
   
   if (matchArray==null) 
   {
      /* Too many/few @'s or something; basically, this address doesn't
      even fit the general mould of a valid e-mail address. */
      
      alert("Email address seems incorrect (check @ and .'s)");
      return false;
   }
   var user=matchArray[1];
   var domain=matchArray[2];

   // Start by checking that only basic ASCII characters are in the strings (0-127).
   
   for (i=0; i<user.length; i++) 
   {
      if (user.charCodeAt(i)>127) 
      {
         alert("Ths username contains invalid characters.");
         return false;
      }
   }
   for (i=0; i<domain.length; i++) 
   {
      if (domain.charCodeAt(i)>127) 
      {
         alert("Ths domain name contains invalid characters.");
         return false;
      }
   }
   
   // See if "user" is valid 
   
   if (user.match(userPat)==null) 
   {
      // user is not valid
      alert("The username doesn't seem to be valid.");
      return false;
   }

   /* if the e-mail address is at an IP address (as opposed to a symbolic
   host name) make sure the IP address is valid. */
   
   var IPArray=domain.match(ipDomainPat);
   if (IPArray!=null) 
   {
      // this is an IP address
      for (var i=1;i<=4;i++) 
      {
         if (IPArray[i]>255) 
         {
            alert("Destination IP address is invalid!");
            return false;
         }
      }
      return true;
   }

   // Domain is symbolic name.  Check if it's valid.
    
   var atomPat=new RegExp("^" + atom + "$");
   var domArr=domain.split(".");
   var len=domArr.length;
   for (i=0;i<len;i++) 
   {
      if (domArr[i].search(atomPat)==-1) 
      {
         alert("The domain name does not seem to be valid.");
         return false;
      }
   }

   /* domain name seems valid, but now make sure that it ends in a
   known top-level domain (like com, edu, gov) or a two-letter word,
   representing country (uk, nl), and that there's a hostname preceding 
   the domain or country. */
   
   if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) 
   {
      alert("The address must end in a well-known domain or two letter " + "country.");
      return false;
   }

   // Make sure there's a host name preceding the domain.
   
   if (len<2) 
   {
      alert("This address is missing a hostname!");
      return false;
   }

   // If we've gotten this far, everything's valid!
   return true;
}

function checkCodFisc(e) {

  var isIE = (navigator.appName == "Microsoft Internet Explorer") ? 1 : 0;

  var whichCode = (window.Event) ? e.which : e.keyCode;
  if (!whichCode) {
	  whichCode = e.keyCode;
     if (!whichCode) {
       whichCode = e.which;
     }
  }
	// whichCode=13 è il tasto Enter, 8 è il tasto backspace per cancellare, 37 e 39 sono la navigazione a sinistra e destra
  if ((whichCode>=48 && whichCode<=57) || (whichCode >= 65 && whichCode < 91)||(whichCode==13)||(whichCode==32)||(whichCode==8)||(whichCode==37)||(whichCode==39))
  {
    return true;
  } else if (whichCode >= 97 && whichCode < 123)
  {
			if (isIE) {
    	   e.which = e.which -32;
    	   e.keyCode = e.keyCode -32;
         return true;
			} else {
         alert('Impossibile inserire caratteri in minuscolo');
         return false;
			}
  } else {
    return false;
  }
}

function uppercase(e) {

  var isIE = (navigator.appName == "Microsoft Internet Explorer") ? 1 : 0;

  var whichCode = (window.Event) ? e.which : e.keyCode;
  if (!whichCode) {
    whichCode = e.keyCode;
    if (!whichCode) {
      whichCode = e.which;
    }
  }
  // whichCode=13 è il tasto Enter, 32 barra spaziatrice, 34 doppi apici, 36 dollaro, 38 apmersand, 39 apostrofo,
  // 40 tonda aperta, 41 torna chiusa, 44 virgola, 46 punto, 58 due punti, 59 punto e virgola
  if ((whichCode<97 || whichCode>122))
  {
    return true;
  } else
  {
		/*if (isIE) {
    	   e.which = e.which -32;
    	   e.keyCode = e.keyCode -32;
         return true;
		} else {*/
         alert('Impossibile inserire caratteri in minuscolo');
         return false;
		//}
  }
}

function lowercase(e) {

  var isIE = (navigator.appName == "Microsoft Internet Explorer") ? 1 : 0;

  var whichCode = (window.Event) ? e.which : e.keyCode;
  if (!whichCode) {
    whichCode = e.keyCode;
    if (!whichCode) {
      whichCode = e.which;
    }
  }
  // whichCode=13 è il tasto Enter, 32 barra spaziatrice, 34 doppi apici, 36 dollaro, 38 apmersand, 39 apostrofo,
  // 40 tonda aperta, 41 torna chiusa, 44 virgola, 46 punto, 58 due punti, 59 punto e virgola
  if ((whichCode<65 || whichCode>90))
  {
    return true;
  } else
  {
		/*if (isIE) {
    	   e.which = e.which -32;
    	   e.keyCode = e.keyCode -32;
         return true;
		} else {*/
         alert('Impossibile inserire caratteri in maiuscolo');
         return false;
		//}
  }
}

