(function($){

	$.fn.fpModal = function(params) {
	
		var defaults = {
		
			wwWidth:300, //Modal Width
			wwHeight:200, //Modal Height
			wwColor:false, //Colore di sfondo
			wwPadding:0, //Padding
			//wwBorder:'none', //Bordo
			wwClass:'', //Classe da aggiungere
			bgColor:'#000',
			opacity:0.8,
			bgVisible:true, //Show background
			speed:'fast',
			draggable:true,
			center:true //Show the modal centered in the screen...
		
		}
		
		var o = $.extend(defaults,params);
		
		var bg = $('<div class="fpModalBg"></div>');
		var ww = $('<div class="fpModalWindow"></div>');
		
		return this.each(function() {
		
			var a = $(this);
			var w = $(window);
			var d = $(document);
			var b = $('body');
			
			var dragging = false;
			var dragX = 0;
			var dragY = 0;
		
			a.bind('click',show);
			w.bind('resize',redraw);
			bg.bind('click',hide);
			
			ww.bind('mousedown',startDrag);
			ww.bind('mouseup',stopDrag);
			
			$(document).bind('mousemove',drag);
			
			init();

			//init...			
			function init() {
				//nascondo i div del popup
				var target = a.attr('href');
				if (target.match(/^(#.+)$/)) {
					$(target).hide();
				}
				bg.hide();
				ww.hide();
				b.append(bg);
				b.append(ww);
			}
			
			function drag(e) {
			
				if (dragging && o.draggable) {
								
					deltaX = e.pageX - dragX;
					deltaY = e.pageY - dragY;
					
					//salvo le nuove posizioni
					dragX = e.pageX;
					dragY = e.pageY;
					
					newPosX = parseInt(ww.css('left'),10) + deltaX;
					newPosY = parseInt(ww.css('top'),10) + deltaY;
				
					ww.css('left', newPosX);
					ww.css('top',  newPosY);
				}
			}
			
			function startDrag(e) {
				dragging = true;
				dragX = e.pageX;
				dragY = e.pageY;
			}
			
			function stopDrag(e) {
				dragging = false;
			}
			
			function show(e) {
				e.preventDefault();
				e.stopPropagation();
				//nascondo eventuali altri popup
				$('.fpModalBg').hide();
				$('.fpModalWindow').hide();
				redraw();
				bg.fadeIn(o.speed);
				loadContent();
			}
			
			function hide(e) {
				dragging = false;
				e.stopPropagation();
				$('.fpModalBg').fadeOut(o.speed);
				$('.fpModalWindow').fadeOut(o.speed);
			}
			
			function loadContent() {
				var target = a.attr('href');
				if (target.match(/^(#.+)$/)) {
					var content = $(target).html();
					fill(content);
				} else {
					$.post(target, function(data) {
					  content = data;
					  fill(content);
					});
				}
			}
			
			function fill(content) {
				ww.html(content);
				ww.fadeIn(o.speed);
			}
			
			function redraw() {
				var bgWidth = d.width();
				var bgHeight = d.height();
				
				if (o.center) {
					//posizioni per popup centrato...
					var wwLeft = ( w.width()  - o.wwWidth  - o.wwPadding*2 ) / 2;
					var wwTop  = ( w.height() - o.wwHeight - o.wwPadding*2 ) / 2;
					if ( wwLeft < 0 ) centerLeft = 0;
					if ( wwTop  < 0 ) centerTop = 0;
					var position = 'fixed';
				} else {
					//posizioni per popup "inplace"
					var position = 'absolute';
					var wwLeft = a.offset().left + a.outerWidth() + 10;
					var wwTop  = a.offset().top;
				}
				
				if (!o.bgVisible) {
					o.bgColor = "transparent";
				}
			
				bg.css({
					top:0,
					left:0,
					position:'fixed',
					zIndex:1000,
					width:bgWidth,
					height:bgHeight,
					background:o.bgColor,
					opacity:o.opacity
				});
				
				//aggiungo una classe personalizzata
				ww.addClass(o.wwClass);
				
				ww.css({
					position:position,
					zIndex:2000,
					//padding:o.wwPadding,
					//border:o.wwBorder,
					width:o.wwWidth,
					height:o.wwHeight,
					left:wwLeft,
					top:wwTop
					//background:o.wwColor
				});
				
				if (o.wwPadding > 0)
				{
					ww.css('padding',o.wwPadding);
				}
				
				if (o.wwColor != false)
				{
					ww.css('background-color',o.wwColor);
				}
			}
		
		});
	
	}


})(jQuery)
