//
// 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, K_DATE=4; 
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; 
	ErrorAlreadyShowed = false;
	if (idToFocus == null)
		idToFocus=aId; 

	var aVar = document.getElementById(aId);
	
	if((!isMandatory) && ("" + aVar.value == ""))
		return true;

	var res = checkLengthAndAlert(aDisplayName, aVar.value, aType, vmin, vmax, msgPlaceHolderId);

	if(res) { 
		if (checkField(aDisplayName, 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 ValidateByReference( aDisplayName, aVar, aType, vmin, vmax, n, isMandatory, msgPlaceHolderId ) {
	ErrorFieldAlreadyFocused = false; 
	ErrorAlreadyShowed = false;
	if((!isMandatory) && ("" + aVar.value == ""))
		return true;

	var res = checkLengthAndAlert(aDisplayName, aVar.value, aType, vmin, vmax, msgPlaceHolderId);

	if(res) { 
		if (checkField(aDisplayName, aVar.value, aType, vmin, vmax, n))
			return true; 

		var errormsg = 'O campo \'' + aDisplayName + '\' não está preenchido correctamente.';
		WriteErrorMessage(null, errormsg);
		checkFocus(null,aVar);
		return false;
	}
	checkFocus(null,aVar);
	return false;
}

function ValidateCollection( aDisplayName, aName, aType, vMin, vMax, n, isMandatory, msgPlaceHolderId ) {

	var retVal = 1;
	var colFNames = document.getElementsByName( aName );
	for( var i=0; i<colFNames.length; ++i ) {
		var aInput = colFNames[i];
		retVal &= ValidateByReference( aDisplayName, aInput, aType, vMin, vMax, n, isMandatory, msgPlaceHolderId );
		if( !retVal )
			return retVal;
	}
	return retVal;
}

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(aDisplayName, f, t, min, max, n)
{ 
	if (t==K_TEXT) return ValidateText(f,min,max,n); 
	if (t==K_NUMBER) return ValidateNumber(aDisplayName,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, type, vmin, vmax, msgPlaceHolderId) { 
	if( type == K_NUMBER ) {
		if( val.length == 0 ) {
			var errormsg = 'O campo \'' + aDisplayName + '\' tem de estar preenchido.';
			WriteErrorMessage(msgPlaceHolderId, errormsg);
			return false; 
		}
		return true;
	}
	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 ((vmin == vmax) && ((val.length < vmin) || (val.length > vmax))) 
	{ 
		var errormsg = 'O campo \'' + aDisplayName + '\' tem de ter ' + vmin + ' caracteres.';
		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 {
		if( !ErrorAlreadyShowed )
			alert(errormsg); 
		ErrorAlreadyShowed = true;
	}
	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( aDisplayName, aValue, minVal, maxVal, decimalPlaces ) {
	if ( arguments.length < 4 )
		decimalPlaces = -1;
	if( isNaN( aValue ) )
		return 0;
	if( maxVal != -1 && aValue > maxVal ) {
		var errormsg = 'O campo \'' + aDisplayName + '\' não pode ser superior a ' + maxVal + ' .';
		WriteErrorMessage(null, errormsg);
		return 0;
	}		
	if( minVal != -1 && aValue < minVal ) {		
		var errormsg = 'O campo \'' + aDisplayName + '\' não pode ser inferior a ' + minVal + ' .';
		WriteErrorMessage(null, errormsg);
		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;
}
//função que retira os espaços iniciais e finais; usa RegularExp
function Trim(str)
{
	return str.replace(/^\s+|\s+$/, '');
}
//função que substitui os caracteres com acentos por outros iguais sem acentos
function RetiraAcentos(Campo)
{
   var Acentos = "%E1%E0%E3%E2%E2%C1%C0%C3%C2%E9%EA%C9%CA%ED%CD%F3%F5%F4%D3%D4%D5%FA%DA%DC%E7%C7"; 
   var Traducao = "aaaaaAAAAeeEEiIoooOOOuUUcC";
   var Posic, Carac;
   var TempLog = "";
   for (var i=0; i < Campo.length; i++)
   {      
			Carac = Campo.charAt(i);
			Posic  = Acentos.indexOf(escape(Carac));
			if (Posic > -1 && escape(Carac).length > 1)
			{
				TempLog += Traducao.charAt(Posic / 3);
				//alert("sim" + Posic);
			}
			else
			{
				TempLog += Campo.charAt(i);
				//alert("nao" + Posic);
			}
   }
   
return (TempLog);
}
//função: Retira espaços vazios antes e depois...
//...so aceita caracteres de A a Z e se for espaço dá uma mensagem própria
//chama a função RetiraAcentos() e Trim()
function VerifyChar(str, aName, index, aDescName)
{
		var retVal = 1;
		str = RetiraAcentos(Trim(str));
		str = String(str);
		str = str.toUpperCase();
		//alert(str);
		var ch;
		
		for (var i = 0; i < str.length; i++)
		{
			ch = str.charAt(i);	    
			if ((ch < "A" || "Z" < ch))
			{
				if (ch == " ")
					alert("O campo '" + aDescName + "' não pode conter espaços.");
				else if ( !isNaN(ch) )
				  alert("O campo '" + aDescName + "' não pode conter números.");
				else
					alert("O campo '" + aDescName + "' têm o seguinte carácter inválido: '" + ch + "'");
					
				document.getElementsByName( aName )[index].focus();
				retVal = false;
				break;				
			}
		}	

return retVal;
}
//Validar a Collections dos campos que são passados.
function ValidarCamposCol( aName, aDescName )
{	
	var retVal = 1;	
	var colFNames = document.getElementsByName( aName );
	for( var i=0; i<colFNames.length; ++i ) {		
		var aInput = colFNames[i];
		retVal = VerifyChar(aInput.value, aName, i, aDescName);
		if (!retVal)
			return retVal;
	}
	
	return retVal;	
}
//Validar a Data de Nascimentos dos Bébés e das Crianças
function ValidateAges()
{
  var retVal = 1;
  var date = new Date();
  var depart = new Date();
  var dateAux;
  var today;
  var isleap;
  var feb;
  //
  var types = document.getElementsByName('PassengerType');
  var days = document.getElementsByName('BirthDateDay');
  var months = document.getElementsByName('BirthDateMonth');
  var years = document.getElementsByName('BirthDateYear');
  var dep = document.getElementById('DepartureDate').value;

  for (var i=0; i < types.length; i++)
  {
		if (types[i].value == "IN")
    {
			isleap = (years[i].value % 4 == 0 && (years[i].value % 100 != 0 || years[i].value % 400 == 0));
      feb = (Number(months[i].value) == 2 && (Number(days[i].value) > 29 || (Number(days[i].value) == 29 && !isleap)));
      date.setFullYear(Number(years[i].value),Number(months[i].value) - 1,Number(days[i].value));
      depart.setFullYear(Number(dep.split('/')[0]),Number(dep.split('/')[1]) -1 ,Number(dep.split('/')[2]) );                  
      //
      today = new Date();                       
			
			depart.setYear(depart.getYear() - 2);

      if ( feb || ((Number(months[i].value)==4 || Number(months[i].value)==6 || Number(months[i].value)==9 || Number(months[i].value)==11) && Number(days[i].value)==31))
      {
				alert("Data de nascimento do passageiro " + (i + 1) + " incorrecta.");
				
        retVal = 0;
      }
			else if (date.getTime() <= depart.getTime())
			{
				alert("O passageiro " + (i + 1) + " possui mais de 2 anos no dia de partida.");
        
        retVal = 0;
      }
      else if (date.getTime() > today.getTime())
      {                       
				alert("Data de nascimento do passageiro " + (i + 1) + " maior que a data de hoje.");
        
        retVal = 0;
	    }
		}

		if (types[i].value == "CH")
		{
			dateAux = new Date();
			isleap = (years[i].value % 4 == 0 && (years[i].value % 100 != 0 || years[i].value % 400 == 0));
			feb = (Number(months[i].value) == 2 && (Number(days[i].value) > 29 || (Number(days[i].value) == 29 && !isleap)));
			date.setFullYear(Number(years[i].value),Number(months[i].value) - 1,Number(days[i].value));     
			depart.setFullYear(Number(dep.split('/')[0]),Number(dep.split('/')[1]) - 1,Number(dep.split('/')[2]) );
			//date = new Date();
			//date.setFullYear(Number(years[i].value),Number(months[i].value) - 1,Number(days[i].value));
			depart.setYear(depart.getYear() - 12);
			//alert(date.getDate() + "/" + date.getMonth()  + "/" + date.getYear() + ">" + depart.getDate() + "/" + depart.getMonth() + "/" + depart.getFullYear());           
			//alert(date.getTime() +">"+ depart.getTime());
			dateAux.setFullYear(Number(dep.split('/')[0]),Number(dep.split('/')[1]) -1 ,Number(dep.split('/')[2]) );
			dateAux.setYear(dateAux.getYear() - 2);
			//alert(date.dateAux.getFullYear());                  
			if ( feb || ((Number(months[i].value)==4 || Number(months[i].value)==6 || Number(months[i].value)==9 || Number(months[i].value)==11) && Number(days[i].value)==31))
			{ 
				alert("Data de nascimento do passageiro " + (i + 1) + " incorrecta.");
				
				retVal = 0;
			}
			else if (date.getTime() <= depart.getTime())
			{				                                         
				alert("O passageiro " + (i + 1) + " possui mais de 11 anos no dia de partida.");				
				
				retVal = 0;
			}
			else if (date.getTime() > dateAux.getTime())
			{	
				alert("O passageiro " + (i + 1) + " tem menos de 2 anos.");

				retVal = 0;
			}
		}                 
	}

  return retVal;
}
