/**------------
*	Form validations utility functions
*
*	Note:
*	class must used for the input field:
*		- requested: indicates if a field is required or not.
*
*		- text_field: for normal text input
*		- mail_field: for text input that will be contain a email
*		- re_mail_field: for text input that will be contain the repetition of email
*		- pass_field: for text input that will be contain a password
*		- re_pass_field: for text input that will be contain the repetition of password
*		- number_field: for text input that will be contain only number
*		- radio_field: for radio input
*		- check_field: for check input
*		- pi_field: for text input that will be contain a VAT (italian)
*		- cf_field: for text input that will be contain a tax code (italian)
*
*		- agency_field:	class for agency field. If this class is assigned to a text field, when you insert text
*						in this field, the pi_field became required. Remember that the agency field is NOT required.
*
*	Every input field must have a parent with the class indicated in the var "field_container".
*	Between this tag and the fild you can have all the tags you want!
*/

$(document).ready(function ()
{
	// options
	var field_container = '.field';
	var select_default_val = '';
	var min_lenght_password = 6;

	// do not touch, var for make script working. $_request_field is used only for the field
	// that at the loading of DOM is already set as required
	
	var $_request_field = $('#page_form form').find('.requested');
	var $_mail_field = $('#page_form form').find('.mail_field');
	var $_pass_field = $('#page_form form').find('.pass_field');
	var $_re_mail_field;
	var $_have_re_mail_field = false;
	var $_re_pass_field;
	var $_have_re_pass_field = false;
	if ($('#page_form form').find('.re_mail_field').get(0))
	{
		$_re_mail_field = $('#page_form form').find('.re_mail_field');
		$_have_re_mail_field = true;
	}
	if ($('#page_form form').find('.re_pass_field').get(0))
	{
		$_re_pass_field = $('#page_form form').find('.re_pass_field');
		$_have_re_pass_field= true;
	}
	var $_cf_field = $_request_field.filter('.cf_field');
	var $_pi_field = '';
	var allCompiled = true;
	/**--------------------------------------------------------------------------------
	*	form Utils
	*/
	// return true if the parameter "field_val" is a correct PI
	function isPI(field_val)
	{
		var i, s, err = '';
		if( field_val.length != 11 )
		{
			return false;
			//return err = "- " + field_name + ": la lunghezza della partita IVA non e\' corretta: la partita IVA deve essere lunga esattamente 11 caratteri.\n";
		}
		else if(field_val == '00000000000')
		{
			//return err = "- " + field_name + ": partita iva non valida!.\n";
			return false;
		}

		var validi = "0123456789";
		for(i = 0; i < 16; i++)
		{
			if( validi.indexOf( field_val.charAt(i) ) == -1 )
			{
				//return err = "- " + field_name + ": la partita IVA contiene un carattere non valido '" + field_val.charAt(i) + "'. I caratteri validi sono solo i numeri.\n";
				return false;
			}
		}
		
		s = 0;
		for( i = 0; i <= 9; i += 2 )
			s += field_val.charCodeAt(i) - '0'.charCodeAt(0);
		for( i = 1; i <= 9; i += 2 )
		{
			c = 2*( field_val.charCodeAt(i) - '0'.charCodeAt(0) );
			if( c > 9 )  c = c - 9;
			s += c;
		}
		if( ( 10 - s%10 )%10 != field_val.charCodeAt(10) - '0'.charCodeAt(0) )
		{
			//return err = "- " + field_name + ": la partita IVA non e\' valida! Il codice di controllo non corrisponde.\n";
			return false;
		}
		//return err;
		return true;
	}

	// return true if the parameter "field_val" is a correct CF
	function isCF(field_val)
	{
		var validi, i, s, set1, set2, setpari, setdisp, err = '';
		field_val = field_val.toUpperCase();

		if( field_val.length != 16 )
		{
			//return err = "- " + field_name + ": la lunghezza del codice fiscale non e\' corretta.\nIl codice fiscale deve essere lungo esattamente 16 caratteri.\n";
			return false;
		}
		var validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

		for( i = 0; i < 16; i++ )
		{
			if( validi.indexOf( field_val.charAt(i) ) == -1 )
			{
				//return err = "- " + field_name + ": il codice fiscale contiene il carattere non valido '" + field_val.charAt(i) + "'.\nI caratteri validi sono le lettere e le cifre.\n";
				return false;
			}
		}
		set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
		setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
		s = 0;
		for( i = 1; i <= 13; i += 2 )
			s += setpari.indexOf( set2.charAt( set1.indexOf( field_val.charAt(i) )));

		for( i = 0; i <= 14; i += 2 )
			s += setdisp.indexOf( set2.charAt( set1.indexOf( field_val.charAt(i) )));

		if( s%26 != field_val.charCodeAt(15)-'A'.charCodeAt(0) )
		{
			//return err = "- " + field_name + ": il codice fiscale non e\' corretto.\nIl codice di controllo non corrisponde.\n";
			return false;
		}
		//return err;
		return true;
	}

	// return true if the parameter "field_val" is a correct mail
	function isMail(field_val)
	{
		var at = "@";
		var dot = ".";
		var lat = field_val.indexOf(at);
		var lstr = field_val.length;
		var ldot = field_val.indexOf(dot);
		var err = false;
		if (field_val.indexOf(at) == -1) { err = true; }
		else if (field_val.indexOf(at) == -1 || field_val.indexOf(at) == 0 || field_val.indexOf(at) == lstr) { err = true; }
		else if (field_val.indexOf(dot) == -1 || field_val.indexOf(dot) == 0 || field_val.indexOf(dot) == lstr) { err = true; }
		else if (field_val.indexOf(at,(lat+1))!=-1) { err = true; }
		else if (field_val.substring(lat-1,lat)==dot || field_val.substring(lat+1,lat+2)==dot) { err = true; }
		else if (field_val.indexOf(dot,(lat+2))==-1) { err = true; }
		else if (field_val.indexOf(" ")!=-1) { err = true; }

		return !err;
	}

	// return true if  the parameter "field_val" is a number
	function isNumber(field_val)
	{
		var  err = false;
		if (isNaN(field_val)) {	err = true;	}
		return !err;
	}
	
	// show the ok icon (and if the error icon is showed, hide it)
	function showOk($_obj)
	{
		var $_current_ok = $_obj.parents(field_container).siblings('.icon').find('.form_ok');
		var $_current_error = $_obj.parents(field_container).siblings('.icon').find('.form_error');
		if(parseInt($_current_error.css('left')) > 0)
		{
			$_current_error.stop().animate({'left':'-20px'}, 150, function() {
				$_current_ok.stop().animate({'left':'4px'}, 150);
			});;
		}
		else if(parseInt($_current_ok.css('left')) < 0)
		{
			$_current_ok.stop().animate({'left':'4px'}, 150);
		}
	}

	// show the error icon (and if the ok icon is showed, hide it)
	function showError($_obj)
	{
		var $_current_ok = $_obj.parents(field_container).siblings('.icon').find('.form_ok');
		var $_current_error = $_obj.parents(field_container).siblings('.icon').find('.form_error');
		if(parseInt($_current_ok.css('left')) > 0)
		{
			$_current_ok.stop().animate({'left':'-20px'}, 150, function() {
				$_current_error.stop().animate({'left':'4px'}, 150);
			});;
		}
		else if(parseInt($_current_error.css('left')) < 0)
		{
			$_current_error.stop().animate({'left':'4px'}, 150);
		}
	}

	// remove all the icon
	function removeIcon($_obj)
	{
		var $_current_ok = $_obj.parents(field_container).siblings('.icon').find('.form_ok');
		var $_current_error = $_obj.parents(field_container).siblings('.icon').find('.form_error');
		if(parseInt($_current_ok.css('left')) > 0)
		{
			$_current_ok.stop().animate({'left':'-20px'}, 150);;
		}
		else if(parseInt($_current_error.css('left')) > 0)
		{
			$_current_error.stop().animate({'left':'-20px'}, 150);
		}
	}

	// set field as required, but DON'T SET the type of field (example text_field, number_field,...)
	function setRequired($_obj)
	{
		var $_current_label = $_obj.parents(field_container).siblings('.label');

		if (!$_current_label.find('.star').get(0))
		{
			$('<span class="star"> (*)</span>').appendTo($_current_label);
		}
		$_obj.addClass('requested');
		$_request_field = $_request_field.add($_obj, document);
	}

	// unset field as required
	function unsetRequired($_obj)
	{
		var $_current_label = $_obj.parents(field_container).siblings('.label');

		$_current_label.find('.star').remove();
		$_obj.removeClass('requested');
		$_request_field = $_request_field.not($_obj, document);
	}

	// check the field and show ok/error depending the type and the content
	function checkField($_cur_obj)
	{
		if($_cur_obj.hasClass('agency_field'))
		{
			$_pi_field = $('#page_form form').find('.pi_field');
			if($_cur_obj.val().length > 0)
			{
				setRequired($_pi_field);
			}
			else
			{
				unsetRequired($_pi_field);
			}
		}
		if($_cur_obj.hasClass('check_field'))
		{
			if ($_cur_obj.hasClass('requested'))
			{
				if($_cur_obj.attr('checked') == 'checked')
				{
					showOk($_cur_obj);
				}
				else
				{
					showError($_cur_obj);
					allCompiled = false;
				}
			}
			else
			{
				removeIcon($_cur_obj);
			}
		}
		else if($_cur_obj.hasClass('radio_field'))
		{
			if ($_cur_obj.hasClass('requested'))
			{
				var radio_name = $_cur_obj.attr('name');
				if($_cur_obj.parents(field_container).find("[name]='"+radio_name+"'").filter(":checked").length > 0)
				{
					showOk($_cur_obj);
				}
				else
				{
					showError($_cur_obj);
					allCompiled = false;
				}
			}
			else
			{
				removeIcon($_cur_obj);
			}
		}
		else if($_cur_obj.hasClass('select_field'))
		{
			if ($_cur_obj.hasClass('requested'))
			{
				if($_cur_obj.find(":selected").text() != select_default_val)
				{
					showOk($_cur_obj);
				}
				else
				{
					showError($_cur_obj);
					allCompiled = false;
				}
			}
			else
			{
				removeIcon($_cur_obj);
			}
		}
		else
		{
			// text field
			if($_cur_obj.hasClass('text_field'))
			{
				if ($_cur_obj.hasClass('requested'))
				{
					if($_cur_obj.val().length > 0)
					{
						showOk($_cur_obj);
					}
					else
					{
						showError($_cur_obj);
						allCompiled = false;
					}
				}
				else
				{
					removeIcon($_cur_obj);
				}
			}
			// mail field
			if($_cur_obj.hasClass('mail_field'))
			{
				if(isMail($_cur_obj.val()))
				{
					showOk($_cur_obj);
					if($_have_re_mail_field && $_re_mail_field.val()!= '')
					{
						if($_cur_obj.val() == $_re_mail_field.val())
						{
							showOk($_re_mail_field);
						}
						else
						{
							showError($_re_mail_field);
							allCompiled = false;
						}
					}
				}
				else
				{
					if(!$_cur_obj.hasClass('requested') && ($_cur_obj.val() == ''))
					{
						// mail not required and empty field!
						removeIcon($_cur_obj);
					}
					else
					{
						// mail required or not empty field!
						showError($_cur_obj);
					}
					if($_have_re_mail_field && $_re_mail_field.val()!= '')
					{
						showError($_re_mail_field);
						allCompiled = false;
					}
				}
			}
			// retype mail field
			if($_cur_obj.hasClass('re_mail_field'))
			{
				if(isMail($_cur_obj.val()))
				{
					if($_cur_obj.val() == $_mail_field.val())
					{
						showOk($_cur_obj);
					}
					else
					{
						showError($_cur_obj);
						allCompiled = false;
					}
				}
				else
				{
					if(!$_cur_obj.hasClass('requested') && ($_cur_obj.val() == '') && $_mail_field.val() == '')
					{
						// retype mail not required and empty field (and mail field is empty)!
						removeIcon($_cur_obj);
					}
					else
					{
						// retype mail required or not empty field!
						showError($_cur_obj);
						allCompiled = false;
					}
				}
			}
			// password field
			if($_cur_obj.hasClass('pass_field'))
			{
				if($_cur_obj.val().length >= min_lenght_password)
				{
					showOk($_cur_obj);
					if($_have_re_pass_field && $_re_pass_field.val()!= '')
					{
						if($_cur_obj.val() == $_re_pass_field.val())
						{
							showOk($_re_pass_field);
						}
						else
						{
							showError($_re_pass_field);
							allCompiled = false;
						}
					}
				}
				else
				{
					if(!$_cur_obj.hasClass('requested') && ($_cur_obj.val() == ''))
					{
						// password not required and empty field!
						removeIcon($_cur_obj);
					}
					else
					{
						// password required or not empty field!
						showError($_cur_obj);
						allCompiled = false;
					}
					if($_have_re_pass_field && $_re_pass_field.val()!= '')
					{
						showError($_re_pass_field);
					}
				}
			}
			// retype password field
			if($_cur_obj.hasClass('re_pass_field'))
			{
				if($_cur_obj.val().length >= min_lenght_password)
				{
					if($_cur_obj.val() == $_pass_field.val())
					{
						showOk($_cur_obj);
					}
					else
					{
						showError($_cur_obj);
						allCompiled = false;
					}
				}
				else
				{
					if(!$_cur_obj.hasClass('requested') && ($_cur_obj.val() == '') && $_pass_field.val() == '')
					{
						// retype password not required and empty field (and password field is empty)!
						removeIcon($_cur_obj);
					}
					else
					{
						// retype password required or not empty field!
						showError($_cur_obj);
						allCompiled = false;
					}
				}
			}
			// number field
			if($_cur_obj.hasClass('number_field'))
			{
				if(isNumber($_cur_obj.val()) && ($_cur_obj.val() != ''))
				{
					showOk($_cur_obj);
				}
				else
				{
					if(!$_cur_obj.hasClass('requested') && ($_cur_obj.val() == ''))
					{
						// number field not required and empty field!
						removeIcon($_cur_obj);
					}
					else
					{
						// number field required or not empty field!
						showError($_cur_obj);
						allCompiled = false;
					}
				}
			}
			// partita iva
			if($_cur_obj.hasClass('pi_field'))
			{
				if(isPI($_cur_obj.val()))
				{
					showOk($_cur_obj);
					if($_cur_obj.hasClass('requested'))
					{
						$_cf_field.val($_cur_obj.val());
						showOk($_cf_field);
					}
				}
				else
				{
					if(!$_cur_obj.hasClass('requested') && ($_cur_obj.val() == ''))
					{
						// pi not required and empty field!
						removeIcon($_cur_obj);
					}
					else
					{
						// pi required or not empty field!
						showError($_cur_obj);
						allCompiled = false;
					}
				}
			}
			// codice fiscale
			if($_cur_obj.hasClass('cf_field'))
			{
				if(isCF($_cur_obj.val()) || isPI($_cur_obj.val()))
				{
					showOk($_cur_obj);
				}
				else
				{
					showError($_cur_obj);
					allCompiled = false;
				}
			}
		}
	}
	
	// check the obbligatory field when they lose the focus
	$('#page_form form').find('.requested, .agency_field, .text_field, mail_field, .re_mail_field, .pass_field, .re_pass_field, .number_field, .pi_field, .cf_field, .radio_field, .check_field, .select_field').live('blur', function()
	{
		var $_cur_obj = $(this);
		checkField($_cur_obj);
	});

	// return true only if all the request field are compiled
	$('.form_submit').click(function(evt) {
		var $_cur_obj = '';
		allCompiled = true;

		$('#page_form form').find('.requested, .agency_field, .text_field, mail_field, .re_mail_field, .pass_field, .re_pass_field, .number_field, .pi_field, .cf_field, .radio_field, .check_field, .select_field').each(function(i)
		{
			$_cur_obj = $(this);
			checkField($_cur_obj);
		});
		
		if(allCompiled)
		{
			//alert('Tutto OK, invio del form');
			return true;
		}
		else
		{
			//alert('form non completo');
			return false;
		}
	});

});

