/**
* SUBMODAL v1.5
* Used for displaying DHTML only popups instead of using buggy modal windows.
*
* By Seth Banks
* http://www.subimage.com/
*
* Contributions by:
* 	Eric Angel - tab index code
* 	Scott - hiding/showing selects for IE users
*	Todd Huss - inserting modal dynamically and anchor classes
*
* Up to date code can be found at http://www.subimage.com/dhtml/subModal
* 
*
* 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 gDefaultPage = "PopupWaitPage.htm?counter=";
var gHideSelects = false;
var gReturnVal = null;

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");


var gPopupContexts = new Array();

// Doc: document in which the method must be called. Must pass the 'window', not 'document'
// Func: function that must be called
function popupContext(doc, func) {
  this.doc = doc;
  this.func = func;
  this.returnVal = null;
}

// If using Mozilla or Firefox, use Tab-key trap.
if (!document.all) {
  document.onkeypress = keyDownHandler;
}

var counter = 0;    // Popup counter

/**
* Initializes popup code on load.	
*/
function initPopUp() {
  // Add the HTML to the body
  theBody = document.getElementsByTagName('BODY')[0];
  popmask = document.createElement('div');
  popmask.id = 'popupMask' + counter;
  popmask.style.display = 'none';
  popmask.style.position = 'absolute';
  popcont = document.createElement('div');
  popcont.id = 'popupContainer' + counter;
  popcont.style.display = 'none';
  popcont.style.position = 'absolute';
  popcont.innerHTML = '' +
		'<div id="popupInner' + counter + '">' +
			'<div id="popupTitleBar' + counter + '" class="boite">' +
				'<div id="popupTitle' + counter + '" class="titre-popup">---</div>' +
  //'<div id="popupControls' + counter + '" class="controls-popup"> <a href="#" onclick="popupFrame' + counter + '.DoPopupCloseCallBack();">' +
                '<div id="popupControls' + counter + '" class="controls-popup"> <a href="#" onclick="DoClosePopup();">' +
					'<img src="images/bt-close.gif" onclick="" id="popCloseBox' + counter + '" /></a>' +               //onclick="hidePopWin(false);"
				'</div>' +
			'</div>' +
			'<iframe src="' + gDefaultPage + counter + '" style="width:100%;height:100%;background-color:transparent;" scrolling="auto" frameborder="0" allowtransparency="true" id="popupFrame' + counter + '" name="popupFrame' + counter + '" width="100%" height="100%" class="contenu-popup"></iframe>' +
		'</div>';
  theBody.appendChild(popmask);
  theBody.appendChild(popcont);
  jQuery('#popupContainer' + counter).addClass("container-popup");
  jQuery('#popupMask' + counter).addClass("popupMask");

  // We assign the z index based on the counter value
  jQuery('#popupContainer' + counter).css("z-index", (201 + counter * 100) + '');
  jQuery('#popupFrame' + counter).css("z-index", (202 + counter * 100) + '');
  jQuery('#popupMask' + counter).css("z-index", (200 + counter * 100) + '');

  gPopupMask = document.getElementById("popupMask" + counter);
  gPopupContainer = document.getElementById("popupContainer" + counter);
  gPopFrame = document.getElementById("popupFrame" + counter);

  // 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;
  }

  // Add onclick handlers to 'a' elements of class submodal or submodal-width-height
  //	var elms = document.getElementsByTagName('a');
  //	for (i = 0; i < elms.length; i++) {
  //		if (elms[i].className.indexOf("submodal") == 0) { 
  //			// var onclick = 'function (){showPopWin(\''+elms[i].href+'\','+width+', '+height+', null);return false;};';
  //			// elms[i].onclick = eval(onclick);
  //			elms[i].onclick = function(){
  //				// default width and height
  //				var width = 400;
  //				var height = 200;
  //				// Parse out optional width and height from className
  //				params = this.className.split('-');
  //				if (params.length == 3) {
  //					width = parseInt(params[1]);
  //					height = parseInt(params[2]);
  //				}
  //				showPopWin(this.href,width,height,null); return false;
  //			}
  //		}
  //	}
}

// need it for closing popup in FireFox
function DoClosePopup() {
  var $f = $("#popupFrame" + counter);
  var fd = $f[0].contentWindow || $f[0].document; // document of iframe
  fd.DoPopupCloseCallBack();
}

/**
* @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.
* @argument showCloseBox - show the close box - default true
*/
function showPopWin(baseUrl, width, height, returnFunc, returnDoc, showCloseBox, popupTitle) {

  counter++;
  initPopUp();

  // We add new object in
  //gPopupContexts.push(new popupContext(returnDoc, returnFunc));
  var context = new popupContext(returnDoc, returnFunc);
  gPopupContexts.push(context);

  // NCA force popup parameter in the url ...
  var separator = baseUrl.indexOf("?") > 0 ? "&" : "?";
  var url = baseUrl + separator + "InPopup=1";

  // show or hide the window close widget
  var control = document.getElementById("popCloseBox" + counter);
  //    if(control == null)
  //    {
  //        initPopUp();
  //    }
  if (showCloseBox == null || showCloseBox == true) {
    document.getElementById("popCloseBox" + counter).style.display = "block";
  }
  else {
    document.getElementById("popCloseBox" + counter).style.display = "none";
  }

  centerPopWin(width, height);

  gPopupIsShown = true;
  disableTabIndexes();
  gPopupMask.style.display = "block";
  gPopupContainer.style.display = "block";
  // calculate where to place the window on screen

  var titleBarHeight = parseInt(document.getElementById("popupTitleBar" + counter).offsetHeight, 10);


  gPopupContainer.style.width = width + "px";
  gPopupContainer.style.height = (height + titleBarHeight) + "px";

  setMaskSize();

  // reset title popup
  if (popupTitle) {
    $("#popupTitle" + counter).html(popupTitle);
  }
  else {
    $("#popupTitle" + counter).html(baseUrl);
  }

  // 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" + counter).offsetWidth, 10) - 10) + "px";
  gPopFrame.style.height = (height) + "px";

  // set the url
  gPopFrame.src = url;

  gReturnFunc = returnFunc;
  // for IE
  if (gHideSelects == true) {
    hideSelectBoxes();
  }
}

//
var gi = 0;
function centerPopWin(width, height) {
  //if (gPopupIsShown == true) {

  if (counter <= 0)
    return;

  var totalPopup = counter;
  counter = 1;
  while (counter <= totalPopup) {

    if (width == null || isNaN(width)) {
      width = document.getElementById("popupContainer" + counter).offsetWidth;
    }
    if (height == null) {
      height = document.getElementById("popupContainer" + counter).offsetHeight;
    }

    //var theBody = document.documentElement;
    var theBody = document.getElementsByTagName("BODY")[0];
    //theBody.style.overflow = "hidden";
    var scTop = 0;   //parseInt(getScrollTop(), 0);

    var scLeft = 0; //  parseInt(theBody.scrollLeft,10);

    setMaskSize();

    //window.status = gPopupMask.style.top + " " + gPopupMask.style.left + " " + gi++;

    var titleBarHeight = parseInt(document.getElementById("popupTitleBar" + counter).offsetHeight, 10);

    var fullHeight = jQuery(window).height(); //getViewportHeight();
    var fullWidth = jQuery(window).width(); //getViewportWidth();

    var relativeOffset = ((fullHeight - (height + titleBarHeight)) / 2);
    if (relativeOffset < 0)
      relativeOffset = 0;

    gPopupContainer = document.getElementById("popupContainer" + counter);
    gPopupContainer.style.top = (scTop + relativeOffset) + "px";
    gPopupContainer.style.left = (scLeft + ((fullWidth - width) / 2)) + "px";
    //alert(fullWidth + " " + width + " " + gPopupContainer.style.left);
    //window.parent.SetPopupTitle(scTop + " " + fullHeight + " " + height + " " + gPopupContainer.style.top);
    //}

    counter++;
  }
  counter = totalPopup;
}

//NCA TMP 

addEvent(window, "resize", centerPopWin);

// We recenter on scroll only if not in chrome (else, display bug...)
if (navigator.userAgent.toLowerCase().indexOf('chrome') == -1) {
  addEvent(window, "scroll", centerPopWin);
}
window.onscroll = centerPopWin;


/**
* Sets the size of the popup mask.
*
*/
function setMaskSize() {
  gPopupMask = document.getElementById("popupMask" + counter);
  if (gPopupMask == null)
    return;
  gPopupMask.style.height = jQuery(window).height() + "px";
  gPopupMask.style.width = jQuery(window).width() + "px";
}

// Calls the callback function for the currently displayed popup window
function callPopupCallBack() {
  var context = gPopupContexts[counter - 1];
  gReturnVal = context.returnVal;

  // We set timeout in the calling document, to call function name, using global var with the return value
  if (context.doc && context.func) {
    //context.doc.setTimeout(context.func + '(top.gReturnVal);', 100);
    if (topWin != null) //Set return value for integrated page
      topWin.gReturnVal = gReturnVal;
    context.doc.eval(context.func + '(topWin.gReturnVal);');
  }
}

/**
* @argument callReturnFunc - bool - determines if we call the return function specified
* @argument returnVal - anything - return value 
*/
function hidePopWin(callReturnFunc) {
  gPopupIsShown = false;
  //	var theBody = document.getElementsByTagName("BODY")[0];
  //	theBody.style.overflow = "";
  //	restoreTabIndexes();
  //	if (gPopupMask == null) {
  //		return;
  //	}
  //	gPopupMask.style.display = "none";
  //	gPopupContainer.style.display = "none";


  // We don't hide elements, we remove them from DOM
  gPopupMask = document.getElementById("popupMask" + counter);
  gPopupContainer = document.getElementById("popupContainer" + counter);
  gPopFrame = document.getElementById("popupFrame" + counter);
  gPopupMask.parentNode.removeChild(gPopupMask);
  gPopupContainer.parentNode.removeChild(gPopupContainer);
  gPopFrame.parentNode.removeChild(gPopFrame);
  try {
    if (callReturnFunc == true) {
      callPopupCallBack();
    }

    if (gHideSelects == true) {
      displaySelectBoxes();
    }
  }
  catch (ex) {
    alert(ex);
  }
  finally {
    counter--;
    gPopupContexts.splice(counter, 1);
  }
}

/**
* 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(title) {
  document.getElementById("popupTitle" + counter).innerHTML = title;
}

/* Sets the return value for the current popupp */
function setPopReturnVal(obj) {
  gPopupContexts[counter - 1].returnVal = obj;
}

// 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";
      }
    }
  }
}
/**
* X-browser event handler attachment and detachment
* TH: Switched first true to false per http://www.onlinetools.org/articles/unobtrusivejavascript/chapter4.html
*
* @argument obj - the object to attach event to
* @argument evType - name of the event - DONT ADD "on", pass only "mouseover", etc
* @argument fn - function to call
*/
function addEvent(obj, evType, fn) {
  if (obj.addEventListener) {
    obj.addEventListener(evType, fn, false);
    return true;
  } else if (obj.attachEvent) {
    var r = obj.attachEvent("on" + evType, fn);
    return r;
  } else {
    return false;
  }
}
function removeEvent(obj, evType, fn, useCapture) {
  if (obj.removeEventListener) {
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent) {
    var r = obj.detachEvent("on" + evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}

/**
* Code below taken from - http://www.evolt.org/article/document_body_doctype_switching_and_more/17/30655/
*
* Modified 4/22/04 to work with Opera/Moz (by webmaster at subimage dot com)
*
* Gets the full width/height because it's different for most browsers.
*/
function getViewportHeight() {
  if (window.innerHeight != window.undefined) return window.innerHeight;
  if (document.compatMode == 'CSS1Compat') return document.documentElement.clientHeight;
  if (document.body) return document.body.clientHeight;

  return window.undefined;
}
function getViewportWidth() {
  var offset = 17;
  var width = null;
  if (window.innerWidth != window.undefined) return window.innerWidth;
  if (document.compatMode == 'CSS1Compat') return document.documentElement.clientWidth;
  if (document.body) return document.body.clientWidth;
}

/**
* Gets the real scroll top
*/
function getScrollTop() {
  if (self.pageYOffset) // all except Explorer
  {
    return self.pageYOffset;
  }
  else if (document.documentElement && document.documentElement.scrollTop)
  // Explorer 6 Strict
  {
    return document.documentElement.scrollTop;
  }
  else if (document.body) // all other Explorers
  {
    return document.body.scrollTop;
  }
}

function getScrollLeft() {
  if (self.pageXOffset) // all except Explorer
  {
    return self.pageXOffset;
  }
  else if (document.documentElement && document.documentElement.scrollLeft)
  // Explorer 6 Strict
  {
    return document.documentElement.scrollLeft;
  }
  else if (document.body) // all other Explorers
  {
    return document.body.scrollLeft;
  }
}

