// Dependências: util.js, valid.js, num.js, str.js e num.asp.
//
var ParsedNum = 0	// Ultimo nº validado por uma das funções deste módulo.

// Retorna 'true' se o conteúdo de qualquer elemento de 'wdFields' fôr um nº inteiro ou se estiver vazio. 'optReq' é um 
// campo opcional que indica se o campo é mandatório. Se fôr 'true' e o campo estiver vazio, será 
// apresentada uma mensagem de erro ao utilizador e a função retornará 'false'.
function isIntNumField (wdFields, optReq, optMinVal, optMaxVal) {
	return apply (function (wd) {
		var res = isNumField (wd, KMsgOnlyNumInts, optReq, optMinVal != null ? optMinVal + 1 : null, optMaxVal != null ? optMaxVal - 1 : null)
		if (!res [0]) return false
		var n = res [1]

		if (Math.floor (n) != n) return _vError (wd, KMsgOnlyInts)
		ParsedNum = n
		return true
	}, wdFields)
}

// Retorna 'true' se o conteúdo de qualquer elemento de 'wdField' fôr um nº inteiro ou um nº real que não tenha mais do
// que 'maxPrecis' casas decimais, ou então, se estiver vazio.  'optReq' é um parâmetro opcional 
// que indica se o campo é mandatório. Se fôr 'true' e o campo estiver vazio, será apresentada uma 
// mensagem de erro ao utilizador e a função retornará 'false'.
function isRealNumField (wdFields, optReq, maxPrecis, optMinVal, optMaxVal) {
	return apply (function (wd) {
		var res = isNumField (wd, KMsgOnlyNums, optReq, optMinVal, optMaxVal)
		if (!res [0]) return false
		var n = res [1]

		var i, n, str = wd.value // Este valor já foi devidamente rectificado por 'isNumField'.
		if (maxPrecis > 0 && str) {
			// Testar se o nº de casas decimais não ultrapassa 'maxPrecis'.
			if ((i = str.lastIndexOf (rem_fracsep)) >= 0) {
				n = str.length - i - 1
				if (n > maxPrecis)
					return _vError (wd, KMsgPrecOverflow.replace ("$maxPrecis", maxPrecis))
				else wd.value += alignRight ("", maxPrecis - n)
			}
			else wd.value += rem_fracsep + alignRight ("", maxPrecis)
		}
		ParsedNum = n
		return true
	}, wdFields)
}

// FUNÇÕES PRIVADAS. Usadas unicamente por funções deste módulo.

// Verifica se 'wd' é numérico. A função retorna um array de 2 elementos, em que o primeiro
// é um "boolean" que indica se o conteúdo de 'wd' é realmente numérico, e o segundo é o nº
// em si. 'optReq' é um parâmetro opcional que indica se o campo é mandatório. Se fôr 'true' e o
// campo estiver vazio, será apresentada uma mensagem de erro ao utilizador e a função retornará
// 'false' no primeiro elemento.
// No caso do conteúdo de 'wd' não ser numérico, 'badDataMsg' será apresentado como mensagem.
function isNumField (wd, badDataMsg, optReq, optMinVal, optMaxVal) {
	if (wd.substr) wd = elmnx (wd)
	var n = 0
	var res = true
	if (wd.value) {
		n = cvtNum (wd.value)

		if (err_badnum)
			res = _vError (wd, badDataMsg)
		else {
			var str = n.toString ()
			// Se necessário, corrigir os dados do próprio controlo.
			var b = rem_fracsep != in_fracSep && in_fracSep != ""
			if (b || str.length != wd.value.length)
				wd.value = b ? str.replace (in_fracSep, rem_fracsep) : str
			// Validar limites.
			var msg = ""
			if (optMinVal != null) {
				optMinVal || (optMinVal = 0)
				if (n < optMinVal) {
					if (optMaxVal != null)
						msg = KMsgNumMustBeBetween.replace ("$minVal", optMinVal).replace ("$maxVal", optMaxVal)
					else
						msg = KMsgNumMustBeBigger.replace ("$minVal", optMinVal)
				}
			}
			else if (optMaxVal != null) {
				optMaxVal || (optMaxVal = 0)
				optMaxVal > n && (msg = KMsgNumMustBeSmaller.replace ("$maxVal", optMaxVal))
			}
			if (msg != "") return _vError (wd, msg)
		}
	}
	else {
		// O campo está vazio. No caso de ser um campo mandatório, apresentar erro.
		if (optReq != null && optReq) res = _vError (wd, KMsgReqField)
	}

	return Array (res, n)
}
