if(!window.Mask){
	window.Mask = {

		runEvent: false,
		operationKeys: [
		                Event.KEY_BACKSPACE,//  8
		                Event.KEY_TAB, 		//  9
		                Event.KEY_RETURN, 	// 13
		                Event.KEY_ESC, 		// 27
		                Event.KEY_LEFT, 	// 37
		                Event.KEY_UP, 		// 38
		                Event.KEY_RIGHT, 	// 39
		                Event.KEY_DOWN, 	// 40
		                Event.KEY_DELETE, 	// 46
		                Event.KEY_HOME, 	// 36
		                Event.KEY_END, 		// 35
		                Event.KEY_PAGEUP, 	// 33
		                Event.KEY_PAGEDOWN, // 34
		                Event.KEY_INSERT 	// 45
		               ],
		CEP: "##.###-###",
		CPF: "###.###.###-##",
		CNPJ: "##.###.###/####-##",
		DATE: "##/##/####",
		AREACODE: "##", 
		PHONE: "####-####",
		HOUR: "##:##",
		CREDITCARD: "#### #### #### ####",
		

		// Le a tecla
		readKey: function(event){
			return (!Object.isUndefined(event.charCode) && event.charCode != 0) ? event.charCode : 
					event.keyCode ? event.keyCode : 0;
		},
		
		// Verifica teclas de controle
		isCtrlKey: function(event){ return event.ctrlKey; },
		
		isAltKey: function(event){ return event.altKey; },
		
		isShiftKey: function(event){ return event.shiftKey; },
		
		isEnter: function(event){ return (this.readKey(event) == Event.KEY_RETURN); },
		
		// Verifica teclas de operacao
		isOperationKey: function(event){
			if(!Prototype.Browser.IE && this.operationKeys.include(event.keyCode))
				return true;
		},
		
		// So permite caracteres numericos
		onlyNumber: function(event){
			var keyCode = this.readKey(event);
			if((this.isCtrlKey(event)) ||
			   (this.isOperationKey(event)) ||
			   (keyCode >= 48 && keyCode <= 57)){ /* Numeros */
				
				return true;
			}
			return false;
		},
		
		// So permite caracteres numericos e letras
		onlyCharNumber: function(event){
			var keyCode = this.readKey(event);
			if((this.isCtrlKey(event)) ||
			   (this.isOperationKey(event)) ||
			   (keyCode >= 48 && keyCode <= 57) || /* Numeros */
			   (keyCode >= 65 && keyCode <= 90) || /* Letras Maisculas */
			   (keyCode >= 97 && keyCode <= 122)|| /* Letras Minusculas */
			   (keyCode == 45 || keyCode == 46 || keyCode == 95)){ /* hifen, ponto, underline */ 
				
				return true;
			}
			return false;
		},

		// Aplica tamanho maximo de caracteres em campos que nao possui
		applyMaxLength: function(textarea, maxlength){
			textarea = $(textarea);
			if(maxlength == null && !Object.isUndefined(textarea.getAttribute("maxlength"))){
				maxlength = parseInt(textarea.getAttribute("maxlength"), 10);
			}

			var callback = this.maxLength.bind(this, textarea, maxlength);
			Event.observe(textarea, "keyup", callback);
			Event.observe(textarea, "blur", callback);
		},

		// Truca texto ao tamanho maximo
		maxLength: function(textarea, maxlength){
			textarea = $(textarea);
			if(maxlength == null && !Object.isUndefined(textarea.getAttribute("maxlength"))){
				maxlength = parseInt(textarea.getAttribute("maxlength"), 10);
			}
			if((textarea.value||"").length > maxlength){
				textarea.value = textarea.value.substring(0, maxlength);
			}
		},

		// Aplica mascara ao campo
		applyMask: function(event, field, mask){
			var valueField = field.value;

			if(!String.isEmpty(valueField)){
				if(!this.runEvent){
					this.clear(valueField);
				}
				var value = this.setMask(valueField, mask);
				if(field.value != value)
				   field.value = value;
			}
			return true;
		},
		
		// Seta a mascara a um valor
		setMask: function(valueField, mask){
			var newValue = "";
			var charMask = "#";
			var count = 0;
			
			for(var i = 0; i < mask.length; i++){
				if(mask.charAt(i) == charMask){
					if(!String.isEmpty(valueField.charAt(count)) && mask.indexOf(valueField.charAt(count)) < 0){
						newValue += valueField.charAt(count++);
					}else if(!this.runEvent){
						break;
					}
				}else{
					newValue += mask.charAt(i);
					if(i == 0){
						newValue += valueField.charAt(count);
					}
					if(this.runEvent){
						newValue += valueField.charAt(count);
						i++;
					}
					count++;
				}
			}
			return newValue;
		},

		// Registra eventos para campos numericos
		numberField: function(field, mask){
			field = $(field);
			Event.observe(field, "keypress", this.onlyNumber.bindAsEventListener(this));
			if(!String.isEmpty(mask)){
				Event.observe(field, "keyup", this.applyMask.bindAsEventListener(this, field, mask));
			}
		},
		
		// Registra eventos para campos numericos e letras
		charNumberField: function(field, mask){
			field = $(field);
			Event.observe(field, "keypress", this.onlyCharNumber.bindAsEventListener(this));
			if(!String.isEmpty(mask)){
				Event.observe(field, "keyup", this.applyMask.bindAsEventListener(this, field, mask));
			}
		},
		
		// Limpa mascara
		clear: function(value){
			return value.replaceAll("[^0-9]", "");
		}
	};
}

