// $Revision: 2618 $
// DialogStackEntry object
function DialogStackEntry(id) {
	this.id = id;
	this.properties = new Array();
}

DialogStackEntry.prototype.getValue = function(name) {
	return this.properties[name];
}

DialogStackEntry.prototype.setValue = function(name, value) {
	this.properties[name] = value;
}

// DialogStack object
function DialogStack() {
	this.a = new Array();
	this.top = null;
}

DialogStack.prototype.push = function(dialog) {
	this.a.push(dialog);
	this.top = dialog;
}

DialogStack.prototype.pop = function() {
	var dialog = this.a.pop();
	this.top = this.a.length > 0 ? this.a[this.a.length - 1] : null;
	return dialog;
}

DialogStack.prototype.remove = function(id) {
	for (var i = 0; i < this.a.length; i++) {
		if (this.a[i].id == id) {
			var r = this.a[i];
			for (var j = i + 1; j < this.a.length; j++) {
				this.a[j - 1] = this.a[j];
			}
			this.a.length--;
			return r;
		}
	}
	return null;
}

// return the top entry with the specified property value, else null
DialogStack.prototype.getDialogByPropertyValue = function(name, value) {
	for (var i = this.a.length - 1; i >= 0; i--) {
		if ((this.a[i] != null) && (this.a[i].getValue(name) == value)) {
			return this.a[i];
		}
	}
	return null;
}

DialogStack.prototype.isInDialog = function(event) {
	for (var i = this.a.length - 1; i >= 0; i--) {
		var dse = this.a[i];
		if (dse == null) {
			continue;
		}
		var dialog = getElement(dse.id);
		var width = dialog.offsetWidth;
		var height = dialog.offsetHeight;
		var top = AbsTop(dialog, true);
		var left = AbsLeft(dialog, true);
		var X = GetX(event);
		var Y = GetY(event);
		if (X >= left && X <= left + width && Y >= top && Y <= top + height) {
			return true;
		}
	}
	return false;
}

var Dialogs = new DialogStack();

var TOP_INCREMENT = Number(20);
var LEFT_INCREMENT = Number(10);
var DIALOG_SHADOW_TOP_OFFSET = Number(22);
var DIALOG_SHADOW_LEFT_OFFSET = Number(12);
var MARGIN = Number(20);
var Z_IFRAME_OFFSET = Number(10);
var Z_BACKDROP_DEFAULT = Number(40);
var Z_SHADOW_DEFAULT = Number(60);
var Z_SHADOW_OFFSET = Number(1);
var Z_TABLE_DEFAULT = Number(70);
var Z_DIALOG_DEFAULT = Number(90);
var Z_INCREMENT = Number(10);

function DisplayDialog(id, doCloseOnReturn, doNotifyServer, doOpen, left, top, event) {
    if (typeof event == "undefined" || event == null) {
        event = window.event;
    }
	id = unEscape(id);
	var dialogbackdrop = getElement(id + "_backdrop");		// Div
	var dialogbackdropimg = getElement(id + "_backdrop_img"); // Img
	var modal = dialogbackdrop != null;
	if (doOpen) {
		var dialog = new DDiv(id + "_ddiv");				// DDiv
		var dialogpanel = dialog.div;						// Panel
		var dialogtable = getElement(id + "_table");		// Table
		var dialogshadow = new DDiv(id + "_shadow");		// DDiv
		if (dialog == null || dialogpanel == null || dialogtable == null || dialogshadow == null) {
			return;
		}
		var pageWidth = GetPageWidth();
		var pageHeight = GetPageHeight();
		var scrollLeft = GetScrollLeft();
		var scrollTop = GetScrollTop();
		var scrollWidth = GetScrollWidth();
		var scrollHeight = GetScrollHeight();
		if (pageWidth == null || pageHeight == null || scrollLeft == null || scrollTop == null ||
				scrollWidth == null || scrollHeight == null) {
			return;
		}
		var offset = dialogpanel.getAttribute("offset");
		if (offset == null) {
			offset = 0;
		} else if (offset.match(/%$/)) {
			offset = parseInt(offset) * pageWidth / 100;
		} else {
			offset = parseInt(offset);
		}
		var isCentered = (left == null || top == null);
		if (isCentered) {
			var TopDialog = Dialogs.getDialogByPropertyValue("isCentered", true);
			if (TopDialog == null) {
				left = Math.round(Math.max(offset + scrollLeft + Math.max(0, (pageWidth - offset - dialogpanel.offsetWidth) / 2), MARGIN));
				top = Math.round(Math.max(scrollTop + Math.max(0, (pageHeight - dialogpanel.offsetHeight) / 2), MARGIN));
			} else {
				left = Number(TopDialog.getValue("left")) + LEFT_INCREMENT;
				top = Number(TopDialog.getValue("top")) + TOP_INCREMENT;
			}
		}
		if (dialogbackdrop != null) {
			dialogbackdrop.style.left = "0px";
			dialogbackdrop.style.top = "0px";
			dialogbackdrop.style.width = scrollWidth + "px";
			dialogbackdrop.style.height = scrollHeight + "px";
			dialogbackdrop.style.visibility = "visible";
			if (dialogbackdropimg != null) {
				dialogbackdropimg.style.width = dialogbackdrop.style.width;
				dialogbackdropimg.style.height = dialogbackdrop.style.height;
			}
		}
		if (dialogpanel.style.width == null || dialogpanel.style.width.length == 0) {
			if (dialogpanel.offsetWidth > pageWidth - (2 * MARGIN)) {
				dialogpanel.style.width = pageWidth - (2 * MARGIN) + "px";
			} else {
				dialogpanel.style.width = Number(dialogpanel.offsetWidth) + Number(20) + "px"
			}
		}
		dialogtable.style.left = left + "px";
		dialogtable.style.top = top + "px";
		dialogtable.style.width = dialogpanel.offsetWidth + "px";
		dialog.Resize((isIE || isWebKit) ? ("0px") : (dialogtable.style.left),
			(isIE || isWebKit) ? ("0px") : (dialogtable.style.top),
			null,
			null);
			
		if (dialog.iframe != null) {
			dialog.iframe.style.width = dialogpanel.offsetWidth + "px";
			dialog.iframe.style.height = dialogpanel.offsetHeight + "px";
		}
		
		dialogshadow.Resize((isIE || isWebKit) ? (DIALOG_SHADOW_LEFT_OFFSET + "px") : (Number(dialogtable.offsetLeft) + DIALOG_SHADOW_LEFT_OFFSET + "px"),
			(isIE || isWebKit) ? (DIALOG_SHADOW_TOP_OFFSET + "px") : (Number(dialogtable.offsetTop) + DIALOG_SHADOW_TOP_OFFSET + "px"),
			dialogpanel.offsetWidth + "px",
			dialogpanel.offsetHeight + "px");
		
		SetZ(id, dialog, dialogtable, dialogshadow, dialogbackdrop);
		
		var dse = new DialogStackEntry(id);
		dse.setValue("isModal", modal);
		dse.setValue("doCloseOnReturn", doCloseOnReturn);
		dse.setValue("isCentered", isCentered);
		dse.setValue("left", left);
		dse.setValue("top", top);
		if (dialogbackdrop != null) {
			dse.setValue("backdrop", dialogbackdrop);
			dse.setValue("backdropZ", dialogbackdrop.style.zIndex);
		}
		dse.setValue("tableZ", dialogtable.style.zIndex);
		dse.setValue("dialogZ", dialog.ddiv.style.zIndex);
		dse.setValue("shadowZ", dialogshadow.ddiv.style.zIndex);
		Dialogs.push(dse);
		if (doCloseOnReturn) {
		    if (GetMap() != null && CurrentMapTool != null && CurrentMapTool.releaseFunction != null) {
		        CurrentMapTool.releaseFunction();
	        }
			CatchEvents(["keyup"], CloseOnReturn); 
			CatchEvents(["click", "mousedown", "mouseup", "keypress", "keydown"], CatchAll);
		} else if (modal) {
		    if (GetMap() != null && CurrentMapTool != null && CurrentMapTool.releaseFunction != null) {
		        CurrentMapTool.releaseFunction();
	        }
			CatchEvents(["click", "mousedown", "mouseup", "keypress", "keydown", "keyup"], CatchAll);
		}
		var dialogheader = getElement(id + "_header");
		dialogheader.onmousedown = DialogMoveDown;
		var forms = dialogpanel.getElementsByTagName("form");
		if (forms != null && forms.length > 0) {
			DoSetFocus(forms[0]);
		}
		if (doNotifyServer) {
			MarkOpen(true, "ABSOLUTE", [id])
		}
	} else {
		var menuContainer = getElement("menucontainer2id");
		var menus = GetDescendentsByTagNameAndClassName(menuContainer, "DIV", "menu");
		for (var i = 0; i < menus.length; i++) {
			DoDisplay(menus[i], false);
		}
		RemoveElement(id + "_table");
		if (modal) {
			RemoveElement(id + "_backdrop");
		}	
		Dialogs.remove(id);
		if (doCloseOnReturn && Dialogs.getDialogByPropertyValue("doCloseOnReturn", true) == null) {
			// if no more "closeonreturn" dialogs on the stack
		    if (GetMap() != null && CurrentMapTool != null && CurrentMapTool.command != null) {
                SetMapTool(CurrentMapTool.command, false, event);
            }
			ReleaseEvents(["keyup"], CloseOnReturn);
			ReleaseEvents(["click", "mousedown", "mouseup", "keypress", "keydown"], CatchAll);
		} else if (modal && Dialogs.getDialogByPropertyValue("isModal", true) == null) {
			// if no more "modal" dialogs on the stack
		    if (GetMap() != null && CurrentMapTool != null && CurrentMapTool.command != null) {
                SetMapTool(CurrentMapTool.command, false, event);
            }
			ReleaseEvents(["click", "mousedown", "mouseup", "keypress", "keydown", "keyup"], CatchAll);
		}
		if (doNotifyServer) {
			MarkOpen(false, "ABSOLUTE", [id])
		}
	}
    if (typeof event != "undefined" && event != null) {
	    Finish(event);
	}
}

function SetZ(id, dialog, table, shadow, backdrop) {
	if (dialog == null) {
		dialog = new DDiv(id + "_ddiv");				// DDiv
	}
	if (table == null) {
		table = getElement(id + "_table");				// Table
	}
	if (shadow == null) {
		shadow = new DDiv(id + "_shadow");				// DDiv
	}
	if (backdrop == null) {
		backdrop = getElement(id + "_backdrop");		// Div
	}
	var TopDialog = Dialogs.top;
	var tableZ, dialogZ, shadowZ, backdropZ;
	if (TopDialog == null) {
		// no top dialog - everything gets default Z
		tableZ = Z_TABLE_DEFAULT;
		dialogZ = Z_DIALOG_DEFAULT;
		if (backdrop != null) {
			backdropZ = Z_BACKDROP_DEFAULT;
		}
	} else if (backdrop == null) {
			// no backdrop - new dialog placed above top dialog
			tableZ = Number(TopDialog.getValue("tableZ")) + Z_INCREMENT;
			dialogZ = Number(TopDialog.getValue("dialogZ")) + Z_INCREMENT;
	} else {
		// backdrop - backdrop placed above top dialog, new dialog placed above backdrop
		backdropZ = Number(TopDialog.getValue("dialogZ")) + (Z_DIALOG_DEFAULT - Z_BACKDROP_DEFAULT);
		tableZ = backdropZ + (Z_TABLE_DEFAULT - Z_BACKDROP_DEFAULT);
		dialogZ = backdropZ + (Z_DIALOG_DEFAULT - Z_BACKDROP_DEFAULT);
	}
	shadowZ = dialogZ - Z_SHADOW_OFFSET;
	if (backdrop != null) {
		backdrop.style.zIndex = backdropZ;
	}
	table.style.zIndex = tableZ;
	dialog.ddiv.style.zIndex = dialogZ;
	if (dialog.iframe != null) {
		dialog.iframe.style.zIndex = Z_IFRAME_OFFSET;
	}
	shadow.ddiv.style.zIndex = shadowZ;
	if (shadow.iframe != null) {
		shadow.iframe.style.zIndex = Z_IFRAME_OFFSET;
	}
}

function AdjustDialogShadow(id) {
	id = unEscape(id);
	var dialog = new DDiv(id + "_ddiv");				// DDiv
	var dialogpanel = dialog.div;						// Panel
	var dialogtable = getElement(id + "_table");		// Table
	var dialogshadow = new DDiv(id + "_shadow");		// DDiv
	if (dialog == null || dialogpanel == null || dialogtable == null || dialogshadow == null) {
		return;
	}
	dialogshadow.Resize(null, null, dialogpanel.offsetWidth + "px", dialogpanel.offsetHeight + "px");
}

function RaiseDialog(id) {
	if (Dialogs.a.length < 2 || Dialogs.top.id == id) {
		// already at the top
		return;
	}
	var dse = Dialogs.remove(id);
	var dialog = new DDiv(id + "_ddiv");				// DDiv
	var dialogpanel = dialog.div;						// Panel
	var dialogtable = getElement(id + "_table");		// Table
	var dialogshadow = new DDiv(id + "_shadow");		// DDiv
	var dialogbackdrop = getElement(id + "_backdrop");	// Div
	
	SetZ(id, dialog, dialogtable, dialogshadow, dialogbackdrop);
	
	dse.setValue("backdropZ", (dialogbackdrop == null) ? null : dialogbackdrop.style.zIndex);
	dse.setValue("tableZ", dialogtable.style.zIndex);
	dse.setValue("dialogZ", dialog.ddiv.style.zIndex);
	dse.setValue("shadowZ", dialogshadow.ddiv.style.zIndex);
	Dialogs.push(dse);
}

function report(parameters) {
	var s = "";
	var i = 0;
	while (i < parameters.length) {
		if (i > 0) {
			s += " ";
		}
		s += parameters[i++] + " = " + parameters[i++] + "\n";
	}
	// window.top.status = s;
	alert(s);
}

function InDialog(element) {
	while (element) {
		if (ContainsStyleClass(element, "dialog")) {
			return true;
		}
		element = element.parentNode;
	}
	return false;
}

function CloseOnReturn(event) {
	if (!event) {
		event = window.event;
	}
	var topCloseOnReturn = Dialogs.getDialogByPropertyValue("doCloseOnReturn", true);
	if (event.type == "keyup" && (event.keyCode == 13 || event.keyCode == 27) && topCloseOnReturn != null) {
		// close dialog on "Return" or "Escape"
		var closeButton = getElement(topCloseOnReturn.id + "_close");
		if (closeButton != null) {
			if (closeButton.onclick != null) {
				closeButton.onclick(event);
				return;
			}
		}
		DisplayDialog(topCloseOnReturn.id, true, false);
	}
	Finish(event);
}

function CatchAll(event) {
	if (!event) {
		event = window.event;
	}
	var elem = null;
	if (event.target) {
	    elem = event.target;
	} else if (event.srcElement) {
	    elem = event.srcElement;
	}
	if (elem == null) {
	    return Finish(event);
	}
	if (InDialog(elem)) {
		// allow event to propagate
		return;
	} else {
		// do not allow event to propagate
	    return Finish(event);
	}
}

function HasAncestor(element, id) {
	if (id == null) {
		return false;
	}
	for (var parent = element.parentNode; parent != null; parent = parent.parentNode) {
		if (parent.id != null && id == parent.id) {
			return true;
		}
	}
	return false;
}

function Overlaps(element1, element2) {
	var smallerW, largerW, smallerH, largerH;
	var betweenLeftW, betweenRightW, betweenTopH, betweenBottomH;
	var smallerWAbsLeft, largerWAbsLeft, smallerHAbsTop, largerHAbsTop;
	
	if (element1.offsetWidth < element2.offsetWidth) {
		smallerW = element1;
		largerW = element2;
	} else {
		smallerW = element2;
		largerW = element1;
	}
	if (element1.offsetHeight < element2.offsetHeight) {
		smallerH = element1;
		largerH = element2;
	} else {
		smallerH = element2;
		largerH = element1;
	}
	smallerWAbsLeft = Absolute(smallerW, "Left");
	largerWAbsLeft = Absolute(largerW, "Left");
	smallerHAbsTop = Absolute(smallerH, "Top");
	largerHAbsTop = Absolute(largerH, "Top");
	
	betweenLeftW = Between(smallerWAbsLeft, largerWAbsLeft, largerWAbsLeft + Number(largerW.offsetWidth));
	betweenRightW = Between(Number(smallerWAbsLeft) + Number(smallerW.offsetWidth), largerWAbsLeft, Number(largerWAbsLeft) + Number(largerW.offsetWidth));
	betweenTopH = Between(smallerHAbsTop, largerHAbsTop, Number(largerHAbsTop) + Number(largerH.offsetHeight));
	betweenBottomH = Between(Number(smallerHAbsTop) + Number(smallerH.offsetHeight), largerHAbsTop, Number(largerHAbsTop) + Number(largerH.offsetHeight));
	return (betweenLeftW || betweenRightW) && (betweenTopH || betweenBottomH);
}

function Absolute(element, offsetDirection) {
	var abs = eval("element.offset" + offsetDirection);
	for (var parent = element.offsetParent; parent != null; parent = parent.offsetParent) {
		abs += Number(eval("parent.offset" + offsetDirection));
	}
	return abs;
}

// return true if a is between b and c
function Between(a, b, c) {
	if (b < c) {
		return b <= a && a <= c;
	} else if (b > c) {
		return c <= a && a <= b;
	}
}

// movable dialogs
var DialogTable;
var DTheight;
var Dialog;
var Dleft;
var Dtop;
var DialogShadow;
var DialogBackdrop;
var DialogMoveX0;
var DialogMoveY0;

function DialogMoveDown(event) {
	if (event == null) {
		event = window.event;
	}
	if (document.onmousemove != null) {
		return Finish(event);
	}
	var dialogpanel = GetAncestorByTagNameAndClassName(GetTarget(event), "div", "dialog");
	var id = dialogpanel.id;
	Dialog = new DDiv(id + "_ddiv");
	DialogTable = getElement(id + "_table");
	DialogShadow = new DDiv(id + "_shadow");
	DialogBackdrop = getElement(id + "_backdrop");
	DTheight = Number(DialogTable.offsetHeight);
	Dleft = Number(Dialog.ddiv.offsetLeft);
	Dtop = Number(Dialog.ddiv.offsetTop);
	RaiseDialog(id);
	DialogMoveX0 = Number(event.clientX);
	DialogMoveY0 = Number(event.clientY);
	PushOnMouseMove(DialogMoveMove);
	PushOnMouseUp(DialogMoveUp);
	return Finish(event);
}

function DialogMoveMove(event) {
	if (event == null) {
		event = window.event;
	}
	if (isIE) {
		// catch mouse up event outside the browser window
		if (event.button == 0) {
			return DialogMoveUp(event);
		}
	}
	PositionDialog(event);
	return Finish(event);
}

function PositionDialog(event) {
	var left = Number(event.clientX) - DialogMoveX0 + Dleft;
	var top = Number(event.clientY) - DialogMoveY0 + Dtop;
	DoPositionDialog(left, top);
}

function DoPositionDialog(left, top) {
	DialogShadow.ddiv.style.left = Number(left) + DIALOG_SHADOW_LEFT_OFFSET + "px";
	DialogShadow.ddiv.style.top = Number(top) + DIALOG_SHADOW_TOP_OFFSET + "px";
	Dialog.ddiv.style.left = left + "px";
	Dialog.ddiv.style.top = top + "px";
}

function DialogMoveUp(event) {
	if (event == null) {
		event = window.event;
	}
	var target = GetTarget(event);
	PopOnMouseMove(DialogMoveMove);
	PopOnMouseUp(DialogMoveUp);
	if (IsVisibleElement(Dialog.div, true)) {
		PositionDialog(event);
		SetDialogBackdropWidth();
		var rememberPosition = Dialog.div.getAttribute("rememberposition");
		if (rememberPosition != null) {
			var left = Absolute(Dialog.div, "Left");
			var top = Absolute(Dialog.div, "Top");
			if (left != 0 && top != 0) {
				var url = new Url(LOADSCRIPT_URL);
				url.Append("command", "positionwindow");
				url.Append("id", escape(Dialog.div.id));
				url.Append("left", left);
				url.Append("top", top);
				LoadScript(url.toString());
			}
		}
	}
	return Finish(event);
}

function SetDialogBackdropWidth() {
	var scrollWidth = GetScrollWidth();
	var scrollHeight = GetScrollHeight();
	for (var i = Dialogs.a.length - 1; i >= 0; i--) {
		if (Dialogs.a[i] == null) {
			continue;
		}
		var backdrop = Dialogs.a[i].getValue("backdrop");
		if (backdrop != null) {
			backdrop.style.width = scrollWidth + "px";
			backdrop.style.height = scrollHeight + "px";
		}
	}
}