﻿var		ModalWindows			= [];
var		DefaultFadeInMS			= 500;
var		DefaultBackdropOpacity	= .7;
/** 
	* Creates a div and an iFrame that are absolutely positioned to fill the browser's viewport.
	* @param {Double}	destOpacity			The Final opacity that the darkened backdrop should have. (A value between 0 or 1 representing the opacity)
	* @param {Integer}	fadeInDurationMS	The number of milliseconds that the whole fade in process should occur.
	* @returns {Div, Frame }				Returns a structure containing a reference to the newly created Div and Iframe.
*/
function ModalWindow_CreateBackdrop(destOpacity, fadeInDurationMS)
{
	var		TagsCreated						= ["iframe", "div"];
	if ((typeof destOpacity=="undefined")		&& (destOpacity==null))			{ destOpacity		= .7;		}
	if ((typeof fadeInDurationMS=="undefined")	&& (fadeInDurationMS==null))	{ fadeInDurationMS	= 1000;		}
	var		Dimensions						= GetBodyViewportDimensions	();
	var		ScrollInfo						= GetWindowScrollInfo		();
	var		divBackdrop						= null;
	var		frmBackdrop						= null;
	for (var i=0; i<TagsCreated.length; i++)
	{
		var		TagName						= TagsCreated[i];
		var		element						= document.createElement	(TagName);
		element.style.position				= 'absolute';
		element.style.left					= ScrollInfo.ScrollLeft		+ 'px';
		element.style.top					= ScrollInfo.ScrollTop		+ 'px';
		element.style.width					= Dimensions.Width			+ 'px';
		element.style.height				= Dimensions.Height			+ 'px';
		element.style.opacity				= '0';
		element.style.backgroundColor		= '#000000';
		InsertElementAfter(element,	document.body.lastChild);
		if (TagName=="div")
			{ divBackdrop					= element; }
		else if(TagName=="iframe")
			{ frmBackdrop					= element; }
		//alert(ScrollInfo.ScrollLeft + 'x' + ScrollInfo.ScrollTop + '-' + Dimensions.Width + 'x' + Dimensions.Height);
	};
	FadeTo(divBackdrop, destOpacity, fadeInDurationMS, fadeInDurationMS/1000 * 45, window.ActiveFadeAction);
	return { Div:divBackdrop, Frame:frmBackdrop };
}
function ModalWindow_CreateNew(element, backdropOpacity, fadeInDurationMS)
{
	if (typeof fadeInDurationMS=="undefined")	{ fadeInDurationMS		= DefaultFadeInMS;			}
	if (typeof backdropOpacity=="undefined")	{ backdropOpacity		= DefaultBackdropOpacity;	}
	DefaultBackdropOpacity
	var		Backdrop								= ModalWindow_CreateBackdrop(backdropOpacity, fadeInDurationMS);
	document.body.style.overflow					= 'hidden';
	document.body.parentNode.style.overflow			= 'hidden';
	if (typeof element=="string")
	{
		var		ElementID		= element;
		element		= document.getElementById(ElementID);
		if (element==null)
			{ alert("Could not find an element by the name of '" + ElementID + "'."); return; }
	}
	var		ModalWindowInfo							= 
	{
		FrameBackdrop			: Backdrop.Frame,
		DivBackdrop				: Backdrop.Div,
		ActivePopup				: element,
		Id						: element.id,
		FadeDuration			: fadeInDurationMS,
		BackdropOpacity			: backdropOpacity
//		BodyEventsInitted		= 
//		PopupShown				= 
//		MovingPoupWindow		= 
//		MovingX					= 
//		MovingY					= 
//		Popups					= 
	};
	CenterAbsPosDomElemnt	(ModalWindowInfo.ActivePopup, true, ModalWindowInfo.length);
	ModalWindows.push		(ModalWindowInfo);
	AttachEvent				(window, "resize",		ModalWindow_Body_Resize);
	element.setAttribute("data_ModalWindow", element.id);
	ModalWindow_Body_Resize(null);
	return ModalWindowInfo;
}
function ModalWindow_FindWindowInfo(sID)
{
	if (typeof sID!="string")
	{
		var		AttributeValue		= null;
		var		EleID				= null;
		var		Element				= null;
		var		FirstTime			= true;
		do 
		{
			if ((Element==null) && (FirstTime==true))
				{ Element = sID; FirstTime = false; }
			else 
				{ Element = Element.parentNode; }
			EleID				= Element.id ? Element.id : null;
			AttributeValue	= Element.getAttribute("data_ModalWindow");
			if ((typeof AttributeValue=="undefined") || ((AttributeValue!=null) && (AttributeValue.length==0)) || (AttributeValue==null))
				{ AttributeValue = "________________________$$$$$$$$$$$$$$__________________"; }
		}
		while ((Element.parentNode!=null) && (AttributeValue!=EleID))
		if (Element!=null)
			 { sID = Element.id; }
	}
	if (sID==null)
		{ return null; }
	for (var i=0; i<ModalWindows.length; i++)
	{
		if (ModalWindows[i].Id==sID)
			{ return ModalWindows[i]; }
	}
	return null;
}
function ModalWindow_Body_Resize		(event, delayed)
{
	if ((IsIE==true) && (typeof delayed=="undefined"))
		{ setTimeout(function() { ModalWindow_Body_Resize(event, true); }, 400); }
	var		Dimensions						= GetBodyViewportDimensions	();
	var		ScrollInfo						= GetWindowScrollInfo		();
	for (var i=0; i<ModalWindows.length; i++)
	{
		
		ModalWindows[i].FrameBackdrop.style.left		= ScrollInfo.ScrollLeft		+ 'px';
		ModalWindows[i].FrameBackdrop.style.top			= ScrollInfo.ScrollTop		+ 'px';
		ModalWindows[i].FrameBackdrop.style.width		= Dimensions.Width			+ 'px';
		ModalWindows[i].FrameBackdrop.style.height		= Dimensions.Height			+ 'px';

		ModalWindows[i].DivBackdrop.style.left			= ScrollInfo.ScrollLeft		+ 'px';
		ModalWindows[i].DivBackdrop.style.top			= ScrollInfo.ScrollTop		+ 'px';
		ModalWindows[i].DivBackdrop.style.width			= Dimensions.Width			+ 'px';
		ModalWindows[i].DivBackdrop.style.height		= Dimensions.Height			+ 'px';

		CenterAbsPosDomElemnt(ModalWindows[i].ActivePopup, true, 500 + i);
	}
}
function ModalWindow_Close			(mElement, sCompleted)
{
	var		RetVal		= ModalWindow_FindWindowInfo(mElement);
	if (RetVal!=null)
	{ 
		FadeTo(RetVal.DivBackdrop, 0, RetVal.FadeDuration, RetVal.FadeDuration/1000 * 45, window.ActiveFadeAction, 
					function () { 
									RetVal.DivBackdrop.parentNode.removeChild(RetVal.DivBackdrop);
									RetVal.FrameBackdrop.parentNode.removeChild(RetVal.FrameBackdrop);
									RetVal.ActivePopup.style.display = 'none';
									ModalWindows.pop(RetVal);
									if (ModalWindows.length==0)
									{
										document.body.style.overflow					= '';
										document.body.parentNode.style.overflow			= '';
									}
									if ((typeof sCompleted!="undefined") && (sCompleted!=null))
										{ sCompleted(); }
								});
	}
}
