/*
 * 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 trim(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) {
            return;
            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 'latin':
                    var  pattern = /[^a-z0-9!@%#$\^&*()\[\]+_=<>?.\/\\{}~"'’`:;,| \r\n\t~¢£¤¥¦§¨©«¬®¯°±²³´·¸¹º»ǀǁǂ\‒\–\—\―‖‗‘’‚‛“”„‟†‡•…′″‴‹›₤€₵℅ℓ№℗™■□▪▫◊○◌●◦-]+/i
                    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 = trim(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();
        }).change(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 'latin':
                    var  pattern = /[^a-z0-9!@%#$\^&*()\[\]+_=<>?.\/\\{}~"'’`:;,| \r\n\t~¢£¤¥¦§¨©«¬®¯°±²³´·¸¹º»ǀǁǂ\‒\–\—\―‖‗‘’‚‛“”„‟†‡•…′″‴‹›₤€₵℅ℓ№℗™■□▪▫◊○◌●◦-]+/i
                    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 = trim(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();
        }).blur(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 'latin':
                    var  pattern = /[^a-z0-9!@%#$\^&*()\[\]+_=<>?.\/\\{}~"'’`:;,| \r\n\t~¢£¤¥¦§¨©«¬®¯°±²³´·¸¹º»ǀǁǂ\‒\–\—\―‖‗‘’‚‛“”„‟†‡•…′″‴‹›₤€₵℅ℓ№℗™■□▪▫◊○◌●◦-]+/i
                    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 = trim(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);
