//-----------------------------------------------------------------
// validacoes_1.js
//
// funções auxiliares para validações de forms
//
// copyright (c) 2000 Ponto.C - Desenv. Sistemas de Informação, Lda 
//
//Autor: Nuno Santos
//Alterada por: Margarida Fernandes
//-----------------------------------------------------------------

//Inicio funções de ajuda************************************************************

// permite verificar se um elemento passado é um objecto
function SPW_JS_IsObject(eElem)
{
	var isObj = false;

	if (eElem.toString().indexOf('object') > 0)
		isObj = true;
		
	return isObj
}

//permite fazer o replace para mostrar as msg nas linguas definidas pelo sistema
function SPW_JS_ReplaceAll( str, replacements ) {
   
    for ( i = 0; i < replacements.length; i++ ) {
    
		str = str.replace("{%"+(i+1)+"}",replacements[i]);

    }
    return str;
}

// Função para introduzir o focus
function SPW_JS_SetFocus(campo){
	if (SPW_JS_IsObject(campo))
	{		
		if (campo.focus)
		{
			try	{
				campo.focus();
			}
			catch(ex)
			{}
		}
	}
}
//mostra msg de erro e coloca o ponteiro no input
function SPW_JS_MsgErro(theForm,campo,descerro,radio)
{
	if (SPW_JS_IsObject(campo))
		var cam = campo;
	else
		var cam = eval(theForm + "." + campo);
		
	SPW_JS_MsgErroShow(descerro);
	if (radio > 1)
		SPW_JS_SetFocus(cam[0]);
	else
		SPW_JS_SetFocus(cam);
}

//mostra msg de erro
function SPW_JS_MsgErroShow(descerro)
{	
	alert(descerro);	
}

//validar hora
function SPW_JS_Hora(checkStr) {

	var date = checkStr.split(':');
	var num = date.length;
                                
	var hora = date[0];
	var minutos = date[1];

	if (Number(hora) < 0 || Number(hora) > 23 || hora == "") {
		return (false);
	}
	if (Number(minutos) < 0  || Number(minutos) > 59 || minutos == "" ) {
		return (false);
	}
      	if (Number(hora) == 24 ) {
		if (Number(minutos) != 0 ) {
			return (false);
		}	  
	}        
	return (true);
}

//validar nº de horas (as horas não são limitadas a 24)
function SPW_JS_NumHora(checkStr) {

	var date = checkStr.split(':');
	var num = date.length;
                                
	var hora = date[0];
	var minutos = date[1];

	if (Number(hora) < 0 || hora == "") {
		return (false);
	}
	if (Number(minutos) < 0  || Number(minutos) > 59 || minutos == "" ) {
		return (false);
	}
      	     
	return (true);
}						

//ver se é ano bisexto
function SPW_JS_IsLeapYear(y) 
{
	return (y % 4 == 0  && (y % 400 == 0 || y % 100 != 0))
}

//validar data 
function SPW_JS_Data(checkStr,tipo) {

//tipo = 0 = ddmmaaaa
//tipo = 1 = aaaammdd
//tipo = 2 = aaaaddmm

	var daysOfMonth = new Object();
	daysOfMonth ['Jan'] = daysOfMonth ['January']   = daysOfMonth [1] = 31;
	daysOfMonth ['Feb'] = daysOfMonth ['February']  = daysOfMonth [2] = 28;
	daysOfMonth ['Mar'] = daysOfMonth ['March']     = daysOfMonth [3] = 31;
	daysOfMonth ['Apr'] = daysOfMonth ['April']     = daysOfMonth [4] = 30;
	daysOfMonth ['May'] = daysOfMonth ['May']       = daysOfMonth [5] = 31;
	daysOfMonth ['Jun'] = daysOfMonth ['June']      = daysOfMonth [6] = 30;
	daysOfMonth ['Jul'] = daysOfMonth ['July']      = daysOfMonth [7] = 31;
	daysOfMonth ['Aug'] = daysOfMonth ['August']    = daysOfMonth [8] = 31;
	daysOfMonth ['Sep'] = daysOfMonth ['September'] = daysOfMonth [9] = 30;
	daysOfMonth ['Oct'] = daysOfMonth ['October']   = daysOfMonth [10] = 31;
	daysOfMonth ['Nov'] = daysOfMonth ['November']  = daysOfMonth [11] = 30;
	daysOfMonth ['Dec'] = daysOfMonth ['December']  = daysOfMonth [12] = 31;
		
	if (checkStr.search("/") > -1)
		var date = checkStr.split('/');
	else if (checkStr.search("-") > -1)
		var date = checkStr.split('-');
	else
		return (false);
		
	var num = date.length;
	if (num != 3)
		return (false);
	
	var month = Number(date[1]);
	var day = Number(date[2]);
	var year = Number(date[0]);
	
	if (tipo == "0")	  
	{
		day = Number(date[0]);
		month = Number(date[1]);
		year = Number(date[2]);
	}
	if (tipo == "1")	  
	{
		month = Number(date[1]);
		day = Number(date[2]);
		year = Number(date[0]);
	}
	if (tipo == "2")	  
	{
		month = Number(date[2]);
		day = Number(date[1]);
		year = Number(date[0]);
	}
			
	if (month < 1 || month > 12 || month == "")
		return (false);

	if (day < 1  || day == "")
		return (false);
  
	if (month == 2 && SPW_JS_IsLeapYear(year))
		var dayLimit = 29;
	else 
		var dayLimit = daysOfMonth[month];
	
	if (day > dayLimit)
		return (false);
 
	if (year < 1000 || year == "" || year > 9999)
		return (false);
	
	return (true);
}					  

//validar email (esta função tarda muito com strings um pouco maiores)
function SPW_JS_Email(checkStr) 
{
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(checkStr))
	{
		return (true);
	}

return (false)
}


//validar email
function SPW_JS_Email1(checkStr) 
{
	var Viarroba = false;
	var Viponto = false;
	var Vispace = false;
	var i ;
	for (i = 0;  i < checkStr.length;  i++) {
		ch = checkStr.charAt(i);
		if (ch == "@") {
			Viarroba = true;
		} 
	}
	
	for (i = 0;  i < checkStr.length;  i++) {
		ch = checkStr.charAt(i);
		if (ch == ".") {
			Viponto = true;
		} 
	}

	for (i = 0;  i < checkStr.length;  i++) {
		ch = checkStr.charAt(i);
		if (ch == " ") {
			Vispace = true;
		} 
	}

	if (!Viarroba || !Viponto || Vispace)
		return (false);

return (true)
}

//função para ver se encontrou o caracter ' ou |
function SPW_JS_CaracteresEsp(checkStr) {

	var checkOK = "'|";
	var i ;
	for (i = 0;  i < checkStr.length;  i++) {
		ch = checkStr.charAt(i);
		for (j = 0;  j < checkOK.length;  j++)
		if (ch == checkOK.charAt(j)) {
			return (false);
		} 
	}
	return (true);
}

//verifica espaços
function SPW_JS_Espacos(checkStr)
{	
	var checkOk = " ";
	var i;
	var j;
	j = 0;
	
	for (i = 0; i  < checkStr.length; i++)
	{
		ch = checkStr.charAt(i);
		if (ch == checkOk.charAt(0))
			j ++;
	}
	
	if (j == i)
		return (false);
		
	return (true);
}

//função para ver se encontrou caracteres não permitidos pelo programador
//Retorna falso se encontrou, true caso contrário
function SPW_JS_ScanP(checkStr,checkOK) {

	var i ;
	for (i = 0;  i < checkStr.length;  i++) {
		ch = checkStr.charAt(i);
		for (j = 0;  j < checkOK.length;  j++)
			if (ch == checkOK.charAt(j)) {
				return (false);
			} 
	}
	return (true);
}

//função para ver se os caracteres usados são os pretendidos
//True se forem só caracteres válidos, false caso contrário
function SPW_JS_Scan(checkStr,checkOK) {

	for (i = 0;  i < checkStr.length;  i++) {
		ch = checkStr.charAt(i);
		for (j = 0;  j < checkOK.length;  j++)
			if (ch == checkOK.charAt(j))
				break;
		if (j == checkOK.length)  {
			return (false);
			break;
		}
	}
	return (true);
}

//valida um numero dado 
function SPW_JS_Num(checkStr,NumCasasInt,NumCasasDec)
{	
	if (Number(NumCasasInt) < 0) 
		NumCasasInt = 1;
	
	if (!Number(NumCasasInt)) 
		NumCasasInt = 1;
	
	if (Number(NumCasasDec) < 0)
		NumCasasDec = 1;
	
	if (!Number(NumCasasDec))
		NumCasasDec = 1;
	//******************************************************
	
	var ponto = checkStr.indexOf(".");
	var virgula = checkStr.indexOf(",");
	
	if (ponto > -1)
		var str = checkStr.split(".");
	else if (virgula > -1)
		var str = checkStr.split(",");
	else
	{
		var str = checkStr;
		if (!Number(str) && str != 0)
			return(false);
		else
		{
			if (str.length > NumCasasInt)
				return(false);
			else
				return(true);
		}				
	}
	
	if (!Number(str[0]) && str[0] != 0)
		return(false);
	
	if (!Number(str[1]) && str[1] != 0)
		return(false);
	
	var menos = checkStr.indexOf("-");
	if (menos > -1)
		NumCasasInt = NumCasasInt + 1;
	if (str[0].length > Number(NumCasasInt))
		return(false);
	
	if (str[1].length > Number(NumCasasDec))
		return(false);
	
return(true);
}

//validar hora
//Alterada pela Margarida para conter segundos no tipo opt=2
function SPW_validar_hora(checkStr,opt) {

	var date = checkStr.split(':');
	var num = date.length;
	
	if (opt == 1) {
		if (num < 1 || num > 2)
			return (false);       
		if (date[1] == ":")
			return (false);                      		                   
	}
	else {
		if (num != 2 && num !=3)
			return (false);       
		if (date[1] == ":")
			return (false);       
	}
                                
	var hora = date[0];
	var minutos = date[1];
	
	if (Number(hora) < 0 || Number(hora) > 23 || hora == "") {
		return (false);
	}
	if (Number(minutos) < 0  || Number(minutos) > 59 || minutos == "" ) {
		return (false);
	}
      	if (Number(hora) == 24 ) {
		if (Number(minutos) != 0 ) {
			return (false);
		}	  
	}
	if (num ==3){
		var segundos = date[2];
		
		if (Number(segundos) < 0  || Number(segundos) > 59 || segundos == "" ) {
			return (false);
		}
		if (Number(hora) == 24 ) {
			if (Number(segundos) != 0 ) {
				return (false);
			}	  
		}
	}        
	return (true);
}

function SPW_JS_Trim (s) {
	if (s.length == 0) return s;
    return s.replace(/^\s*(.*?)\s*$/,'$1');
}

// Check whether string s is empty.
function SPW_JS_IsEmpty(s)
{
	return (s == null || s.length == 0 || SPW_JS_Trim (s).length == 0)
}

// Returns true if character c is a digit
// (0 .. 9).
function SPW_JS_IsDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

// isInteger (STRING s)
//
// Returns true if all characters in string s are numbers.
//
// Accepts non-signed integers only. Does not accept floating
// point, exponential notation, etc.
function SPW_JS_IsInteger (s)
{
    if (SPW_JS_IsEmpty(s)) return false;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (var i = 0; i < s.length; i++)
    {
        // Check that current character is number.
        var c = s.charAt(i);

        if (!SPW_JS_IsDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}

// isSignedInteger (STRING s)
//
// Returns true if all characters are numbers;
// first character is allowed to be + or - as well.
//
// Does not accept floating point, exponential notation, etc.
function SPW_JS_IsSignedInteger (s)
{
    if (SPW_JS_IsEmpty(s)) return false;

    else {
        var startPos = 0;

        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;
        return (SPW_JS_IsInteger(s.substring(startPos, s.length)))
    }
}


// isPositiveInteger (STRING s)
//
// Returns true if string s is an integer > 0.
function SPW_JS_IsPositiveInteger (s)
{
    if (SPW_JS_IsEmpty(s)) return false;

    return (SPW_JS_IsSignedInteger(s) && Number (s) > 0);
}

//Verifica se o Numero de Contribuinte está correcto
//Valida Unicamente NIF portugueses
function SPW_JS_IsNumContribuinte(s){
    // se o NIF vier com as duas letras retiro-as...
    if (!Number(s.substring(0,2)))
    {
        s = s.substring(2,s.length);
    }
        
	if (s.length!=9 || !SPW_JS_IsPositiveInteger(s)) {
		return false;
	}

	var soma,resto,digi;
    var nif = new Array(9);
  	for (var i=0;i<9;i++) {
    	nif[i] = Number(s.substring(i,i+1));
  	}
  	for (var i=0,soma=0;i<8;i++) {
    	soma += nif[i]*(9-i);
  	}
  	resto = soma%11;
  	digi = 11-resto;
  	if (digi>9) digi=0;
  	return (digi==nif[8]);
}



//Fim funções de ajuda***************************************************************
//***********************************************************************************

//INICIO funções de validação********************************************************
//***********************************************************************************
//Valida uma data obrigatoria
function SPW_JS_ValidaDataObg(theForm,campo,nome,tipo)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value == "")
	{
		msgErro = SPW_JS_ReplaceAll(msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
	if (!SPW_JS_Scan(ncamp.value,"0123456789/-"))
	{
		msgErro = SPW_JS_ReplaceAll(msgStrDataInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (!SPW_JS_Data(ncamp.value,tipo))
	{
		msgErro = SPW_JS_ReplaceAll(msgStrDataInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
return(true);
}

//Valida uma data opcional
function SPW_JS_ValidaDataOpc(theForm,campo,nome,tipo)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value != "")
	{
		if (!SPW_JS_Data(ncamp.value,tipo))
		{
			msgErro = SPW_JS_ReplaceAll(msgStrDataInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	}

	if (!SPW_JS_Scan(ncamp.value,"0123456789/-"))
	{
		msgErro = SPW_JS_ReplaceAll(msgStrDataInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

return(true);
}


//Valida hora obrigatória
function SPW_JS_ValidaHoraObg(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value == "")
	{
		msgErro = SPW_JS_ReplaceAll(msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
		
	if (!SPW_JS_Scan(ncamp.value,"0123456789:"))
	{
		msgErro = SPW_JS_ReplaceAll(msgStrHoraInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	//verifica que a hora não seja 00:00
	//Busca todos os zeros da hora
	//verifica que o comprimento da string obtida é >= 7
	//se a hora for 00:00 a string obtida é: 0,0,0,0
	if (ncamp.value.toString().indexOf("0") > 0){
		if (ncamp.value.toString().match(/0/g).toString().length >= 7)
		{
			msgErro = SPW_JS_ReplaceAll(msgStrObg, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	}

	if (ncamp.value != "")
	{	
		if (!SPW_validar_hora(ncamp.value,2))
		{
			msgErro = SPW_JS_ReplaceAll(msgStrHoraInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	}	

return(true);
}

//Valida hora obrigatória com segundos
function SPW_JS_ValidaHoraSegObg(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value == "")
	{
		msgErro = SPW_JS_ReplaceAll(msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
		
	if (!SPW_JS_Scan(ncamp.value,"0123456789:"))
	{
		msgErro = SPW_JS_ReplaceAll(msgStrHoraSegInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (ncamp.value != "")
	{	
		if (!SPW_validar_hora(ncamp.value,2))
		{
			msgErro = SPW_JS_ReplaceAll(msgStrHoraSegInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	}
		
return(true);
}

//Valida hora opcional
function SPW_JS_ValidaHoraOpc(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (!SPW_JS_Scan(ncamp.value,"0123456789:"))
	{
		msgErro = SPW_JS_ReplaceAll(msgStrHoraInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (ncamp.value != "")
	{	
		if (!SPW_validar_hora(ncamp.value,2))
		{
			msgErro = SPW_JS_ReplaceAll(msgStrHoraInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	}

return(true);
}

//Valida Nº de horas obrigatória
function SPW_JS_ValidaNumHoraObg(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value == "")
	{
		msgErro = SPW_JS_ReplaceAll(msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
	if (!SPW_JS_Scan(ncamp.value,"0123456789:"))
	{
		msgErro = SPW_JS_ReplaceAll(msgStrHoraInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (ncamp.value != "")
	{	
		if (!SPW_JS_NumHora(ncamp.value))
		{
			msgErro = SPW_JS_ReplaceAll(msgStrHoraInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	}

return(true);
}

//Valida Nº de horas opcional
function SPW_JS_ValidaNumHoraOpc(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (!SPW_JS_Scan(ncamp.value,"0123456789:"))
	{
		msgErro = SPW_JS_ReplaceAll(msgStrHoraInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (ncamp.value != "")
	{	
		if (!SPW_JS_NumHora(ncamp.value))
		{
			msgErro = SPW_JS_ReplaceAll(msgStrHoraInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	}

return(true);
}

//Valida uma string obrigatoria
//CNPPU = Caracteres Não Permitidos Pelo Utilizador
//NotValCE = não valida caracteres especias ' e | true/false
function SPW_JS_ValidaStrObg(theForm,campo,len,nome,CNPPU,NotValCE)
{	
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
		
	if (!SPW_JS_Espacos(ncamp.value))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	if (!NotValCE)
	{
		if (!SPW_JS_CaracteresEsp(ncamp.value))
		{
			msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [["'|"], [nome]]);
			SPW_JS_MsgErro(theForm,campo,msgErro);		
			return(false);
		}
	}

	if (CNPPU)
	{
		if (CNPPU.length > 0)
		{
			if (!SPW_JS_ScanP(ncamp.value,CNPPU))
			{
				msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [[CNPPU], [nome]]);
				SPW_JS_MsgErro(theForm,campo,msgErro);						
				return(false);
			}
		}
	}
	
	//só se for > 0 é que comparo, caso contrário quer dizer
	//que o campo não tem limite de caracteres.
	if (len > 0){
		if (ncamp.value.length > len)
		{
			msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
			SPW_JS_MsgErro(theForm,campo,msgErro);		
			return(false);
		}
	}	

return(true);
}

//Valida uma string obrigatoria
//CNPPU = Caracteres Não Permitidos Pelo Utilizador
//NotValCE = não valida caracteres especias ' e | true/false
function SPW_JS_ValidaStrValueObg(valor,len,nome,CNPPU,NotValCE)
{		
	var msgErro = new String();
		
	if (!SPW_JS_Espacos(valor))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErroShow(msgErro);
		return(false);
	}
	if (!NotValCE)
	{
		if (!SPW_JS_CaracteresEsp(valor))
		{
			msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [["'|"], [nome]]);
			SPW_JS_MsgErroShow(msgErro);	
			return(false);
		}
	}

	if (CNPPU)
	{
		if (CNPPU.length > 0)
		{
			if (!SPW_JS_ScanP(valor,CNPPU))
			{
				msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [[CNPPU], [nome]]);
				SPW_JS_MsgErroShow(msgErro);						
				return(false);
			}
		}
	}
	
	//só se for > 0 é que comparo, caso contrário quer dizer
	//que o campo não tem limite de caracteres.
	if (len > 0){
		if (valor.length > len)
		{
			msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
			SPW_JS_MsgErroShow(msgErro);		
			return(false);
		}
	}	

return(true);
}

//Valida uma string opcional
//CNPPU = Caracteres não permitidos pelo utilizador
//NotValCE = não valida caracteres especias ' e | true/false
function SPW_JS_ValidaStrOpc(theForm,campo,len,nome,CNPPU,NotValCE)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value != "")
	{
		if (!NotValCE)
		{
			if (!SPW_JS_CaracteresEsp(ncamp.value))
			{
				msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [["'|"], [nome]]);
				SPW_JS_MsgErro(theForm,campo,msgErro);		
				return(false);
			}
		}

		if (CNPPU)
		{

			if (CNPPU.length > 0)
			{
				if (!SPW_JS_ScanP(ncamp.value,CNPPU))
				{
					msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [[CNPPU], [nome]]);
					SPW_JS_MsgErro(theForm,campo,msgErro);		
					return(false);
				}
			}
		}

		//só se for > 0 é que comparo, caso contrário quer dizer
		//que o campo não tem limite de caracteres.
		if (len > 0){
			if (ncamp.value.length > len)
			{
				msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
				SPW_JS_MsgErro(theForm,campo,msgErro);		
				return(false);
			}
		}	
	}
return(true);
}
//Valida uma string opcional
//CNPPU = Caracteres Não Permitidos Pelo Utilizador
//NotValCE = não valida caracteres especias ' e | true/false
function SPW_JS_ValidaStrValueOpc(valor,len,nome,CNPPU,NotValCE)
{		
	var msgErro = new String();
		
	if (valor != "")
	{
		if (!NotValCE)
		{
			if (!SPW_JS_CaracteresEsp(valor))
			{
				msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [["'|"], [nome]]);
				SPW_JS_MsgErroShow(msgErro);	
				return(false);
			}
		}

		if (CNPPU)
		{
			if (CNPPU.length > 0)
			{
				if (!SPW_JS_ScanP(valor,CNPPU))
				{
					msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [[CNPPU], [nome]]);
					SPW_JS_MsgErroShow(msgErro);						
					return(false);
				}
			}
		}
		
		//só se for > 0 é que comparo, caso contrário quer dizer
		//que o campo não tem limite de caracteres.
		if (len > 0){
			if (valor.length > len)
			{
				msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
				SPW_JS_MsgErroShow(msgErro);		
				return(false);
			}
		}	
	}
return(true);
}

//Valida um email obrigatorio
function SPW_JS_ValidaEmailObg(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value == "")
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (!SPW_JS_CaracteresEsp(ncamp.value))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [["'|"], [nome]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);		
		return(false);
	}
	
	if (!SPW_JS_Email(ncamp.value))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrEmailInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
return(true);
}

//Valida um email opcional
function SPW_JS_ValidaEmailOpc(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value != "")
	{
		if (!SPW_JS_Email(ncamp.value))
		{
			msgErro = SPW_JS_ReplaceAll( msgStrEmailInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	
		if (!SPW_JS_CaracteresEsp(ncamp.value))
		{
			msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [["'|"], [nome]]);
			SPW_JS_MsgErro(theForm,campo,msgErro);		
			return(false);
		}
	}
return(true);
}


//Valida um email obrigatorio com validação também do seu comprimento
function SPW_JS_ValidaEmailObg1(theForm,campo,len,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value == "")
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (!SPW_JS_CaracteresEsp(ncamp.value))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [["'|"], [nome]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);		
		return(false);
	}
	
	if (!SPW_JS_Email(ncamp.value))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrEmailInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
	if (ncamp.value.length > len)
	{
		msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);		
		return(false);
	}

return(true);
}

//Valida um email opcional com validação também do seu comprimento
function SPW_JS_ValidaEmailOpc1(theForm,campo,len,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value != "")
	{	
		if (!SPW_JS_Email1(ncamp.value))
		{
			msgErro = SPW_JS_ReplaceAll( msgStrEmailInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
		
		if (!SPW_JS_CaracteresEsp(ncamp.value))
		{
			msgErro = SPW_JS_ReplaceAll( msgStrCaractInv, [["'|"], [nome]]);
			SPW_JS_MsgErro(theForm,campo,msgErro);		
			return(false);
		}
	}
return(true);
}

//Valida um Numero Inteiro obrigatorio
function SPW_JS_ValidaIntObg(theForm,campo,len,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	num = ncamp.value.toString().replace(/ /g,"");
	num = num.replace(/\$|\,/g,'');
	
	if (num == "")
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (!SPW_JS_Scan(num,'0123456789'))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrNumInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
	if (!SPW_JS_Num(num,len,0))
	{	
		msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);		
		return(false);
	}
return(true);	
}
//Valida um Numero Inteiro obrigatorio,tem que ser > 0
function SPW_JS_ValidaIntObg1(theForm,campo,len,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	num = ncamp.value.toString().replace(/ /g,"");
	num = num.replace(/\$|\,/g,'');
	
	if (num == "")
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (!SPW_JS_Scan(num,'0123456789'))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrNumInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
	if (!SPW_JS_Num(num,len,0))
	{	
		msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);		
		return(false);
	}
	if (num == 0)
	{
		msgErro = SPW_JS_ReplaceAll( msgStrNumObgMaiorZero, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);		
		return(false); 
	}
return(true);	
}

//Valida um Numero Inteiro opcional
function SPW_JS_ValidaIntOpc(theForm,campo,len,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	
	num = ncamp.value.toString().replace(/ /g,"");
	num = num.replace(/\$|\,/g,'');
	
	if (num != "")
	{
		if (!SPW_JS_Scan(num,'0123456789'))
		{
			msgErro = SPW_JS_ReplaceAll( msgStrNumInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
		
		if (!SPW_JS_Num (num,len,0))
		{	
			msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
			SPW_JS_MsgErro(theForm,campo,msgErro);		
			return(false);
		}
	}
return(true);
}
//Valida um Numero Inteiro opcional tem que ser > 0
function SPW_JS_ValidaIntOpc1(theForm,campo,len,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	
	num = ncamp.value.toString().replace(/ /g,"");
	num = num.replace(/\$|\,/g,'');
	
	if (num != "")
	{
		if (!SPW_JS_Scan(num,'0123456789'))
		{
			msgErro = SPW_JS_ReplaceAll( msgStrNumInv, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
		
		if (!SPW_JS_Num (num,len,0))
		{	
			msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[len]]);
			SPW_JS_MsgErro(theForm,campo,msgErro);		
			return(false);
		}
		
		if (num == 0)
		{
			msgErro = SPW_JS_ReplaceAll( msgStrNumObgMaiorZero, [nome]);
			SPW_JS_MsgErro(theForm,campo,msgErro);		
			return(false); 
		}
	}
return(true);
}
//valida um Numero dado obrigatorio
function SPW_JS_ValidaNumObg(theForm,campo,nome,NumCasasInt,NumCasasDec)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	num = ncamp.value.toString().replace(/ /g,"");	
	
	if (num == "")
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
	if (!SPW_JS_Scan(num,'0123456789.-'))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrNumCaractVal, [[". -"],[nome]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (!SPW_JS_Num(num,NumCasasInt,NumCasasDec))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrDecInv, [[nome],[NumCasasInt],[NumCasasDec]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
return(true);
}

//valida um Numero dado obrigatorio, tem que ser > 0
function SPW_JS_ValidaNumObg1(theForm,campo,nome,NumCasasInt,NumCasasDec)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	num = ncamp.value.toString().replace(/ /g,"");	
	
	if (num == "")
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
	if (!Number(num))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrNumObgMaiorZero, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);		
		//SPW_JS_MsgErro(theForm,campo,"O campo " + nome + " é do tipo numérico e o valor deve ser maior que zero (0).\nUtilize apenas caracteres numéricos e \".\" para preencher o campo.");
		return(false);
	}

	if (!SPW_JS_Scan(num,'0123456789.'))	
	{
		msgErro = SPW_JS_ReplaceAll( msgStrNumCaractVal, [["."],[nome]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

	if (!SPW_JS_Num(num,NumCasasInt,NumCasasDec))
	{
		msgErro = SPW_JS_ReplaceAll( msgStrDecInv, [[nome],[NumCasasInt],[NumCasasDec]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
return(true);
}

//valida um Numero dado opcional
function SPW_JS_ValidaNumOpc(theForm,campo,nome,NumCasasInt,NumCasasDec)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	num = ncamp.value.toString().replace(/ /g,"");
	
	if (num != "")
	{
		if (!SPW_JS_Scan(num,'0123456789.-'))	
		{
			msgErro = SPW_JS_ReplaceAll( msgStrNumCaractVal, [[". -"],[nome]]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
			
		if (!SPW_JS_Num(num,NumCasasInt,NumCasasDec))
		{	
			msgErro = SPW_JS_ReplaceAll( msgStrDecInv, [[nome],[NumCasasInt],[NumCasasDec]]);
			SPW_JS_MsgErro(theForm,campo,msgErro);
			return(false);
		}
	}
return(true);
}

//valida um Select obrigatório
function SPW_JS_ValidaSelectObg(theForm,campo,nome,valor)
{	
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value == valor)
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

return(true);
}

//valida um Check obrigatório
function SPW_JS_ValidaCheckObg(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (!ncamp.checked)
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}

return(true);
}

//valida um radio obrigatorio
function SPW_JS_ValidaRadioObg(theForm,campo,nome,num)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	var i = 0;
	var aux = false;
	
	if (num > 1)	
	{
		if (num != ncamp.length)
		{
			msgErro = SPW_JS_ReplaceAll( msgStrRadInv, [nome]);
			alert(msgErro);
			return(false);
		}	
	}
	
	if (num ==1)
	{
		if (ncamp.checked)
			return (true);
	}
	else
	{
		for (i=0; i<num;i++)
		{
			if (ncamp[i].checked)
				aux = true;
		}
	}

	if (!aux)
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro,num);
		return(false);
	}
		
return(true);
}


//valida um select MULTIPLE SIZE obrigatorio
function SPW_JS_ValidaMultSizeObg(theForm,campo,nome)
{
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.length == 0)
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
		
return(true);
}

//Valida que pelo menos um dos campos passados no array esteja preenchido
function SPW_JS_ValidaCamposObg(theForm,arrCampos,arrNomes){

	var isEmpty = true;
	var ncamp = new Object();
	var strDesc = new String();
	var strDescNomes = new String();
	for (var i = 0; i < arrCampos.length; i++ ) {
		if (SPW_JS_IsObject(arrCampos[i]))
			var ncamp = arrCampos[i];
		else
			var ncamp = eval(theForm + "." + arrCampos[i]);

		strDescNomes += " - " + arrNomes[i] + "\n";
		switch (ncamp.type)
		{		    
		    case "checkbox":
		        isEmpty = !ncamp.checked;
		        break;
		        
		    default:
		        if (SPW_JS_Espacos(ncamp.value)){
		    	    isEmpty = false;		    	
		        }    
		        break;
		}
		if (!isEmpty) break;
    }
    
    if (isEmpty) {
		msgErro = SPW_JS_ReplaceAll( msgStrObgMulti, [strDescNomes]);
		SPW_JS_MsgErro(theForm,arrCampos[0],msgErro)
		return(false);
    }
    return(true);
}

//Valida que o Nº de Contribuinte está preechido e correcto
//Valida Unicamente NIF portugueses
function SPW_JS_ValidaNumContribuinteObg(theForm,campo,nome){
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();
	if (ncamp.value == '')
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
	if (!SPW_JS_IsNumContribuinte(ncamp.value)) {
		msgErro = SPW_JS_ReplaceAll( msgStrNumContribuinteInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
    }
    return(true);	
}

//Valida que o Nº de Contribuinte é correcto
//Valida Unicamente NIF portugueses
function SPW_JS_ValidaNumContribuinteOpc(theForm,campo,nome){
	if (SPW_JS_IsObject(campo))
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var msgErro = new String();

	if (!SPW_JS_IsNumContribuinte(ncamp.value)) {
		msgErro = SPW_JS_ReplaceAll( msgStrNumContribuinteInv, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
    }
    return(true);	
}


//unformat Numero
function unformatNum(str)
{
	if (!str) return str; // nothing to do
	str = ("" + str);
	var nstr = '';
	var code;
	var hasDot=false;
	
	for (var i=0; i<str.length; i++) 
	{	
		code=str.charCodeAt(i);
		if (code>=48 && code<=57) 
			nstr += str.charAt(i);
		else if ((code==44 || code==46)&& !hasDot)
		{	// transforma virgula em ponto
			nstr += '.';
			hasDot=true;
		}
		else if (code==45 && i==0) // minus sign
			nstr += str.charAt(i);
		
	}
	return nstr;
}
//formata numero
//(str, decPlaces, GroupDigits)
function SPW_JS_FormatNumber(str,decPlaces,GroupDigits) 
{	
	return SPW_JS_FormatNumber2(str,decPlaces,".",GroupDigits) ;
}
//formata numero
//(str, decPlaces, decDigit, groupDigits)
function SPW_JS_FormatNumber2(str,decPlaces,decDigit,groupDigits) 
{
	var auxStr;
	if (str == "") str = 0;
	
	if (isNaN(Number(decPlaces))) {decPlaces = 2;}
	
	str = ("" + str);
	auxStr = unformatNum(str);
	
	var dotPos = auxStr.indexOf(".")
	var decStr = "";
	
	if (dotPos >= 0) 
	{		
		if (auxStr!="0") {auxStr = "" + Math.round(parseFloat(auxStr)*Math.pow(10,decPlaces))/Math.pow(10,decPlaces);}
		dotPos = auxStr.indexOf(".")    
	}
	
	if (dotPos > 0) 
	{		
		if (dotPos<(auxStr.length-1)) decStr = auxStr.substr(dotPos+1,3);
		auxStr = reverseStr(auxStr.substr(0,dotPos))
	}
	else
	{
		auxStr = reverseStr(auxStr);
	}
	
	var newStr = '';
	for (var i=0; i<auxStr.length; i++) 
	{
		if (i>0 && (i%3)==0) newStr += groupDigits.toString();
		newStr += auxStr.charAt(i);
	}
	newStr = reverseStr(newStr)
	
	var _dp = "";
	for (var j=0; j < decPlaces; j++) {_dp += "0";}
	
	decStr += _dp ;
	decStr=decStr.substr(0,decPlaces);

	newStr += decDigit + decStr;
	return newStr;
}

//Devolve uma string invertida
function reverseStr(str) {
   if (!str) return str; // nothing to do
   var rstr = '';
   for (var i=str.length-1;i>=0;i--) rstr += str.charAt(i);
   return rstr;
}

// Se o caracter introduzido não fôr um número então não o mostra.
// no input onkeypress="return SPW_JS_CheckNum(event)"
function SPW_JS_CheckNum(e)
{
  var codigoTecla;
  
  if(window.event) // IE
  {
	codigoTecla = event.keyCode
  }
  else if(e.which) // Netscape/Firefox/Opera
  {
	codigoTecla = e.which
  }
    
  if (codigoTecla == 8) return true;  // BS 
  if (codigoTecla<48 || codigoTecla>57) return false;
  return true;
}

// Se o caracter introduzido não fôr um número ou o ponto 
//ou a virgula então não o mostra.
//no input onkeypress="return SPW_JS_CheckNumDot(event)"
function SPW_JS_CheckNumDot(e)
{
  var codigoTecla;
  
  //codigoTecla = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
  if(window.event) // IE
  {
	codigoTecla = event.keyCode
  }
  else if(e.which) // Netscape/Firefox/Opera
  {
	codigoTecla = e.which
  }
  
  switch(codigoTecla)
  {
	// virgula ou ponto
	case 44: 
	case 46: if (event.srcElement.value=='') { event.srcElement.value='0.'; return false; }
			 return (event.srcElement.value.indexOf(",")<0 && event.srcElement.value.indexOf(".")<0 && event.srcElement.value.length>0);
			 break;	
	// Backspace
	case 8:  return true;
			 break;
  }
  if (codigoTecla<48 || codigoTecla>57) return false;
  return (true);
  
}

// Se o caracter introduzido não fôr um número ou o ponto ou a virgula,
//ou o sinal menos então não o mostra.
//no input onkeypress="return SPW_JS_CheckNumDot(event)"
function SPW_JS_CheckNumDotNeg(e)
{
  var codigoTecla;
  
  if(window.event) // IE
  {
	codigoTecla = event.keyCode
  }
  else if(e.which) // Netscape/Firefox/Opera
  {
	codigoTecla = e.which
  }
  
  switch(codigoTecla)
  {
	// virgula ou ponto
	case 44: 
	case 46: if (event.srcElement.value=='') { event.srcElement.value='0.'; return false; }
			 return (event.srcElement.value.indexOf(",")<0 && event.srcElement.value.indexOf(".")<0 && event.srcElement.value.length>0);
			 break;	
	// menos "-"
	case 45: if (event.srcElement.value.indexOf("-")<0) event.srcElement.value = '-'+event.srcElement.value;
			 return false;
			 break;
	// Backspace
	case 8:  return true;
			 break;
  }
  if (codigoTecla<48 || codigoTecla>57) return false;
  return (true);
  
}


// verifica se uma data é maior que a outra, 
//retorna false se Datafim < DataIni
function SPW_JS_Compara_Data(DataIni,DataFim,Tipo) 
{	
	if (!SPW_JS_Scan(DataIni,"0123456789/-"))
		return (false);
		
	if (!SPW_JS_Scan(DataFim,"0123456789/-"))
		return (false);		
	
	if (!SPW_JS_Data(DataIni,Tipo))
		return (false);
	
	if (!SPW_JS_Data(DataFim,Tipo))
		return (false);
	
	if (DataIni.search("/") > -1){
		var a_dateini = DataIni.split('/');
		var a_datefim = DataFim.split('/');}
	else if (DataIni.search("-") > -1){
		var a_dateini = DataIni.split('-');
		var a_datefim = DataFim.split('-');}
	else
		return (false);
		
	var monthini = a_dateini[1];
	var dayini = a_dateini[2];
	var yearini = a_dateini[0];

	var monthfim = a_datefim[1];
	var dayfim = a_datefim[2];
	var yearfim = a_datefim[0];
	
	if (Tipo == "0")	  
	{
		var monthini = a_dateini[1];
		var dayini = a_dateini[0];
		var yearini = a_dateini[2];

		var monthfim = a_datefim[1];
		var dayfim = a_datefim[0];
		var yearfim = a_datefim[2];
	}
	if (Tipo == "1")	  
	{
		var monthini = a_dateini[1];
		var dayini = a_dateini[2];
		var yearini = a_dateini[0];

		var monthfim = a_datefim[1];
		var dayfim = a_datefim[2];
		var yearfim = a_datefim[0];
	}
	if (Tipo == "2")	  
	{		
		var monthini = a_dateini[2];
		var dayini = a_dateini[1];
		var yearini = a_dateini[0];

		var monthfim = a_datefim[2];
		var dayfim = a_datefim[1];
		var yearfim = a_datefim[0];
	}

	var DI = new Date(parseInt(yearini,10),parseInt(monthini,10) - 1, parseInt(dayini,10));
	var DF= new Date(parseInt(yearfim,10),parseInt(monthfim,10) - 1, parseInt(dayfim,10));
	
	if(DF < DI)
		return (false);
	else
		return (true);
}

// verifica se uma data é maior que a outra, 
//retorna false se Datafim + HoraFim < DataIni + HoraIni
function SPW_JS_Compara_DataHora(DataIni,HoraIni,DataFim,HoraFim,Tipo) 
{	
	if (!SPW_JS_Scan(DataIni,"0123456789/-"))
		return (false);
	if (!SPW_JS_Scan(HoraIni,"0123456789:"))
		return (false);
		
	if (!SPW_JS_Scan(DataFim,"0123456789/-"))
		return (false);		
	if (!SPW_JS_Scan(HoraFim,"0123456789:"))
		return (false);
		
	if (!SPW_JS_Data(DataIni,Tipo))
		return (false);
	if (!SPW_JS_Hora(HoraIni))
		return (false);
		
	if (!SPW_JS_Data(DataFim,Tipo))
		return (false);
	if (!SPW_JS_Hora(HoraFim))
		return (false);
		
	if (DataIni.search("/") > -1){
		var a_dateini = DataIni.split('/');
		var a_datefim = DataFim.split('/');}
	else if (DataIni.search("-") > -1){
		var a_dateini = DataIni.split('-');
		var a_datefim = DataFim.split('-');}
	else
		return (false);
		
	var monthini = a_dateini[1];
	var dayini = a_dateini[2];
	var yearini = a_dateini[0];

	var monthfim = a_datefim[1];
	var dayfim = a_datefim[2];
	var yearfim = a_datefim[0];
	
	if (Tipo == "0")	  
	{
		var monthini = a_dateini[1];
		var dayini = a_dateini[0];
		var yearini = a_dateini[2];

		var monthfim = a_datefim[1];
		var dayfim = a_datefim[0];
		var yearfim = a_datefim[2];
	}
	if (Tipo == "1")	  
	{
		var monthini = a_dateini[1];
		var dayini = a_dateini[2];
		var yearini = a_dateini[0];

		var monthfim = a_datefim[1];
		var dayfim = a_datefim[2];
		var yearfim = a_datefim[0];
	}
	if (Tipo == "2")	  
	{		
		var monthini = a_dateini[2];
		var dayini = a_dateini[1];
		var yearini = a_dateini[0];

		var monthfim = a_datefim[2];
		var dayfim = a_datefim[1];
		var yearfim = a_datefim[0];
	}
    
	var a_horaini = HoraIni.split(':');
	var a_horafim = HoraFim.split(':');
  
	var DhI = new Date(parseInt(yearini,10),parseInt(monthini,10) - 1, parseInt(dayini,10), parseInt(a_horaini[0]),parseInt(a_horaini[1]));
	var DhF= new Date(parseInt(yearfim,10),parseInt(monthfim,10) - 1, parseInt(dayfim,10), parseInt(a_horafim[0]),parseInt(a_horafim[1]));
			
	if(DhF < DhI)
		return (false);
	else
		return (true);
}


// calcula a diferencia entre duas datas retorna dias
function SPW_JS_Dif_Data(DataIni,DataFim,Tipo) 
{	
	if (!SPW_JS_Scan(DataIni,"0123456789/-"))
		return (false);
		
	if (!SPW_JS_Scan(DataFim,"0123456789/-"))
		return (false);		
	
	if (!SPW_JS_Data(DataIni,Tipo))
		return (false);
	
	if (!SPW_JS_Data(DataFim,Tipo))
		return (false);
	
	if (DataIni.search("/") > -1){
		var a_dateini = DataIni.split('/');
		var a_datefim = DataFim.split('/');}
	else if (DataIni.search("-") > -1){
		var a_dateini = DataIni.split('-');
		var a_datefim = DataFim.split('-');}
	else
		return (false);
			
	DataIni = a_dateini[0] + "/" + a_dateini[1] + "/" + a_dateini[2];        
    DataFim = a_datefim[0] + "/" + a_datefim[1] + "/" + a_datefim[2];
	
	if (Tipo == "0")	  
	{
	    DataIni = a_dateini[2] + "/" + a_dateini[1] + "/" + a_dateini[0];        
		DataFim = a_datefim[2] + "/" + a_datefim[1] + "/" + a_datefim[0];		
	}
	if (Tipo == "1")	  
	{			
		DataIni = a_dateini[0] + "/" + a_dateini[1] + "/" + a_dateini[2];        
		DataFim = a_datefim[0] + "/" + a_datefim[1] + "/" + a_datefim[2];
	}
	if (Tipo == "2")	  
	{		
        DataIni = a_dateini[0] + "/" + a_dateini[2] + "/" + a_dateini[1];        
		DataFim = a_datefim[0] + "/" + a_datefim[2] + "/" + a_datefim[1];
	}
	
	var sDate = new Date(DataIni);
    var eDate = new Date(DataFim);
    var daysApart = Math.abs(Math.round((sDate-eDate)/86400000));
    return(daysApart);
}

//calcula a data para um determinada dia da semana do ano
//necessita da Função SPW_JS_GetDayLimit()
function SPW_JS_WeekEnd(n_Week,n_WeekDay) 
{	
	a_Date = new Date()
	a_Date.setFullYear(a_Date.getFullYear(),0,1)		
	a_LastDate = new Date()
	a_LastDate.setFullYear(a_Date.getFullYear(),11,31)
	a_DateAct = new Date();	
	
	if (n_Week == null || n_Week == "") 
		return(a_DateAct.getFullYear() +"/"+ (a_DateAct.getMonth()+1) +"/"+ a_DateAct.getDate())
	
	a_Returns = new Array()
	if (n_WeekDay == null || n_WeekDay == "") 
		n_WeekDay = 0

	var MaxDay = 0; cont=1;
	
	for (var I = 0;I <= 11; I++)
	{	
		a_Date.setMonth(I);
		MaxDay = SPW_JS_GetDayLimit(a_Date.getFullYear(),(I + 1));
		for (var J = 1; J <= MaxDay; J++)
		{
			a_Date.setDate(a_Date.getDate() + 1);			
			if (a_Date.getDay() == n_WeekDay)
			{
				a_Returns[cont] = a_Date.getFullYear() +"/"+ (a_Date.getMonth()+1) +"/"+ a_Date.getDate()
				cont ++;
			}
		}		
	}	
		
return(a_Returns[n_Week])
}

//calcula a data para um determinada dia da semana do ano seguinte ao corrente
//necessita da Função SPW_JS_GetDayLimit()
function SPW_JS_NextYearWeekEnd(n_Week,n_WeekDay) 
{	
	a_Date = new Date()
	a_Date.setFullYear(a_Date.getFullYear(),0,1)		
	a_LastDate = new Date()
	a_LastDate.setFullYear(a_Date.getFullYear()+1,11,31)
	a_DateAct = new Date();	
	
	if (n_Week == null || n_Week == "") 
		return(a_DateAct.getFullYear() +"/"+ (a_DateAct.getMonth()+1) +"/"+ a_DateAct.getDate())
	
	a_Returns = new Array()
	if (n_WeekDay == null || n_WeekDay == "") 
		n_WeekDay = 0

	var MaxDay = 0; cont=1;
	
	for (var I = 0;I <= 11; I++)
	{	
		a_Date.setMonth(I);
		MaxDay = SPW_JS_GetDayLimit(a_Date.getFullYear(),(I + 1));
		for (var J = 1; J <= MaxDay; J++)
		{
			a_Date.setDate(a_Date.getDate() + 1);			
			if (a_Date.getDay() == n_WeekDay)
			{
				a_Returns[cont] = a_Date.getFullYear()+1 +"/"+ (a_Date.getMonth()+1) +"/"+ a_Date.getDate()
				cont ++;
			}
		}		
	}	
		
return(a_Returns[n_Week])
}

//busca o numero da semana para a data actual
//utiliza a função SPW_JS_getWeekFromDate
function SPW_JS_getWeekNr()
{	
	var today = new Date();
	Year = today.getFullYear();
	Month = today.getMonth()+1;
	Day = today.getDate();	
	return SPW_JS_getWeekFromDate(Year,Month,Day);
}

//verifica o ano
function y2k(number) { return (number < 1000) ? number + 1900 : number; }

//devolve o numero da semana para uma determinada data
//utiliza a função y2k
function SPW_JS_getWeekFromDate(year,month,day) {
    var when = new Date(year,month-1,day);
    var newYear = new Date(year,0,1);
    var modDay = newYear.getDay();
             	
    var daynum = ((Date.UTC(y2k(year),when.getMonth(),when.getDate(),0,0,0) -
                 Date.UTC(y2k(year),0,1,0,0,0)) /1000/60/60/24) + 1;
		
    var weeknum = Math.floor((daynum+modDay-1)/7)+1;
    if (weeknum == 0) {
        year--;
        var prevNewYear = new Date(year,0,1);
        var prevmodDay = prevNewYear.getDay();        
        if (prevmodDay < 4) weeknum = 53; else weeknum = 52;
    }

    return  + weeknum;
}

//Calcula o ultimo dia de cada mes, tomando en conta o ano
//necessita da função SPW_JS_IsLeapYear()
//Apoia a Função SPW_JS_WeekEnd()
function SPW_JS_GetDayLimit(y,m)
{
	var daysOfMonth = new Object();
	daysOfMonth ['Jan'] = daysOfMonth ['January']   = daysOfMonth [1] = 31;
	daysOfMonth ['Feb'] = daysOfMonth ['February']  = daysOfMonth [2] = 28;
	daysOfMonth ['Mar'] = daysOfMonth ['March']     = daysOfMonth [3] = 31;
	daysOfMonth ['Apr'] = daysOfMonth ['April']     = daysOfMonth [4] = 30;
	daysOfMonth ['May'] = daysOfMonth ['May']       = daysOfMonth [5] = 31;
	daysOfMonth ['Jun'] = daysOfMonth ['June']      = daysOfMonth [6] = 30;
	daysOfMonth ['Jul'] = daysOfMonth ['July']      = daysOfMonth [7] = 31;
	daysOfMonth ['Aug'] = daysOfMonth ['August']    = daysOfMonth [8] = 31;
	daysOfMonth ['Sep'] = daysOfMonth ['September'] = daysOfMonth [9] = 30;
	daysOfMonth ['Oct'] = daysOfMonth ['October']   = daysOfMonth [10] = 31;
	daysOfMonth ['Nov'] = daysOfMonth ['November']  = daysOfMonth [11] = 30;
	daysOfMonth ['Dec'] = daysOfMonth ['December']  = daysOfMonth [12] = 31;
	
	if (m == 2 && SPW_JS_IsLeapYear(y))
		var dayLimit = 29;
	else 
		var dayLimit = daysOfMonth[m];
	
return(dayLimit);
}

//left pad
function SPW_JS_LeftPad(Str,NumMax,Pad)
{
    if (Str.length <= 0)
        return(Str);
    
    if (!Number(NumMax)) 
        return(Str);
    
    if (Pad.length <= 0)
        return(Str);
    
    var aux = "";
    
    for (var i = 1; i <= NumMax - Str.length; i++)
        aux = aux + Pad
        
    return(aux + Str)
}
//right pad
function SPW_JS_RightPad(Str,NumMax,Pad)
{
    if (Str.length <= 0)
        return(Str);
    
    if (!Number(NumMax)) 
        return(Str);
    
    if (Pad.length <= 0)
        return(Str);
    
    var aux = "";
    
    for (var i = 1; i <= NumMax - Str.length; i++)
        aux = aux + Pad
        
    return(Str + aux)
}

//valida que os intervalos de varias datas não se cruzam
//retorna false se existe um Intervalo de Datas que se cruzem
//utiliza a função SPW_JS_Compara_Data
//entra array com as Datas Inicio e Datas Fim
function SPW_JS_ValidaIntervaloDatas(arrDataIni,arrDataFim) 
{	
	//validar que os arrays tenham dados
	if (arrDataIni.length == 0 || arrDataFim.length == 0)
		return(false)
	
	//validar que os valores sejam datas bem formatadas
	for (var i=0; i < arrDataIni.length; i++){
		if (!SPW_JS_Scan(arrDataIni[i],"0123456789/-"))
			return (false);			
		if (!SPW_JS_Scan(arrDataFim[i],"0123456789/-"))
			return (false);	
		if (!SPW_JS_Data(arrDataIni[i]))
			return (false);	
		if (!SPW_JS_Data(arrDataFim[i]))
			return (false);
	}
	
	var arrDataIniAux = new Array();	
	var arrDataFimAux = new Array();
	for (var i=0; i < arrDataIni.length; i++){
		arrDataIniAux[i] = arrDataIni[i];
		arrDataFimAux[i] = arrDataFim[i];
		for (var j=0; j < arrDataIniAux.length; j++){
			if (!SPW_JS_Compara_Data(arrDataIni[i],arrDataIniAux[j]) && !SPW_JS_Compara_Data(arrDataFimAux[j],arrDataIni[i]))
				return(false)
			
			if (!SPW_JS_Compara_Data(arrDataIniAux[j],arrDataIni[i]) && !SPW_JS_Compara_Data(arrDataFim[i],arrDataIniAux[j]))
				return(false)
		}		
	}
	
	return(true);
}

//SPW_JS_MaxLength: limita o numero de caracteres num campo
//usa o maxlength como limite de caracteres
//<TEXTAREA rows=2 cols=20 id=textarea1 name=textarea1 maxlength=5
//onKeyUp="SPW_JS_MaxLength(this.form.name,this.name,'TextArea');"></TEXTAREA>
function SPW_JS_MaxLength(theForm,campo,nome) {
	var total = 0;
	if (SPW_JS_IsObject(campo))
		var Input = campo;
	else
		var Input = eval(theForm + "." + campo);
			
	total = Input.getAttribute("maxlength");
	if (Input.value.length > total){
		//event.keyCode=0;
		Input.value = Input.value.substring(0,total);		
		msgErro = SPW_JS_ReplaceAll( msgStrLenInv, [[nome],[total]]);
		SPW_JS_MsgErro(theForm,campo,msgErro);	
		return;
	}
}

//formata hora
//coloca uma string Hora no formato HH:MM
//Utiliza a função SPW_JS_LeftPad(Str,NumMax,Pad)
//Utiliza a função SPW_JS_RightPad(Str,NumMax,Pad)
//MF: Acrescentei um parâmetro opcional que me diz se quero ou não preencher o campo
//    e comentei o if dentro do else pois posso ter horas com mais do que duas casas
function SPW_JS_FormatHora(strHora,opt) 
{	
	var auxStr;
	var HoraFormatada = strHora;
	
	if (opt !== 1){	
		if (strHora == "") return("00:00");
	}else if (strHora == "") return("");
	
	if (strHora.indexOf(":") > 0){
		var auxStr = strHora.toString().split(":");
		var H = auxStr[0];
		var M = auxStr[1];
		
		H = SPW_JS_LeftPad(H,2,0);				
		M = SPW_JS_RightPad(M,2,0);
		HoraFormatada = H +":"+ M;
	}
	else{
		//if (strHora.toString().length <= 2)
			
		HoraFormatada = SPW_JS_LeftPad(strHora,2,0) + ":00"	
	}	
			
	return (HoraFormatada)
}

//Calcula o Dia da Semana 
//utiliza a função SPW_JS_Data para verificar que a data é válida
function SPW_JS_GetDiaDaSemana(year,month,day){
	
	var then = new Date(year,month-1,day) //-1 por que o mês  de JAN = 0
	var theday = then.getDay();
	
	var weekday = new Array(6);
	weekday[0]=msgDomingo;
	weekday[1]=msgSegunda;
	weekday[2]=msgTerca;
	weekday[3]=msgQuarta;
	weekday[4]=msgQuinta;
	weekday[5]=msgSexta;
	weekday[6]=msgSabado;
		
	return(weekday[theday]);
}

//permite Somar ou Subtrair intervalos a uma data
//é semelhante à DateAdd do VB
//interval = w (semanas),d (dias),h (horas),m(minutos),s(segudos)
function SPW_JS_DateAdd(interval, number, Data) {
	        		
    // get the milliseconds for this Date object. 
    var buffer = Date.parse( Data ) ;
		
    // check that the start parameter is a valid Date. 
    if ( isNaN (buffer) ) return null ;
    	
    // check that an interval parameter was not numeric. 
    if ( interval.charAt == 'undefined' ) return null ;
    
    // check that the number parameter is numeric. 
    if ( isNaN ( number ) )	return null ;
    
    // so far, so good...
    //
    // what kind of add to do? 
    switch (interval.toString())
    {
		case 'w': case 'W': 
            number *= 7 ; // semanas to days
        case 'd': case 'D': 
            number *= 24 ; // days to hours
            // fall through! 
        case 'h': case 'H':
            number *= 60 ; // hours to minutes
            // fall through! 
        case 'm': case 'M':
            number *= 60 ; // minutes to seconds
            // fall through! 
        case 's': case 'S':
            number *= 1000 ; // seconds to milliseconds
            break ;
        default:
        // If we get to here then the interval parameter
        // didn't meet the w,d,h,m,s criteria.
        return null ;
    }    
    return new Date( buffer + number ) ;    
}


//Devolve um array com a Data de Inicio e Data de Fim
// para uma determinada data
//é caculada a semana a que pertence a data e depois
//são calculadas as duas datas
//utiliza a função SPW_JS_getWeekFromDate(),SPW_JS_DateAdd()
function SPW_JS_GetIntervaloSemana(Ano,Mes,Dia)
{
	var semana,inicio, fim;
	semana = SPW_JS_getWeekFromDate(Ano,Mes,Dia);
	
	var aux = SPW_JS_DateAdd("w",semana-1,"01/01/"+Ano);
	var arrDatas = new Array(1);

	var aData = new Date(aux) //-1 por que o mês  de JAN = 0
	var oDia = aData.getDay();
		
	arrDatas[0] = SPW_JS_DateAdd("d", - oDia, aux);	
	arrDatas[1] = SPW_JS_DateAdd("d",6,arrDatas[0]);	
		
	return arrDatas;
	
}

// verifica se uma hora é maior que a outra, 
// retorna false se HoraFim < HoraIni
function SPW_JS_Compara_Hora(HoraIni,HoraFim) 
{	
	HoraIni = SPW_JS_FormatHora(HoraIni)
	HoraFim = SPW_JS_FormatHora(HoraFim)
	
	var DI = "2000/01/01 " + HoraIni
	var DF = "2000/01/01 " + HoraFim

	var DIP = Date.parse(DI)
	var DFP = Date.parse(DF)  

	if (DFP < DIP)
		return (false);
	else
		return (true);
}

//valida que os intervalos de varios numeros não se cruzam
//retorna false se existe um Intervalo que se cruzem
//entra array com os intervalos
function SPW_JS_ValidaIntervaloNumeros(arrIni,arrFim) 
{	
	//validar que os arrays tenham dados
	if (arrIni.length == 0 || arrFim.length == 0)
		return(false)
		
	//validar que os valores sejam numeros
	for (var i=0; i < arrIni.length; i++){
		if (!SPW_JS_Scan(arrIni[i],'0123456789.')) return (false)
		if (!SPW_JS_Scan(arrFim[i],'0123456789.')) return (false)		
	}
		
	for (var i=0; i < arrIni.length; i++){
		for (var j=i; j < arrIni.length; j++){
				
			if (!SPW_JS_ComparaNumero(arrIni[i],arrIni[j]) && !SPW_JS_ComparaNumero(arrFim[j],arrIni[i]))
				return(false)			
			if (!SPW_JS_ComparaNumero(arrIni[j],arrIni[i]) && !SPW_JS_ComparaNumero(arrFim[i],arrIni[j]))
				return(false)							
		}		
	}
	
	return(true);
}

// verifica se um numero é maior que o outro, 
// retorna false se numFim < numIni
function SPW_JS_ComparaNumero(numIni,numFim)
{
	// validar 
	if (!SPW_JS_Scan(numIni,'0123456789.')) return (false)
	if (!SPW_JS_Scan(numFim,'0123456789.')) return (false)	
		
	if (Number(numIni) > Number(numFim))
		return (false);
	else
		return (true);
}
//valida um array de Checks, obriga a pelo menos um
function SPW_JS_ValidaArrayCheckObg(theForm,campo,nome)
{	
	if (campo == '[object]')
		var ncamp = campo;
	else
		var ncamp = eval(theForm + "." + campo);
		
	var aux = false;
	var num = ncamp.length;

	if (num ==1)
	{
		if (ncamp.checked)
			return (true);
	}
	else
	{
		for (i=0; i<num;i++)
		{
			if (ncamp[i].checked)
				aux = true;
		}
	}

	if (!aux)
	{
		msgErro = SPW_JS_ReplaceAll( msgStrObg, [nome]);
		SPW_JS_MsgErro(theForm,campo,msgErro);
		return(false);
	}
	
return(true);
}
//********************************************