﻿jQuery.fn.maxlength = function() {

    bindKeypressEvent();
    bindKeyupEvent();
    bindPasteEvent();

    function handleLength(target, event){
        var key = event.which;

        if ($(target).attr("maxlength")) {
            //all keys including enter, backspace, tab.
            if (key >= 32 || key == 13 || key == 8 || key == 9) {
                var maxLength = $(target).attr("maxlength");
                var length = target.value.length;
                if (length >= maxLength) {
                    target.value = target.value.substring(0, maxLength);
                    event.preventDefault();
                }
            }
        }
    }

    function bindPasteEvent()
    {
        var textAreas = $("textarea");
        $.each(textAreas, function() {
            if (!$.data(this, 'events') || !$.data(this, 'events').paste){
                $("textarea").bind('paste', function(event) {
                    if ($(this).attr("maxlength")) {
                        var maxLength = $(this).attr("maxlength");
                        var selectionRange = document.selection.createRange();
                        var selectionLength = selectionRange.text.length;
                        var pasteData = window.clipboardData.getData("Text");
                        var dataLength = Math.min(Math.abs((maxLength - this.value.length) - selectionLength), pasteData.length);
                        selectionRange.text = pasteData.substring(0, dataLength);
                        window.event.returnValue = false;
                        return;
                    }
                });
            }
        });
    }

    function bindKeypressEvent()
    {
        var textAreas = $("textarea");
        $.each(textAreas, function() {
            if (!$.data(this, 'events') || !$.data(this, 'events').keypress){
                $("textarea").bind("keypress", function(event) {
                    handleLength(this, event);
                });
            }
        });
    }

    function bindKeyupEvent()
    {
        var textAreas = $("textarea");
        $.each(textAreas, function() {
            if (!$.data(this, 'events') || !$.data(this, 'events').keyup){
                $("textarea").bind("keyup", function(event) {
                    handleLength(this, event);
                });
            }
        });
    }
}

