/**
 * Classe Form per uramakisan
 *
 * Il nome dell'istanza della classe DEVE essere
 * uguale al nome del form
 * 
 */

var UForm = Class.create();

UForm.prototype = {
	
	
	/**
	 * Inizializza il form
	 *
	 */
	initialize: function (formname) {
	
		this.responses = $('responses');
		this.form = $(formname);
		this.form.notValidAction = null;
		this.form.beforeValidation = null;
		this.form.afterValidation = null;
		
		this.controlli = new Array();

		this.form.onsubmit = function () {
			
			if(this.beforeValidation != null) {
				var before_validation = eval(this.beforeValidation);
				if (!before_validation) {
					if(this.notValidAction != null) {
						eval(this.notValidAction);
					}
					return false;
				}
			}
			
			var valid = eval(this.name + '.validate()');
			if (valid) {
				if($('loading')) $('loading').style.visibility = 'visible';
				
				if(this.afterValidation != null) {
					var after_validation = eval(this.afterValidation);
					if(this.notValidAction != null) {
						eval(this.notValidAction);
					}
					return false;
					
				}
				
				return true;
			} else {
			
				if(this.notValidAction != null) {
					eval(this.notValidAction);
				}
				return false;
			}
		}
	},
	
	
	addControl: function (field, control, param) {
		if($(field)){
			this.controlli.push(Array(field, control, param));
		}
	},
	
	removeControl: function (field, control) {
		for(var i = 0; i < this.controlli.length; i++) {
			if (this.controlli[i][0] == field &&
					this.controlli[i][1] == control) {
					this.controlli.splice(i, 1);
					var elementClasses = new Element.ClassNames($(field));
					elementClasses.remove('fielderror');
			}
		}
	},
	
	validate: function () {
		var errors = 0;
		var fielderrors = new Array();
		for(var i = 0; i < this.controlli.length; i++) {
			var field = this.controlli[i][0];
			var func = this.controlli[i][1];
			var params = this.controlli[i][2];
			
			var retval = eval('this.control_' + func + '("' + field + '"," ' + params + '")');
			var elementClasses = new Element.ClassNames(field);
			
			if (! retval) {
				elementClasses.add('fielderror');
				fielderrors.push(field);
				errors++;
			} else {
				if(fielderrors.indexOf(field) == -1) {
					elementClasses.remove('fielderror');
				}
			}
		}
		return !(errors > 0);
	},
	
	displaymessage: function (message) {
		var msg_div = document.createElement('div');
		msg_div.innerHTML = message;
		this.responses.appendChild(msg_div);
	},
	
	emptymessage: function () {
		while(this.responses.hasChildNodes()) {
			this.responses.removeChild(this.responses.lastChild);
		}
	},
	
	setmessage: function(field, message) {
		if ($(field + '_error'))
		{
			$(field + '_error').innerHTML = message;
		}
	},
	
	/**
	 * Controls if field value is not null
	 */
	control_is_not_null: function (field) {
		var msg =  'campo richiesto';
		var isvalid = ($(field).value.length != 0);
		
		var err_msg = isvalid ? '' : msg;
		this.setmessage(field.replace(/\[(.*)\]/, ''), err_msg);
		return isvalid;
	},

	/**
	 * Controls if field value is a valid email
	 */
	control_is_email: function (field) {
		var msg =  'email non valida';
		var isvalid = /^[_a-z0-9-]+(\.[_a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$/.test($(field).value);
		
		var err_msg = isvalid ? '' : msg;
		this.setmessage(field, err_msg);
				
		return isvalid;
	},

	/**
	 * Controls if field is a number
	 */
	control_is_number: function (field) {
		var msg = 'numero non valido';
		var isvalid = /^[0-9,.]+$/.test($(field).value);
		
		var err_msg = isvalid ? '' : msg;
		this.setmessage(field, err_msg);
				
		return isvalid;
	},
	
	/**
	 * Controls if field is long enough
	 */
	control_is_long: function (field, minlength) {
		var msg = 'deve essere lungo almeno ' + minlength + ' caratteri';
		var isvalid = ($(field).value.length >= minlength);
		
		var err_msg = isvalid ? '' : msg;
		this.setmessage(field, err_msg);
				
		return isvalid;
	},
	
	/**
	 * Controls if passwords are the same
	 */
	control_passwords_are_identical: function (field) {
		var msg = 'le password non combaciano';
		var isvalid = $(field).value == $(field.replace('_2', '')).value;
		
		var err_msg = isvalid ? '' : msg;
		this.setmessage(field, err_msg);
				
		return isvalid;
	},
	
	control_is_valid_url: function (field) {
		var msg = 'non è un url valido';
		var isvalid = ($(field).value).match(/^(http|ftp|https)\:\/\/\w+([\.\-]\w+)*\.\w{2,4}(\:\d+)*([\/\.\-\?\&\%\#\=]\w+)*\/?$/i);
		
		var err_msg = isvalid ? '' : msg;
		this.setmessage(field, err_msg);
				
		return isvalid;
	},
	
	control_at_least_one_selected: function(field) {
		var msg = 'non è stato selezionato alcun item';
		var items = Form.getInputs(this.form, 'checkbox');
	  var totitems = 0;
	  for ( i = 0 ; i < items.length; i++) {
	  	var fieldrgxp = '^' + field + '(.*)';
	    if (items[i].name.match(fieldrgxp) && items[i].checked) {
	      totitems++;
	    }
	  }
	  
	  isvalid = (totitems > 0);
	  
		var err_msg = isvalid ? '' : msg;
		this.setmessage(field, err_msg);
		return isvalid;
	},
	
	control_ext_validation: function (field) {
		var msg = 'error';
		var isvalid = $(field+'_isvalid').value == 'true';
		var err_msg = isvalid ? '' : msg;
		this.setmessage(field, err_msg);
		return isvalid;
		
	},
  
  control_md5: function (field) {
    var msg = 'Testo inserito e immagine non corrispondono';
    var md5ed = hex_md5($(field).value);
    var isvalid = (md5ed == uword) ? true : false;
    var err_msg = isvalid ? '' : msg;
    this.setmessage(field, err_msg);
    return isvalid;
    
  }
}