/*
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_username = function(el){
		if (el.value){
			var filter  = /^([a-zA-Z0-9_\.\-])+$/;
			return filter.test(el.value)?true:false;
		}
		return false;
	}
	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;
			}
		}
	}
	if (typeof validateWindow.validate_done == "function"){
    		validate_done(el, val_return);
	}
	return val_return; 
}

 