(function($) {
	$.fn.tweet = function(a) {
		var params = new Array();

		for (var i = 1; i < arguments.length; i++) {
			params.push(arguments[i]);
		}

		if (typeof a != "string") {
			var defaults = {
				limit: 140,
				ok: [140, 50, "ok"],
				watch: [49, 25, "watch"],
				warning: [24, 0, "warning"],
				error: [0, -140, "error"]
			};

			var options = $.extend({}, defaults, a);

			return this.each(function() {
				var charCount = $(this).val().length;
				var charsLeft = options["limit"] - charCount;
				var types = ["ok", "watch", "warning", "error"];

				$.each(types, function() {
					var el = this.toString();

					if ($(options["counter"]).hasClass(options[el][2])) {
						$(options["counter"]).removeClass(options[el][2]);
					}

					if ((charsLeft <= options[el][0]) && (charsLeft >= options[el][1])) {
						$(options["counter"]).addClass(options[el][2]);
					}
				});

				$(options["counter"]).text(charsLeft);
				
				$(this).one("keyup", function() {
					$(this).tweet(options);
				});

				$(this).bind("setCursor", function(e, pos) {                
					if ($(this).get(0).setSelectionRange) {
						$(this).focus();
						$(this).get(0).setSelectionRange(pos, pos);
					} else if ($(this).get(0).createTextRange) {
						var range = $(this).get(0).createTextRange();

						range.collapse(true);
						range.moveEnd("character", pos);
						range.moveStart("character", pos);
						range.select();
					}
				});
			});
		} else {        
			return this.each(function() {           
				$(this).trigger(a, params);
			});
		}

		return this;
	};
})(jQuery);