//
// Done by ViaTecla, P.P. 21/10/2004
// validations.js : generic validations lib
//
// TODO: Use browser detection handler do getElementById

var K_TEXT=0, K_NUMBER=1, K_EMAIL=2, K_TEXTAREA=3; 
var ErrorFieldAlreadyFocused = false;

function IsNill(p){return (typeof(p)=="undefined")||p==null||String(p)=="";}	

//
// aDisplayName - Field name for user
// aId - Field id
// aType - one of : K_TEXT, K_NUMBER, K_EMAIL, K_TEXTAREA
// vmin - minimum length/value
// vmax - maximum length/value
// n - max lines for a text area, number of decimal places if number
// isMandatory - boolean, true if mandatory, false otherwise
// msgPlaceHolderId - id of an html element used to show the error messages, (optional).
// idToFocus - id of field to focus if validation failed
//
function Validate(aDisplayName, aId, aType, vmin, vmax, n, isMandatory, msgPlaceHolderId, idToFocus){
	ErrorFieldAlreadyFocused = false; 
	if (idToFocus == null)
		idToFocus=aId; 

	var aVar = document.getElementById(aId);
	
	if((!isMandatory) && ("" + aVar.value == ""))
		return true;
	
	var res = checkLengthAndAlert(aDisplayName, aVar.value, vmin, vmax, msgPlaceHolderId);

	if(res) { 
		if (checkField(aVar.value, aType, vmin, vmax, n))
			return true; 

		var errormsg = 'O campo \'' + aDisplayName + '\' não está preenchido correctamente.';
		WriteErrorMessage(msgPlaceHolderId, errormsg);
		checkFocus(idToFocus,aVar);
		return false;
	}
	checkFocus(idToFocus,aVar);
	return false;
}

function checkFocus(idToFocus, aVar){
	if (idToFocus == null) {
		if (!ErrorFieldAlreadyFocused)
			aVar.focus();
		ErrorFieldAlreadyFocused = true;
	}
	else 
		if (!IsNill(idToFocus)) {
			if (!ErrorFieldAlreadyFocused)
				document.getElementById(idToFocus).focus();
			ErrorFieldAlreadyFocused = true;
		}
}

function checkField(f, t, min, max, n)
{ 
	if (t==K_TEXT) return ValidateText(f,min,max,n); 
	if (t==K_NUMBER) return ValidateNumber(f,min,max,n); 
	if (t==K_EMAIL) return ValidateEmail(f,min,max); 
	if (t==K_TEXTAREA) return ValidateTextArea(f,min,max,n); 
	return true; 
} 

function checkLengthAndAlert(aDisplayName, val, vmin, vmax, msgPlaceHolderId) { 
	if ((vmin == null) || (vmax == null)) return true; 
	if ((vmin > 0) && (val.length == 0)) 
	{ 
		var errormsg = 'O campo \'' + aDisplayName + '\' tem de estar preenchido.';
		WriteErrorMessage(msgPlaceHolderId, errormsg);
		return false; 
	} 
	if (val.length < vmin) 
	{ 
		var errormsg = 'O campo \'' + aDisplayName + '\' tem de ter pelo menos ' + vmin + ' caracteres.';
		WriteErrorMessage(msgPlaceHolderId, errormsg);
		return false; 
	} 
	if (val.length > vmax) 
	{ 
		var errormsg = 'O campo \'' + aDisplayName + '\' não pode ter mais de ' + vmax + ' caracteres.';
		WriteErrorMessage(msgPlaceHolderId, errormsg);
		return false; 
	}		 
	return true; 
} 

function WriteErrorMessage(msgPlaceHolderId, errormsg, showErrorsFoundMsg)
{
	if (showErrorsFoundMsg == null)
		showErrorsFoundMsg = true;
	if (document.getElementById(msgPlaceHolderId))
		WriteSpanInnerHTML(msgPlaceHolderId, '&nbsp;' + errormsg + '<br/>');
	else if (document.getElementById('SPANID_ErrorGenericPlaceholder'))
		WriteSpanInnerHTML('SPANID_ErrorGenericPlaceholder', '&nbsp;' + errormsg + '<br/>');
	else
		alert(errormsg); 
	if (showErrorsFoundMsg)
	{
		// notify in the generic message placeholder that errors ocurred on the page.	
		if (document.getElementById('SPANID_ErrorGenericPlaceholder'))
		{
			var strErrorsFound = '&nbsp;Aten&#231;ão: Registaram-se erros na introdu&#231;ão dos dados.';
			var v1 = document.getElementById('SPANID_ErrorGenericPlaceholder').innerHTML;
			if ((v1+'').indexOf('Registaram-se erros na introdu') == -1)
				document.getElementById('SPANID_ErrorGenericPlaceholder').innerHTML = 
					strErrorsFound + '<br>' + 
					document.getElementById('SPANID_ErrorGenericPlaceholder').innerHTML;
		}
	}
}

function ValidateNumber( aValue, minVal, maxVal, decimalPlaces ) {
	if ( arguments.length < 4 )
		decimalPlaces = -1;
	if( isNaN( aValue ) )
		return 0;
	if( maxVal != -1 && aValue > maxVal )
		return 0;
	if( minVal != -1 && aValue < minVal )		
		return 0;
	if( decimalPlaces == -1 )
		return 1;
	var f = parseFloat( aValue );
	var decimals = f - Math.floor(f);
	if ( ( String(decimals).length - 2 ) > decimalPlaces )
		return 0;
	return 1;
}
function ValidateTextArea( aVal, minLen, maxLen, maxLineBreaks ) {
	var retVal = 1;
	retVal &= ValidateText( aVal, minLen, maxLen );
	if( retVal != 1)
		return retVal;
	var matches = aVal.match(/\r\n/g);
	if( matches == null )
		return 1;
	if( matches.length > maxLineBreaks )		
		return 0;
	return 1;
}
function ValidateText( aVal, minLen, maxLen ) {
	if( aVal == null )
		return 0;
	aVal  = String( aVal );
	if ( minLen != -1 && aVal.length > maxLen )
		return 0;
	if ( maxLen != -1 && aVal.length < minLen )
		return 0;
	return 1;
}
function ValidateEmail( aEmail ) {
	// s.match(/\w+[.]?\w*@\w+[.]\w+/g); // regex for e-mail
	if ( aEmail == null )
		return 0;
	if ( aEmail == "" )
		return 0;
	aEmail = String(aEmail);
	if ( aEmail.length < 6 )
		return 0;
	if ( aEmail.indexOf(".") == 0 || aEmail.indexOf(".") == ( aEmail.length - 1) )
		return 0;
	if ( aEmail.indexOf(".") == -1 || aEmail.indexOf("@") == - 1 )
		return 0;
	return 1;
}



