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 SuscribeEq( formId, objId, objToCompareId, controls, allowEmpty ){
	var form = document.getElementById(formId);
	if ("complete" != document.readyState){
		setTimeout(function() { SuscribeEq( formId, objId, objToCompareId, 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);
	}

	if (!forms[formId]._controls[objToCompareId])
	{
		forms[formId].AddControl(objToCompareId);
		document.getElementById(objToCompareId).attachEvent("onkeyup", ValidateHandler);
		document.getElementById(objToCompareId).attachEvent("onchange", ValidateHandler);
	}

	forms[formId]._controls[objId].AddEqValidator( objToCompareId );
	//label for primary compare control.
	forms[formId]._controls[objToCompareId]._extMark = document.getElementById( 
		"lbl_" + objId
	);
	
	forms[formId]._controls[objToCompareId].AddEqValidator( objId );

	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)
			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;
	this._eqValidator = -1;
	this._allowEmpty = false;
}

Control.prototype.AddValidator = function(regEx)
{
//	alert(this._parentId + ":" + this._obj.id + ":" + regEx);
	this._validators.push(new RegExp(regEx));
	this._ok.push(false);
}

//eq validators
Control.prototype.AddEqValidator = function( ctrlId, allowEmpty ) {
	this._allowEmpty = allowEmpty;
	this._controlToCompare = document.getElementById( ctrlId );
	this._validators.push( '' );
	this._ok.push(false);
	this._eqValidator = this._ok.length - 1;
}

Control.prototype.Validate = function()
{
	this._valid = true;
	for(var i = 0; i < this._validators.length; i++)
	{
		if ( i == this._eqValidator ) {
			if ( !this._eqValidator._allowEmpty && "" == this._obj.value )
				this._ok[i] = false;
			else
				this._ok[i] = this._controlToCompare.value == this._obj.value;
		}
		else			
			this._ok[i] = this._validators[i].test(this._obj.value);


		if ( this._extMark && i == this._eqValidator ) {
			this._extMark.style.visibility = !this._ok[i] ? "visible" : "hidden";
		}
		else if (this._mark)
			this._mark.style.visibility = !this._ok[i] ? "visible" : "hidden";

		this._valid = this._ok[i] && this._valid;
	}

}
