var dashboard = function(settings) {

	var $ = jQuery;
	var settings = $.extend( {}, dashboardDefaults, settings);
	var dash = this;
	
	var visitor = null, visited = null;
	
	this.setVisitor = function(id){ visitor = id; };
	this.setVisited = function(id){ visited = id; };
	this.getVisitor = function(){return visitor; };
	this.getVisited = function(){return visited; };
	
	// function onsotrstop - saves position of widget
	this.onsortstop = function(widget){
		
		// get parent node of widget - the column it is in
		var column	= $(widget).parent();
		var columnID = column.get(0).id;
		
		var x = 0, y = 0;
		
		if (typeof(settings.columnMap[columnID]) != 'undefined'){
			x = settings.columnMap[columnID];
		}
		
		// get order position of widget in column (y coordinate)
		var widgets = column.find(settings.widgetSelector);
		
		for(var i=0; i<widgets.length; i++){
			if (widgets[i].id == widget.id){
				y = i; break;
			}
		}
		
		this.saveWidgetPosition(x, y, $(widget).attr('widgetID'));
	};
	
	this.saveWidgetPosition = function(x, y, ID){
		$.ajax({
			url: settings.server,
			type: 'POST',
			data: {
				'do': 'savePosition',
				'x'	: x,
				'y' : y,
				'id': ID,
				'visited': this.getVisited()
			}
		});
	};
	
	// make widget elements moveable
	$(settings.widgetSelector).find(settings.handleSelector).each(function() {
		$(this).css( {
			cursor : 'move'
		})
		.mousedown(function(e) {
			$(this).parent().css( {
				width : $(this).parent().width() + 'px'
			});
		}).mouseup(function(e) {
			if (!$(this).parent().hasClass('dragging')) {
				$(this).parent().css( {
					width : ''
				});
			}
		});
	});

	var sort = $(settings.columnSelector).sortable( {
		items : settings.widgetSelector,
		connectWith : settings.columnSelector,
		handle : settings.handleSelector,
		placeholder : 'widget-placeholder',
		forcePlaceholderSize : true,
		forceHelperSize : true,
		revert : 300,
		delay : 100,
		opacity : 0.8,
		scroll: true,
		dropOnEmpty: true,
		start : function(e, ui) {
			if (ui.helper){
				$(ui.helper).addClass('dragging');
			}
		},
		stop : function(e, ui) {
			$(ui.item).css( {
				width : ''
			}).removeClass('dragging');

			// call ondrop handler 
			dash.onsortstop(ui.item[0]);
		}
	});
	
	this.destroy = function(){
		$(settings.widgetSelector).find(settings.handleSelector).each(function() {
			$(this).css( {
				cursor : 'default'
			})
			.unbind('mousedown')
			.unbind('mouseup');
		});
		$(settings.columnSelector).sortable('destroy');
		//$(settings.columnSelector).find(settings.handleSelector).find('a').each(function(){
		//	if (!$(this).hasClass('toggler')){
		//		$(this).remove();
		//	}
		//});
		
		for (var i in this)
			delete this[i];
	};
	
	this.removeWidget = function(id){
		
		if (!id) return;
		var widget = $(settings.rootElement).find('*[widgetid='+id+']');
		
		if (widget.length){
		
			$.ajax({
				url: settings.server,
				type: 'POST',
				dataType: 'json',
				data: {
					'do' : 'removeWidget',
					'id' : id,
					'visited': this.getVisited()
				},
				success: function(obj){
					if (obj && obj.success){
						// TODO: unbind event handlers
						widget.remove();
					}
				}
			});
		}
	};
	
	this.toggleWidget = function(id){
		
		if (!id) return;
		var widget = $(settings.rootElement).find('*[widgetid='+id+']');
		
		if (!widget.length) return;
		
		var toggler = widget.find('.toggler');
		
		$.ajax({
			url: settings.server,
			type: 'POST',
			dataType: 'json',
			data: {
				'do': 'toggleWidget', 
				id: id,
				'visited': this.getVisited()
			},
			success: function(obj){
				if (obj && obj.success){
					
					if (obj.collapsed){
						if (toggler.hasClass('toggled')){
							toggler.removeClass('toggled');
						}							
					}else{
						if (!toggler.hasClass('toggled')){
							toggler.addClass('toggled');
						}
					}
					widget.find(settings.contentSelector).toggle();
				}
			}// end success
		});
	};
	
	this.toggleWidgetRO = function(id){
		
		if (!id) return;
		var widget = $(settings.rootElement).find('*[widgetid='+id+']');
		
		if (!widget.length) return;
		
		var toggler = widget.find('.toggler');
		
		if (toggler.hasClass('toggled')){
			toggler.removeClass('toggled');
		}else{
			toggler.addClass('toggled');
		}
		widget.find(settings.contentSelector).toggle();
	};
	
	this.loadWidgetPage = function(id, page){
		
		$.ajax({
			url: settings.server,
			type: 'POST',
			dataType: 'html',
			data: {id: id, page: page, 'do': 'widgetPage', 'visited': this.getVisited()},
			success: function(html){
				$(settings.rootElement).find('*[widgetid='+id+']').find(settings.contentSelector).html(html);
			}
		});
	};
	
	this.submitForm = function(formName, id){
		
		var form = $(settings.rootElement).find('*[widgetid='+id+']').find('form[name="'+formName+'"]');
		if (!form) return false;
		
		var data = form.serialize();
		
		$.ajax({
			url: settings.server,
			type: 'POST',
			dataType: 'html',
			data: {form: formName, id: id, formData: data, 'do': 'processWidgetForm', 'visited': this.getVisited()},
			success: function(html){
				$(settings.rootElement).find('*[widgetid='+id+']').find(settings.contentSelector).html(html);	
			}
		});
		
	};

	this.setWidgetTitle = function(id, title){
		$(settings.rootElement).find('*[widgetid='+id+']').find(settings.handleSelector).find('h3').html(title);
	};
	
	this.addWidget = function(widgetID){
		if (!widgetID) return;
		
		$.ajax({
			url: settings.server,
			type: 'POST',
			dataType: 'json',
			data: {'id': widgetID, 'do': 'addWidget'},
			success: function(obj){
				
				var fstColID = '';
				for (var i in settings.columnMap){
					if (settings.columnMap[i] == 0){
						fstColID = i;
					}
				}
				
				if (fstColID.length){
					
					jQuery('#'+fstColID)
						.append(obj.html)
						.find(settings.widgetSelector+'[widgetid='+obj.id+']')
						.find(settings.handleSelector)
						.css( { cursor : 'move'})
						.mousedown(function(e) { 
								$(this).parent().css( { 
									width : $(this).parent().width() + 'px' 
								});
						}).mouseup(function(e) {
							if (!$(this).parent().hasClass('dragging')) {
								$(this).parent().css( {
									width : ''
								});
							}
						});
				}
			}
		});
	};
};

var dashboardDefaults = {
	rootElement : '#content',
	columnSelector : '#middle_left, #WidgetsRightColumn',
	widgetSelector : '.widget[sortable=true]',
	handleSelector : '.widget-head',
	contentSelector : '.widget-content',
	widgetDefault : {
		movable : true,
		removable : true,
		collapsible : true,
		editable : true
	},
	columnMap : {
		'middle_left' : 0,
		'WidgetsRightColumn': 1
	},
	server: '/widgets/server.php'
};