// Rits Object
if(typeof Rits == "undefined") {
	var Rits = {};
}

/**
 * Form
 *
 * @category   Rits
 * @package    Rits
 * @copyright  Copyright (c) 2007 Rits Comunicacao & Teconologia. (http://www.rits.com.br) 
 */
Rits.Form = {
		
	/**
	 * Set a masked input
	 * 
	 * @param Object input
	 * @param string mask
	 */
	setMask: function(input, mask) {
		Event.observe(input, 'keypress',
			Rits.Form.applyMask.bindAsEventListener(input, mask), true);
	},
	
	/**
	 * Applies a mask to an input
	 * 
	 * @param event event
	 * @param string mask
	 */
	applyMask: function(event, mask) {
		
		var key = Rits.Form.getKey(event);

		if(Rits.Form.isPrintable(key)) {
			
			var character = String.fromCharCode(key);			
			
			var temp;
			if(this.value && this.value.length) {
			 	temp = this.value + character;
			} else {
				temp = character;
			}
			
			var position = temp.length - 1;

			var ok = true;			
			if(position < mask.length) {
				if(mask.charAt(position) == '#') {
					
					if(!(character >= '0' && character <= '9')) {
						ok = false;
					}
				} else if(mask.charAt(position) == 'A') {
					if(!((character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z'))) {
						ok = false;
					}
				} else if(mask.charAt(position) == 'B') {
				} else {
					if(this.value && this.value.length) {
						temp = this.value;
					} else {
						temp = '';
					}
					while(position < mask.length) {
						if(mask.charAt(position) == '#') {
							
							if(!(character >= '0' && character <= '9')) {
								ok = false;
							}
							break;
						} else if(mask.charAt(position) == 'A') {
							if(!((character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z'))) {
								ok = false;
							}
							break;
						} else if(mask.charAt(position) == 'B') {
							break;
						} else {							
							temp += mask.charAt(position);
						}
						position++;
					}

					temp += character;
				}
				
				position++;

				while(position < mask.length) {
					if(mask.charAt(position) == '#') {
						break;
					} else if(mask.charAt(position) == 'A') {
						break;
					} else if(mask.charAt(position) == 'B') {
						break;
					} else {
						temp += mask.charAt(position);
					}
					position++;
				}
				
			} else {
				ok = false;
			}

			
			if(ok) {				
				this.value = temp;				
			}
	
			Event.stop(event);
		}

	},
	
	/**
	 * Sets a limit to an input
	 *
	 * @param Object input
	 * @param int limit
	 * @param Object counter
	 */
	setLimit: function(input, limit, counter) {	
		Event.observe(input, 'keyup',
			Rits.Form.applyLimit.bindAsEventListener(input, limit, counter), true);
		Event.observe(input, 'keydown',
			Rits.Form.applyLimit.bindAsEventListener(input, limit, counter), true);
	},
	
	/**
	 * Applies a limit to an input
	 *
	 * @param event event
	 * @param int limit
	 * @param Object counter
	 */
	applyLimit: function(event, limit, counter) {
		if(limit < this.value.length) {
			this.value = this.value.substring(0, limit);
		}
		counter.value = this.value.length;
	},
	
	/**
	 * Get the key code associated to the event
	 *
	 * @param event e
	 */
	getKey: function(e) {
		return window.event ? window.event.keyCode : e ? e.which : 0;		
	}, 
	
	/**
	 * Returns if the key is printable
	 * 
	 * @param int key
	 */
	isPrintable: function(key) {		
		return ( key >= 32 && key < 127 );
	}
}