var str_bug_no_matching_form_element = "There is no form element for descriptor #";
var str_bug_incorrect_check_command = "Check command for non-checkable object";

function is_ok(str){
	return (str.substr(0,3)=="OK:")?true:false;
}

function is_error(str){
	return (str.substr(0,6)=="ERROR:")?true:false;
}

function trunc_error(str){
	if (is_error(str)){
		return str.substr(6);
	}
}

function get_commands_array(str){
	var arr = str.split('&');
	var res = new Array(arr.length);
	var field;
	for (var i in arr){
		field = arr[i].split('=');
		var value = (field.length==2)?field[1]:"";
		res[field[0]]= value;
	}
	return res;
}

function validate_form(frm,arr){
	var cnt = 0; 
	var offset=0;
	if(frm.elements.length< arr.length){
	    alert(str_error_no_matching_form_element+i);
	    return false;
	}
	var i=0; var j=-1;
	while (i<arr.length){
		cnt = arr[i].length;
		if (!cnt) {i += 1;continue;}
		var arrCmd = new Array();
		var arrCntr = new Array();
		arrCmd = get_commands_array(arr[i][0]);
		arrCntr = get_commands_array(arr[i][1]);
		var type = (arrCntr["type"])?Number(arrCntr["type"]):0;
		var dep = (arrCntr["dep"])?Number(arrCntr["dep"]):1;
		if (dep>1){
			var v_res = validate_form_segment(frm,arr,i,dep,type);
			j=-1;
		}else{
			var v_res = validate_field(arrCmd,frm[i]);
			j=i;
		}
		if (is_error(v_res)) {
			alert(trunc_error(v_res));
			if (j!=-1) frm[j].focus();
			return false;
		}
		i += dep;
	}
	return true;
}

function error_msg(frm,msg,i){
	if (is_error(msg)){
		frm[i].focus();
		alert(msg);
		return false;
	}else
		return true;
}
function validate_form_segment(frm,arr,index,len,type){
	var dep_sel = false;
	var dep_not_sel = false;
	var i=-1;
	var arrCmd = new Array();
	var arrCntr = new Array();
	var j=0;
	while (j<len){
		var obj = frm[index+j];
		arrCmd = get_commands_array(arr[index+j][0]);
		arrCntr = get_commands_array(arr[index+j][1]);
		var type1 = (arrCntr["type"])?Number(arrCntr["type"]):0;
		var dep = (arrCntr["dep"])?Number(arrCntr["dep"]):1;
		if (j==0) var arrCmd0 = arrCmd;
		if (dep>1 && j!=0){
			var v_res = validate_form_segment(frm,arr,index+j,dep,type1);
		}else{
			arrCmd["err"]= (len>1)?((arrCmd0["err"])?arrCmd0["err"]:arrStdError["dep"+type]):arrCmd["err"];
			var v_res = validate_field(arrCmd,frm[index+j]);
		}
		if (type==1){
			if (is_ok(v_res)) dep_sel = true;
			else {
				if (i<0) i=j;
				dep_not_sel = true;
			}
		}else if(type==2){
			if(!is_ok(v_res)){
				if (i<0) i=j;
				break;
			}
		}else 
			if(is_ok(v_res))
				break;
			else if (i<0) i=j;
		j+=(dep>1 && j!=0)?dep:1;
	}
	if (type==1){
		if (dep_sel && dep_not_sel){
			frm[index+i].focus();
			return "ERROR: "+((arrCmd0["err"])?arrCmd0["err"]:arrStdError["dep"+type]);
		}else return "OK:";
	}else{
		if (is_error(v_res))
			frm[index+i].focus();
		return v_res;
	}
}
var arrStdError = new Array();
arrStdError["req"]="Required Field";
arrStdError["num"]="Only digits allowed ";
arrStdError["tel"]="Incorrect phone number ";
arrStdError["alnum"]="Only alpha-numeric characters allowed ";
arrStdError["email"]="Enter a valid e-mail address ";
arrStdError["regexp"]="Regular expression doesn't match ";
arrStdError["not"]="Please select an option ";
arrStdError["check"]="Please check an option ";
arrStdError["dep0"]="You have to select at least one option from the group ";
arrStdError["dep1"]="You have to select either all options or no options";

function validate_email(email)
{
    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 validate_field(arr,obj){
    var result = true;
    var sErrorDetails = "";

	for (var cmd in arr){
		var cmd_value = arr[cmd];
	    switch(cmd){
		    case "req":{
				if(obj.value.length == 0) result = false;
				break;
			}
		    case "check":{
				if(obj.checked==null){
					alert(str_bug_incorrect_check_command);
					return false;
				}
				if(!obj.checked) result = false;
				break;
			}
	        case "num":{ 
				pos = obj.value.search("[^0-9]"); 
				if(obj.value.length > 0 &&  pos >= 0){ 
					sErrorDetails = "\n [Error character position: " +(pos+1)+"]";
					result=false;
				}
				break;
			}
	        case "numcor":{ 
        		var str = obj.value.replace(/[^0-9]*/,"");
        		obj.value=str;
//        		result=true;
        		break;
			}
	        case "tel":{ 
	        	var str=obj.value;
//	        		var str = replace("\(","");
//	        		str = str.replace("\)","");
//	        		str = str.replace("-","");
//	        	}
				pos = str.search(/[^0-9\(\)\-\,]/); 
//				if (str.length==0) result=true;
				if(pos >= 0){ 
					sErrorDetails = "\n [Error character position: " +(pos+1)+"]";
					result=false;
				}
				break;
			}
	        case "pass":{ 
				pos = obj.value.search("[^A-Za-z0-9_]"); 
				if(obj.value.length > 0 &&  pos >= 0){ 
					sErrorDetails = "\n [Error character position: " +(pos+1)+"]";
					result=false;
				}
				break;
			}
	        case "email":{
				if(!validate_email(obj.value)) result=false;
				break;
			}
	        case "regexp":{
				if(!obj.value.match(cmd_value)) result=false;
				break;
	        }
	        case "not":{ 
				if(obj.value == cmd_value) result=false;
				break;
			}
	    }
	    if (!result) break;
	}
	if (!result){
		if(!arr["err"] || arr["err"].length==0){
			arr["err"] = arrStdError[cmd]; 
		}
		return "ERROR: "+ arr["err"]+sErrorDetails;
	}
    return "OK:"; 
} 
function allow_keys(keys){
	for(i in keys){
		if(keys[i].length){
			if (event.keyCode>=keys[i][0]&&event.keyCode<keys[i][1])
				return true;
		}else
			if (event.keyCode==keys[i])
				return true;
	}
	return false;
}
