String.prototype.trim = Function("return this.replace(/((^\\s+)|(\\s+$))/g, '');");
String.prototype.toFloat = Function("if (this.trim() == '') return 0;\nreturn parseFloat(this.replace(',', '.').trim());");
String.prototype.toDate = ParseToDate;
String.prototype.toInt = ParseToInt;

function UnsignedInt()
{
	var key = event.keyCode;
	if ((key >= 48) && (key <= 57))
	{
		return true;
	}

	return false;
}


//Máscara usada para impedir que certos caracteres passados
//por parâmetro apareçam em um determinado campo.
function BlockCharsMask()
{
	if (arguments.length > 0)
	{
		for (var i = 0; i < arguments.length; i++)
		{
			if (event.keyCode.toString() == arguments[i].toString())
			{
				return false;
			}
		}
	}
	
	return true;
}

function isControlKey(key)
{
	if (event.ctrlKey || event.altKey) return true;
	if ((key == 37) || (key == 39) || (key == 16) || (key == 8) || (key == 9) || (key == 46) || (key == 13)) return true;
	return false;
}

function NumericMask(nLength, oLength)
{
	var key = event.keyCode;
	
	if (isControlKey(key)) return true;

	if ((key < 48) || ((key > 57) && (key < 96)) || (key > 106)) return false;
	if (oLength >= nLength)
	{
		if (document.selection.createRange().text.length > 0) return true;
	}

	return true;
}

function NumericFormat()
{
	var src = event.srcElement;
	var mch = src.value.match("[0-9]+");
	if (mch == null)
	{
		src.value = "";
	}
	else
	{
		if (mch[0] != src.value) src.value = "";
	}
}

function cnpjOnBlur()
{
/*
	try
	{
		var s = this.value;
		if (s.length != 18) this.value = "";		
	}
	catch(e)
	{
		this.value = "";
	}
*/	
}

// Máscara para CNPJ
function CNPJMask()
{
	var src = this;
	src.style.textAlign = "right";
	src.maxLength = 18;
	src.onkeydown = cnpjKeyFilter;
	src.onpropertychange = cnpjFormatFilter;
	src.toString = cnpjToString;
	src.onblur = cnpjOnBlur;
}

function cnpjToString(str)
{
	try
	{
		str = str.replace(".", "");
		str = str.replace(".", "");
		str = str.replace("/", "");
		str = str.replace("-", "");
		
		var num = str.toFloat();
		if (isNaN(num)) return "";

		if (str.length > 8)
		{
			str = NewString('0', 14) + num.toString();
			str = str.substring(str.length - 14, str.length);
		}
		else
		{
			str = NewString('0', 8) + num.toString();
			str = str.substring(str.length - 8, str.length);
		}
		
		if (!validaCNPJ(str)) return "";
		
		var hResult = "";
		if (str.length >= 2)
		{
			hResult = str.substring(0, 2);
			if (str.length > 2)
			{
				hResult += ".";
				if (str.length >= 5)
				{
					hResult += str.substring(2, 5);
					if (str.length > 5)
					{
						hResult += ".";
						if (str.length >= 8)
						{
							hResult += str.substring(5, 8);
							if (str.length > 8)
							{
								hResult += "/";
								if (str.length >= 12)
								{
									hResult += str.substring(8, 12);
									if (str.length > 12)
									{
										hResult += "-" + str.substring(12);
									}
								}
								else
								{
									hResult += str.substring(8);
								}
							}
						}
						else
						{
							hResult += str.substring(5);
						}
					}
				}
				else
				{
					hResult += str.substring(2);
				}
			}
		}
		else
		{
			hResult = str;
		}
		
		return hResult;
	}
	catch (e)
	{
		return "";
	}
}

function cnpjFormatFilter()
{
	try
	{
		if (event.propertyName != "value") return;
		
		var rng = this.createTextRange();
		if (rng.text.length == 0)
		{
			this.OldValue = "";
			return true;
		}
		
		var auxRng = rng.duplicate();
		
		// Colocando o foco no primeiro caracter.		
		rng.moveEnd("character", 1 - rng.text.length);
		
		var n = 0;		
		while (n < auxRng.text.length)
		{
			switch (n)
			{
				case 2:
					if (rng.text != ".")
					{
						if (enDigits.indexOf(rng.text) >= 0)
						{
							rng.text = "." + rng.text;
						}
						else
						{
							rng.text = ".";
						}
					}
					break;
					
				case 6:
					if (rng.text != ".")
					{
						if (enDigits.indexOf(rng.text) >= 0)
						{
							rng.text = "." + rng.text;
						}
						else
						{
							rng.text = ".";
						}
					}
					break;
					
				case 10:
					if (rng.text != "/")
					{
						if (enDigits.indexOf(rng.text) >= 0)
						{
							rng.text = "/" + rng.text;
						}
						else
						{
							rng.text = "/";
						}
					}
					break;
					
				case 15:
					if (rng.text != "-")
					{
						if (enDigits.indexOf(rng.text) >= 0)
						{
							rng.text = "-" + rng.text;
						}
						else
						{
							rng.text = "-";
						}
					}
					break;
					
				default:
					if (enDigits.indexOf(rng.text) < 0)
					{
						rng.text = "";
					}
					break;
			}
			
			n++;
			
			// Movendo-se no texto um caracter por vez.
			rng.moveEnd("character", 1);
			rng.moveStart("character", 1);
		}
	}
	catch (e)
	{
	}
	
	this.OldValue = this.value;
}
function cnpjKeyFilter()
{	
	if (event.repeat)
	{
		event.returnValue = false;
		return false;
	}
	
	if (!isControlKey(event.keyCode))
	{
		event.returnValue = FloatMask(true, 0, ",");
		return event.returnValue;
	}
	
	event.returnValue = true;
	return true;
}

function FloatMask(isPositive, DecimalPlaces, DecimalSign)
{
	var key = event.keyCode;
	var src = event.srcElement;
	var keySign = 188;
	
	if (isControlKey(key)) return true;

	if (key == 109)
	{
		if (isPositive) return false;
		if (src.value.indexOf("-") < 0)
		{
			src.value = "-" + src.value;
		}

		return false;
	}

	if (DecimalSign != ",")
	{
		keySign = 190;
		if (key == 194)
		{
			keySign = key;
		}
	}
	else if (key == 110)
	{
		keySign = key;
	}

	if (key == keySign)
	{
		if (src.value.indexOf(DecimalSign) >= 0)
		{
			if (document.selection.createRange().text.indexOf(DecimalSign) >= 0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return true;
		}
	}

	if ((key < 48) || ((key > 57) && (key < 96)) || (key > 106)) return false;
	return true;
}

function FloatFormat(isPositive, DecimalPlaces, DecimalSign, Name)
{
	event.returnValue = true;

	var src = event.srcElement;
	src.value = src.value.replace("+", "");

	var reg = "[0-9]";
	if (!isPositive)
	{
		reg = "[-]?" + reg;
	}
	
	if (DecimalPlaces > 0)
	{
		reg += "*" + DecimalSign + "?[0-9]*";
	}
	else
	{
		reg += "+";
	}

	var mch = src.value.match(reg);
	if (mch == null)
	{
		src.value = "";
	}
	else
	{
		if (mch[0] != src.value) src.value = "";
	}
		
	var val = src.value;
	if (val != "")
	{
		var max = src.maxLength;
		if (max == "")
		{
			max = 0;
		}

		max = parseInt(max);
		if (max > 0)
		{
			var ll = max - (DecimalPlaces + 1);

			if (!isPositive)
			{
				if (val.indexOf("-") < 0)
				{
					ll -= 1;
				}
			}

			var rl = DecimalPlaces;

			var sl = "";
			var sr = "";

			var i = val.indexOf(DecimalSign);
			if (i == 0)
			{
				sl = "0";
				sr = val.substring(1, val.length);
			}
			else if (i > 0)
			{
				sl = val.substring(0, i);
				if (i < (val.length - 1))
				{
					sr = val.substring(i + 1, val.length);
				}
			}
			else
			{
				sl = val;
			}

			if ((sl.length > ll) || (sr.length > rl))
			{
				alert("O campo " + Name + " pode ter " + ll + " casa(s) antes e " + rl + " casa(s) depois da vírgula!");
				src.focus();
				src.value = "";
				event.returnValue = false;
				return false;
			}

			if (sr.length < rl)
			{
				sr += NewString("0", rl - sr.length);
			}

			src.value = sl + DecimalSign + sr;
		}
	}

	return true;
}

function FloatFormatPT(DecimalPlaces, Value)
{
	Value = Value.toString().toFloat();
	if (Value == 0)
	{
		return "0," + NewString("0", DecimalPlaces);
	}

	var dec = Math.pow(10, DecimalPlaces);
	var val = Value * dec;
	val = Math.round(val).toString();

	var sl = val.substring(0, val.length-DecimalPlaces);
	var sr = val.substring(val.length-DecimalPlaces, val.length);
	
	if (sl == "")
	{
		sl = "0," + NewString("0", DecimalPlaces-sr.length) + sr;
	}
	else
	{
		sl = sl + "," + sr;
	}

	return sl;
}

function NewString(chr, times)
{
	var str = "";
	for (var j = 0; j < times; j++)
	{
		str += chr;
	}

	return str;
}

function GenericMask()
{
	if (isControlKey(event.keyCode)) return true;
	if (arguments == null) return true;
	
	for (var i = 0; i < arguments.length; i++)
	{
		if (event.keyCode.toString() == arguments[i].toString()) return false;
	}
	
	return true;
}

function GenericFormat()
{
	var args = arguments;
	if (args == null) return;

	for (var i = 0; i < args.length; i++)
	{
		if (event.srcElement.value.indexOf(args[i]) >= 0)
		{
			event.srcElement.value = "";
			return;
		}
	}
}

function DateMask()
{
	event.srcElement.maxLength = 10;
	var str = event.srcElement.value;

	str = event.srcElement.value.replace(/\//g, "");
	if (NumericMask(8, str.length))
	{
		var key = event.keyCode;
		if (isControlKey(key)) return true;
		
		if (str.length == 2)
		{
			str = str.substring(0, 2) + "/";
		}
		else if (str.length > 2)
		{
			str = str.substring(0, 2) + "/" + str.substring(2, str.length);

			if (str.length == 5)
			{
				str = str.substring(0, 5) + "/";
			}
			else if (str.length > 5)
			{
				str = str.substring(0, 5) + "/" + str.substring(5, str.length);
			}
		}

		event.srcElement.value = str;
		return true;
	}

	return false;
}

function HourMask()
{
	event.srcElement.maxLength = 5;
	var str = event.srcElement.value;

	str = event.srcElement.value.replace(/:/g, "");
	if (NumericMask(4, str.length))
	{
		var key = event.keyCode;
		if (isControlKey(key)) return true;

		if (str.length == 2)
		{
			str = str.substring(0, 2) + ":";
		}
		else if (str.length > 2)
		{
			str = str.substring(0, 2) + ":" + str.substring(2, str.length);
		}

		event.srcElement.value = str;
		return true;
	}

	return false;
}

function HourFormat()
{
	var src = event.srcElement;
	var mch = src.value.match("[0-9]{1,2}:?[0-9]{1,2}");
	if (mch == null)
	{
		src.value = "";
	}
	else
	{
		if (mch[0] != src.value) src.value = "";
	}

	var str = event.srcElement.value;
	str = event.srcElement.value.replace(/:/g, "");
	if (str == "") return;

	if (str.length == 1)
	{
		str = "0" + str;
	}

	str += "0000";

	var h = str.substring(0, 2);
	var m = str.substring(2, 4);

	if ((h > "23") || (m > "59"))
	{
		str = "";
	}
	else
	{
		str = h + ":" + m;
	}

	if (str == "00:00")
	{
		str = "";
	}

	event.srcElement.value = str;
}

function ParseToDate()
{
	var d = 0, m = 0, a = 0;
	var h = 0, n = 0, s = 0;

	var str = this.trim();
	if (str.match(/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}( [0-9]{1,2}(:[0-9]{1,2}){1,2})?$/g) == null)
	{
		return null;
	}

	var dt = null;
	var hr = null;

	var dh = str.split(" ");
	if (dh.length > 0)
	{
		dt = dh[0];
		dt = dt.split("/");

		d = dt[0].toInt();
		m = dt[1].toInt() - 1;
		a = dt[2].toInt();
	}

	if (dh.length > 1)
	{
		hr = dh[1];
		hr = hr.split(":");

		h = hr[0].toInt();
		n = hr[1].toInt();

		if (hr.length > 2)
		{
			s = hr[2].toInt();
		}
	}

	dh = new Date();
	dh.setFullYear(a);
	dh.setMonth(m);
	dh.setDate(d);
	dh.setHours(h, n, s);

	if (dh.getFullYear() != a) return null;
	if (dh.getDate() != d) return null;
	if (dh.getMonth() != m) return null;
	if (dh.getHours() != h) return null;
	if (dh.getMinutes() != n) return null;
	if (dh.getSeconds() != s) return null;

	return dh;
}

function ParseToInt()
{
	var str = this;
	if (str.match(/^[-+]?[0-9]+$/g) == null)
	{
		return null
	}

	var num = 0;
	var sgn = 1;
	for (var i = 0; i < str.length; i++)
	{
		var s = str.substr(i, 1);
		if (s == "-")
		{
			sgn = -1;
		}
		else if (s != "+")
		{
			num += parseInt(s) * (Math.pow(10, (str.length - (i + 1))));
		}
	}

	return (num * sgn);
}
function FormatCurrency(num, symbol)
{
   // Courtesy of http://www7.brinkster.com/cyanide7/
 num = num.toString().replace(/\R$|\,/g,'');
 if(isNaN(num))
    num = "0";
 sign = (num == (num = Math.abs(num)));
 num = Math.floor(num*100+0.50000000001);
 cents = num%100;
 num = Math.floor(num/100).toString();
 if(cents<10)
     cents = "0" + cents;
 for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
     num = num.substring(0,num.length-(4*i+3))+'.'+
           num.substring(num.length-(4*i+3));
      return (((sign)?'':'-') + symbol + num + ',' + cents);
}

