//-----------------------------------------------------------------
// 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,valor) {

    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;
            case "select-one":                
                isEmpty = (ncamp.value == valor);                
                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,'<%=oResources.GetString("Observacoes") %>');"></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 = "yyyy, q, m, y, d, wd, w, h, n, s, or ms"
function SPW_JS_DateAdd(p_Interval, p_Number, p_Date) {
    var thing = new String();
    var dtNow = new Date();
    if (p_Date != undefined) {

        // get the milliseconds for this Date object.
        var dtAux = Date.parse(p_Date);

        // check that the start parameter is a valid Date.
        if (isNaN(dtAux)) {
            throw "Date format is invalid. \n You passed: " + p_Date;
            return (false);
        }
        dtNow = new Date(dtAux);
    }

    //in the spirt of VB we'll make this function non-case sensitive
    //and convert the charcters for the coder.
    p_Interval = p_Interval.toLowerCase();

    if (isNaN(p_Number)) {

        //Only accpets numbers 
        //throws an error so that the coder can see why he effed up    
        throw "The second parameter must be a number. \n You passed: " + p_Number;
        return false;
    }
    p_Number = new Number(p_Number);
    switch (p_Interval.toLowerCase()) {
        case "yyyy":
            {// year
                dtNow.setFullYear(dtNow.getFullYear() + p_Number);
                break;
            }
        case "q":
            {        // quarter
                dtNow.setMonth(dtNow.getMonth() + (p_Number * 3));
                break;
            }
        case "m":
            {        // month
                dtNow.setMonth(dtNow.getMonth() + p_Number);
                break;
            }
        case "y":        // day of year
        case "d":        // day
        case "wd":
            {        // weekday
                dtNow.setDate(dtNow.getDate() + p_Number);
                break;
            }
        case "w":
            {    // week of year
                dtNow.setDate(dtNow.getDate() + (p_Number * 7));
                break;
            }
        case "h":
            {        // hour
                dtNow.setHours(dtNow.getHours() + p_Number);
                break;
            }
        case "n":
            {        // minute
                dtNow.setMinutes(dtNow.getMinutes() + p_Number);
                break;
            }
        case "s":
            {        // second
                dtNow.setSeconds(dtNow.getSeconds() + p_Number);
                break;
            }
        case "ms":
            {        // second
                dtNow.setMilliseconds(dtNow.getMilliseconds() + p_Number);
                break;
            }
        default:
            {
                //throws an error so that the coder can see why he effed up and
                //a list of elegible letters.
                throw "The first parameter must be a string from this list: \n" +
                    "yyyy, q, m, y, d, wd, w, h, n, s, or ms. You passed: " + p_Interval;
                return false;
            }
    }

    // Atenção não pode retornar uma string... tem que retornar o objecto Date.
    var dt = new Date(dtNow.getFullYear(), dtNow.getMonth(), dtNow.getDate());
    return dt;
}

//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, Ano + "/01/01");
    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);
}

//formata a data passada para uma string no formato YYYY/MM/DD
function SPW_JS_FormataData(dtDate) {
    return (dtDate.getFullYear() + "/" + (dtDate.getMonth()+1) + "/" + dtDate.getDate());

}
//********************************************
