/* global jQuery */
(function($) {
    $.fn.charLimiter = function(params) {
        params = $.extend({
           hard: false,
           limit: 100,
           info_id: "char_info"
        }, params);

        return this.each(function () {
            var input = $(this);
            var message_box = $('#' + params.info_id);
            var jcounter = null;
            var jmessage = null;

            var diff = params.limit - input.val().length;
            jcounter = $('<span class="counter_cnt">' + diff + '</span>').appendTo(message_box);
            jmessage = $('<span class="counter_msg">' + ((diff < 0) ? gettext("characters") : gettext("characters left")) + '.</span>').appendTo(message_box);

            $(this).data("params", params);
            $(this).bind("keypress keyup keydown", function (ev) { return input[0].update(ev); } );

            this.update = function (ev) {
                var param = input.data("params");
                if (typeof input.val() != 'undefined') {
                    var diff = param.limit - input.val().length;
                    if (param.hard && diff < 0) {
                        return (ev.keyCode == 8 || ev.keyCode == 46);
                    } else {
                        this.setCounter(diff);
                        this.setMessage(gettext("characters left") + ".");
                        return true;
                    }
                }
            };

            this.setCounter = function (cnt) {
                if (jcounter) {
                    jcounter.text(cnt);
                }
            };

            this.setMessage = function (msg) {
                if (jmessage) {
                    jmessage.text(msg);
                }
            };
        });
    };
})(jQuery);
