/**
 * 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, display_messages) {
		
		this.responses = $('responses');
		this.form = $(formname);
		this.form.beforeValidation = null;
		this.form.notValidAction = null;
		
		if(display_messages == undefined) {
			this.display_messages = true;
		}
		
		this.display_messages = !(display_messages == false);
		
		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) {
				$('loading').style.visibility = 'visible';
				return true;
			} else {
				return false;
			}
		}
	},
	
	addControl: function (field, control, param) {
		this.controlli.push(Array(field, control, param));
	},
	
	validate: function () {

		if(!this.display_messages){
			$('form_error').innerHTML = '';
		}
		
		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');
				}
			}
		}
		if(errors > 0){
			if(!this.display_messages){
				$('form_error').innerHTML = 'I campi contrassegnati da * sono obbligatori.';
			} else {
				alert('controlla i campi contrassegnati da *');
			}
		}
		
		return !(errors > 0);
	},

	displayErrorMessage: function (field, isvalid, msg) {
		if(!isvalid && this.display_messages) {
			$(field + '_error').innerHTML = msg;
		}
	},
	
	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);
		}
	},
	
	/**
	 * Controls if field value is not null
	 */
	control_is_not_null: function (field) {
		var msg =  'campo richiesto';
		var isvalid = ($(field).value.length != 0);
		this.displayErrorMessage(field.replace(/\[(.*)\]/, ''), isvalid, msg);
		return isvalid;
	},
	
	/**
	 * Controls if field value is checked
	 */
	control_is_checked: function (field) {
		var msg =  'campo richiesto';
		var isvalid = ($(field).checked);
		this.displayErrorMessage(field.replace(/\[(.*)\]/, ''), isvalid, 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);
		
		this.displayErrorMessage(field, isvalid, 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);
		
		this.displayErrorMessage(field, isvalid, 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);
		
		this.displayErrorMessage(field, isvalid, 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 == $('user_cpassword').value;
		
		this.displayErrorMessage(field, isvalid, msg);
		
		$(field + '_error').innerHTML = isvalid ? '' : msg;
		
		return isvalid;
	},
	
	/**
	 * Controls if gender radio button is checked
	 */
	control_is_gender: function (field) {
		var msg = 'specificare il sesso';
		var isvalid = $(field + '_M').checked || $(field + '_F').checked;
		
		this.displayErrorMessage(field, isvalid, 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);
		
		this.displayErrorMessage(field, isvalid, 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);
	  
		this.displayErrorMessage(field, isvalid, msg);
	  return isvalid;
	},
	
	control_ext_validation: function (field) {
		var msg = 'error';
		var isvalid = $(field+'_isvalid').value == 'true';
		this.displayErrorMessage(field, isvalid, 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;
    this.displayErrorMessage(field, isvalid, msg);
    return isvalid;
    
  }
}