
function updateValidatorPos()
{
	var domInput = document.getElementById(document.curInputId);
	if (domInput == null)
		return;
	var posInfo = findPos(domInput);
	var domValidator = document.getElementById("validatorTooltip");
	domValidator.style.top = (posInfo.top - 21) + 'px';
	domValidator.style.left = (posInfo.left + domInput.offsetWidth - domValidator.offsetWidth) + 'px';
}

function showValidatorTooltip(inputId, visible, msgType, msgId)
{
	document.curInputId = inputId;
	var domValidator = document.getElementById("validatorTooltip");
	var domValidatorDefErrMsg = document.getElementById("validatorDefErrorMsg");
	var domValidatorErrMsg;
	if (msgId != null)
		domValidatorErrMsg = document.getElementById(msgId);
	else
		domValidatorErrMsg = domValidatorDefErrMsg;
	domValidatorDefErrMsg.style.display = 'none';
	for (curMsgId in document.taveoValidatorData.customMsgIdList)
	{
		var domMsg = document.getElementById(document.taveoValidatorData.customMsgIdList[curMsgId]);
		if (domMsg != null)
			domMsg.style.display = 'none';
	}
	if (visible)
	{
		switch (msgType)
		{
			case 'error':
				domValidatorErrMsg.style.display = 'inline';
				break;
		}
		updateValidatorPos();
		domValidator.style.visibility = 'visible';
	}
	else
	{
		domValidator.style.visibility = 'hidden';
	}
}

function setValidatorInfo(desc)
{
	document.taveoValidatorData = new Object();
	document.taveoValidatorData.customMsgIdList = new Array();
	document.taveoValidatorData.fieldsToValidate = new Array();
	document.taveoValidatorData.requiredFields = new Array();
	var fieldsToValidate = document.taveoValidatorData.fieldsToValidate;
	for (var descId in desc)
	{
		fieldsToValidate.push(descId);
		var domObj = document.getElementById(descId);
		for (var prop in desc[descId])
		{
			var propValue = desc[descId][prop];
			switch (prop)
			{
				case 'charsMask':
					domObj.charsMaskVal = propValue;
					domObj.filterInputText = function()
					{
//						var selPos = this.selectionStart;
						var regexp = new RegExp("[^" + this.charsMaskVal + "]","g");
						this.value = this.value.replace(regexp, '');
//						this.selectionStart = selPos;
//						this.selectionStop = 1;
					};
					domObj.isValidChar = function(chr)
					{
						var regexp = new RegExp("[^" + this.charsMaskVal + "]","g");
						return !regexp.test(chr);
					};
					break;
				case 'format':
					domObj.formatVal = propValue;
					domObj.errMsgId = desc[descId]['errMsgId'];
					if (domObj.errMsgId != null)
						document.taveoValidatorData.customMsgIdList.push(domObj.errMsgId);
					
					var reformatVal = desc[descId]['reformat'];
					if (reformatVal != null)
					{
						domObj.reformatVal = '';
						var curOutputVal = reformatVal;
						var matches;
						do
						{
							var regexp = new RegExp('^(.*?)\{([0-9]+)\}(.*?)$', "g");
							matches = regexp.exec(curOutputVal);
							if (matches != null)
							{
								if (matches[1] != '')
								{
									if (domObj.reformatVal.length > 0)
										domObj.reformatVal += ' + ';
									domObj.reformatVal += "'" + matches[1] + "'";
								}
								if (matches[2] != '')
								{
									if (domObj.reformatVal.length > 0)
										domObj.reformatVal += ' + ';
									domObj.reformatVal += 'matches[' + matches[2] + ']';
								}
								if (matches[3] != '')
									curOutputVal = matches[3];
								else
									break;
							}
						}
						while (matches != null);
					}
					break;
				case 'required':
				case 'requiredId':
					var required = desc[descId]['required'];
					if ((required != null) && !required)
						break;
					var requiredId = desc[descId]['requiredId'];
					var requiredFields = document.taveoValidatorData.requiredFields;
					var requiredEntry = new Object( {'inputIdList': new Array(descId)} );
					var alreadyAdded = false;
					if (requiredId != null)
					{
						for (rFieldIdx in requiredFields)
						{
							if (requiredFields[rFieldIdx].id == requiredId)
							{
								alreadyAdded = true;
								requiredFields[rFieldIdx].inputIdList.push(descId);
								break;
							}
						}
						requiredEntry.id = requiredId;
					}
					if (!alreadyAdded)
						requiredFields.push(requiredEntry);
					break;
			}
		}
		
		domObj.isValid = function(changeInputStyle, showTooltip, checkReqFields)
		{
			if (checkReqFields)
			{
				var requiredFields = document.taveoValidatorData.requiredFields;
				for (rFieldIdx in requiredFields)
				{
					var inputIdList = requiredFields[rFieldIdx].inputIdList;
					var isValid = false;
					var isRuleForThis = false;
					for (idx in inputIdList)
					{
						var domInput = document.getElementById(inputIdList[idx]);
						if (domInput != null)
						{
							if (domInput.id == this.id)
								isRuleForThis = true;
							if (domInput.value != '')
							{
								isValid = true;
								break;
							}
						}
					}
					if (isRuleForThis)
					{
						if (!isValid)
						{
							if (showTooltip)
								showValidatorTooltip(this.id, false, null, null);
							for (idx in inputIdList)
							{
								var domInput = document.getElementById(inputIdList[idx]);
								if (domInput.isValid(false, false, false))
									domInput.className = 'validatorError';
							}
							return false;
						}
						else
						{
							if (isValid && changeInputStyle)
							{
								for (idx in inputIdList)
								{
									var domInput = document.getElementById(inputIdList[idx]);
									if (domInput.isValid(false, false, false))
										domInput.className = 'validatorOk';
								}
							}
							break;
						}
					}
				}
			}
			
			if (this.value != '')
			{
				var domValidator = document.getElementById("validatorTooltip");
				var domValidatorErrMsg = document.getElementById("validatorTooltipErrorMsg");
				if (this.formatVal != null)
				{
					var regexp = new RegExp(this.formatVal, "g");
					var matches = regexp.exec(this.value);
					if (matches != null)
					{
						if (this.reformatVal != null)
						{
							var outputVal = '';
							eval('outputVal = ' + this.reformatVal);
							this.value = outputVal;
						}
					}
					else
					{
						if (showTooltip)
							showValidatorTooltip(this.id, true, 'error', this.errMsgId);
						if (changeInputStyle)
							this.className = 'validatorError';
						return false;
					}
				}
			}
			if (showTooltip)
				showValidatorTooltip(this.id, false, null, null);
			if (changeInputStyle)
				this.className = 'validatorOk';
			return true;
		};
		
		domObj.onkeydown = function(evt)
		{
			var code;
			var e = evt;
			if (e == null)
				e = window.event;
//			dumpObj(e);
			if (e.keyCode != null)
				code = e.keyCode;
			else if (e.which != null)
				code = e.which;
			else
				return true;
			
			if ((this.isValidChar == null) || e.ctrlKey)
				return true;
			
//			alert(code);
			var chr;
			if (code == 190)
				chr = '.';
			else if (code == 61)
				chr = '+';
			else
				chr = String.fromCharCode(code);
			return (this.isValidChar(chr) 
				|| (e.keyCode == 8) // Backspace
				|| (e.keyCode == 9) // Tab
				|| (e.keyCode == 16) // Shift
				|| (e.keyCode == 17) // Ctrl
				|| (e.keyCode == 18) // Alt
				|| (e.keyCode == 35) // End
				|| (e.keyCode == 36) // Home
				|| (e.keyCode == 37) // Left arrow
				|| (e.keyCode == 38) // Top arrow
				|| (e.keyCode == 39) // Right arrow
				|| (e.keyCode == 40) // Bottom arrow
				|| (e.keyCode == 45) // Insert
				|| (e.keyCode == 46) // Suppr
				|| (e.keyCode == 91) // Windows
				);
		};
		
		domObj.onblur = function()
		{
			if (this.filterInputText != null)
				this.filterInputText();
			this.isValid(true, true, true);
			return true;
		}
		
/*		domObj.onkeyup = function()
		{
			this.onblur();
		};*/
		
		domObj.onchange = function()
		{
			this.isValid(true, true, true);
		};
	}
	
	updateValidatorPos();
	
	var fieldsToValidate = document.taveoValidatorData.fieldsToValidate;
	if (fieldsToValidate == null)
		return;
	for (fieldIdx in fieldsToValidate)
	{
		var domInput = document.getElementById(fieldsToValidate[fieldIdx]);
		domInput.isValid(true, false, true);
	}
}

function validateForm()
{
	var fieldsToValidate = document.taveoValidatorData.fieldsToValidate;
	if (fieldsToValidate == null)
		return true;
	for (fieldIdx in fieldsToValidate)
	{
		var domInput = document.getElementById(fieldsToValidate[fieldIdx]);
		if (!domInput.isValid(true, false, true))
		{
			alert('Veuillez compléter les champs marqués en rouge.');
			return false;
		}
	}
	return true;
}

