/*
*  The Validator
*   The class that handles all validation related issues
*
*   pass the name of the form while constructing.
*   methods:
*    addValidation(input_item_name, validation_descriptor, error_string)
*       call this method for each input item. Single input item can have
*       many validations
*
*    addCustomValidation(function_name)
*       call this function to set a custom validat function, which will
*       be called after other validations are over.
*	The function should return 'true' or 'false'
*/


function Validator(frmname)
{
  this.formobj=document.forms[frmname];
	if(!this.formobj)	{
	  alert("BUG: could not get Form object " + frmname);
		return;
	}
	if(this.formobj.onsubmit)	{
	 this.formobj.old_onsubmit = this.formobj.onsubmit;
	 this.formobj.onsubmit=null;
	}
	else {
	 this.formobj.old_onsubmit = null;
	}
	this.formobj.onsubmit=form_submit_handler;
	this.addValidation = add_validation;
	this.addCustomValidation=set_addnl_vfunction;
	this.clearAllValidations = clear_all_validations;
}

function set_addnl_vfunction(functionname) {
  this.formobj.addnlvalidation = functionname;
}

function clear_all_validations() {
	for(var itr=0;itr < this.formobj.elements.length;itr++)	{
		this.formobj.elements[itr].validationset = null;
	}
}

// Chiama tutte le funzioni di validazione associate al campo
function form_submit_handler() {
	for(var itr=0;itr < this.elements.length;itr++)	{
		if(this.elements[itr].validationset &&
	    !this.elements[itr].validationset.validate()) {
		  return false;
		}
	}
	if(this.addnlvalidation) {
	  str = " var ret = " + this.addnlvalidation + "()";
	  eval(str);
    if(!ret) return ret;
	}
	return true;
}

function add_validation(itemname, command, commandValue, errstr) {
  if(!this.formobj)	{
	  alert("BUG: the form object is not set properly");
		return;
	}
  var itemobj = this.formobj[itemname];
  if(!itemobj) {
	  alert("BUG: Could not get the input object named: " + itemname);
	  return;
	}
	if(!itemobj.validationset) {
    itemobj.validationset = new ValidationSet(itemobj);
	}
  itemobj.validationset.add(command, commandValue, errstr);
}

function ValidationDesc(inputitem, command, commandValue, error) {
  this.cmd=command;
  this.cmdValue=commandValue;
  this.error=error;
  this.itemobj = inputitem;
  this.validate=vdesc_validate;
}

function vdesc_validate() {
  if(!validateData(this.cmd, this.cmdValue, this.itemobj, this.error)) {
    this.itemobj.focus();
    return false;
  }
  return true;
}

function ValidationSet(inputitem) {
  this.vSet=new Array();
  this.add= add_validationdesc;
  this.validate= vset_validate;
  this.itemobj = inputitem;
}

function add_validationdesc(command, commandValue, error) {
  this.vSet[this.vSet.length]=
	  new ValidationDesc(this.itemobj, command, commandValue, error);
}

function vset_validate() {
  for(var itr=0;itr<this.vSet.length;itr++) {
    if(!this.vSet[itr].validate()) {
      return false;
		}
	}
	return true;
}


//*********************************************************************************
//                   V A L I D A T I O N   R O U T I N E S
//*********************************************************************************

// Very simple email validation checking.
function validateEmail(email) {
  var splitted = email.match("^(.+)@(.+)$");
  if(splitted == null) return false;
  if(splitted[1] != null ) {
    var regexp_user=/^\"?[\w-_\.]*\"?$/;
    if(splitted[1].match(regexp_user) == null) return false;
  }
  if(splitted[2] != null) {
    var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
    if(splitted[2].match(regexp_domain) == null) {
	    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    if(splitted[2].match(regexp_ip) == null) return false;
    }
    return true;
  }
  return false;
}

// function validateData, Checks each field in a form.
function validateData(command, cmdvalue, objValue, strError) {
  switch(command) {

    case "required": {
      if(eval(objValue.value.length) == 0) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + " : Required Field";
        }
        alert(strError);
        return false;
      }
      break;
    }

    case "maxlength": {
      if(eval(objValue.value.length) >  eval(cmdvalue)) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + " : " + cmdvalue + " characters maximum ";
        }
        alert(strError + "\n[Current length = " + objValue.value.length + " ]");
        return false;
      }
      break;
    }

    case "minlength": {
      if(eval(objValue.value.length) <  eval(cmdvalue)) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + " : " + cmdvalue + " characters minimum  ";
        }
        alert(strError + "\n[Current length = " + objValue.value.length + " ]");
        return false;
      }
      break;
    }

    case "alphanumeric": {
      var charpos = objValue.value.search("[^A-Za-z0-9]");
      if(objValue.value.length > 0 &&  charpos >= 0) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + ": Only alpha-numeric characters allowed ";
        }
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
        return false;
      }
      break;
    }

    case "numeric": {
      var charpos = objValue.value.search("[^0-9]");
      if(objValue.value.length > 0 &&  charpos >= 0) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + ": Only digits allowed ";
        }
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
        return false;
      }
      break;
    }

    case "alphabetic": {
      var charpos = objValue.value.search("[^A-Za-z]");
      if(objValue.value.length > 0 &&  charpos >= 0) {
        if(!strError || strError.length == 0) {
          strError = objValue.name + ": Only alphabetic characters allowed ";
        }
        alert(strError + "\n [Error character position " + eval(charpos + 1) + "]");
        return false;
      }
      break;
    }

    case "alphanumhyphen": {
      var charpos = objValue.value.search("[^A-Za-z0-9\-_]");
      if(objValue.value.length > 0 &&  charpos >= 0) {
        if(!strError || strError.length == 0) {
          strError = objValue.name + ": characters allowed are A-Z,a-z,0-9,- and _";
        }
        alert(strError + "\n [Error character position " + eval(charpos + 1) + "]");
        return false;
      }
			break;
		}

    case "email": {
      if(!validateEmail(objValue.value)) {
        if(!strError || strError.length == 0) {
          strError = objValue.name + ": Enter a valid Email address ";
        }
        alert(strError);
        return false;
      }
      break;
    }

    case "date_it": {
      var charpos = objValue.value.search("\d{2}\-\d{2}\-\d{4}");
      if(objValue.value.length > 0 &&  charpos >= 0) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + ": dd-mm-yyyy Format allowed ";
        }
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
        return false;
      }
      break;
    }

    case "date_us": {
      var charpos = objValue.value.search("\d{2}\-\d{2}\-\d{4}");
      if(objValue.value.length > 0 &&  charpos >= 0) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + ": mm-dd-yyyy Format allowed ";
        }
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
        return false;
      }
      break;
    }

    case "date_iso": {
      var charpos = objValue.value.search("\d{4}\-\d{2}\-\d{2}");
      if(objValue.value.length > 0 &&  charpos >= 0) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + ": yyyy-mm-dd Format allowed ";
        }
        alert(strError + "\n [Error character position " + eval(charpos+1)+"]");
        return false;
      }
      break;
    }

    case "lessthan": {
      if(isNaN(objValue.value)) {
        alert(objValue.name+": Should be a number ");
        return false;
      }//if
      if(eval(objValue.value) >=  eval(cmdvalue)) {
        if(!strError || strError.length == 0) {
          strError = objValue.name + " : value should be less than " + cmdvalue;
        }
        alert(strError);
        return false;
      }
      break;
    }

    case "greaterthan": {
      if(isNaN(objValue.value)) {
        alert(objValue.name + ": Should be a number ");
        return false;
      }
      if(eval(objValue.value) <=  eval(cmdvalue)) {
        if(!strError || strError.length == 0) {
          strError = objValue.name + " : value should be greater than " + cmdvalue;
        }
        alert(strError);
        return false;
      }
      break;
    }

    case "equalto": {
      var a = cmdvalue.split(".");
      var aField = document.forms[a[0]].elements[a[1]];

    	if(!(objValue.value == aField.value)) {
        if(!strError || strError.length == 0) {
          strError = objValue.name + ": Invalid characters found ";
        }
        alert(strError);
        return false;
      }
      break;
    }

    case "regexp": {
      if(!objValue.value.match(cmdvalue)) {
        if(!strError || strError.length == 0) {
          strError = objValue.name + ": Invalid characters found ";
        }
        alert(strError);
        return false;
      }
      break;
    }

    case "dontselect": {
      if(objValue.selectedIndex == null) {
        alert("BUG: dontselect command for non-select Item");
        return false;
      }
      if(objValue.selectedIndex == eval(cmdvalue)) {
        if(!strError || strError.length ==0) {
          strError = objValue.name + ": Please Select one option ";
        }//if
        alert(strError);
        return false;
      }
      break;
    }
  } //switch
  return true;
}

