﻿(function($) {
	$.fn.textCounter = function(opts) {
	    /* options */
        var options = {
	        limit: 140,
	        warning: 25,
	        countWords: false,
	        counterElement: 'span',
	        counterClass: 'counter',
	        warningClass: 'warning',	
	        exceededClass: 'exceeded',
    	    
	        counterText: ''
	    };
	    
	    function HandleTextChange(eventObject)
	    {
	        var targ = $(eventObject.target);
	        UpdateCounter(targ);
	    };
    	
	    function UpdateCounter(targ)
	    {
	        var counterElm = targ.next(options.counterElement+"."+options.counterClass);
	        var cnt = 0;
	        var remaining = 0;
    	    
	        if(options.countWords)
	        {
	            var safeText = $.trim(targ.val()).replace(/\s+/gi, " ");
	            
	            if(safeText.length != 0)
	                cnt = safeText.split(/\s/gi).length;
    	       
	            remaining = options.limit - cnt;
	        }
	        else
	        {
	            var safeText = $.trim(targ.val());
	            if(safeText.length != 0)
	                cnt = safeText.length;
	            remaining = options.limit - cnt;
	        }
    	    
	        counterElm.text($.trim(options.counterText) + " " + remaining);
    	    
	        (cnt > options.warning && cnt <= options.limit) ? counterElm.addClass(options.warningClass) : counterElm.removeClass(options.warningClass);
	        (cnt > options.limit) ? counterElm.addClass(options.exceededClass) : counterElm.removeClass(options.exceededClass);
	    };
	
		this.each(function() {
		   //var settings = null;
			if(opts) {
                $.extend(options, opts);
            }
            
            var targ = $(this);
            var counterElm = targ.next(options.counterElement+"."+options.counterClass);
            
            if(counterElm.length == 0)
            {
            
                counterElm = $("<"+options.counterElement+"/>", {
                    className : options.counterClass,
                    text: $.trim(options.counterText) + " " + options.limit
                });
                targ.after(counterElm);
                targ.bind("keyup", HandleTextChange);
            }
            
            UpdateCounter(targ);
        });
        
		return this;
	};
})(jQuery);
