function mouseCoords(ev) {
	if (ev.pageX || ev.pageY) {
		return {
			x:ev.pageX,
			y:ev.pageY
		};
	}
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
}
function getMouseOffset(target, ev) {
	ev            = ev ? ev : window.event;
	var docPos    = getPosition(target);
	var mousePos  = mouseCoords(ev);
	return {
		x:mousePos.x - docPos.x,
		y:mousePos.y - docPos.y
	};
}

function getPosition(e) {
	if (!e)
		return {x:0, y:0};
		
	var left = 0;
	var top  = 0;

	while (e.offsetParent) {
		left += e.offsetLeft;
		top  += e.offsetTop;
		e     = e.offsetParent;
	}

	left += e.offsetLeft;
	top  += e.offsetTop;

	return {
		x:left,
		y:top
	};
}

function showHelp(target, name, ev) {
	ev = ev ? ev : window.event;
	var fra = document.getElementById("hiddenFrame");
	var lay = document.getElementById("helpLayer");
	lay.innerHTML = helpTexts[name];
	var mouseOffset = getMouseOffset(target, ev);
	var mousePos    = mouseCoords(ev);
	var y = mousePos.y - mouseOffset.y;
	var x = mousePos.x - mouseOffset.x;
	
	lay.style.top = (y + 20) + "px";
	lay.style.left = (x + 25) + "px";
	fra.style.top = (y + 20) + "px";
	fra.style.left = (x + 25) + "px";
	fra.style.width = lay.offsetWidth + "px";
	fra.style.height = lay.offsetHeight + "px";
	fra.style.visibility = "visible";
	lay.style.visibility = "visible";
}

function hideHelp() {
	var lay = document.getElementById("helpLayer");
	var fra = document.getElementById("hiddenFrame");
	lay.style.visibility = "hidden";
	fra.style.visibility = "hidden";
}

function showError(target, name, ev) {
	ev = ev ? ev : window.event;
	if (errorTexts[name] == null || errorTexts[name] == "")
		return;
	var fra = document.getElementById("hiddenFrame");
	var lay = document.getElementById("errorLayer");
	lay.innerHTML = errorTexts[name];
	var mouseOffset = getMouseOffset(target, ev);
	var mousePos    = mouseCoords(ev);
	var y = mousePos.y - mouseOffset.y;
	var x = mousePos.x - mouseOffset.x;
	
	lay.style.top = (y + 20) + "px";
	lay.style.left = (x + 25) + "px";
	fra.style.top = (y + 20) + "px";
	fra.style.left = (x + 25) + "px";
	fra.style.width = lay.offsetWidth + "px";
	fra.style.height = lay.offsetHeight + "px";
	fra.style.visibility = "visible";
	lay.style.visibility = "visible";
}

function hideError() {
	var lay = document.getElementById("errorLayer");
	var fra = document.getElementById("hiddenFrame");
	lay.style.visibility = "hidden";
	fra.style.visibility = "hidden";
}


function formatInteger(field) {
	if (typeof(field) == "number" || typeof(field) == "string")
		return formatIntegerValue(field);
	
	var value = field.value.replace(/[^0-9]/g, "");
	field.value = isNaN(value) ? "" : value;
}

function formatIntegerValue(valor) {
	var value = (""+valor).replace(/[^0-9]/g, "");
	return isNaN(value) ? "" : value;
}

function formatMonetary(field) {
	if (typeof(field) == "number" || typeof(field) == "string")
		return formatMonetaryValue(field);
		
	var value = field.value.replace(/[^0-9]/g, "");
	if (value != "") {
		value = value.replace(/^[0]+/, "");
		var intPart = reverseString(value.length > 2 ? value.substr(0, value.length - 2) : "0");
		var decPart = value.length >= 2 ? value.substr(value.length - 2) : value;
		while (decPart.length < 2)
			decPart = "0" + decPart;
		for (var i = 0; i < intPart.length - 3; i += 4)
			intPart = intPart.substr(0, i) + intPart.substr(i, 3) + '.' + intPart.substr(i + 3);
		value = reverseString(intPart) + "," + decPart;
	}
	field.value = isNaN(value.replace(/[., ]/g, "")) ? "" : value;
}

function formatMonetaryValue(valor) {
	var value = (""+valor).replace(/[^0-9]/g, "");
	if (value != "") {
		value = value.replace(/^[0]+/, "");
		var intPart = reverseString(value.length > 2 ? parseInt(value.substr(0, value.length - 2)) + "" : "0");
		var decPart = value.length >= 2 ? value.substr(value.length - 2) : value;
		while (decPart.length < 2)
			decPart = "0" + decPart;
		for (var i = 0; i < intPart.length - 3; i += 4)
			intPart = intPart.substr(0, i) + intPart.substr(i, 3) + '.' + intPart.substr(i + 3);
		value = reverseString(intPart) + "," + decPart;
	}
	return isNaN(value.replace(/[., ]/g, "")) ? "" : value;
}

function formatDate(field) {
	value = field.value.replace(/[^0-9]/g, "");
	if (value != "") {
		if (value.length > 4)
			value = value.substr(0, 4) + "/" + value.substr(4);
		if (value.length > 2)
			value = value.substr(0, 2) + "/" + value.substr(2);
	}
	field.value = value;
}

function formatDateTime(field) {
	value = field.value.replace(/[^0-9]/g, "");
	if (value != "") {
		if (value.length > 10)
			value = value.substr(0, 10) + ":" + value.substr(10);
		if (value.length > 8)
			value = value.substr(0, 8) + " " + value.substr(8);
		if (value.length > 4)
			value = value.substr(0, 4) + "/" + value.substr(4);
		if (value.length > 2)
			value = value.substr(0, 2) + "/" + value.substr(2);
	}
	field.value = value;
}

function formatCPF(field) {
	var value = field.value.replace(/[^0-9]/g, "");
	if (value != "") {
		if (value.length > 8)
			value = value.substr(0, value.length - 8) + "." + value.substr(value.length - 8);
		if (value.length > 5)
			value = value.substr(0, value.length - 5) + "." + value.substr(value.length - 5);
		if (value.length > 2)
			value = value.substr(0, value.length - 2) + "-" + value.substr(value.length - 2);
	}
	field.value = value;
}

function formatZipCode(field) {
	var value = field.value.replace(/[^0-9]/g, "");
	if (value != "") {
		if (value.length > 3)
			value = value.substr(0, value.length - 3) + "-" + value.substr(value.length - 3);
	}
	field.value = value;
}

function formatPhone(field) {
	var value = field.value.replace(/[^0-9]/g, "");
	if (value.charAt(0) == "0")
		value = value.substr(1);
	if (value != "") {
		if (value.length > 8)
			value = "(" + value.substr(0, value.length - 8) + ") " + value.substr(value.length - 8);
		if (value.length > 4)
			value = value.substr(0, value.length - 4) + "-" + value.substr(value.length - 4);
	}
	field.value = value;
}
	
function reverseString(str) {
	var rev = "";
	for (var i = str.length - 1; i >= 0; i--)
		rev += str.charAt(i);
	return rev;
}

function trimString(str) {
	var i,j;
	for (i = 0; i < str.length && str.charAt(i) == ' '; i++);
	for (j = str.length - 1; i >= 0 && str.charAt(j) == ' '; j--);
	return (str.length == 0 || i > j ? "" : str.substr(i, j - i + 1));
}

function textLimiter(field, counterid) {
	var maxlimit = field.getAttribute("maxlength");
	if (field.value.length > maxlimit)
		field.value = field.value.substring(0, maxlimit);
	if (counterid)
		document.getElementById(counterid).innerHTML = "(" + (maxlimit - field.value.length) + " restantes)";
}

function valorPorExtenso(value) {
  var singular = "centavo,real,mil,milhão,bilhão,trilhão,quatrilhão".split(",");
  var plural = "centavos,reais,mil,milhões,bilhões,trilhões,quatrilhões".split(",");

  var c = ",cem,duzentos,trezentos,quatrocentos,quinhentos,seiscentos,setecentos,oitocentos,novecentos".split(",");
  var d = ",dez,vinte,trinta,quarenta,cinqüenta,sessenta,setenta,oitenta,noventa".split(",");
  var d10 = "dez,onze,doze,treze,quatorze,quinze,dezesseis,dezesete,dezoito,dezenove".split(",");
  var u = ",um,dois,três,quatro,cinco,seis,sete,oito,nove".split(",");

  var z = 0;
  var rt = "";

  var valor = formatMonetaryValue(value).replace(/[,]/g, ".");
  var inteiro = valor.split(".");
  for(var i = 0; i < inteiro.length; i++)
		for(var ii = inteiro[i].length; ii < 3; ii++)
			inteiro[i] = "0"+inteiro[i];	

  // fim identifica onde que deve se dar junção de centenas por "e" ou por ","
  var fim = inteiro.length - (inteiro[inteiro.length - 1] > 0 ? 1 : 2);
  for (var i = 0; i < inteiro.length; i++) {
		valor = inteiro[i];
		var vc = parseInt(valor.charAt(0));
		var vd = parseInt(valor.charAt(1));
		var vu = parseInt(valor.charAt(2));
		var v = vc * 100 + vd * 10 + vu;
		
		var rc = v > 100 && v < 200 ? "cento" : c[vc];
		var rd = vd < 2 ? "" : d[vd];
		var ru = v > 0 ? (vd == 1 ? d10[vu] : u[vu]) : "";
		
		//window.status = valor + " - " + v + " - "+ rc + ", " + rd + ", " + ru;
		
		var r = rc + (rc != "" && (rd != "" || ru != "") ? " e " : "") + rd + (rd != "" && ru != "" ? " e " : "") + ru;
		var t = inteiro.length - 1 - i;
		r += r ? " " + (valor > 1 ? plural[t] : singular[t]) : "";
		if (valor == "000") {
			z++;
		}
		else if (z > 0) {
			z--;
		}
		if ((t == 1) && (z > 0) && (inteiro[0] > 0))
			r += ((z > 1) ? " de " : "") + plural[t];
		if (r != "")
			rt += (((i > 0) && (i <= fim) && (inteiro[0] > 0) && (z < 1)) ? ((i < fim) ? ", " : " e ") : " ") + r;
	}
	rt = trimString(rt);
	return (rt != "" ? rt : "zero");
}
