(function($){
	
	animating = false;
	
	createBar = function() {
		return $(
			'<div class="bar">' +
				'<div class="tooltip"></div>' +
				'<div class="top"></div>' +
				'<div class="span"></div>' +
			'</div>');
	};
	
	calculateHeight = function(wrapHeight, barHeight) {
		height = wrapHeight - barHeight;
		if($.browser.msie) {
			if($.browser.version == "6.0" || $.browser.version == "7.0") {
				return height + 3;
			}
		}
		
		return height;
	};
	
	ifIe = function(ifIe, other) {
		return ($.browser.msie) ? ifIe : other;
	};
	
	addBar = function(wrap, bar, val, min, max, height, n) {
		
		setTimeout(function(){
			if(val == min) {
				bar.addClass("green");
			} else if(val == max) {
				bar.addClass("red");
			} else {
				bar.addClass("grey");
			}
			
			wrap.append(bar);
			
			bar.fadeOut(function(){
				bar.css("margin-top", wrap.height() - bar.height());
				bar.fadeIn(ifIe(0, "slow"), function(){
					bar.animate({
						"marginTop": calculateHeight(wrap.height(), bar.height()+height) + "px"
					}, function(){
						bar.children(".tooltip").append('<span>' + val + '</span>');
						//TODO: INSERT CUFON CALLBACK
					})
					bar.children(".span").animate({
						"height":  (height) + "px"
					}, function() { if(n == 4){ animating = false; } });
				});
			}).hide();
			
		}, 200*n);
		
	};
	
	buildBars = function(self, values, step) {
		$(self).each(function(n, em){
			
			wrap = $(em);
			wrap.children().each(function(i, ob){
				$(ob).fadeOut(ifIe(0, "slow"), function(){
					$(this).remove();
				})
			});
			
			setTimeout(function(){
				
				// Get min and max value
				sorted = values.slice(0, values.length).sort();
				min = sorted[0];
				max = sorted.pop();
				
				for(k in values) {
					addBar(wrap, createBar(), values[k], min, max, values[k]/step, k);
				}
			}, wrap.children().size() > 0 ? 500 : 0);
			
		});
	};
	
	waitForAnimation = function(self, values, step) {
	    if(animating)
	    {
	        setTimeout(function(){ waitForAnimation(self, values, step); }, 200);
	    }
	    else
	    {
	        animating = true;
	        buildBars(self, values, step);
	    }
	}
	
	$.fn.cordovanBars = function(values, step) {
	    waitForAnimation(this, values, step);
	};
	
})(jQuery);