// validation

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.setAddnlValidationFunction=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;
	}
}

function form_submit_handler() {
	var isok = true;
	for (var itr=0;itr < this.elements.length;itr++) {
		if(this.elements[itr].validationset && !this.elements[itr].validationset.validate()) {
		  isok = false;
		}
	}
	if(this.addnlvalidation) {
		str =" var ret = "+this.addnlvalidation+"()";
		eval(str);
		if(!ret) isok = false;
	}
	return isok;
}

function add_validation(itemname,descriptor,errstr) {
	if(!this.formobj) {
	  alert("BUG: the form object is not set properly");
		return;
	}//if
	var itemobj = this.formobj[itemname];
	if(!itemobj) {
	  alert("BUG: Couldnot get the input object named: "+itemname);
		return;
	}
	if(!itemobj.validationset) {
	  itemobj.validationset = new ValidationSet(itemobj);
	}
	itemobj.validationset.add(descriptor,errstr);
}

function ValidationDesc(inputitem,desc,error) {
	this.desc = desc;
	this.error = error;
	this.itemobj = inputitem;
	this.validate = vdesc_validate;
}

function vdesc_validate() {
	if (!V2validateData(this.desc, 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(desc,error) {
	this.vSet[this.vSet.length] = new ValidationDesc(this.itemobj,desc,error);
}

function vset_validate() {
	for (var itr=0; itr<this.vSet.length; itr++) {
		if(!this.vSet[itr].validate()) {
		   return false;
		}
	}
	return true;
}

function validateEmailv2(email) {
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
	if(email.length <= 0) {
	  return true;
	}
	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 V2validateData (strValidateStr, objValue, strError) { 
	var epos = strValidateStr.search("="); 
	var  command  = ""; 
	var  cmdvalue = ""; 
	if (epos >= 0) { 
		command  = strValidateStr.substring(0,epos); 
		cmdvalue = strValidateStr.substr(epos+1); 
	} else { 
		command = strValidateStr; 
	} 
	var isok = true;
	switch(command) 
	{ 
        case "req": 
        case "required": 
          {
			if(eval(objValue.value.length) == 0) isok = false;
			break;
          }
        case "maxlength": 
        case "maxlen": 
          { 
			if(eval(objValue.value.length) >  eval(cmdvalue)) isok = false;
			break; 
          }
        case "minlength":
        case "minlen":
		{ 
			if(eval(objValue.value.length) <  eval(cmdvalue)) isok = false;
			break; 
		}
        case "alnum": 
        case "alphanumeric": 
           { 
			var charpos = objValue.value.search("[^A-Za-z0-9]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) isok = false;
              break; 
           }
        case "num": 
        case "numeric": 
           { 
			var charpos = objValue.value.search("[^0-9]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) isok = false;
			break;
           }
        case "alnum_s": 
        case "alphanumeric_space": 
           { 
			var charpos = objValue.value.search("[^A-Za-z0-9\\s]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) isok = false;
			break; 
           }		   
        case "dec": 
        case "decimal": 
           { 
			var charpos = objValue.value.search("[^0-9\.]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) isok = false;
               break;               
           }
        case "alphabetic": 
        case "alpha": 
           { 
			var charpos = objValue.value.search("[^A-Za-z]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) isok = false;
			break; 
           }
        case "email": 
          { 
               if(!validateEmailv2(objValue.value)) isok = false;
			break; 
          }
        case "lt": 
        case "lessthan": 
          { 
			if(isNaN(objValue.value)) isok = false;
			if(eval(objValue.value) >= eval(cmdvalue)) isok = false;
			break; 
          }
        case "gt": 
        case "greaterthan": 
          { 
			if(isNaN(objValue.value)) isok = false;
			if(eval(objValue.value) <=  eval(cmdvalue)) isok = false;
			break; 
          }
        case "regexp": 
          { 
		 	if(objValue.value.length > 0) {
				if(!objValue.value.match(cmdvalue)) isok = false;
			}
			break; 
          }
        case "dontselect": // supply a value for a dropdown that should NOT be allowed
          { 
		 	if(objValue.selectedIndex == null) isok = false;
		 	if(objValue.selectedIndex == eval(cmdvalue)) isok = false;
		 	break; 
          }
        case "dontinput": // supply a value for an input that should NOT be allowed
          { 
		 	if(objValue.value == cmdvalue) isok = false;
		 	break; 
          }
        case "checked": 
          {
			if(objValue.checked == 0) isok = false;
			break;
          }
        case "radioreq":  // errors if none are selected
          {
          	var cnt = -1;
			for (var i=objValue.length-1; i > -1; i--) {
			   if (objValue[i].checked) {cnt = i; i = -1;}
			}
			if (cnt == -1) isok = false;
			break;
          }
	}
	if (isok) {
		document.getElementById(strError).style.display = "none";
		return true;
	} else {
		document.getElementById(strError).style.display = "inline";
		return false; 
	}
}

// default value handling

var active_color = '#555'; // Colour of user provided text
var inactive_color = '#ccc'; // Colour of default text

window.onload = formDefaultValues;

function formDefaultValues() {
  var fields = getElementsByClassName(document, "input", "default-value");
  if (!fields) {
    return;
  }
  var default_values = new Array();
  for (var i = 0; i < fields.length; i++) {
    fields[i].style.color = inactive_color;
    if (!default_values[fields[i].id]) {
      default_values[fields[i].id] = fields[i].value;
    }
    fields[i].onfocus = function() {
      if (this.value == default_values[this.id]) {
        this.value = '';
        this.style.color = active_color;
      }
      this.onblur = function() {
        if (this.value == '') {
          this.style.color = inactive_color;
          this.value = default_values[this.id];
        }
      }
    }
  }
}

function getElementsByClassName(oElm, strTagName, strClassName){
  var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
  var arrReturnElements = new Array();
  strClassName = strClassName.replace(/\-/g, "\\-");
  var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
  var oElement;
  for (var i = 0; i < arrElements.length; i++) {
    oElement = arrElements[i];
    if (oRegExp.test(oElement.className)) {
      arrReturnElements.push(oElement);
    }
  }
  return (arrReturnElements);
}
