(function($){
	$.fn.dashboard = function(options) {
		var opts = $.extend({}, $.fn.dashboard.defaults, options);
		return this.each(function(){
			var $this = $(this).addClass("dashboard ui-widget");
			var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			
			var $header = $("<div></div>").addClass("header ui-widget-header").appendTo($this);
			
			$this.append($("<div></div>").addClass("yFieldValueHeader ui-state-default").text(o.yFieldName));
			
			var $content = $("<ul></ul>").addClass("content").sortable({
				placeholder: "ui-state-highlight"
			}).appendTo($("<div></div>")).appendTo($this);
			var $controls = $("<div></div>").addClass("controls")
				.append($("<span></span>").attr("id","updateDashboard").addClass("control ui-state-default").click(update)
					.mouseover(function(){$(this).addClass("ui-state-hover");})
					.mouseout(function(){$(this).removeClass("ui-state-hover");})
					.append($("<span></span>").addClass("ui-icon ui-icon-refresh"))
					.append($("<span></span>").addClass("label").text(o.label.update))
				)
				.append($("<span></span>").attr("id","startDashboard").addClass("control ui-state-default").click(start)
					.mouseover(function(){$(this).addClass("ui-state-hover");})
					.mouseout(function(){$(this).removeClass("ui-state-hover");})
					.append($("<span></span>").addClass("ui-icon ui-icon-play"))
					.append($("<span></span>").addClass("label").text(o.label.startdashboard))
				)
				.append($("<span></span>").attr("id","stopDashboard").addClass("control ui-state-default ui-helper-hidden").click(stop)
					.mouseover(function(){$(this).addClass("ui-state-hover");})
					.mouseout(function(){$(this).removeClass("ui-state-hover");})
					.append($("<span></span>").addClass("ui-icon ui-icon-stop"))
					.append($("<span></span>").addClass("label").text(o.label.stopdashboard))
				)
				.append($("<span></span>").addClass("loading ui-helper-hidden"))
				.append($("<span></span>").attr("id", "labeltest").addClass("labeltext"))
				.appendTo($this);
			
			$header.append($("<div><div>").addClass("xFieldValueHeader").text(o.xFieldName));	
			
			
			for (var i=0; i<o.xFieldValues.length; i++) {
				$header.append($("<div><div>").attr("id","header-"+o.xFieldValues[i].value).addClass("datacolumn").text(o.xFieldValues[i].label));
			};
			$header.append($("<div></div>").addClass("headerbottom"));
			
			var maxHeaderHeight = 0;	
			$header.find(".datacolumn").each(function() {
				if (maxHeaderHeight < $(this).height()) {
					maxHeaderHeight = $(this).height();
				}
			});
			$header.find(".datacolumn").height(maxHeaderHeight);

			update();

			function update() {
				if (o.processDataUrl) {
					$this.find(".controls").addClass("ui-state-disabled");
					$this.find(".loading").show();
					$.getJSON(o.processDataUrl,{"valuesJSON":o.valuesJson,"id":o.dashboardId},function(data){
						processData(data);
						$this.find(".controls").removeClass("ui-state-disabled");
						$this.find(".loading").hide();
					});
				};
			};
			
			function start() {
				update();
				$this.find("#stopDashboard").show();
				$this.find("#startDashboard").hide();
				$this.everyTime(o.refreshRate,"dashboard",update);
			};
			
			function stop() {
				$this.find("#stopDashboard").hide();
				$this.find("#startDashboard").show();
				$this.stopTime("dashboard");
			};
			
			function processData(data) {
				if (data && data.length && data.length>0) {
					var maxLabelLength = 0;
					var dataMap = {};
					for (var i=0; i<data.length; i++) {
						var xFieldValue = data[i].fieldMap.eventField;
						var yFieldValue = data[i].fieldMap.itemField;
						var itemValue = data[i].itemValue;
						$this.find("#labeltest").text(yFieldValue);
						if (maxLabelLength<$this.find("#labeltest").width()) {
							maxLabelLength=$this.find("#labeltest").width();
						}
						var $row = $content.find("#content-"+yFieldValue.replace(/[\.#:]/g,"-"));
										
						
						if ($row.length == 0) {							
							$row = $("<li></li>").attr("id","content-"+yFieldValue.replace(/[\.#:]/g,"-")).addClass("ui-state-default")
								.mouseover(function(){$(this).addClass("ui-state-hover");})
								.mouseout(function(){$(this).removeClass("ui-state-hover");}).appendTo($content);
							$row.append($("<div></div>").addClass("labelcolumn")
								.append($("<div></div>").addClass("ui-icon ui-icon-arrowthick-2-n-s"))
								.append($("<div></div>").addClass("labeltext").text(yFieldValue)));
							$row.show("highlight");
						};
						dataMap["["+xFieldValue+"]["+yFieldValue+"]"]=itemValue;
					};
					
									
					$this.width((maxLabelLength+40)+10+((o.xFieldValues.length)*115));
					$header.css({"padding-left":(maxLabelLength+40)+10});
					$content.find(".labelcolumn").width(maxLabelLength+40);
					
					
					
					resizeContainer();
						
					
					$content.find("li").each(function(){
						var yFieldValue = $(this).find(".labelcolumn .labeltext").text();
						for (var j = 0; j < o.xFieldValues.length; j++) {
							var xFieldValue = o.xFieldValues[j].value;
							var $field = $(this).find(".column"+j);
							if ($field.length==0) {
								$field = $("<div></div>").addClass("datacolumn ui-widget-content column"+j).appendTo($(this));
							}
							
							if (dataMap["["+xFieldValue+"]["+yFieldValue+"]"]==null) {
								$field.text(o.defaultValue);
							} else {
								$field.text(dataMap["["+xFieldValue+"]["+yFieldValue+"]"]).show("highlight");
							}
						}
					});
				};
			};
			
			function undoRemove() {
				$trash.children(":last").appendTo($resultColumns).show("highlight");
			};
			
		});
	};
	$.fn.dashboard.toJSON = function() {
		var returnValue = [];
		if (this.length > 0) {
			var $this = $(this[0]);
			$this.find(".resultcolumns li").each(function(i, conditionEle){
				returnValue.push({
					id:$(conditionEle).data("id"),
					name:$(conditionEle).data("name")
				});
			});
		};
		return JSON.stringify(returnValue);
	};
	$.fn.dashboard.defaults = {
		dashboardId:"",
		processDataUrl:"<html:rewrite action='/DataLink/DataLinkMainSearch'/>",
		refreshRate:10000,
		label:{
			update:"Update",
			startdashboard:"Start Dashboard",
			stopdashboard:"Stop Dashboard"
		},
		defaultValue:0,
		xFieldName:"",
		xFieldValues:[],
		yFieldName:"",
		valuesJson :""
	};
})(jQuery);

