// +----------------------------------------------------------------------+
// | Copyright (c) 2004 Piero Bellomo                                     |
// +----------------------------------------------------------------------+
// | Licence: LPLG <>																											|
// +----------------------------------------------------------------------+
// | Author: Piero Bellomo <piero.bellomo@fastwebnet.it>                  |
// +----------------------------------------------------------------------+
var error = new Array
var re = "gi"

// auxillary functions
function ltrim(s){
	return (s.length == 0) ? s : s.replace(new RegExp("^\\s+", re), '');
}
function rtrim(s){
	return (s.length == 0) ? s : s.replace(new RegExp("\\s+$", re), '');
}
function trim(s){	return rtrim(ltrim(s));}

function isPosInt(s){
	str = s.toString()
	for(i=0; i<str.length; i++) if(str.charAt(i)<"0" || str.charAt(i)>"9") return false;
	return true;
}
function is_value(val, label, args)	{
	val = get_value(args.f_name, args.e_name)
	if(val == args.val) ret_val = '';
	else ret_val = "val = "+val;
	return ret_val
}
function has_value(val, label, args)	{
	val = get_value(args.f_name, args.e_name)
	if(val.indexOf(args.val) > -1) ret_val = '';
	else ret_val = "val = "+val;
	return ret_val
}
function is_gte(val, label, args)	{
	val = get_value(args.f_name, args.e_name)
	cmp = get_value(args.f_name, args.c_name)
	if(val > cmp) ret_val = '';
	else ret_val = "val = "+cmp;
	return ret_val
}

//validation

/*----------------------------------------------------
//	 CHECK MANDATORY
//		not_null
//		not_null_radio str[name] = document.forms['form_name'].field_name
//----------------------------------------------------
*/
function not_null(val, label)	{
	return (trim(val).length == 0)?  "Il Campo \""+label+"\" è obbligatorio" : '';
}
function not_null_radio(val, label, args) {
	for(i=0; i<args.name.length; i++)	if(args.name[i].checked) return '';
	return "Il Campo \""+label+"\" è obbligatorio"
}
function not_null_file(val, label) 	{return '';}
/*----------------------------------------------------
//CHECK LENGTH
//	strict_len 	= string must be exact length
//  max_len 		= max. allowed length
//	min_len 		= min. allowed length
//----------------------------------------------------
*/
function strict_len(val, label, args)	{
	return (trim(val).length != args.strict)?  "Il campo \""+label+"\" è di "+args.strict+" caratteri" : '';
}
function max_len(val, label, args)	{
	return (trim(val).length > args.max)? "Il campo \""+label+"\" accetta un massimo di "+args.max+" caratteri" : '';
}
function min_len(val, label, args)	{
	return (trim(val).length < args.min)? "Il campo \""+label+"\" è di almeno "+args.min+" caratteri" : '';
}
/*
----------------------------------------------------
TYPO
	alpha			bool[allow_whitespace]
	alphanum	bool[allow_whitespace]
	integer		bool[allow_whitespace]
	
	email
	
	DEBUG: must include facility to add custom valid characters to these functions; must add a floating point number detector (1.000.000,00 or 1,000,000.00?)		
----------------------------------------------------
*/

function alpha(val, label, args)	{
	exp = args.allow_whitespace? "[^A-Z a-z]+" : "[^A-Za-z]+"
	msg = args.allow_whitespace? "" : " (Gli spazi non sono ammessi)	"
	return(trim(val).match(new RegExp(exp, re)) != null)? "Il campo \""+label+"\" accetta solo caratteri alfabetici"+msg : '';
}
function alphanum(val, label, args)	{
	exp = args.allow_whitespace? "[^A-Za-z 0-9 ]+" : "[^A-Za-z0-9]+"
	msg = args.allow_whitespace? "" : " (Gli spazi non sono ammessi)	"
	return(trim(val).match(new RegExp(exp, re)) != null)? "Il campo \""+label+"\" accetta solo caratteri alfanumerici"+msg : '';
}
function integer(val, label, args)	{
	exp = args.allow_whitespace? "[^0-9 ]+" : "[^0-9]+"
	msg = args.allow_whitespace? "" : " (Gli spazi non sono ammessi)	"
	return(trim(val).match(new RegExp(exp, re)) != null)? "Il campo \""+label+"\" accetta solo caratteri numerici"+msg : '';
}
function decimal(val, label, args)	{
	exp = args.allow_whitespace? "[^0-9. ]+" : "[^0-9.]+"
	msg = args.allow_whitespace? "" : " (Gli spazi non sono ammessi)	"
	return(trim(val).match(new RegExp(exp, re)) != null)? "Il campo \""+label+"\" accetta solo caratteri numerici"+msg : '';
}

function email(val, label, args)	{
	exp = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;
	return(trim(val).match(new RegExp(exp)) == null)? "Inserire un indirizzo valido nel campo \""+label+"\"" : ''; 
}
function emailset(val, label, args)	{
	exp = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;
	var eset = val.split(";");
	var ewrn = new Array();
	for(i = 0; i < eset.length; i++)	{
		if(trim(eset[i]).match(new RegExp(exp)) == null) ewrn[ewrn.length] = eset[i]
	}
	if(ewrn.length) {
		if(ewrn.length > 1)	{
			errstr = ewrn.join(", ")+" non sono indirizzi validi";
		} else errstr = ewrn[0]+" non è un indirizzi valido";
		errstr = "Campo \""+label+"\": ".errstr
		return errstr
	} else return ''; 
}
/*
----------------------------------------------------
DATE/TIME
	[date: YYYY-MM-GG (MySQL)]
		date_before			[before, strict] (before can also be 'now')
		date_after			[after, strict]  (after can also be 'now')
	[time: HH:MM (MySQL)]
		time_before			[before]
		time_after			[after]
----------------------------------------------------
*/
function date_before(uval, label, args)	{
	wdays = new Array("Domenica","Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato");
	months = new Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre");
	if(args.before.toLowerCase() == 'now'){
		 cmp = new Array(new Date().getFullYear(), new Date().getMonth()+1, new Date().getDate())
		 cmp[1] = cmp[1].length=1? '0'+cmp[1] : cmp[1]
	} else cmp = args.before.split('-')
	if(cmp[0].toString().length!=4 || !isPosInt(cmp[0]) || //check input format
		 cmp[1].toString().length!=2 || !isPosInt(cmp[1]) || Number(cmp[1])>12 || Number(cmp[1])<1 ||
		 cmp[2].toString().length!=2 || !isPosInt(cmp[2]) || Number(cmp[2])>31 || Number(cmp[2])<1
		 ) return "Il valore di confronto '"+args.before+"' per il campo \""+label+"\" non è una data valida: specificare una data in formato AAAA-MM-GG (e.g. 2001-07-31)";
	val = uval.split('-')
	if(val[0].toString().length!=4 || !isPosInt(val[0]) || //check input format
		 val[1].toString().length!=2 || !isPosInt(val[1]) || Number(val[1])>12 || Number(val[1])<1 ||
		 val[2].toString().length!=2 || !isPosInt(val[2]) || Number(val[2])>31 || Number(val[2])<1
		 ) return "'"+uval+"' non è una data valida per il campo \""+label+"\": specificare una data in formato AAAA-MM-GG (e.g. 2001-07-31)";
	if( (val.join('') < cmp.join('')) || ( (val.join('') == cmp.join('')) && !args.strict) ) return '';
	msg = args.strict? "escluso" : "";
	if(args.before.toLowerCase() == 'now') limit = "oggi"
	else	{ 
		tmp = new Date;	tmp.setYear(cmp[0]); tmp.setMonth(cmp[1]-1); tmp.setDate(cmp[2])
		limit = wdays[tmp.getDay()]+' '+cmp[2]+' '+months[cmp[1]-1]+' '+cmp[0]
	}
	return "Il campo \""+label+"\" accetta solo una data antecedente "+limit+" "+msg+""
}
function date_after(uval, label, args)	{
	wdays = new Array("Domenica","Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato");
	months = new Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre");
	if(args.after.toLowerCase() == 'now'){
		 cmp = new Array(new Date().getFullYear(), new Date().getMonth()+1, new Date().getDate())
		 cmp[1] = cmp[1].length=1? '0'+cmp[1] : cmp[1]
	} else cmp = args.after.split('-')
	if(cmp[0].toString().length!=4 || !isPosInt(cmp[0]) || //check input format
		 cmp[1].toString().length!=2 || !isPosInt(cmp[1]) || Number(cmp[1])>12 || Number(cmp[1])<1 ||
		 cmp[2].toString().length!=2 || !isPosInt(cmp[2]) || Number(cmp[2])>31 || Number(cmp[2])<1
		 ) return "Il valore di confronto '"+args.after+"' per il campo \""+label+"\" non è una data valida: specificare una data in formato AAAA-MM-GG (e.g. 2001-07-31)";
	val = uval.split('-')
	if(val[0].toString().length!=4 || !isPosInt(val[0]) || //check input format
		 val[1].toString().length!=2 || !isPosInt(val[1]) || Number(val[1])>12 || Number(val[1])<1 ||
		 val[2].toString().length!=2 || !isPosInt(val[2]) || Number(val[2])>31 || Number(val[2])<1
		 ) return "'"+uval+"' non è una data valida per il campo \""+label+"\": specificare una data in formato AAAA-MM-GG (e.g. 2001-07-31)";
	if( (val.join('') > cmp.join('')) || ( (val.join('') == cmp.join('')) && !args.strict) ) return '';
	msg = args.strict? "escluso" : "";
	if(args.after.toLowerCase() == 'now') limit = "oggi"
	else	{ 
		tmp = new Date;	tmp.setYear(cmp[0]); tmp.setMonth(cmp[1]-1); tmp.setDate(cmp[2])
		limit = wdays[tmp.getDay()]+' '+cmp[2]+' '+months[cmp[1]-1]+' '+cmp[0]
	}
	return "Il campo \""+label+"\" accetta solo una data posteriore a "+limit+" "+msg+""
}
function time_before(uval, label, args)	{
	cmp = args.before.split(':')
	if(cmp[0].toString().length!=2 || !isPosInt(cmp[0]) || Number(cmp[0])>23 || Number(cmp[0])<1 ||
		 cmp[1].toString().length!=2 || !isPosInt(cmp[1]) || Number(cmp[1])>59 || Number(cmp[1])<0
		 ) return "Il valore di confronto '"+args.before+"' per il campo \""+label+"\" non è un orario valido: specificare un orario in formato HH:MM (e.g. 23:02)"
	val = uval.split(':')
	if(val[0].toString().length!=2 || !isPosInt(val[0]) || Number(val[0])>23 || Number(val[0])<1 ||
		 val[1].toString().length!=2 || !isPosInt(val[1]) || Number(val[1])>59 || Number(val[1])<0
		 ) return "'"+uval+"' non è un orario valido per il campo \""+label+"\": specificare un orario in formato HH:MM (e.g. 23:02)";
	return (cmp.join('') < val.join(''))? "Il campo \""+label+"\" accetta solo un'orario antecedente le "+cmp[0]+":"+cmp[1] : '';
}
function time_after(uval, label, args)	{
	cmp = args.after.split(':')
	if(cmp[0].toString().length!=2 || !isPosInt(cmp[0]) || Number(cmp[0])>23 || Number(cmp[0])<1 ||
		 cmp[1].toString().length!=2 || !isPosInt(cmp[1]) || Number(cmp[1])>59 || Number(cmp[1])<0
		 ) return "Il valore di confronto '"+args.after+"' per il campo \""+label+"\" non è un orario valido: specificare un orario in formato HH:MM (e.g. 23:02)"
	val = uval.split(':')
	alert(cmp.join(''))
	if(val[0].toString().length!=2 || !isPosInt(val[0]) || Number(val[0])>23 || Number(val[0])<1 ||
		 val[1].toString().length!=2 || !isPosInt(val[1]) || Number(val[1])>59 || Number(val[1])<0
		 ) return "'"+uval+"' non è un orario valido per il campo \""+label+"\": specificare un orario in formato HH:MM (e.g. 23:02)";
	return (cmp.join('') > val.join(''))? "Il campo \""+label+"\" accetta solo un'orario posteriore le "+cmp[0]+":"+cmp[1] : '';
}
/*
----------------------------------------------------
FILE VALIDATION
		file_ok				
		file_mime			[array(mime 1, ..., mime n)]
		file_ext			[array(ext 1, ..., ext n)]
		file_size			[max]
----------------------------------------------------
*/
function file_ok($val, $label)		{return ''}
function file_mime($val, $label)	{return ''}
function file_ext($val, $label)	{return ''}
function file_size($val, $label)	{return ''}
function file_img_chan($val, $label)	{return ''}
