var forms = new Array();

function Suscribe(formId, objId, regEx, controls)
{
	var form = document.getElementById(formId);
	if ("complete" != document.readyState){
		setTimeout(function() { Suscribe(formId, objId, regEx, controls); }, 50);
		return;
	}

	if (!forms[formId])
		forms[formId] = new Form(formId, controls);

	if (!forms[formId]._controls[objId])
	{
		forms[formId].AddControl(objId);
		document.getElementById(objId).attachEvent("onkeyup", ValidateHandler);
		document.getElementById(objId).attachEvent("onchange", ValidateHandler);
	}

	forms[formId]._controls[objId].AddValidator(regEx);
	Validate(formId, objId);
}

function GetFormSubmits(formId)
{
	var form = document.getElementById(formId);
	var btns = new Array();
	for(var i = 0; i < form.elements.length; i++){
		if ("submit" == form.elements[i].type || "image" == form.elements[i].type)
			btns.push(form.elements[i]);
	}
	return btns;
}

function Validate(formId, objId)
{
	forms[formId]._controls[objId].Validate();
	forms[formId].UpdateButtonState();
}

function ValidateHandler(oEvent)
{
	Validate(oEvent.srcElement.form.id, oEvent.srcElement.id);
}


//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

function Form(formId, controls)
{
	this._id = formId;
	this._controls = new Array();
	this._controls2 = new Array();

	if (!controls)
	{
		this._submits = GetFormSubmits(formId);
	}
	else
	{
		var ids = controls.split(",");
		this._submits = new Array();

		for(var i = 0; i < ids.length; i++)
		{
			var obj = document.getElementById(ids[i]);
			this._submits.push(obj);
		}
	}
}

Form.prototype.AddControl = function(objId)
{
	this._controls[objId] = new Control(this._id, objId);
	this._controls2.push(this._controls[objId]);
}

Form.prototype.UpdateButtonState = function()
{
	var ok = true;
	for(var i = 0; i < this._controls2.length; i++)
		ok = ok && this._controls2[i]._valid;

	for(var i = 0; i < this._submits.length; i++)
		 this._submits[i].disabled = !ok;
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
function Control(formId, objId)
{
	this._parentId = formId;
	this._obj = document.getElementById(objId);
	this._mark = document.getElementById("lbl_" + objId);
	this._validators = new Array();
	this._ok = new Array();
	this._valid = false;
}

Control.prototype.AddValidator = function(regEx)
{
//	alert(this._parentId + ":" + this._obj.id + ":" + regEx);
	this._validators.push(new RegExp(regEx));
	this._ok.push(false);
}

Control.prototype.Validate = function()
{
	this._valid = true;
	for(var i = 0; i < this._validators.length; i++)
	{
		this._ok[i] = this._validators[i].test(this._obj.value);
       		if (this._mark)
			this._mark.style.visibility = !this._ok[i] ? "visible" : "hidden";
		this._valid = this._ok[i] && this._valid;
	}
}
