// SpinSix
// widget.js
// @author	Nicholas Boll
// @copy	Spinsix 2010

// add the Pascal prototype
String.prototype.toPascalCase = function() {
	return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase();
}

function removeGauge(link, func){
	
	 jQuery.get(link, func);
	
}

function gaugeEvent(eventString, gaugeId) {

	var dashboardId = document.dashboard_form.id.value;
	var groupId = document.dashboard_form.g.value;
	var url = "/gauge.do?id=" + dashboardId + "&g=" + groupId + "&m="
			+ eventString + "&v=" + gaugeId;

	removeGauge(url, function(data) {
		if( data!=null && data.length>0 ) {
			
			var n = data.indexOf('|');
			if( n>0 ) {
				var gid = data.substr(0,n);
				var content = data.substr(n+1);
				$('#x' + gid).html(content);
			}
		}
	});
}

var DashboardWidget = (function($) {

	// attach widget events
	var attach = function() {
		jQuery('.dashboard-widgets').delegate('.buttonctl', 'click',
				Events.clickButton);
		jQuery('.dashboard-widgets').bind('sortstop', Events.sortStop);
	};

	var Events = {

		// This is a delegation function. It will run and then call other event
		// handlers based on the button clicked
		// Add those event handlers to make them do something
		clickButton : function(e) {
			var button = jQuery(this).html().toPascalCase();
			var $widget = jQuery(this).closest('.widget-module');

			if (Events['click' + button]) {
				Events['click' + button].call(this, e, $widget);
			}
			e.preventDefault();
		},

		// Close the widget. This function is called by the clickButton delegate
		// function
		clickClose : function(e, $widget) {
			$widget.fadeOut('fast', function() {
				Events.removeWidget($widget);
			});
		},

		clickEdit : function(e, $widget) {

			var name = $widget.attr('name');

			window.location = "/dashboard/editor.html?ft=GaugeForm&id=" + name;
		},

		clickMinimize : function(e, $widget) {

			var current = $widget.find('.widget-bd').css('display');

			$widget.find('.widget-bd, .widget-ft').slideToggle('fast');

			if (current == 'block') {
				$widget.find('a.buttonctl.minimize').removeClass('minimize').addClass('maximize');
				
				var name = $widget.attr('name');
				gaugeEvent("minimize", name);
			} else {
				
				$widget.find('a.buttonctl.maximize').removeClass('maximize').addClass('minimize');
				
				var name = $widget.attr('name');
				gaugeEvent("restore", name);
			}
		},

		// This function is called after the clickClose function
		// The actual removal is done here
		removeWidget : function($widget) {
			$widget.remove();

			var name = $widget.attr('name');
			gaugeEvent("close", name);
		},

		// This function is called after a widget has been moved
		sortStop : function(e, ui) {
			var $widget = $(ui.item);

			var order1 = $('#dcol_1').sortable("toArray");
			var order2 = $('#dcol_2').sortable("toArray");
			var order3 = $('#dcol_3').sortable("toArray");
			var order4 = $('#dcol_4').sortable("toArray");

			gaugeEvent("sort", order1 + "|" + order2 + "|" + order3 + "|"
					+ order4)
		}
	};

	return {
		init : function() {
			// DOM ready
			jQuery(document).ready(function() {

				// Make the widgets sortable
				$('.widget-column').sortable( {
					connectWith : '.widget-column',
					handle : '.widget-hd',
					revert : 100,
					tolerance : 'pointer'
				}).disableSelection();

				// attach events
				attach();
			});
		}
	}
})(jQuery);
