/////////////////////////////////////////////
// Control: Dialog Box functionality
/////////////////////////////////////////////
qcodo.dialogBoxResizeHanderArray = [];
qcodo.activeDialogBoxArray = [];
 
	qcodo.registerDialogBox = function(mixControl, strMatteColor, intMatteOpacity, blnMatteClickable, blnAnyKeyCloses) {
		// Initialize the Event Handler
		qcodo.handleEvent();

		// Get Control/Wrapper
		var objControl; if (!(objControl = qcodo.getControl(mixControl))) return;
		var objWrapper = objControl.wrapper;

		// Ensure we have only one
		objWrapper.id = objControl.id + "_ctls";
		while (objOldDialogWrapper = document.getElementById(objControl.id + "_ctl")) {
			objOldDialogWrapper.parentNode.removeChild(objOldDialogWrapper);
		};
		objWrapper.id = objControl.id + "_ctl";

		objWrapper.boxShown = false;
		// DialogBox MUST be at the "top level" in the DOM, a direct child of the FORM
		//document.getElementById(document.getElementById("Qform__FormId").value).appendChild(objWrapper);
    objForm = document.getElementById(document.getElementById("Qform__FormId").value);
    for (x in objForm.childNodes) {
        if (objForm.childNodes[x] && (objForm.childNodes[x].id == objWrapper.id) && objForm.childNodes[x] != objWrapper) {
            objForm.removeChild(objForm.childNodes[x]);
            break;
        }
    }
    objForm.appendChild(objWrapper);	

	
		//This should probably only be moved on show and back on hide.

		// Setup the DialogBoxBackground (DbBg) if applicable
		objWrapper.dbBg = document.getElementById(objWrapper.id + "dbbg");
		var objDbBg = objWrapper.dbBg;

		if (!objDbBg) {
			var objDbBg = document.createElement("div");
			objDbBg.id = objWrapper.id + "dbbg";
			//document.getElementById(document.getElementById("Qform__FormId").value).appendChild(objDbBg);
      for (x in objForm.childNodes) {
          if (objForm.childNodes[x].id == objDbBg.id && objForm.childNodes[x] != objDbBg) {
              objForm.removeChild(objForm.childNodes[x]);
              break;
          }
      }
      objForm.appendChild(objDbBg);	

			// Setup the Object Links
			objWrapper.dbBg = objDbBg;
			objDbBg.wrapper = objWrapper;
/*    //Not sure why we wanted to create a frame maybe ie5?
			if (qcodo.isBrowser(qcodo.IE)) {
				var objIframe = document.createElement("iframe");
				objIframe.id = objWrapper.id + "dbbgframe";
				objIframe.style.left = "0px";
				objIframe.style.top = "0px";
				objIframe.style.position = "absolute";
				objIframe.style.filter = "alpha(opacity=0)";
				objIframe.src = "";
				objIframe.frameBorder = 0;
				objIframe.scrolling = "no";
				objIframe.style.zIndex = 990;
				objIframe.display = "none";

			  //	document.getElementById(document.getElementById("Qform__FormId").value).appendChild(objIframe);
        for (x in objForm.childNodes) {
          if (objForm.childNodes[x].id == objIframe.id && objForm.childNodes[x] != objIframe) {
              objForm.removeChild(objForm.childNodes[x]);
              break;
          }
        }
        objForm.appendChild(objIframe);	

				objWrapper.dbBgFrame = objIframe;
			};*/
		};


		objWrapper.handleQueueResize = function(objEvent) {
		  for (i in qcodo.dialogBoxResizeHanderArray) { 
			  if(qcodo.dialogBoxResizeHanderArray[i]) { 
			    qcodo.dialogBoxResizeHanderArray[i](objEvent, i);
				}
		  };
			return true;
		};


		objWrapper.handleResize = function(objEvent, id) {
			objEvent = qcodo.handleEvent(objEvent);
			if (objEvent.target && objEvent.target.nodeName) {
				if ((objEvent.target.nodeName.toLowerCase() == 'div') || (objEvent.target.nodeName.toLowerCase() == 'span'))
					return;
			};

			// Restore from Link
			var objWrapper = qcodo.activeDialogBoxArray[id];
			var objDbBg = objWrapper.dbBg;
			var objDbBgFrame = objWrapper.dbBgFrame;

			// Hide Everything
			// If we hide everything then run handleEvents then show everything Firefox will scoll back to the top of the page. 
			//objWrapper.style.display = "none";
			//objDbBg.style.display = "none";
			//if (objDbBgFrame) objDbBgFrame.style.display = "none";

			// Setup Events
			qcodo.handleEvent(objEvent);

			// Show Everything
			objWrapper.style.display = "inline";
			objDbBg.style.display = "block";
			if (objDbBgFrame) objDbBgFrame.style.display = "block";

			// DbBg Re-Setup
			actualWidth = Math.max(qcodo.page.width, qcodo.client.width);
			actualHeight = Math.max(qcodo.page.height, qcodo.client.height);
			objDbBg.style.width = actualWidth + "px";
			objDbBg.style.height = actualHeight + "px";

			if (objDbBgFrame) {
				objDbBgFrame.style.width = Math.max(qcodo.page.width, qcodo.client.width) + "px";
				objDbBgFrame.style.height = Math.max(qcodo.page.height, qcodo.client.height) + "px";
			};

			// Wrapper Re-Setup
			var intWidth = objWrapper.offsetWidth;
			var intHeight = objWrapper.offsetHeight;
			if(intHeight > actualHeight) {
			  objDbBg.style.height = intHeight+"px";
			}
			if(intWidth > actualWidth) {
			  objDbBg.style.width = intWidth+"px";
			}

			if((intHeight < qcodo.client.height) && (intWidth < qcodo.client.width)) {
			  var intTop = Math.round((qcodo.client.height - intHeight) / 2) + qcodo.scroll.y;
			  var intLeft = Math.round((qcodo.client.width - intWidth) / 2) + qcodo.scroll.x;
			  if(intTop < 0) intTop = 0;
			  if(intLeft < 0) intLeft = 0;
			  objWrapper.setAbsolutePosition(intLeft, intTop);
			} else {
			  var intTop = objWrapper.offsetTop;
			  var intLeft = objWrapper.offsetLeft;
				var absPos = objWrapper.getAbsolutePosition();

			  if((intWidth > qcodo.client.width) && (objWrapper.offsetLeft > 0)) {
				  //intLeft = 0;
				  intLeft = absPos.x;
				} else {
			    intLeft = Math.round((qcodo.client.width - intWidth) / 2) + qcodo.scroll.x;
			    if(intLeft < 0) intLeft = 0;
				}
			  if((intHeight > qcodo.client.height) && (objWrapper.offsetTop > 0)) {
				  //intTop = 0;
				  intTop = absPos.y;
				} else if(intHeight < qcodo.client.height) {
			    intTop = Math.round((qcodo.client.height - intHeight) / 2) + qcodo.scroll.y;
			    if(intTop < 0) intTop = 0;
				}

			  objWrapper.setAbsolutePosition(intLeft, intTop);
			}

			return true;
		};

		objWrapper.handleKeyPress = function(objEvent) {
			objEvent = qcodo.handleEvent(objEvent);
			qcodo.terminateEvent(objEvent);
			var objWrapper = qcodo.activeDialogBox;
			objWrapper.hideDialogBox();

			return false;
		};

		objWrapper.showDialogBox = function() {
			// Restore from Object Link
			var objDbBg = this.dbBg;
			var objDbBgFrame = this.dbBgFrame;

			// Hide Everything
			objWrapper.style.display = "none";
			objDbBg.style.display = "none";
			if (objDbBgFrame) objDbBgFrame.style.display = "none";

			// Setup Events
			qcodo.handleEvent();

			// Show Everything
			objDbBg.style.display = "block";
			if (objDbBgFrame) objDbBgFrame.style.display = "block";
			this.toggleDisplay("show");

      //alert(" ScrollBar Width = "+qcodo.scrollbar.width+"x"+qcodo.scrollbar.height);

			// DbBg Re-Setup
			actualWidth = Math.max(qcodo.page.width, qcodo.client.width);
			actualHeight = Math.max(qcodo.page.height, qcodo.client.height);
			objDbBg.style.width = actualWidth + "px";
			objDbBg.style.height = actualHeight + "px";
			if (objDbBgFrame) {
				objDbBgFrame.style.width = Math.max(qcodo.page.width, qcodo.client.width) + "px";
				objDbBgFrame.style.height = Math.max(qcodo.page.height, qcodo.client.height) + "px";
			};

			//alert("Qcodo Page Width ="+qcodo.page.width+" qcodo.client.width="+qcodo.client.width +"\n"+
			      //"Qcodo Page Height ="+qcodo.page.height+" qcodo.client.height="+qcodo.client.height);
			//alert("Qcodo Style Width ="+objDbBg.style.width);
			//alert("Width ="+objDbBg.style.width);

			// Wrapper Re-Setup
			var intWidth = objWrapper.offsetWidth;
			var intHeight = objWrapper.offsetHeight;
//alert("qcodo.client.height="+qcodo.client.height+" qcodo.page.height "+qcodo.page.height+" actualHeight="+actualHeight);

			if(intHeight > actualHeight) {
			  objDbBg.style.height = intHeight+"px";
			}
			if(intWidth > actualWidth) {
			  objDbBg.style.width = intWidth+"px";
			}

			if((intHeight < qcodo.client.height) && (intWidth < qcodo.client.width)) {
			  var intTop = Math.round((qcodo.client.height - intHeight) / 2) + qcodo.scroll.y;
			  var intLeft = Math.round((qcodo.client.width - intWidth) / 2) + qcodo.scroll.x;
			  if(intTop < 0) intTop = 0;
			  if(intLeft < 0) intLeft = 0;
			  objWrapper.setAbsolutePosition(intLeft, intTop);
			} else {
			  var intTop = objWrapper.offsetTop;
			  var intLeft = objWrapper.offsetLeft;
				var absPos = objWrapper.getAbsolutePosition();

			  if((intWidth > qcodo.client.width) && (objWrapper.offsetLeft > 0)) {
				  intLeft = 0;
				  //intLeft = absPos.x;
				} else {
			    intLeft = Math.round((qcodo.client.width - intWidth) / 2) + qcodo.scroll.x;
			    if(intLeft < 0) intLeft = 0;
				}
			  if((intHeight > qcodo.client.height) && (objWrapper.offsetTop > 0)) {
				  intTop = 0;
					window.scrollTo(0,0);
				  //intTop = absPos.y;
				} else {
			    intTop = Math.round((qcodo.client.height - intHeight) / 2) + qcodo.scroll.y;
			    if(intTop < 0) intTop = 0;
				}

			  objWrapper.setAbsolutePosition(intLeft, intTop);
			}


/*
			var intTop = Math.round((qcodo.client.height - intHeight) / 2) + qcodo.scroll.y;
			var intLeft = Math.round((qcodo.client.width - intWidth) / 2) + qcodo.scroll.x;
			if(intTop < 0) intTop = 0;
			if(intLeft < 0) intLeft = 0;
			objWrapper.setAbsolutePosition(intLeft, intTop);
*/
			// Set Window OnResize Handling
			//window.onresize = this.handleResize;
			qcodo.dialogBoxResizeHanderArray[this.id] = this.handleResize;
			window.onresize = this.handleQueueResize;
			window.onscroll = this.handleQueueResize;
			qcodo.activeDialogBoxArray[this.id] = this;
			qcodo.activeDialogBox = this;

			// If we have blnMatteClickable and blnAnyKeyCloses
			if (objWrapper.anyKeyCloses) {
				document.body.onkeypress = this.handleKeyPress;
				objWrapper.control.focus();
			};
		};

		objWrapper.hideDialogBox = function() {
			var objWrapper = this;
			if (this.id.indexOf("_ctldbbg") > 0)
				objWrapper = this.wrapper;
			objWrapper.dbBg.style.display = "none";
			if (objWrapper.dbBgFrame) {
			  objWrapper.dbBgFrame.style.display = "none";
			}
			objWrapper.toggleDisplay("hide");
			// Unsetup OnResize Handling
			delete qcodo.dialogBoxResizeHanderArray[this.id];
			//qcodo.dialogBoxResizeHanderArray[this.id] = null;
			//window.onresize = null;
			//window.onscroll = null;

			// Unsetup KeyPress Closing
			document.body.onkeypress = null;

			// Unsetup ActiveDialogBox
			qcodo.activeDialogBoxArray[this.id] = null;
			qcodo.activeDialogBox = null;
		};

		// Initial Wrapper Setup
		objWrapper.style.zIndex = 999;
		objWrapper.position = "absolute";
		objWrapper.anyKeyCloses = blnAnyKeyCloses;

		// Initial DbBg Setup
		objDbBg.style.position = "absolute";
		objDbBg.style.zIndex = 998;
		objDbBg.style.top = "0px";
		objDbBg.style.left = "0px";
		if (qcodo.isBrowser(qcodo.IE))
			objDbBg.style.overflow = "auto";
		else
			objDbBg.style.overflow = "hidden";

		if (blnMatteClickable) {
			objDbBg.style.cursor = "pointer";
			objDbBg.onclick = objWrapper.hideDialogBox;
		} else {
			objDbBg.style.cursor = "url(" + qc.imageAssets + "/_core/move_nodrop.cur), auto";
			objDbBg.onclick = null;
		};

		// Background Color and Opacity
		objDbBg.style.backgroundColor = strMatteColor;
		if (qcodo.isBrowser(qcodo.IE)) {
			objDbBg.style.filter = "alpha(opacity=" + intMatteOpacity + ")";
		} else {
			objDbBg.style.opacity = intMatteOpacity / 100.0;
		}

		// Other Random Stuff
		objDbBg.style.fontSize = "1px";
		objDbBg.innerHTML = "&nbsp;";

		// Perform a Show or Hide (depending on state)
		if (objWrapper.style.display == 'none') {
			objWrapper.hideDialogBox();
		} else
			objWrapper.showDialogBox();
	};


//////////////////
// Qcodo Shortcuts
//////////////////

	qc.regDB = qcodo.registerDialogBox;
