/*

 * Autotab - jQuery plugin 1.0

 * http://dev.lousyllama.com/auto-tab

 * 

 * Copyright (c) 2008 Matthew Miller

 * 

 * Dual licensed under the MIT and GPL licenses:

 *   http://www.opensource.org/licenses/mit-license.php

 *   http://www.gnu.org/licenses/gpl.html

 * 

 * Revised: 2008/05/22 01:23:25

 */



(function($) {



$.fn.autotab = function(options) {

	var defaults = {

		format: 'all',			// text, numeric, alphanumeric, all

		maxlength: 2147483647,	// Defaults to maxlength value

		uppercase: false,		// Converts a string to UPPERCASE

		lowercase: false,		// Converts a string to lowecase

		nospace: false,		// Remove spaces in the user input

		target: null,			// Where to auto tab to

		previous: null			// Backwards auto tab when all data is backspaced

	};



	$.extend(defaults, options);



	var check_element = function(name) {

		var val = null;

		var check_id = $('#' + name)[0];

		var check_name = $('input[name=' + name + ']')[0];



		if(check_id != undefined)

			val = $(check_id);

		else if(check_name != undefined)

			val = $(check_name);



		return val;

	};



	var key = function(e) {

		if(!e)

			e = window.event;



		return e.keyCode;

	};



	// Sets targets to element based on the name or ID passed

	if(typeof defaults.target == 'string')

		defaults.target = check_element(defaults.target);



	if(typeof defaults.previous == 'string')

		defaults.previous = check_element(defaults.previous);



	var maxlength = $(this).attr('maxlength');



	// Each text field has a maximum character limit of 2147483647



	// defaults.maxlength has not changed and maxlength was specified

	if(defaults.maxlength == 2147483647 && maxlength != 2147483647)

		defaults.maxlength = maxlength;

	// defaults.maxlength overrides maxlength

	else if(defaults.maxlength > 0)

		$(this).attr('maxlength', defaults.maxlength)

	// defaults.maxlength and maxlength have not been specified

	// A target cannot be used since there is no defined maxlength

	else

		defaults.target = null;



	// IE does not recognize the backspace key

	// with keypress in a blank input box

	if($.browser.msie)

	{

		this.keydown(function(e) {

			if(key(e) == 8)

			{

				var val = this.value;



				if(val.length == 0 && defaults.previous)

					defaults.previous.focus();

			}

		});

	}



	return this.keypress(function(e) {

		if(key(e) == 8)

		{

			var val = this.value;



			if(val.length == 0 && defaults.previous)

				defaults.previous.focus();

		}

	}).keyup(function(e) {

		var val = this.value;



		switch(defaults.format)

		{

			case 'text':

				var pattern = new RegExp('[0-9]+', 'g');

				var val = val.replace(pattern, '');

				break;



			case 'alpha':

				var pattern = new RegExp('[^a-zA-Z]+', 'g');

				var val = val.replace(pattern, '');

				break;



			case 'number':

			case 'numeric':

				var pattern = new RegExp('[^0-9]+', 'g');

				var val = val.replace(pattern, '');

				break;



			case 'alphanumeric':

				var pattern = new RegExp('[^0-9a-zA-Z]+', 'g');

				var val = val.replace(pattern, '');

				break;



			case 'all':

			default:

				break;

		}



		if(defaults.nospace)

		{

			pattern = new RegExp('[ ]+', 'g');

			val = val.replace(pattern, '');

		}



		if(defaults.uppercase)

			val = val.toUpperCase();



		if(defaults.lowercase)

			val = val.toLowerCase();



		this.value = val;



		/**

		 * Do not auto tab when the following keys are pressed

		 * 8:	Backspace

		 * 9:	Tab

		 * 16:	Shift

		 * 17:	Ctrl

		 * 18:	Alt

		 * 19:	Pause Break

		 * 20:	Caps Lock

		 * 27:	Esc

		 * 33:	Page Up

		 * 34:	Page Down

		 * 35:	End

		 * 36:	Home

		 * 37:	Left Arrow

		 * 38:	Up Arrow

		 * 39:	Right Arrow

		 * 40:	Down Arroww

		 * 45:	Insert

		 * 46:	Delete

		 * 144:	Num Lock

		 * 145:	Scroll Lock

		 */

		var keys = [8, 9, 16, 17, 18, 19, 20, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 144, 145];

		var string = keys.toString();



		if(string.indexOf(key(e)) == -1 && val.length == defaults.maxlength && defaults.target)

			defaults.target.focus();

	});

};



})(jQuery);