//Copyright 2007 www.chatlb.net
//Version 1.0

var chatlb_Val = 
{
	ValEmail: function(str)
	{
		var pattern =  /^[a-z]([\.\-\_]{0,}([a-z_0-9]|[a-z_0-9]\.[a-z_0-9])*)+@([a-z0-9]|[a-z0-9][\.\-][a-z0-9])+\.[a-z]{2,}$/i;
		return pattern.test(str);
	},
	ValUserName: function(str)
	{
		var pat = /^[a-z]{1,}([a-z_0-9]|-)*$/i;
		return pat.test(str);
	},
	ValNoNumbers: function(str)
	{
	    var pat = /\d/;
	    return !pat.test(str);
	},
	Mendatory: function(str, min , max)
	{
		return str.length > 0;
	},
	CheckLength: function(str, min, max)
	{
		var l = str.length;
		return (defined(min)? l >= min: true) && (max? l <= max: true);
	},
	ValNumbers: function(str, min, max)
	{
		var pat = /^\d*$/;
		return pat.test(str) && (defined(min)? parseFloat(str) >= min: true) && (max? parseFloat(str) <= max: true);
	},
	ValFloat: function(str, min, max)
	{
		if(str.length == 0 && (!defined(min) || min == 0))
			return true;
		var pat = /^-?\d*(\.\d+)?$/;
		return pat.test(str) && (defined(min)? parseFloat(str) >= min: true) && (max? parseFloat(str) <= max: true);
	},
	ValDate: function(str)
	{
		var pat = /^\d{1,2}(\/|-)\d{1,2}(\/|-)\d{2,4}$/;
		if(pat.test(str))
		{
			var sep = "-";
			var i = str.indexOf("/");
			if(i>0)
				sep = "/";
			var ar = str.split(sep);
			if(ar.length != 3)
				return false;
			if(ar[0]>12 && ar[1]>12)
				return false;
			if(ar[2].length == 3 || ar[2].length>4)
				return false;
			return true;
		}
		return false;
	},
	ValidateImage: function(str)
	{
		if(!str)
			return true;
		var pat = /\.((jpg)|(jpeg)|(bmp)|(gif)|(png))$/i;
		return pat.test(str);
	},
	Messages:
	{
		Mendatory: "Enter a value in the \"{0}\" field.",
		MendatoryLimited: "{0} must be between {1} and {2} characters long.",
		ValNumbers: "Enter only numbers in the \"{0}\" field.",
		ValNumbersLimited: "{0} must be between {1} and {2}.",
		ValEmail: "Enter a correct email address in the \"{0}\" field.",
		ValImage: "Enter only images in the \"{0}\" field"
	},
	Errors: [],
	Validator: function(_Mendatory, min, max, _Function, _Message, dep)
	{
		this.Validate = true;
		this.CheckMendatory = _Mendatory && _Function != "Mendatory";
		this._Mendatory = _Mendatory;
		this.min = min;
		this.max = max;
		if(_Function && typeof(_Function) == "string" && chatlb_Val[_Function])
			this._Function = chatlb_Val[_Function];
		else if(!_Function && _Mendatory)
			this._Function = chatlb_Val["Mendatory"];
		else if(typeof(_Function) == "function")
			this._Function = _Function;
		else
			this.Validate = false;
		this.Depends = dep;
			
		this.Message = chatlb_Val.Messages[_Message]? chatlb_Val.Messages[_Message]: _Message;
		
		this.Exec = function(Form, Field, FieldName)
		{
			if(this.Depends && !eval(this.Depends))
				return;
			FieldName = FieldName? FieldName: Field.name;
			var _ = chatlb_Val;
			if(this.Validate)
			{
				_.DownLight(Field);
				if(this.CheckMendatory)
				{
					if(!_.Mendatory(Field.value))
					{
						var m = _.Messages["Mendatory"].Format(FieldName);
						_.Hilight(Field, m);
						Form.Errors.push(m);
						return;
					}
					if(min || max)
						if(!_.CheckLength(Field.value, min, max))
						{
							var m = _.Messages["MendatoryLimited"].Format(FieldName, min, max);
							Form.Errors.push(m);
							_.Hilight(Field, m);
							return;
						}
				}
				if(typeof this._Function == "function")
				{
					if(!this._Function(Field.value, min, max))
					{
						var m = this.Message.Format(FieldName, min, max);
						_.Hilight(Field, m);
						Form.Errors.push(m);
						return;
					}
				}
			}
		}
	},
	OldBorderColors: {},
	Hilight: function(Field, Message)
	{
		try
		{
			var _ = chatlb_Val;
			_.OldBorderColors[Field.form.name + "_" + Field.name] = Field.style.borderColor;
			Field.style.borderColor = "red";
			if(Field.document.getElementById( _.Forms[Field.form.name].patern + Field.name))
				Field.document.getElementById( _.Forms[Field.form.name].patern + Field.name).innerHTML = Message;
		}catch(e){}
	},
	DownLight: function(Field)
	{
		try
		{
			var _ = chatlb_Val;
			Field.style.borderColor = _.OldBorderColors[Field.form.name + "_" + Field.name];
			if(Field.document.getElementById( _.Forms[Field.form.name].patern + Field.name))
				Field.document.getElementById( _.Forms[Field.form.name].patern + Field.name).innerHTML = "";
		}catch(e){}
	},
	Form: function(f, fields, patern, _alert, box)
	{
		this.form = f;
		this.fields = fields;
		this.patern = patern;
		this._alert = _alert;
		this.box = document.getElementById(box);
		
		this.Errors = [];
		
		for(i in fields)
		{
			if(f[i])
			{
				f[i].onfocus = new Function("chatlb_Val.FocusIn(this)");
				f[i].onblur = new Function("chatlb_Val.FocusOut(this)");
			}
		}
		this.Validate = function()
		{
			this.Errors = [];
			if(this.box)
				this.box.style.display = "none";
			for(i in this.fields)
				fields[i].Validate();
			if(this.Errors.length > 0)
			{
				if(this.box)
				{
					box.innerHTML = "Please correct the following before submitting: <ul><li>" + this.Errors.join("</li><li>") + "</li></ul>";
					box.style.display = "block";
				}
				if(this._alert)
					alert("Please correct the following before submitting:\n\n\n\t" + this.Errors.join("\t\t\n\t") +"\n\n");
				return false;
			}
		}
	},
	Field: function(f, name, Name, val)
	{
		this.f = f;
		this.name = name;
		this.Name = Name? Name: name;
		this.vals = val;
		this.field = f[name];
		this.Validate = function()
		{
			for(var i = 0; i < this.vals.length; i ++)
			{
				try
				{
					this.vals[i].Exec(chatlb_Val.Forms[this.f.name], this.field, this.Name);
				}
				catch(e)
				{
					alert(e.description);
				}
			}
		}
	},
	FocusIn: function(f)
	{
			
	},
	FocusOut: function(f)
	{
		var o = chatlb_Val.Forms[f.form.name];
		if(o)
			if(o.fields[f.name])
				o.fields[f.name].Validate();
	},
	Forms: {},
	V: function(f)
	{
		if(chatlb_Val.Forms[f.name])
			return chatlb_Val.Forms[f.name].Validate();
		else if(chatlb_Val.Forms[f.id])
			return chatlb_Val.Forms[f.id].Validate();
		return true;
	}
};
var Ready_Vals = 
{
	Mendatory: new chatlb_Val.Validator(true),
	Email: new chatlb_Val.Validator(true, 5, 150, "ValEmail", "ValEmail"),
	UserName: new chatlb_Val.Validator(true, 5, 25, "ValUserName", "Enter a correct username in the \"{0}\" field."),
	Number: new chatlb_Val.Validator(false, null, null, "ValNumbers", "ValNumbers"),
	Image: new chatlb_Val.Validator(false, null, null, "ValidateImage", "ValImage"),
	Money: new chatlb_Val.Validator(false, 0, null, "ValFloat", "Please enter a money value in the \"{0}\" field.")
};