var floatingDivTimeout;
var floatingDivLastX, floatingDivLastY;

/**
* FloatingDiv: Creates a new div window with content from a local URL.
 *
 * @param options					Key/value pairs for specified options.
 * @param {event} 	[e]	 			Window event used to calculate mouse position if opening via Relative.
 * @author Nate Fisher (nate.scott.fisher@gmail.com)
 *
 */
(function($){
	
	var options;
	var posy, posx;
	
	$.FloatingDiv = function(arg_options, arg_e) {
		options = arg_options;
		posx = arg_e.clientX;
		posy = arg_e.clientY;
		clearTimeout(floatingDivTimeout);
		if (arg_options.Toggle == "Close") 
			{ $("#FloatingDiv").fadeOut("fast"); }
		else
			{ floatingDivTimeout = setTimeout($.FloatingDivDelay, arg_options.Delay); }
	}
	
	$.FloatingDivDelay = function() {
		// DEFAULT OPTIONS 
		options = $.extend( {
			xSize: "auto",
			ySize: "auto",
			TargetFileURL: "",
			Position: "Over",
			Type: "show()",
			Toggle: "Open",
			zIndex: "100"
		}, options || {});

		// MOUSE POSITION
		if (options.Position == "Relative") {
			posx = posx + document.body.scrollLeft + document.documentElement.scrollLeft;
			posy = posy + document.body.scrollTop + document.documentElement.scrollTop;
		}
		
		// SCREEN DIMENSIONS
		var screenWidth;
		var screenHeight;
		screenWidth = document.documentElement.scrollWidth;
		screenHeight = document.documentElement.scrollHeight;

		// PROCEED ONLY IF OPEN
		if (options.Toggle == "Open") {
			if (options.TargetFileURL == "")  return false;
			
			// PULL REMOTE DATA
			$.post(options.TargetFileURL, function(data) {
				var divHTML;
				divHTML = "<DIV ID='FloatingDiv' STYLE='position: absolute; top: "+posy+"; left: "+posx+";";
				divHTML += "height: "+options.ySize+"px; ";
				divHTML += "width: "+options.xSize+"px; ";
				divHTML += "z-index: "+options.zIndex+"; ";				
				divHTML += "'>"+data+"</DIV>";

				// IF DIV IS OPEN THEN REPLACE, OTHERWISE CREATE
				if ($("#FloatingDiv").length == 0)	{
					$("body").append(divHTML);
				} else {
					$("#FloatingDiv").html(data);	
					$("#FloatingDiv").show();
					$("#FloatingDiv").css({"height": options.ySize, "width": options.xSize, "z-index": options.zIndex});
				}
 
				// GET DIV DIMENSIONS
				var divWidth = document.getElementById("FloatingDiv").scrollWidth;
				var divHeight = document.getElementById("FloatingDiv").scrollHeight;
				
				// SET POSITION ACCORDING TO OPTIONS
				var top, left;
				switch(options.Position) {
					case "Lock":
						top = floatingDivLastY;
						left = floatingDivLastX;
						break;		
					case "Relative":
						top = posy;
						left = posx;
						// OPEN RELATIVE TO LOCATION ON SCREEN
						if (posy > screenHeight/2) top = (posy - divHeight - 20);
						if (posx > screenWidth/2) left = (posx - divWidth);
						break;							
					case "Bottom-Right":
						top = screenHeight-divHeight;
						left = screenWidth-divWidth;
						break;
					case "Bottom-Left":
						top = screenHeight-divHeight;
						left = 0;
						break;
					case "Top-Right":
						top = 0;
						left = screenWidth-divWidth;
						break;
					case "Top-Left":
						top = 0;
						left = 0;
						break;
					case "Over":
						top = screenHeight/2-divHeight/2;
						left = screenWidth/2-divWidth/2;
						break;		
					case "Top":
						top = 0;
						left = screenWidth/2-divWidth/2;
						break;	
					case "Left":
						top = screenHeight/2-divHeight/2;
						left = 0;
						break;	
					case "Right":
						top = screenHeight/2-divHeight/2;
						left = screenWidth-divWidth;
						break;	
					case "Bottom":
						top = screenHeight-divHeight;
						left = screenWidth/2-divWidth/2;
						break;		
					default:
						var top = 0;
						var left = 0;						
				}

				// DONT OPEN ABOVE OR TO LEFT OF SCREEN
				if (top < 0) top = 0;
				if (left < 0) left = 0;
				
				// POSITION THE DIV BEFORE REVEALING
				if (options.Position != "Lock") {
					$("#FloatingDiv").hide();
					$("#FloatingDiv").css({"top": top, "left": left});
				}
				
				// ADD HANDLE BAR TO THE DIV (FOR DRAGGING)
				var dragHandle = "<DIV ID='dragHandle' STYLE='position: absolute; top: 0px; left: 25%; width: 75%; height: 20px; cursor: move;'></DIV>";
				$("#FloatingDiv").prepend(dragHandle);
				
				// MAKE IT DRAGGABLE
				$("#FloatingDiv").draggable({"handle": "#dragHandle", "stop": recordFloatingDivPosition});				
								
				// CLEAR THE TIMEOUT WHEN ON THE DIV
				$("#FloatingDiv").mouseover(function() { clearTimeout(floatingDivTimeout); });
				
				// OPEN DIV USING SPECIFIED EFFECT
				eval("$('#FloatingDiv')."+options.Type);

			},"html");
		
		} else	$("#FloatingDiv").fadeOut("fast",function() {$("#FloatingDiv").remove();});
	
	}
	
})(jQuery);

function recordFloatingDivPosition() {
						var offset = $("#FloatingDiv").offset();
						floatingDivLastX = offset.left;
						floatingDivLastY = offset.top;						
}
