/*!
 * jQuery capslockstate plugin v1.2.1
 * https://github.com/nosilleg/capslockstate-jquery-plugin/
 *
 * Copyright 2012 Jason Ellison
 * Released under the MIT license
 * https://github.com/nosilleg/capslockstate-jquery-plugin/blob/master/MIT-LICENSE.txt
 *
 * Date: Sun Feb 3 2013 21:34:00 GMT
 */
(function($) {

    var capsLockState = "unknown";

    var methods = {
        init : function(options) {

            // Create some defaults, extending them with any options that were provided
            var settings = $.extend({
                // No defaults, because there are no options
            }, options);

            // Some systems will always return uppercase characters if Caps Lock is on.
            var capsLockForcedUppercase = /MacPPC|MacIntel/.test(window.navigator.platform) === true;

            var helpers = {
                isCapslockOn : function(event) {

                    var shiftOn = false;
                    if (event.shiftKey) { // determines whether or not the shift key was held
                        shiftOn = event.shiftKey; // stores shiftOn as true or false
                    } else if (event.modifiers) { // determines whether or not shift, alt or ctrl were held
                        shiftOn = !!(event.modifiers & 4);
                    }

                    var keyString = String.fromCharCode(event.which); // logs which key was pressed
                    if (keyString.toUpperCase() === keyString.toLowerCase()) {
                        // We can't determine the state for these keys
                    } else if (keyString.toUpperCase() === keyString) {
                        if (capsLockForcedUppercase === true && shiftOn) {
                            // We can't determine the state for these keys
                        } else {
                            capsLockState = !shiftOn;
                        }
                    } else if (keyString.toLowerCase() === keyString) {
                        capsLockState = shiftOn;
                    }

                    return capsLockState;

                },

                isCapslockKey : function(event) {

                    var keyCode = event.which; // logs which key was pressed
                    if (keyCode === 20) {
                        if (capsLockState !== "unknown") {
                            capsLockState = !capsLockState;
                        }
                    }

                    return capsLockState;

                },

                hasStateChange : function(previousState, currentState) {

                    if (previousState !== currentState) {
                        $('body').trigger("capsChanged");

                        if (currentState === true) {
                            $('body').trigger("capsOn");
                        } else if (currentState === false) {
                            $('body').trigger("capsOff");
                        } else if (currentState === "unknown") {
                            $('body').trigger("capsUnknown");
                        }
                    }
                }
            };

            // Check all keys
            $('body').bind("keypress.capslockstate", function(event) {
                var previousState = capsLockState;
                capsLockState = helpers.isCapslockOn(event);
                helpers.hasStateChange(previousState, capsLockState);
            });

            // Check if key was Caps Lock key
            $('body').bind("keydown.capslockstate", function(event) {
                var previousState = capsLockState;
                capsLockState = helpers.isCapslockKey(event);
                helpers.hasStateChange(previousState, capsLockState);
            });

            // If the window loses focus then we no longer know the state
            $(window).bind("focus.capslockstate", function() {
                var previousState = capsLockState;
                capsLockState = "unknown";
                helpers.hasStateChange(previousState, capsLockState);
            });

            // Trigger events on initial load of plugin
            helpers.hasStateChange(null, "unknown");

            // Maintain chainability
            return this.each(function() {});

        },
        state : function() {
            return capsLockState;
        },
        destroy : function() {
            return this.each(function() {
                $('body').unbind('.capslockstate');
                $(window).unbind('.capslockstate');
            })
        }
    }

    jQuery.fn.capslockstate = function(method) {

        // Method calling logic
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.capslockstate');
        }

    };
})(jQuery);
