﻿/*
* valid masks can be:
* phone ->  "(###) ###-####"
* cep    ->  "##.###-###"
* cpf     ->  "###.###.###-##"
* car     ->  "AAA-####"
* date	-> "##/##/####"
* others -> "####-####"

usage: Text="__/__/____" onkeypress="return mask(this, event, '##/##/####');"
*/
function mask(field, evt, mask)
{
	var LettersU = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	var LettersL = 'abcdefghijklmnopqrstuvwxyz';
	var Letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
	var Numbers = '0123456789';
	var Markers = '().-:/ ';
	var Charset = " !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_/`abcdefghijklmnopqrstuvwxyz{|}~";
	
	if (field.value == mask.replace(/#/g, '_')) field.value = '';
	var value = field.value;
	if (evt)
	{
		var key;
		if (window.event) 
		{
			key = evt.keyCode;
		}
		else 
		{
			key = evt.which;
			if (key == undefined || key == 0) key = evt.keyCode;
		}
		
		if (key < 32)
		{
			return true;
		}
		var key = Charset.substr(key - 32, 1);

		var count = value.length;
		if (count >= mask.length)
		{
			field.value = value;
			evt.cancelBubble = true;
			return false;
		}
		var pos = mask.substr(count, 1);
		while (Markers.indexOf(pos) != -1)
		{
			value += pos;
			count = value.length;
			if (count >= mask.length)
			{
				evt.cancelBubble = true;
				return false;
			}
			pos = mask.substr(count, 1);
		}
		switch (pos)
		{
			case '#': if (Numbers.indexOf(key) == -1) { evt.cancelBubble = true; return false; } break;
			case 'A': if (LettersU.indexOf(key) == -1) { evt.cancelBubble = true; return false; } break;
			case 'a': if (LettersL.indexOf(key) == -1) { evt.cancelBubble = true; return false; } break;
			case 'Z': if (Letters.indexOf(key) == -1) { evt.cancelBubble = true; return false; } break;
			case '*': /*return true;*/field.value = value + key; break;
			default: /*return false;*/field.value = value; break;
		}
	}
	field.value = value + key;
	evt.cancelBubble = true;
	return false;
}

