(function(n){n.fn.charCounter=function(t,i){function r(r,o){if(r=n(r),r.val().length>t){if(r.data("good_char_val")?r.val(r.data("good_char_val")):r.val(r.val().substring(0,t)),r[0].setSelectionRange)r[0].focus(),r[0].setSelectionRange(0,0);else if(r[0].createTextRange){var s=r[0].createTextRange();s.collapse(!0);s.moveEnd("character",0);s.moveStart("character",0);s.select()}i.pulse&&!u&&e(o,!0)}else r.data("good_char_val",r.val());i.delay>0?(f&&window.clearTimeout(f),f=window.setTimeout(function(){o.html(i.format.replace(/%1/,t-r.val().length))},i.delay)):o.html(i.format.replace(/%1/,t-r.val().length))}function e(t,i){u&&(window.clearTimeout(u),u=null);t.animate({opacity:.1},100,function(){n(this).animate({opacity:1},100)});i&&(u=window.setTimeout(function(){e(t)},200))}t=t||100;i=n.extend({container:"<span><\/span>",classname:"charcounter",format:"(%1 characters remaining)",pulse:!0,delay:0},i);var u,f;return this.each(function(){var t=i.container.match(/^<.+>$/)?n(i.container).insertAfter(this).addClass(i.classname):n(i.container);n(this).bind("keydown",function(){r(this,t)}).bind("keypress",function(){r(this,t)}).bind("keyup",function(){r(this,t)}).bind("focus",function(){r(this,t)}).bind("mouseover",function(){r(this,t)}).bind("mouseout",function(){r(this,t)}).bind("paste",function(){var n=this;setTimeout(function(){r(n,t)},10)});this.addEventListener&&this.addEventListener("input",function(){r(this,t)},!1);r(this,t)})}})(jQuery)