var validator = null ;

$.validator.addMethod("numberIT", 	function(value, element) {
	return this.optional(element) ||  /^-?(?:\d+|\d{1,3}(?:(\.|,)\d{0,40})+)(?:(\.|,)\d+)?$/.test(value)
}, "Deve essere un numero")  ;

jQuery.validator.addMethod("multirequired", function(value, element, params) {
	var check = false;
	fieldName = element.name.substr(8, element.name.length - 8);
	//alert(fieldName);
	//return;
	//"numrows_AppuntamentoScadenza_CalendarioPosizioni"
	//listindexrow_AppuntamentoScadenza_CalendarioPosizioni
	//alert('$("#listindexrow_" + fieldName).val(): ' + $("#listindexrow_" + fieldName).val());
	if($("#listindexrow_" + fieldName).val() != '')
	{
		aryIndex = $("#listindexrow_" + fieldName).val().split('$');
		//alert('aryIndex.length: '+ aryIndex.length);
		for(i=0; i<aryIndex.length -1 ; i++)
		{
			//alert("nome: " + fieldName + aryIndex[i]);
			//alert($("#" + fieldName + aryIndex[i]).val());
			if($("#" + fieldName + aryIndex[i]).val() != '')
				return true;
		}
		//alert(aryIndex.length);
		//index = '1';
		//alert($("#AppuntamentoScadenza_CalendarioPosizioni" + index).val());
	}
	//alert(typeof(params));
	//alert(params.lenght);
	//alert(params);
	return check;
}, " Il campo &egrave; obbligatorio");

jQuery.validator.addMethod("multialternate", function(value, element, params) {
	var check = false;
	fieldName = element.name.substr(8, element.name.length - 8);
	aryAlternate = params.split(';'); 
	fieldAlternate = element.name.replace(aryAlternate[0], aryAlternate[1]);
	fieldNameAlternate = fieldAlternate.substr(8, fieldAlternate.length - 8);
	//alert('multialternate inizio\nelement.name: ' + element.name + '\nfieldName: ' + fieldName + '\nfieldAlternate: ' + fieldAlternate  + '\nfieldNameAlternate: ' + fieldNameAlternate);
	
	
	//controllo se il campo alternativo e' gia' stato controllato ed e' compilato
	/*
	for (key in this.successList) {
		alert('this.successList[key].name: ' + this.successList[key].name);
		if (this.successList[key].name == fieldAlternate)
			return true;	// E' gia' valido il campo in alternativa, quindi e' valido anche questo
	}
	*/
	//attenzione il campo alternativo potrebbe non essere ancora stato controllato ma essere valido e quindi e' valido pure questo
	
	//controllo se il campo alternativo e' valido nel qual caso e' valido pure questo
	//alert($("#listindexrow_" + fieldNameAlternate).length);
	if($("#listindexrow_" + fieldNameAlternate).length>0)
	{
		if($("#listindexrow_" + fieldNameAlternate).val() != '')
		{
			aryIndex = $("#listindexrow_" + fieldNameAlternate).val().split('$');
			for(i=0; i<aryIndex.length -1 ; i++)
			{
				//alert('id nel campo alternativo: ' + $("#" + fieldNameAlternate + aryIndex[i]).val());
				if($("#" + fieldNameAlternate + aryIndex[i]).val() != '') {
					return true;
				}
			}
		}
	}
	//l'alternativo non e' valido controllo se e' valido questo campo
	if($("#listindexrow_" + fieldName).val() != '')
	{
		aryIndex = $("#listindexrow_" + fieldName).val().split('$');
		for(i=0; i<aryIndex.length -1 ; i++)
		{
			if($("#" + fieldName + aryIndex[i]).val() != '') {
				/*
				for (key in this.errorList) {
					if (this.errorList[key].element.name == fieldAlternate) {
						// Il campo in alternativa era invalido, lo metto valido
						delete this.errorList[key];
						delete this.errorMap[fieldAlternate];
					}
				}
				*/
				return true;
			}
		}
	}
	
	//alert('fieldName: ' + fieldName + ' - multialternate - check: ' + check);
	return check;
}, " Almeno uno di questi campi &egrave; obbligatorio");

jQuery.validator.addMethod("alternate", function(value, element, params) {
	fieldName = element.name;
	aryAlternate = params.split(';'); 
	fieldAlternate = element.name.replace(aryAlternate[0], aryAlternate[1]);
	if($("#" + fieldName).val() != '')	// Il campo e' valorizzato, quindi e' valido
		return true;
	if ($("#" + fieldAlternate).val() != '')
		return true;	// Era valido il campo in alternativa, quindi e' valido anche questo
	return false;
}, " Almeno uno di questi campi &egrave; obbligatorio");

//}, "La data di {0} deve essere maggiore o uguale della data di {1}");


jQuery.validator.addMethod("dateITmaxorequal", function( value, element, param ) {
	var check = true;
	//alert(typeof param);
	//alert(typeof(param));
	//alert(param.lenght);
	//alert(param);

	var adata = value.split('/');
	var gg = parseInt(adata[0],10);
	var mm = parseInt(adata[1],10);
	var aaaa = parseInt(adata[2],10);
	var valdata = new Date(aaaa,mm-1,gg);

	adata = param.split('/');
	gg = parseInt(adata[0],10);
	mm = parseInt(adata[1],10);
	aaaa = parseInt(adata[2],10);
	var paramdata = new Date(aaaa,mm-1,gg);
	
	if(valdata - paramdata < 0)
		check = false;
		
	//alert(valdata);
	//alert(paramdata);
	
	return this.optional(element) || check;
	//return check;
}, "Inserire una data maggiore o uguale a {0}");

jQuery.validator.addMethod("datehourseparatefieldITmax", function( value, element, param ) {
	var check = true;
	//alert(typeof param);
	//alert(typeof(param));
	//alert(param.lenght);
	//alert(param[0]);
	//alert(param[1]);
	//alert(param[2]);
	//elems = this.elements();
	//alert(elems.length);
	
	if(!this.optional(element))
	{
		datamax = $('#' + param[0]).val();
		datamin = $('#' + param[1]).val();
		oramin = $('#' + param[2]).val();
		if(datamax!='' && datamin!='' && oramin!='')
		{
			var adata = datamax.split('/');
			var aora = value.split(':');
			var gg = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			var aaaa = parseInt(adata[2],10);
			var oo = parseInt(aora[0],10);
			var min = parseInt(aora[1],10);
		
			var datamax = new Date(aaaa,mm-1,gg, oo, min, 0);
			//alert('datamax: ' + datamax);
		
			adata = datamin.split('/');
			aora = oramin.split(':');
			gg = parseInt(adata[0],10);
			mm = parseInt(adata[1],10);
			aaaa = parseInt(adata[2],10);
			oo = parseInt(aora[0],10);
			min = parseInt(aora[1],10);
			
			var datamin = new Date(aaaa,mm-1,gg, oo, min, 0);
			//alert('datamin: ' + datamin + '\n' + 'datamax: ' + datamax);
			
			if(datamax - datamin <= 0)
				return false;
		}	
	}
	return true;
});

$.extend($.validator, {

	messages: {
		required: " Il campo &egrave; obbligatorio",
		remote: " Please fix this field.",
		email: "Inserire un indirizzo di email valido.",
		url: "Please enter a valid URL.",
		date: "Please enter a valid date.",
		dateISO: "Please enter a valid date (ISO).",
		dateDE: "Bitte geben Sie ein gültiges Datum ein.",
		number: "Please enter a valid number.",
		numberDE: "Bitte geben Sie eine Nummer ein.",
		numberIT: "Inserire un numero.",
		digits: "Please enter only digits",
		creditcard: "Please enter a valid credit card.",
		equalTo: "Please enter the same value again.",
		accept: "Please enter a value with a valid extension.",
		maxlength: $.format("Please enter no more than {0} characters."),
		minlength: $.format("Please enter at least {0} characters."),
		rangelength: $.format("Please enter a value between {0} and {1} characters long."),
		range: $.format("Please enter a value between {0} and {1}."),
		max: $.format("Please enter a value less than or equal to {0}."),
		min: $.format("Please enter a value greater than or equal to {0}."),
		multirequired: " Il campo &egrave; obbligatorio",
		dateITmaxorequal: $.format("Inserire una data maggiore o uguale a {0}"),
		multialternate: " Almeno uno di questi campi &egrave; obbligatorio",
		alternate: " Almeno uno di questi campi &egrave; obbligatorio"
	}
}) ;

$(document).ready(function(){
	validator = $(".validate_frm").validate({
		focusInvalid: false,
		focusCleanup: false,
		onkeyup: false,
		debug:false
	});

	$(".validate_frm").bind("invalid-form.validate", function(e, validator) {
		//alert('validazione conclusa');
		var errors = validator.numberOfInvalids();
		if (errors) {
		
			/*
			for ( var i = 0; validator.errorList[i]; i++ ) {
				var error = validator.errorList[i];
				alert( error.element.name + '; ' + error.message + '; ' + error.rulemethod );
			}
			*/
					
			var msgReq = '';
			var message = '';
			for ( var i = 0; validator.errorList[i]; i++ ) {
				var error = validator.errorList[i];
				labName = error.element.name;
				if(labName.substr(labName.length - 2, 2)=='[]')
					labName = labName.substr(0, labName.length - 2);
				labName = '_label_' + labName;
				if(error.rulemethod == 'required' || error.rulemethod == 'multirequired' || error.rulemethod == 'multialternate' || error.rulemethod == 'alternate')
					msgReq += "<li>" + $("#"+ labName).attr("value") + "</li>";
			}
			if(msgReq != '')
			{
				message = "I seguenti campi sono obbligatori:<ul>" + msgReq + '</ul>';;
			}		
			
			for ( var i = 0; validator.errorList[i]; i++ ) {
				var error = validator.errorList[i];
				//alert( error.element.name + '; ' + error.message + '; ' + error.rulemethod );
				if(error.rulemethod != 'required' && error.rulemethod != 'multirequired' && error.rulemethod != 'multialternate' && error.rulemethod != 'alternate')
					message += error.message + '<br/>';
			}
						
			/*
			for(key in validator.invalid) {
				//alert('key: ' + key);
				if(key.match(/\[\]$/)) {
					key = key.substr(0,key.length-2);
				}
				//alert($("#" + key).rules())
				message += "<li>" + $("#_label_"+ key).attr("value") + "</li>";
			}
			*/
			//alert('asd');
			$("div.error").html(message);
			$("div.error").show();
			$("#loading").hide();
		} else {
			//alert('nessun errore di validazione');
			$("div.error").hide();
		}

	}) ;
});

