var PVF_ERROR_TEXT_EMPTY='campul `{LABEL}` este gol';
var PVF_ERROR_TEXT_MINVALUE='lungimea `{LABEL}` este prea mica; cel putin {LEN} caractere';
var PVF_ERROR_TEXT_MAXVALUE='lungimea `{LABEL}` este prea mare; cel mult {LEN} caractere';
var PVF_ERROR_TEXT_MATCH='formatul `{LABEL}` nu corespunde';
var PVF_ERROR_SELECT_EMPTY='trebuie sa selectati un `{LABEL}`';
var PVF_ERROR_CHECKBOX_REQUIRED='trebuie sa selectati `{LABEL}`';
var PVF_ERROR_CHECKBOX_GROUP_REQUIRED='trebuie sa selectati cel putin un `{LABEL}`';
var PVF_ERROR_RADIO_GROUP_REQUIRED='e obligatoriu sa alegeti `{LABEL}`';
var PVF_ERROR_FILE_EXT='fisierul `{LABEL}` poate sa aiba urmatoarele extensii: {EXT}';
var PVF_ERROR_FILE_EMPTY='trebuie sa selectati un fisier pentru campul `{LABEL}`';
var PVF_ERROR_SELECT_EMPTY='trebuie sa selectati `{LABEL}`';
var PVF_ERROR_RADIO_GROUP_EMPTY='trebuie sa selectati `{LABEL}`';
//
function PFValidator(form,container){
	this.Result=[];
	this.Elements=[];
	this.Form=(typeof form=='string'?document.forms[form]:(typeof form=='object'?form:undefined));
}
PFValidator.prototype={
	add:function(name,label,opt){
		var o={};
		o.Element=(this.Form!=undefined?this.Form[name]:document.getElementById(name));
		o.Label=label;
		if(opt==undefined) opt={};
		o.Options=opt;
		o.Options.required=(o.Options.required==undefined?true:false);
		this.Elements.push(o);
	},
	trim:function(str){
		return str.replace(/^\s+|\s+$/g,"");
	},
	error:function(err,msg){
		err=err.replace(/\{LABEL\}/ig,msg.label);
		err=err.replace(/\{EXT\}/ig,msg.ext);
		err=err.replace(/\{LEN\}/ig,msg.len);
		return err;
	},
	inArray:function(arr,str){
		for(var i=0;i<arr.length;i++)
			if(arr[i].toLowerCase()==str)
				return true;
		return false;
	},
	start:function(){
		var E=this.Elements;
		for(var i=0; i<E.length; i++){
			var nName=E[i].Element.nodeName;
			var nLength=E[i].Element.length;
			if(nName!=undefined){
				nName=nName.toLowerCase();
				if(nName=='input'){
					switch(E[i].Element.type){
						case 'text':
						case 'password':
							this.vInputText(E[i]);
							break;
						case 'file':
							this.vInputFile(E[i]);
							break;
						case 'checkbox':
							this.vInputCheckBox(E[i]);
							break;
						case 'radio':
							this.vInputRadio(E[i]);
							break;
						case 'hidden':
							this.vInputHidden(E[i]);
							break;
					}
				}else if(nName=='select'){
					this.vSelect(E[i]);
				}else if(nName=='textarea'){
					this.vTextarea(E[i]);
				}
			}else if(nName==undefined && nLength>0){
				var childNName=(E[i].Element.length?E[i].Element[0].nodeName:undefined);
				switch(E[i].Element[0].type){
					case 'radio':
						this.vInputRadio(E[i]);
						break;
					case 'checkbox':
						this.vInputCheckBox(E[i]);
						break;
				}
			}
		}
		return (this.Result.length?this.Result:false);
	},
	vInputText:function(o){
		var opt=o.Options;
		var eV=this.trim(o.Element.value);
		if(opt.required && eV.length==0){
			var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_TEXT_EMPTY,{label:o.Label}));
			this.Result.push(err);
			return;
		}else if(eV.length>0){
			if(opt.minvalue && eV.length<opt.minvalue){
				var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_TEXT_MINVALUE,{label:o.Label,len:opt.minvalue}));
				this.Result.push(err);
				return;
			}
			if(opt.maxvalue && eV.length>opt.maxvalue){
				var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_TEXT_MAXVALUE,{label:o.Label,len:opt.maxvalue}));
				this.Result.push(err);
				return;
			}
			if(opt.pattern && !opt.pattern.test(eV)){
				var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_TEXT_MATCH,{label:o.Label}));
				this.Result.push(err);
				return;
			}
			if(opt.format){
				var reg=/(.*)/;
				switch(opt.format.toLowerCase()){
					case 'email':
						reg=/^[a-z0-9\.\-\_]+@(?!_)([\w])+[a-z0-9\.\_\-]+\.[a-z]{2,4}$/i;
						break;
					case 'number':
						reg=/^\d+([\.|\,]?\d*)?$/;
						break;
					case 'phone':
					case 'fax':
						reg=/^[0-9\+\(\)\s\-]+$/;
						break;
				}
				if(!reg.test(eV)){
					var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_TEXT_MATCH,{label:o.Label}));
					this.Result.push(err);
					return;
				}
			}
		}

	},
	vInputFile:function(o){
		var opt=o.Options;
		var eV=this.trim(o.Element.value);
		if(opt.required==true && eV.length==0){
			var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_FILE_EMPTY,{label:o.Label}));
			this.Result.push(err);
			return;
		}else{
			var extension=eV.substr(eV.lastIndexOf('.')+1).toLowerCase();
			if(eV && opt.ext && !this.inArray(opt.ext,extension)){
				var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_FILE_EXT,{label:o.Label, ext:opt.ext.join(', ')}));
				this.Result.push(err);
				return;
			}
		}
	},
	vTextarea:function(o){
		var opt=o.Options;
		var eV=this.trim(o.Element.value);
		if(opt.required && eV.length==0){
			var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_TEXT_EMPTY,{label:o.Label}));
			this.Result.push(err);
			return;
		}else if(eV.length>0){
			if(opt.minvalue && eV.length<opt.minvalue){
				var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_TEXT_MINVALUE,{label:o.Label}));
				this.Result.push(err);
				return;
			}
			if(opt.maxvalue && eV.length>opt.maxvalue){
				var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_TEXT_MAXVALUE,{label:o.Label}));
				this.Result.push(err);
				return;
			}
		}
	},
	vSelect:function(o){
		var opt=o.Options;
		var eV=o.Element.value;
		if(opt.required==true && eV.length==0){
			var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_SELECT_EMPTY,{label:o.Label}));
			this.Result.push(err);
			return;
		}
	},
	vInputRadio:function(o){
		var opt=o.Options;
		var eV=o.Element;
		var eL=eV.length;
		for(var i=0;i<eL;i++){
			if(eV[i].checked==true){
				return;
			}
		}
		var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_RADIO_GROUP_EMPTY,{label:o.Label}));
		this.Result.push(err);
	},
	vInputCheckBox:function(o){
		var opt=o.Options;
		if(!o.Element.checked){
			var err=(opt.error!=undefined?opt.error:this.error(PVF_ERROR_CHECKBOX_REQUIRED,{label:o.Label}));
			this.Result.push(err);
			return;
		}
	},
	vInputHidden:function(o){
		this.Result.push('hidden');
	}
}