/*
var validate_onError = null;
var validate_onGood = null;
*/

var validateWindow = window;
var array_validate = new Array();

function validate_form(el,ar_val){
  
         if (typeof validateWindow == "undefined"){
           var validateWindow = this;
         }

	if (typeof ar_val == "undefined"){
           try{
	      ar_val = validateWindow.array_validate;
           }
           catch(e){
             return;
           }
	}
	this.check_value = function(el,comp,val){
		var fl_flag = false;
		fl = el.value;
		if (typeof comp == "string"){
			val = this.get_value(val);
			fl_flag = this.expresion(fl,comp,val);
		}else{
			fl_flag = el.value ? true : false;
		}
		return fl_flag;
		//return oth_value != undefined ? (el.value == oth_value ? true : false) :  el.value ? true:false;
	}
	this.is_element = function( el , id , nm){
		if (typeof id == "string" && id){
			return validateWindow.document.getElementById(id) ? true : false;
		}else if (typeof nm == "string" && nm){
			return current_form[nm] ? true : false;
		}
	}
	this.check_length = function(el,comp,val){
		if (el.value){
			var fl_flag = false;;
			var fl = el.value.toString().length;
			val = this.get_value(val);
			val = parseInt(val);
			if (!isNaN(val)){
				fl_flag = this.expresion(fl,comp,val);
			}
			return fl_flag;
		}
		return false;
	}
	this.check_float = function(el,comp,val){
		var fl;
		var fl_flag = false;
		if (el.value){
			if (el.value.toLowerCase() == "max"){
				fl_flag = true;
			}else{
				fl = parseFloat(el.value);
				if (!isNaN(fl)){
					if (typeof comp == "string"){
						/*
						if (val.indexOf("id#") != -1){
							var a;
							if (a = document.getElementById(val.replace(/id#/,""))){
								val = a.value;
							}
						}*/
						val = this.get_value(val);
						val = parseFloat(val);
						if (!isNaN(val)){
							fl_flag = this.expresion(fl,comp,val);
						}
					}else{
						fl_flag = true;
					}
				}
			}
		}
		return fl_flag;
	}
	this.check_int = function(el,comp,val){
		var fl;
		var fl_flag = false;
		if (el.value){
			if (el.value.toLowerCase() == "max"){
				fl_flag = true;
			}else{
				fl = parseInt(el.value);
				if (!isNaN(fl)){
					if (typeof comp == "string"){
						val = this.get_value(val);
						val = parseInt(val);
						if (!isNaN(val)){
							fl_flag = this.expresion(fl,comp,val);
						}
					}else{
						fl_flag = true;
					}
				}
			}
		}
		return fl_flag;
	}
	this.check_email = function(el){
		if (el.value){
			var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			return filter.test(el.value)?true:false;
		}
		return false;
	}
	this.check_alfanumeric = function(el){
		if (el.value){
			valid="123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.";
			for (var i=0;i<el.value.length;i++){
				if (-1 == valid.indexOf(el.value[i])){
					return false;
				}
			}
			return true;
		}else return false;
		
	}
	this.check_date = function(el,dt_format){
		if (el.value){
			if (typeof dt_format != "string" || dt_format == ""){
				var dt_format = "yyyy-mm-dd";
			}
			var cr_date = el.value;
			if (cr_date.length == dt_format.length){
			    var ar_date = cr_date;
			    ar_date = ar_date.replace(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/gi,"%sep%");
			    ar_date = ar_date.split("%sep%");
			    var fpos = 0;
			    for (var i=0;i<ar_date.length;i++){
				var tmp;
				tmp = cr_date.indexOf(ar_date[i]);
				if (tmp != -1){
				    cr_date = cr_date.substr(fpos);
				    pfos = tmp;
				}else{
				    return false;
				}
			    }
			    return true;
			}
		}
		return false;
	}
	
	this.set_property = function( valFlag , id , prop , val ){
		if (valFlag == false && typeof prop == "string" && prop != "" && id){
			val = this.get_value(val);
			var a;
			if (a = validateWindow.document.getElementById(id)){
				var b = prop.split(".");
				for (var i=0; i<b.length-1; i++){
					a = a[b[i]];
				}
				var final_prop = b[b.length-1];
				if (typeof val != "string"){
					val = "";
				}
				a[final_prop] = val;
			}
		}
	}
	this.check_property = function( el , id , prop , comp , val ){
		if (typeof prop == "string" && prop != "" && typeof comp == "string" && comp != ""){
			val = this.get_value(val);
			if (a = validateWindow.document.getElementById(id));
			else{
				a = el;
			}
			var b = prop.split(".");
			for (var i=0; i<b.length-1; i++){
				a = a[b[i]];
			}
			var final_prop = b[b.length-1];
			return this.expresion(a[final_prop],comp,val);
		}
		return false;
	}
	this.has_elements = function( el , id ){
		var val_return = false;
		var arg_array = new Array;
		var val_array = new Array;
		var a;
		if (id && (a = validateWindow.document.getElementById(id))){
			el = a;
		}
		for (var i=2; i<arguments.length; i++){
			a = arguments[i].toString().split("->");
			if (a.length == 2){
				arg_array.push(a[0].replace(/'/g,''));
				val_array.push(a[1].replace(/'/g,''));
			}

		}
		if (arg_array.length > 0){
			if (a = el.firstChild){
				while (a){
					if (a.nodeType == 1){
						for (var j=0; j<arg_array.length; j++){
							if (arg_array[j].indexOf("extern#") == 0){
								var tfnc = arg_array[j].replace("extern#","");
								if (typeof validateWindow[tfnc] == "function"){
									val_return = validateWindow[tfnc](a, val_array[j]);
								}
							}else{
								if (typeof a[arg_array[j]] != "undefined"){
										val_return = (a[arg_array[j]] == val_array[j]);
								}
							}
						}
					}
					if (a.nextSibling){
						a = a.nextSibling;
					}else{
						break;
					}
				}
			}
		}
		return val_return;
	}
	
	this.get_radio = function(el){
		var ret_el = null;
		for (var i=0; i<current_form.elements.length; i++){
			if (current_form.elements[i].tagName.toLowerCase() == "input" && current_form.elements[i].type.toLowerCase() == "radio" && current_form.elements[i].name == el.name){
				//atentie pe IE
				if (current_form.elements[i].checked == true){
					//ret_el = current_form.elements[i];
					return true;
				}else{
					//last_el = current_form.elements[i];
				}
			}
		}
		//return ret_el ? ret_el : last_el;
		return false;
	}

	this.validate_eval = function(el, evl){
		var arr_els = new Array();
		var str = evl.replace(/id#\w*/g,function(w){
			var i;
			for (i=0; i<arr_els.length; i++){
				if (arr_els[i].tag == w){
					break;
				}
			}
			if (i == arr_els.length){
				arr_els.push({tag:w,el:get_value(w,"object")});
			}
			return "arr_els["+i+"].el";});
		return eval(str)();
	}
	
	this.get_value = function(val, tp){
		if (val){
			if (!tp){
				tp = "value";
			}
			switch (val){
				case "#true#" :		val = true; break;
				case "#false#" :	val = false; break;
				case "#null#" :		val = null; break;
				default: 		
							if (typeof val == "string"){
								if (val.indexOf("id#") != -1){
									var a;
									if (a = validateWindow.document.getElementById(val.replace(/id#/,""))){
										if (tp == "value"){
											val = a.value;
										}else{
											val = a;
										}
									}
								}
							}
							break;
			}
		}else{
			var val = '';
		}
		return val;
	}
	
	this.expresion = function(fl,comp,val){
		var fl_flag = false;
		switch (comp){
			case "greater" : fl_flag = fl > val;break;
			case "smaller" : fl_flag = fl < val;break;
			case "equal" : fl_flag = fl == val;break;
			case "notequal" : fl_flag = fl != val;break;
			default : fl_flag = false;break;
		}
		return fl_flag;
	}
	this.evaluate = function( func , errString , returnErr ){
	    if (typeof func == "string" && func != ""){
		var val = func.split("|");
		if (val.length){
		    var val_return = true;
		    var j = 0;
		    var a;
		    for (j=0;j<val.length;j++){
		    	var ar = this.get_arguments(val[j]);
			var fnc = ar[0];
			if (typeof validateWindow[fnc] == "function"){
			    ar[0] = elem;
			    if (validateWindow[fnc].apply(this,ar) == false){
				val_return = false;
				break;
			    }
			}
	    	    }
		    var err = new Array();
		    if (typeof errString == "string" && errString != ""){
			err = errString.split("|");
		    }
		    if (val_return == false){
			if (typeof validateWindow.validate_onError == "function"){
   			   validateWindow.validate_onError(elem, returnErr, err[j]);
			}else{
          		   if (typeof returnErr == "object" && returnErr != null){
          		      returnErr.innerHTML = val_return == false ? (typeof err[j] == "string" ? err[j] : "" ):"";
          		   }
                        }
		    }else{
		    	if (typeof validateWindow.validate_onGood == "function"){
   			   validateWindow.validate_onGood(elem, returnErr, err[j]);
			}else{
				if (typeof returnErr == "object" && returnErr != null){
					returnErr.innerHTML = "";
				}
			}
		    }
		    return val_return;
	        }
	    }
	    return true;
	}
	
	this.get_arguments = function(str){
		return str ? str.split(":") : new Array;
	}


    var val_return = true;
    if (typeof el == "object" && el != null && el.elements && el.elements.length){
    	this.current_form = el;
    	this.ignore_array = new Array();
    	
	var a;
    	for (key in ar_val){
    		elem = null;
    		//IE check for dom added elements
    		for (var fid=0; fid<el.elements.length; fid++){
                  if (el.elements[fid].name == ar_val[key].name){
                    var elem = el.elements[fid];
                    break;
                  }
                }
                if (!elem){
      		   if (typeof el[ar_val[key].name] == "object"){
                      var elem = el[ar_val[key].name];
                   }else{
                      if (ar_val[key].id != ""){
                         if (a = validateWindow.document.getElementById(ar_val[key].id)){
                            var elem = a;
                            elem.name = elem.id;
                         }
                      }
                   }
    		}
		if (!elem){
			continue;
		}
		if (elem.name != "" && typeof ar_val[elem.name] == "object" && !this.ignore_array[elem.name]){
			var err = new Array();
			if (typeof ar_val[elem.name].error == "string" && ar_val[elem.name].error != ""){
				err = ar_val[elem.name].error.split("|");
			}
			var retErr;
			if (!ar_val[elem.name].returnError){
				elem.returnError = "err_"+elem.name;
			}else{
				elem.returnError = ar_val[elem.name].returnError;
			}
			if (retErr = validateWindow.document.getElementById(elem.returnError));
			
			var eval_el = ar_val[elem.name];
			
			if (ar_val[elem.name].before_validate){
				var ar = this.get_arguments(ar_val[elem.name].before_validate);
				var el_before = ar[0];
				if (typeof this[el_before] == "function"){
					ar[0] = elem;
					var ret_el = this[el_before].apply(this,ar);
					if (ret_el != null){
						elem = ret_el;
					}
				}
			}
		
			var valFlag = this.evaluate(ar_val[elem.name].validate_flag);
			var valReturn = false;
			if (valFlag == true){
				valReturn = this.evaluate(ar_val[elem.name].validate, ar_val[elem.name].error , retErr );
				if (typeof valReturn == "undefined" || valReturn == false){
					val_return = false;
				}
			}else{
				if (typeof retErr =="object" && retErr != null){
					if (typeof validate_onGood == "function"){
   			   		   validate_onGood(elem, retErr);
		   			}else{
                                           retErr.innerHTML = "";
                                        }
				}
			}
			if (ar_val[elem.name].after_validate){
				var ar = this.get_arguments(ar_val[elem.name].after_validate);
				var el_after = ar[0];
				var afcnt = true;
				if ((typeof ar_val[elem.name].only_on_error != "undefined") && (ar_val[elem.name].only_on_error == true)){
					afcnt = !valReturn;
				}
				if (afcnt){
					if (el_after.indexOf("extern#") != -1){
						eval(el_after.replace("extern#",""));
					}else if (typeof this[el_after] == "function"){
						ar[0] = valReturn;
						this[el_after].apply(this,ar);
					}else{
                                          alert(el_after);
                                        }
				}
			}
			this.ignore_array[elem.name] = elem.name;
		}
	}
    }
    return val_return;
}
