
$.en.Validator =
{
	specialEval: function(data){
		 // Try to use the native JSON parser first
		return window.JSON && window.JSON.parse ?
				window.JSON.parse( data ) :
				(new Function("return " + data))();
	},
	methods: {

		// http://docs.jquery.com/Plugins/Validation/Methods/required
		required: function(value, element) {
			switch( element.nodeName.toLowerCase() ) {
			case 'select':
				// could be an array for select-multiple or a string, both are fine this way
				var val = $(element).val();
				return val && val.length > 0;
			case 'input':
				if ( $(element).attr('type')=='text' )
					return $.trim(value).length > 0;
				else
					return true;
			default:
				return $.trim(value).length > 0;
			}
		},


		// http://docs.jquery.com/Plugins/Validation/Methods/minlength
		minlength: function(value, element, param) {
			return $.trim($(element).val()).length >= param;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
		maxlength: function(value, element, param) {
			return $.trim($(element).val()).length <= param;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/min
		min: function( value, element, param ) {
			return parseFloat(value) >= parseFloat(param);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/max
		max: function( value, element, param ) {
			return parseFloat(value) <= parseFloat(param);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/email
		email: function(value, element) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
			return false || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/url
		url: function(value, element) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
			return false || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/date
		date: function(value, element) {
			return false || !/Invalid|NaN/.test(new Date(value));
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/dateISO
		dateISO: function(value, element) {
			return false || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/number
		number: function(value, element) {
			return false || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/digits
		digits: function(value, element) {
			return false || /^\d+$/.test(value);
		},

		nodigits: function(value,element){
			return /\d/.test(value) == false;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
		// based on http://en.wikipedia.org/wiki/Luhn
		creditcard: function(value, element) {

			// accept only digits and dashes
			if (/[^0-9-]+/.test(value))
				return false;
			var nCheck = 0,
				nDigit = 0,
				bEven = false;

			value = value.replace(/\D/g, "");

			for (var n = value.length - 1; n >= 0; n--) {
				var cDigit = value.charAt(n);
				var nDigit = parseInt(cDigit, 10);
				if (bEven) {
					if ((nDigit *= 2) > 9)
						nDigit -= 9;
				}
				nCheck += nDigit;
				bEven = !bEven;
			}

			return (nCheck % 10) == 0;
		}
	},
	validate: function(elm,validation)
	{
		var elm$ = $(elm);
		elm = elm$[0];
		var val = elm$.val();
		var vuoto = val=='';
		val = $.trim(val);
		elm$.val(val);

		var r = true;
		if(typeof(validation)!='object')
			return true;

		for(var i=0;i<validation.length;i++){
			switch(validation[i].type)
			{
				case 'required':
					r = r && $.en.Validator.methods.required(val,elm);
					break;
				case 'minlength':
					r = r && ($.en.Validator.methods.minlength(val,elm,validation[i].opt) || vuoto);
					break;
				case 'email':
					r = r && ($.en.Validator.methods.email(val,elm) || vuoto);
					break;
				case 'digits':
					r = r && ($.en.Validator.methods.digits(val,elm) || vuoto);
					break;
				case 'number':
					val = val.replace(',','.');
					r = r && ($.en.Validator.methods.number(val,elm) || vuoto);
					break;
				case 'min':
					r = r && ($.en.Validator.methods.min(val,elm,validation[i].opt) || vuoto);
					break;
                case 'capitalize':
                    elm$.val(val.capitalize());
                    break;
				case 'nodigits':
					r = r && ($.en.Validator.methods.nodigits(val,elm,validation[i].opt) || vuoto);
					break;
			}
		}
		return r;
	},
	validateElem: function(elm){
		var elm$ = $(elm);
		elm = elm$[0];
		var r = $.en.Validator.validate(elm,elm.validation);
		if(!r)
		{
			$.en.Validator._showTip(elm);
		}
		else
		{
			elm$.removeClass('ui-state-error');
			$.en.Validator._hideTip(elm);
		}
		return r;
	},
	helptext: function(validation)
	{
		s = '<ul class="ui-corner-all ui-state-error">';
		for(var i=0;i<validation.length;i++){
			switch(validation[i].type)
			{
				case 'required':
					s+='<li>Il campo &egrave; obbligatorio';
					break;
				case 'minlength':
					s+='<li>Il campo deve contenere almeno '+validation[i].opt+' caratteri';
					break;
				case 'email':
					s+='<li>Il campo deve contenere un\'email valida';
					break;
				case 'digits':
					s+='<li>Il campo pu&ograve; contenere solo cifre';
					break;
				case 'number':
					s+='<li>Il campo deve contenere un valore numerico nel formato: 10234,24';
					break;
				case 'min':
					s+='<li>Il campo deve contenere un numero superiore a '+validation[i].opt+'';
					break;
				case 'nodigits':
					s+='<li>Il campo NON pu&ograve; contenere cifre';
					break;
				default:
					continue;
					break;
			}
			s+='</li>';
		}
		s+='</ul>';
		return s;
	},
	_showTip: function(elm)
	{
		setTimeout(function(){$.en.Validator.showTip(elm);},10);
	},
	_hideTip: function(elm)
	{
		setTimeout(function(){$.en.Validator.hideTip(elm);},10);
	},
	showTip: function (elm)
	{
		var form = elm.parentform;

		if(form.tip_active)
			return;

		var elm$ = $(elm);
		var tip$ = $(form)[0].tip;
		var elmpos = elm$.offset();

		form.tip_active = true;
		form.tip_cur=elm.indexform;

		tip$.hide();
		tip$.html(elm.tiptext);

		elm$.addClass('ui-state-error');

		tip$.css('left',(elmpos.left+elm$.width()+5)+'px');
		tip$.css('top',(elmpos.top+elm$.height()/2-tip$.height()/2)+'px');

		tip$.show(150);
	},
	hideTip: function(elm)
	{
		var form = elm.parentform;
		if(typeof(form)=='undefined')
			return;
		if(typeof(form.tip_active)=='undefined')
			return;
		if(!form.tip_active)
			return;
		if(form.tip_cur!=elm.indexform)
			return;
		$(form.tip).hide(150);
		form.tip_active = false;
	},
	initValidationForm: function(form)
	{
		var formelm = $(form)[0];
		if(formelm.validation_initialized)
			return;
		formelm.validation_initialized = true;

		formelm.tip = $('<div>').addClass('enfh_tooltip').hide().appendTo(formelm);
		formelm.tip_cur = 99999;
		formelm.tip_active = false;

		var forminputs = $('[name]',formelm);
		var elm,elm$;
		var formindex = 1;
		forminputs.each(function()
		{
			elm$ = $(this);

			if(elm$.tagName()=='div')
				return;
			elm = elm$[0];

			if(typeof(elm$.attr('validation'))!='undefined' && elm$.attr('validation')!='')
			{
				$.extend(elm,{'validation':$.en.Validator.specialEval(elm$.attr('validation'))});
				elm$.blur(function(){$.en.Validator.validateElem(this);});
				elm$.focus(function(){$(this).removeClass('ui-state-error');$.en.Validator.hideTip(this); });
				elm.tiptext = $.en.Validator.helptext(elm.validation);
				elm.parentform = formelm;
				elm.indexform = formindex;
				++formindex;
			}
			if(typeof(elm$.attr('visibleif'))!='undefined' && elm$.attr('visibleif')!='')
			{
				var thiselm = elm;
				$.extend(elm,{'visibleif':$.en.Validator.specialEval(elm$.attr('visibleif'))});
				$('[name='+elm.visibleif.field+']',$(form)).change(function(){ if($.en.Validator.validate(this,thiselm.visibleif.validators)) $(thiselm).parent().parent().show(); else $(thiselm).parent().parent().hide(); }).change();
			}
		});
		var hashelp = $('.enfh_needhelp',$(form));
		hashelp.each(
			function()
			{
				$(this).click(function(){$(this).parent().parent().next('tr').toggle();});
			}
		);

		$(form).submit(function(e){ if(!$.en.Validator.validateForm(form)) {e.preventDefault();e.stopPropagation();} });
	},
	validateForm: function (form)
	{
		var forminputs = $('input[name],textarea[name]',$(form));

		$('textarea.enfh_htmleditor',form).each(function(i,o){
			if(o.nicEditorInstance)
				o.nicEditorInstance.nicInstances[0].saveContent();
		});

		for(var i=0;i<forminputs.length;i++)
		{
			if(!$.en.Validator.validateElem(forminputs[i])) return false;
		}

		return true;
	}
}
$.en.FormHelper =
{
	/**
	 *
	 *	f = id or form element
	 */
	initForm: function(f,w,h,submitName,cancelName,onBeforeSubmit,onSuccess,dialogTitle){

		var d = $('<div>').css('display','block').hide().width('100%').appendTo($('body'));
		$(f).appendTo(d);

		//nicedit
		$('textarea.enfh_htmleditor',f).each(function(i,o){
				$(o).width(w-25);

				$(o)[0].nicEditorInstance = new nicEditor({
					fullPanel: true,
					maxHeight: 5000,
					iconsPath: 'js/nicEditorIcons.gif'
				}).panelInstance(o);
				/*$(o).css('width','100%').ckeditor({
						height:270,
						width: (w-20),
						resize_enabled:false,
						toolbar:
						[
							['Undo','Redo','-','Cut','Copy','Paste','PasteFromWord','-','Bold','Italic','Underline','TextColor','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','Source']
						]
					});*/

			});
		//submit
		$(f).submit(function(e){
			e.preventDefault();
			if( typeof(onBeforeSubmit)=='function' )
			{
				if(onBeforeSubmit(f)===false)
					return;
			}
			$('textarea.enfh_htmleditor',f).each(function(i,o){
				if(o.nicEditorInstance){
					var s = o.nicEditorInstance.nicInstances[0].getContent();
					$(o).val(s);
					//o.nicEditorInstance.nicInstances[0].saveContent();
				}
			});

			/************VALIDATION****************/
			if(!$.en.Validator.validateForm(f))
				return;

			var m = $('input[name=m]',f).val();
			var op = $('input[name=op]',f).val();
			var forminputs = $(f).serializeArray();
			var params = {};
			for(var i=0;i<forminputs.length;i++)
			{
				if(forminputs[i].name=='m' || forminputs[i].name=='op')
					continue;
				params[forminputs[i].name] = forminputs[i].value;
			}
			//now collecting
			$.en.request(m,op,params,onSuccess,'json');
			$(d).dialog('close');
		});

		//dialog buttons
		var b = {};
		if(submitName!='')
			b[submitName] = function(){$(f).submit();};
		b[cancelName] = function(){$(d).dialog('close');};
		d.dialog({
			'autoOpen': false,
			'modal': true,
			'resizable': true,
			'width': w,
			'height':h,
			'title':dialogTitle,
			'buttons': b,
			'close': function () {
			}
		});
	},
	showForm: function (f)
	{
		$(f).parent().dialog('open');
	},
	loadIntoForm: function ( f , data )
	{
		for(var n in data)
		{
			var elm = $('[name='+n+']',f);

			if(elm.length < 1)
				continue;

			if(elm.tagName()=='textarea' && elm[0].nicEditorInstance){
				elm.html(data[n]);
				elm[0].nicEditorInstance.nicInstances[0].setContent(data[n]);
			}else {
				if(elm.tagName()=='div')
					elm.html(data[n]);
				else
					elm.val(data[n]);
			}
		}
	}

};

