/*
* Provides interactivity to collections of DOM elements
* that function as a substitute for pop-up windows.
*
* Descriptor fields:
*
*   containerId (required)
*   titleBarId
*   closeBtnId
*   modalScreenId
*   isModal	('false' by default, event if modalScreenId provided)
*   isDraggable ('false' by default)
*   containerDisplayStyle  ('block' by default)
*   modalScreenDisplayStyle  ('block' by default)
*
* Depends on the inclusion of browser.js and uevent.js.
*
* Originally based on a script from Quirksmode.com. Modified
* extensivly by Michael Volk (mvolk@volksys.com) for the 
* benefit of Northwest Media, Inc.
*/
function DialogBox(descriptor) {

	// Public Interface
	
	this.openDialog = openDialog;
	this.closeDialog = closeDialog;
	this.showContent = showContent;
	
	// Private Implementation

	var b = ( (browser) ? browser : new Browser() );				// use global browser instance if present
	
	var cEl = document.getElementById(descriptor.containerId);		// reference to the overall container element
	var tEl = document.getElementById(descriptor.titleBarId);		// reference to the title bar element (the handle for dragging)
	var xEl = document.getElementById(descriptor.closeBtnId);		// reference to the close element
	var mEl = document.getElementById(descriptor.modalScreenId);	// reference to the modal screen element
	var iEl = null;													// reference to the currently visible inner content element (if any)
																	// (used for help dialog in user/main.jsp)

	var cDs = ( (descriptor.containerDisplayStyle) ? descriptor.containerDisplayStyle : 'block' );
	var mDs = ( (descriptor.modalScreenDisplayStyle) ? descriptor.modalScreenDisplayStyle : 'block' );
	
	var mod = ( descriptor.isModal === true );

	if (!cEl) throw new Error("DialogBox Descriptor must specify containerId.");
	if (xEl) Browser.addEvent('click', xEl, closeDialog);
	if (descriptor.isDraggable && tEl) Browser.addEvent('mousedown', tEl, startDrag);

	var iOX = null;
	var iOY = null;
	var iMX = null;
	var iMY = null;
	
	var isOpen = false;

	// iId = optional id of inner content div to display
	// iDs = optional display style to apply to iId to display it; default is 'block'
	function openDialog(iId, iDs) {
		if (!isOpen) {
			if (mod && mEl) mEl.style.display = mDs;
			cEl.style.display = cDs;
		}
		if (iEl) {
			iEl.style.display = 'none';
			iEl = null;
		}
		if (iId) iEl = document.getElementById(iId);
		iDs = ( (iDs) ? iDs : 'block' );
		if (iEl) iEl.style.display = iDs;
		if (!isOpen) {
			if (mod) {
				center();
			} else {
				makeVisible();
			}
		}
		isOpen = true;
	}

	function closeDialog(evt) {
		if (!isOpen) return;
		if (iEl) iEl.style.display = 'none';
		iEl = null;
		cEl.style.display = 'none';
		if (mod && mEl) mEl.style.display = 'none';
		isOpen = false;
	}
	
	// cId = optional id of inner content div to display
	// cDs = optional display style to apply to cId to display it
	function showContent(cId, cDs) {
		if (iEl) {
			iEl.style.display = 'none';
			iEl = null;
		}
		if (cId) iEl = document.getElementById(cId);
		if (iEl) iEl.style.display = cDs;
	}

	function startDrag(evt) {
		evt = new UEvent(evt);
		iMX = evt.getPageX();
		iMY = evt.getPageY();
		Browser.removeEvent('mousedown', tEl, startDrag);
		iOX = cEl.offsetLeft;									// X-BROWSER SAFE ??
		iOY = cEl.offsetTop;									// X-BROWSER SAFE ??
		Browser.addEvent('mousemove', document, drag);
		Browser.addEvent('mouseup', document, stopDrag);
		return false;
	}
	
	function drag(evt) {
		evt = new UEvent(evt);
		cEl.style.left = (iOX + evt.getPageX() - iMX) + 'px';
		cEl.style.top = (iOY + evt.getPageY() - iMY) + 'px';
		return false;
	}

	function stopDrag() { 
		Browser.removeEvent('mousemove', document, drag);
		Browser.removeEvent('mouseup', document, stopDrag);
		Browser.addEvent('mousedown', tEl, startDrag);
	}
	
	// center the container element if it is not visible
	// note that offsetWidth/Height in IE6+ with no valid doctype excludes margins and padding
	function makeVisible() {
		b.refreshViewSize();
		var top = cEl.offsetTop;
		var left = cEl.offsetLeft;
		var width = cEl.offsetWidth;
		var height = cEl.offsetHeight;
		//alert("makeVisible() Viewport: " + b.getViewWidth() + "x" + b.getViewHeight() + "\nPosition: " + left + ", " + top + "\nSize: " + width+"x"+height);
		if (top < 0 || top > (b.getViewHeight() - height) || left < 0 || left > (b.getViewWidth() - width)) {
			center();
		}
	}

	// note that offsetWidth/Height in IE6+ with no valid doctype excludes margins and padding
	function center() {
		b.refreshViewSize();
		var top = cEl.offsetTop;
		var left = cEl.offsetLeft;
		var width = cEl.offsetWidth;
		var height = cEl.offsetHeight;
		//alert("makeVisible() Viewport: " + b.getViewWidth() + "x" + b.getViewHeight() + "\nPosition: " + left + ", " + top + "\nSize: " + width+"x"+height);
		top = Math.max(0, Math.round((b.getViewHeight() - height) / 2));
		left = Math.max(0, Math.round((b.getViewWidth() - width) / 2));
		//alert("Reposition to: " + left + "(" + Math.round((b.getViewWidth() - width) / 2) + "), " + top + "(" + Math.round((b.getViewHeight() - height) / 2) + ")");
		cEl.style.top = top + "px";
		cEl.style.left = left + "px";
	}

}

