jQuery.fn.extend({
	animeText: function(options) {
		return this.each(function() {
			jQuery.animateText.add(this, options);
		});
	}
});

jQuery.extend({
	animateText: {
		global: [],
		dataKey: "jQuery.animateText",
		add: function(element, options) {
			var text = $(element).text();
			$(element).attr('rel', text);
			$(document).data(this.dataKey, options);
			var rnd = Math.floor(Math.random() * options.chars.length);
			var col = Math.floor(Math.random() * options.colors.length);
			$(element).html('<span style="color: ' + options.colors[col] + '">' + options.chars[rnd] + '</span>');
			$(element).everyTime(options.step, this.update, text.length);
		},
		update: function(i) {
			var text = $(this).attr('rel');
			var options = $(document).data(jQuery.animateText.dataKey);
			var rnd = Math.floor(Math.random() * options.chars.length);
			var col = Math.floor(Math.random() * options.colors.length);
		 	var str = text.substring(0, i) + '<span style="color: ' + options.colors[col] + ';">' + options.chars[rnd] + '</span>';
		 	$(this).html(str);
		 	if (i == text.length) {
		 		$(this).stopTime();
		 		$(this).oneTime(options.step*2, jQuery.animateText.lastUpdate);
		 	}
		},
		lastUpdate: function() {
			var options = $(document).data(jQuery.animateText.dataKey);
			var str = $(this).attr('rel') + '<span style="color: ' + options.lastColor + ';">' + options.lastChar + '</span>';
			$(this).html(str);
			$(this).oneTime(options.step, jQuery.animateText.complete);
		},
		complete: function() {
			var options = $(document).data(jQuery.animateText.dataKey);
			$(this).html($(this).attr('rel'));
		}
	}
})