/*
* jQuery Simply Countable plugin
* Provides a character counter for any text input or textarea
* 
* @version  0.2
* @homepage http://github.com/aaronrussell/jquery-simply-countable/
* @author   Aaron Russell (http://www.aaronrussell.co.uk)
*
* Copyright (c) 2009 Aaron Russell (aaron@gc4.co.uk)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*/

/* Modified by Richard Assar. Considers URLs as 20 characters. */

(function($){
	var URLPattern = /^(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?/;
	
	function calculateURLShortenedLength(value) {
		var split = value.split(" ");

		var length = 0;

		for(var i = 0; i < split.length; i++) {
			length += URLPattern.test(split[i]) ? 20 : split[i].length;			
		}

		length += split.length - 1;

		return length;
	};

	$.fn.simplyCountable = function(options){
		options = $.extend({
			counter: '#counter',
			countType: 'characters',
			maxCount: 140,
			countDirection: 'down',
			safeClass: 'safe',
			overClass: 'over'
		}, options);

		var countable = this;

		var countCheck = function() {
			var value = countable.val();
	
			if (options.countType === 'words') {	
				var count = options.maxCount - value.split(/[\s]+/).length;
				if (value === '') count += 1;
			} else { 
				var count = options.maxCount - calculateURLShortenedLength(value);
			}

			if (!$(options.counter).hasClass(options.safeClass) && !$(options.counter).hasClass(options.overClass)) {
				if (count < 0) {
					$(options.counter).addClass(options.overClass);
				} else { 
					$(options.counter).addClass(options.safeClass);
				}
			} else if (count < 0 && $(options.counter).hasClass(options.safeClass)) {
				$(options.counter)
					.removeClass(options.safeClass)
					.addClass(options.overClass);
			} else if (count >= 0 && $(options.counter).hasClass(options.overClass)) {
				$(options.counter)
					.removeClass(options.overClass)
					.addClass(options.safeClass);
			}

			if (options.countDirection === 'up') {
				count = count - (count*2) + options.maxCount;
			}

			$(options.counter).text(count);
		};
	
		countCheck();

		countable.keyup(countCheck);
		countable.focus(countCheck);
		countable.change(countCheck);
	};
})(jQuery);

