/**
 * POPUP WINDOW CODE v1.1
 * Used for displaying DHTML only popups instead of using buggy modal windows.
 *
 * By Seth Banks (webmaster at subimage dot com)
 * http://www.subimage.com/
 *
 * Contributions by Eric Angel (tab index code) and Scott (hiding/showing selects for IE users)
 *
 *
 * Up to date code can be found at http://www.subimage.com/dhtml/subModal
 *
 * Modifications by Barrie Selack for properly calculating the scroll offset
 *               and not displaying the window until all the calculations are done
 *               (not in official updated code)
 *
 * This code is free for you to use anywhere, just keep this comment block.
 */

// Popup code
var gPopupMask = null;
var gPopupContainer = null;
var gPopFrame = null;
var gReturnFunc;
var gPopupIsShown = false;

var gHideSelects = false;


var gTabIndexes = new Array();
// Pre-defined list of tags we want to disable/enable tabbing into
var gTabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME");	

// If using Mozilla or Firefox, use Tab-key trap.
if (!document.all) {
	document.onkeypress = keyDownHandler;
}

/**
 * Initializes popup code on load.	
 */
function initPopUp() {
	gPopupMask = document.getElementById("popupMask");
	gPopupContainer = document.getElementById("popupContainer");
	gPopFrame = document.getElementById("popupFrame");	
	gPopIFrame = document.getElementById("popupIFrame");	
	
	// check to see if this is IE version 6 or lower. hide select boxes if so
	// maybe they'll fix this in version 7?
	var brsVersion = parseInt(window.navigator.appVersion.charAt(0), 10);
	if (brsVersion <= 6 && window.navigator.userAgent.indexOf("MSIE") > -1) {
		gHideSelects = true;
	}
}
addEvent(window, "load", initPopUp);

/////


function pause(numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime)
			return;
	}
}

var IFrameObj; // our IFrame object

function callToServer(url) {
  if (!document.createElement) {return true};
  var IFrameDoc;

//	alert("in callToServer");
	
  if (!IFrameObj && document.createElement) {
    // create the IFrame and assign a reference to the
    // object to our global variable IFrameObj.
    // this will only happen the first time 
    // callToServer() is called
	// alert("first time only");
   try {
	// alert("01");
//      var oldIFrame = document.getElementById("popupIFrame");
//      gPopIFrame.removeChild(oldIFrame);
      
      var tempIFrame=document.createElement('iframe');
      tempIFrame.setAttribute('id','popupFrame');
      tempIFrame.setAttribute('name','popupFrame');
      tempIFrame.style.border='0px';
      tempIFrame.style.width='0px';
      tempIFrame.style.height='0px';
      tempIFrame.scrolling='no';
      tempIFrame.frameborder='0';
      tempIFrame.allowtransparency='true';
//      IFrameObj = gPopIFrame.appendChild(tempIFrame);
      IFrameObj = document.getElementById('popupIFrame').appendChild(tempIFrame);
      
      if (document.frames) {
        // this is for IE5 Mac, because it will only
        // allow access to the document object
        // of the IFrame if we access it through
        // the document.frames array
        IFrameObj = document.frames['popupFrame'];
      }
    } catch(exception) {
      // This is for IE5 PC, which does not allow dynamic creation
      // and manipulation of an iframe object. Instead, we'll fake
      // it up by creating our own objects.
      iframeHTML='\<iframe id="popupFrame" style="';
      iframeHTML+='border:0px;';
      iframeHTML+='width:0px;';
      iframeHTML+='height:0px;';
      iframeHTML+='"><\/iframe>';
      document.getElementById('popupIFrame').innerHTML+=iframeHTML;
      IFrameObj = new Object();
      IFrameObj.document = new Object();
      IFrameObj.document.location = new Object();
      IFrameObj.document.location.iframe = document.getElementById('popupFrame');
      IFrameObj.document.location.replace = function(location) {
        this.iframe.src = location;
      }
    }
  }
  
  if (navigator.userAgent.indexOf('Gecko') !=-1 && !IFrameObj.contentDocument) {
    // we have to give NS6 a fraction of a second
    // to recognize the new IFrame
    pause(500);
//    setTimeout('callToServer()',10);
//    return true;
  }

//    setTimeout('callToServer()',10);

  if (IFrameObj.contentDocument) {
    // For NS6
    IFrameDoc = IFrameObj.contentDocument; 
  } else if (IFrameObj.contentWindow) {
    // For IE5.5 and IE6
    IFrameDoc = IFrameObj.contentWindow.document;
  } else if (IFrameObj.document) {
    // For IE5
    IFrameDoc = IFrameObj.document;
  } else {
    return true;
  }
  
  IFrameDoc.location.replace('/gallery/loading.ftl');

//   document.getElementById('popupFrame').src = url;
//  IFrameDoc.location.replace(url);
  return false;
}

/////

 /**
	* @argument width - int in pixels
	* @argument height - int in pixels
	* @argument url - url to display
	* @argument returnFunc - function to call when returning true from the window.
	*/

function showPopWin(url, width, height, returnFunc) {
	gPopupIsShown = true;
	disableTabIndexes();

//	frames['popupFrame'].location.href = url;

//		
//  Do this after the centerPopUp() so we put the window in the correct place	
//	gPopupMask.style.display = "block";
//	gPopupContainer.style.display = "block";
	
	// calculate where to place the window on screen

	if (!IFrameObj) {
	  callToServer(url);	
	}

	gPopFrame = document.getElementById("popupFrame");	

	centerPopWin(width, height);
	
	gPopupMask.style.display = "block";
	gPopupContainer.style.display = "block";

	var titleBarHeight = parseInt(document.getElementById("popupTitleBar").offsetHeight, 10);
	
	gPopupContainer.style.width = width + "px";
	gPopupContainer.style.height = (height+titleBarHeight) + "px";
	// need to set the width of the iframe to the title bar width because of the dropshadow
	// some oddness was occuring and causing the frame to poke outside the border in IE6
	gPopFrame.style.width = parseInt(document.getElementById("popupTitleBar").offsetWidth, 10) + "px";
	gPopFrame.style.height = (height) + "px";
	
	// set the url
////    document.getElementById('popupFrame').url = url;
//    document.getElementById('popupFrame').src = url;

////	frames['popupFrame'].location.href = url;
/*
	if (	frames['popupFrame']) {
	    alert("found popupFrame");
	    alert(url);
	    alert(document.getElementById('popupFrame').src);
        frames['popupFrame'].location.replace(url);
	} else {
	    alert("no popupFrame!");
	    document.getElementById('popupFrame').src = url;
	}
*/

//        frames['popupFrame'].location.replace(url);
    
	frames['popupFrame'].location.replace(url);
   
	// for IE
	if (gHideSelects == true) {
		hideSelectBoxes();
	}
	
//	window.setTimeout("setPopTitle();", 600);
}

//
var gi = 0;
function centerPopWin(width, height) {

	if (gPopupIsShown == true) {
		if (width == null || isNaN(width)) {
			width = gPopupContainer.offsetWidth;
		}
		if (height == null) {
			height = gPopupContainer.offsetHeight;
		}
		
		var fullHeight = getViewportHeight();
		var fullWidth = getViewportWidth();
		
		var theBody = document.documentElement;

//       move this computation to after we get the scroll offset... (BS)		
//		var scTop = parseInt(theBody.scrollTop,10);
//		var scLeft = parseInt(theBody.scrollLeft,10);

		var arrayPageSize = getPageSize();
		var arrayPageScroll = getPageScroll();

//		alert("Page Size\n\n" + arrayPageSize[0] + "x" + arrayPageSize[1] + " - " + arrayPageSize[2] + "x" + arrayPageSize[3]);
//		alert("Page Scroll\n\n" + arrayPageScroll[0] + "x" + arrayPageScroll[1]);

		if (typeof lightboxTopOffset != "undefined") {
			var scTop = parseInt(arrayPageScroll[1], 10) - lightboxTopOffset;
		} else {
			var scTop = parseInt(arrayPageScroll[1], 10);
		}
	    
		if (typeof lightboxLeftOffset != "undefined") {
			var scLeft = parseInt(theBody.scrollLeft,10) - lightboxLeftOffset;
	    } else {
			var scLeft = parseInt(theBody.scrollLeft,10);
		}
		
		gPopupMask.style.height = fullHeight + "px";
		gPopupMask.style.width = fullWidth + "px";
		gPopupMask.style.top = scTop + "px";
		gPopupMask.style.left = scLeft + "px";
				
		window.status = gPopupMask.style.top + " " + gPopupMask.style.left + " " + gi++;
		
		var titleBarHeight = parseInt(document.getElementById("popupTitleBar").offsetHeight, 10);
		
//		gPopupContainer.style.top = (scTop + ((fullHeight - (height+titleBarHeight)) / 2)) + "px";

		// I don't want to center it vertically, just start it at the top of the window (BS)
		gPopupContainer.style.top = (scTop + 10) + "px";

		gPopupContainer.style.left =  (scLeft + ((fullWidth - width) / 2)) + "px";
		//alert(fullWidth + " " + width + " " + gPopupContainer.style.left);
	}
}

addEvent(window, "resize", centerPopWin);

//addEvent(window, "scroll", centerPopWin);
//window.onscroll = centerPopWin;

window.onscroll = scrollBackground;

function scrollBackground() {

		var arrayPageSize = getPageSize();
		var arrayPageScroll = getPageScroll();

		var fullHeight = getViewportHeight();
		var fullWidth = getViewportWidth();
		var theBody = document.documentElement;

		if (typeof lightboxTopOffset != "undefined") {
			var scTop = parseInt(arrayPageScroll[1], 10) - lightboxTopOffset;
		} else {
			var scTop = parseInt(arrayPageScroll[1], 10);
		}
	    
		if (typeof lightboxLeftOffset != "undefined") {
			var scLeft = parseInt(theBody.scrollLeft,10) - lightboxLeftOffset;
	    } else {
			var scLeft = parseInt(theBody.scrollLeft,10);
		}

		gPopupMask.style.height = fullHeight + "px";
		gPopupMask.style.width = fullWidth + "px";
		gPopupMask.style.top = scTop + "px";
		gPopupMask.style.left = scLeft + "px";
		window.status = gPopupMask.style.top + " " + gPopupMask.style.left + " " + gi++;
}



/**
 * @argument callReturnFunc - bool - determines if we call the return function specified
 * @argument returnVal - anything - return value 
 */
function hidePopWin(callReturnFunc) {
	gPopupIsShown = false;
	restoreTabIndexes();
	if (gPopupMask == null) {
		return;
	}
	gPopupMask.style.display = "none";
	gPopupContainer.style.display = "none";
	if (callReturnFunc == true && gReturnFunc != null) {
		gReturnFunc(window.frames["popupFrame"].returnVal);
	}
	frames['popupFrame'].location.replace('/gallery/loading.ftl');
//	gPopFrame.src = '/gallery/loading.ftl';
	// display all select boxes
	if (gHideSelects == true) {
		displaySelectBoxes();
	}
}

/**
 * Sets the popup title based on the title of the html document it contains.
 * Uses a timeout to keep checking until the title is valid.
 */

function setPopTitle() {
	if (window.frames["popupFrame"].document.title == null) {
		window.setTimeout("setPopTitle();", 10);
	} else {
		document.getElementById("popupTitle").innerHTML = window.frames["popupFrame"].document.title;
	}
}


// Tab key trap. iff popup is shown and key was [TAB], suppress it.
// @argument e - event - keyboard event that caused this function to be called.
function keyDownHandler(e) {
    if (gPopupIsShown && e.keyCode == 9)  return false;
}

// For IE.  Go through predefined tags and disable tabbing into them.
function disableTabIndexes() {
	if (document.all) {
		var i = 0;
		for (var j = 0; j < gTabbableTags.length; j++) {
			var tagElements = document.getElementsByTagName(gTabbableTags[j]);
			for (var k = 0 ; k < tagElements.length; k++) {
				gTabIndexes[i] = tagElements[k].tabIndex;
				tagElements[k].tabIndex="-1";
				i++;
			}
		}
	}
}

// For IE. Restore tab-indexes.
function restoreTabIndexes() {
	if (document.all) {
		var i = 0;
		for (var j = 0; j < gTabbableTags.length; j++) {
			var tagElements = document.getElementsByTagName(gTabbableTags[j]);
			for (var k = 0 ; k < tagElements.length; k++) {
				tagElements[k].tabIndex = gTabIndexes[i];
				tagElements[k].tabEnabled = true;
				i++;
			}
		}
	}
}


/**
* Hides all drop down form select boxes on the screen so they do not appear above the mask layer.
* IE has a problem with wanted select form tags to always be the topmost z-index or layer
*
* Thanks for the code Scott!
*/
function hideSelectBoxes() {
	for(var i = 0; i < document.forms.length; i++) {
		for(var e = 0; e < document.forms[i].length; e++){
			if(document.forms[i].elements[e].tagName == "SELECT") {
				document.forms[i].elements[e].style.visibility="hidden";
			}
		}
	}
}

/**
* Makes all drop down form select boxes on the screen visible so they do not reappear after the dialog is closed.
* IE has a problem with wanted select form tags to always be the topmost z-index or layer
*/
function displaySelectBoxes() {
	for(var i = 0; i < document.forms.length; i++) {
		for(var e = 0; e < document.forms[i].length; e++){
			if(document.forms[i].elements[e].tagName == "SELECT") {
			document.forms[i].elements[e].style.visibility="visible";
			}
		}
	}
}
