// Валидаторы форм

// Настройки
var validatorStarColor_OK = "";
var validatorStarColor_ERROR = "#B70000";

// СИСТЕМНЫЙ КОД
var validatorBlocks;
var validatorPrevOnClick;

function AddValidator(controlID, type,param, controlTitle)
{
	if (validatorBlocks==null) validatorBlocks = new Array();
	
	var elem = Validate_GetControl(controlID);
	if (elem==null) return;
	
	var formID = Validate_GetFormByControl(elem);
	for (var i=0;i<validatorBlocks.length;i++)
	{
		if (validatorBlocks[i].formID==formID)
		{
			validatorBlocks[i].vals.push(new Validator(controlTitle, controlID, type, param));
			return; 
		}
	}
	
	var valBlock = new Object();
	valBlock.formID = formID;
	valBlock.vals = new Array();
	valBlock.vals.push(new Validator(controlTitle, controlID, type, param));
	validatorBlocks.push(valBlock);
}


function Validate_GetFormByControl(elem)
{
	if (elem.form!=null) return elem.form.id;
	while (elem.tagName!="FORM") elem = elem.parentNode;
	return elem.id;
}

function Validate_GetControl(controlID)
{
	var elem = document.getElementById(controlID);
	if (elem!=null) return elem;
	
	var elems = document.getElementsByName(controlID);
	if (elems!=null && elems.length>0) return elems[0];
	
	return null;
}

function ValidateControl(e)
{
	var elem = e!=null ? e.target : event.srcElement;
	var formID = elem.form.id;
	for (var i=0;i<validatorBlocks.length;i++)
	{
		var valBlock = validatorBlocks[i];
		if (valBlock.formID==formID)
		{
			ProcessValidators_inner(valBlock.vals, null);
			return; 
		}
	}
}

// конструктор Валидатора
// id - id элемента для проверки
// title - его название
// type - тип ("req" - обязательное поле)
// param - дополнительный параметр валидатора (регулярное выражение, например)
function Validator(title,id,type,param)
{
	this.title = title;
	this.id = id;
	this.type = type==null ? "req" : type;
	this.param = param;
	//this.prevOnClick = null;
	
	var elem = Validate_GetControl(id);
	if (elem!=null)
	{
		if ((elem.tagName=="INPUT" && elem.type.toLowerCase()!="submit" && elem.type.toLowerCase()!="radio")
		  || elem.tagName=="SELECT"
		  || elem.tagName=="TEXTAREA"
		) {
			elem.onkeyup = ValidateControl;
			elem.ontextchanged = ValidateControl;
			elem.onchange = ValidateControl;
		}
		else
		if (elem.tagName=="INPUT" && elem.type.toLowerCase()=="radio")
		{
			elem.onclick = ValidateControl;
		}
		else
		if (elem.tagName=="INPUT" && elem.type.toLowerCase()=="submit")
		{
			elem.onclick = Validate_SendClicked;
		}
		else
		if (elem.tagName=="TABLE" && (elem.className=="button" || elem.className=="button_disabled"))
		{
			if (validatorPrevOnClick==null) validatorPrevOnClick = new Array();
			validatorPrevOnClick[elem] = elem.onclick;
			elem.onclick = Validate_SendClicked;
		}
	}
}

function ProcessValidators(e)
{
	var form = e!=null ? e.target : event.srcElement;
	var formID = form.id;
	
	for (var i=0;i<validatorBlocks.length;i++)
	{
		if (validatorBlocks[i].formID==formID)
		{
			return ProcessValidators_inner(validatorBlocks[i].vals,formID +"_errorSummary"); 
		}
	}
	
	return true;
}

function ProcessValidators_inner(validators, summaryID)
{
	var tbSummary = null;
	if (summaryID!=null) tbSummary = document.getElementById(summaryID);
	if (tbSummary!=null) tbSummary.innerHTML = "";

	var isAllOK = true;
	
	var controlsWithError = new Array();
	
	var sum = "";
	
	for (var i=0;i<validators.length;i++)
	{
		var validator = validators[i];
		var isOK = ProcessValidator(validator);
		if (!isOK)
		{
			if (tbSummary!=null)
			{
				if (sum!="") sum += "<br />";
				sum += validator.title;
			}
			isAllOK = false;
			controlsWithError.push(Validate_GetControl(validator.id));
		}
		if (tbSummary!=null)
		{
			tbSummary.style.display = sum!="" && sum!=null ? "" : "none";
			tbSummary.innerHTML = sum;
		}
	}
	
	for (var i=0;i<validators.length;i++)
	{
		var validator = validators[i];
		var tb = Validate_GetControl(validator.id);
		var isWithError = false;
		for (var j=0;j<controlsWithError.length;j++) if (controlsWithError[j]==tb)
		{
			isWithError = true;
			break;
		}
		Validators_HighlightControl(tb, !isWithError);
	}
	
	Validators_EnableSubmit(validators, isAllOK);
	
	return isAllOK;
}

function Validators_EnableSubmit(validators, isEnable)
{
	for (var i=0;i<validators.length;i++)
	{
		var validator = validators[i];
		var elem = Validate_GetControl(validator.id);
		if (elem!=null)
		{
			if (elem.tagName=="INPUT" && elem.type.toLowerCase()=="submit") elem.className = isEnable ? "" : "disabled";
			if (elem.tagName=="TABLE" && (elem.className=="button" || elem.className=="button_disabled")) elem.className = isEnable ? "button" : "button_disabled";
		}		
	}
}

function ProcessValidator(validator)
{
	var tb = Validate_GetControl(validator.id);

	var r = true;
	if ((tb.tagName=="INPUT" && tb.type.toLowerCase()!="submit") || tb.tagName=="TEXTAREA")
	{
		if (validator.type=="req")
		{
			r = tb.value!=null && tb.value!="";
		}
		else
		if (validator.type=="equ")
		{
			var tb2 = Validate_GetControl(validator.param);
			r = tb2!=null && tb.value==tb2.value;
		}
		else
		if (validator.type=="regex")
		{
			try
			{
				var regex = new RegExp(validator.param, "i")
				r = regex.test(tb.value);
			}
			catch(error)
			{
				alert(error.description);
			}
		}
		else
		if (validator.type=="range")
		{
			var curValue = Validate_StrToNum(tb.value);
			var range;
			if (tb.value.indexOf("..")!=-1)
			{
				range = tb.value.split("..");
				range[0] = Validate_StrToNum(range[0]);
				range[1] = Validate_StrToNum(range[1]);
			}
			else
			{
				range = new Array();
				range.push(Validate_StrToNum(tb.value));
				range.push(null);
			}
			r = (range[0]==null || curValue>=range[0]) && (range[1]==null || curValue<=range[1]);
		}
		else
		if (validator.type=="custom")
		{
			r = eval(validator.param);
		}
	}
	else
	if (tb.tagName=="SELECT")
	{
		var val = tb.options[tb.selectedIndex].value;
		if (validator.type=="req") r = val!=null && val!="";
	}
	
	return r;
}

function Validate_SendClicked(e)
{
	var elem = e!=null ? e.currentTarget : event.srcElement;
	
	if (elem.tagName=="TD") elem = elem.parentNode.parentNode.parentNode;
	
	if (elem.className!="disabled" && elem.className!="button_disabled")
	{
		if (validatorPrevOnClick[elem]!=null) return validatorPrevOnClick[elem](e);
		return true;
	}
	
	var formID = Validate_GetFormByControl(elem);
	
	for (var i=0;i<validatorBlocks.length;i++)
	{
		var valBlock = validatorBlocks[i];
		if (valBlock.formID==formID)
		{
			var validators = validatorBlocks[i].vals;
			for (var i=0;i<validators.length;i++)
			{
				if (!ProcessValidator(validators[i]))
				{
					var tb = Validate_GetControl(validators[i].id);
					tb.focus();
					return false;
				}
			}
		}
	}
	
	return false;
}

function Validate_StrToNum(s)
{
	s = Number(String(s).replace(",","."));
	if (isNaN(s)) s = null;
	return s;
}

function Validators_HighlightControl(tb, isOK)
{
	var tbID = tb.id!=null && tb.id!="" ? tb.id : tb.name;
	if (tb.tagName=="INPUT" && tb.type.toLowerCase()!="submit")
	{
		var tbStar = Validate_GetControl(tbID+"_error");
		if (tbStar!=null) tbStar.style.color = isOK ? validatorStarColor_OK : validatorStarColor_ERROR;
	}
}

var validatorsFileLoaded = true;