/*
 *
 * Copyright (c) 2009 Doubleclique (dev [at] doubleclique [dot] com)
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license
 *
 */

/**
 *
 * @name     jquery.dql.charactercounter
 * @version  0.1
 * @author   Shane Garelja (shane [at] doubleclique [dot] com)
 * @requires jQuery
 *
 */

/*
 * Usage:
jQuery('#Story').charactercounter({'characterLimit' : 140});
<div class="filedHolder">
    <textarea id="Story"></textarea>
</div>
<span id="Counter"><!-- Counter text will appear here --></span>

NB: For more than one character counter on the same page you need to instantiate a counter for each:
jQuery('#Story1').charactercounter({'characterLimit' : 140});
jQuery('#Story2').charactercounter({'characterLimit' : 140});

 */

;
(function($){

	$.fn.charactercounter = function(options) {

		var settings = $.extend(
		{
			characterLimit : 100,
			counterElementSelecter : '#Counter',
			messageCharsRemaining : '(CHAR_COUNT characters left)',
			messageCharsExceeded : '(CHAR_COUNT characters over!)',
			errorElementSelector : '.fieldHolder',
			errorClass : 'error',
			exceededFn : function(el, left) {
				var messageExceed = settings.messageCharsExceeded.replace('CHAR_COUNT', (left * -1));
				$(settings.counterElementSelecter).text(messageExceed);
				$(el).closest(settings.errorElementSelector).addClass(settings.errorClass);
				settings.exceededCallbackFn(el);
			},
			exceededCallbackFn : function() {
			// Optional callback
			},
			remainingFn : function(el, left) {
				var messageRemain = settings.messageCharsRemaining.replace('CHAR_COUNT', left);
				$(settings.counterElementSelecter).text(messageRemain);
				$(el).closest(settings.errorElementSelector).removeClass(settings.errorClass);
				settings.remainingCallbackFn(el);
			},
			remainingCallbackFn : function() {
			// Optional callback
			}
		},
		options
		);

		var _updateCount = function(el) {
			var left = settings.characterLimit - $(el).val().length;
			if (left < 0) {
				settings.exceededFn(el, left);
			} else {
				settings.remainingFn(el, left);
			}
		}

		return this.each(
			function(index, el) {
				$(el).bind('keyup', function() {
					_updateCount(el);
				});
				_updateCount(el);
			}
			);
	};

})(jQuery);
