/*
 * Horizontal Bar Graph for jQuery
 * version 0.1a
 *
 * http://www.dumpsterdoggy.com/plugins/horiz-bar-graph
 *
 * Copyright (c) 2009 Chris Missal
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 */
(function($) {
	$.fn.horizontalBarGraph = function(options) {
	
		var opts = $.extend({}, $.fn.horizontalBarGraph.defaults, options);
		
		this.children("dt,dd").each(function(i) {
		
			var el = $(this);
			if(el.is("dt")) {
				el.css({display: "block", float: "left", clear: "left"}).addClass("hbg-label"); return;
			} else {
				(isTitleDD(el) && opts.hasTitles ? createTitle : createBar)(el, opts);
			}
			setBarHover(el, opts);
		});
		
		tryShowTitle(this);
		
		if(opts.animated) {
			createShowButton(opts, this).insertBefore(this);
		}
		if(opts.colors.length) {
			setColors(this.children("dd"), opts);
		}
		if(opts.hoverColors.length) {
			setHoverColors(this.children("dd"), opts);
		}
		
		scaleGraph(this);
		
		return this;
	};
	
	function scaleGraph(graph) {
		var maxWidth = 0;
		graph.children("dt").each(function() {
			maxWidth = Math.max($(this).width(), maxWidth);
		}).css({width: maxWidth+"px"});
	}
	
	function setBarHover(bar, opts) {
		bar.hover(function() {
			bar.addClass("hbg-bar-hover");
		}, function() {
			bar.removeClass("hbg-bar-hover");
		});
	}
	
	function createShowButton(opts, graph) {
		var button = $("<span />").text(opts.button).addClass("hbg-show-button");
		button.click(function() {
			graph.children("dd").show('slow', function() { button.fadeOut('normal'); });
		});
		return button;
	}
	
	function createBar(e, opts) {
		var val = e.text();
		e.css({marginLeft: e.prev().is("dt") ? "5px" : "0px", width: Math.floor(val/opts.interval)+"px"});
		e.html($("<span/>").html(val).addClass("hbg-value"));
		applyOptions(e, opts);
	}
	
	function createTitle(e, opts) {
		var title = e.text();
		e.prev().attr("title", title);
		e.remove();
	}
	
	function tryShowTitle(graph) {
		var title = graph.attr("title");
		if(title) {
			$("<div/>").text(title).addClass("hbg-title").insertBefore(graph);
			graph.css({overflow: "hidden"});
		}
	}
	
	function setColors(bars, opts) {
		var i = 0;
		bars.each(function() { 
			var c = i++ % opts.colors.length;
			$(this).css({backgroundColor: opts.colors[c]});
		});
	}
	
	function setHoverColors(bars, opts) {
		var i = 0;
		bars.each(function(i) {
			var bar = $(this);
			var c = bar.css("background-color");
			var hc = opts.hoverColors[i++ % opts.hoverColors.length];
			bar.hover(function() {
				$(this).css({backgroundColor: hc});
			}, function() {
				$(this).css({backgroundColor: c});
			});
		});
	}
	
	function applyOptions(e, opts) {
		e.css({float: "left"}).addClass("hbg-bar");
		if(opts.animated) { e.hide(); }
	}
	
	function isTitleDD(e) {
		return (e.is(":even") && e.prev().is("dd"));
	}
	
	$.fn.horizontalBarGraph.defaults = {
		interval: 1,
		hasTitles: false,
		animated: false,
		button: 'Show Values',
		colors: [],
		hoverColors: []
	};
	
})(jQuery);
