/**********************************************************
Author:
Adam Barry
Klestrup partners
www.klestrup-partners.dk

Date: August 8 2009

� 2009 Adam Barry, all rights reserved
-----------------------------------------------------------

Name:
popupWindow script

-----------------------------------------------------------
Description:
Functions that enable an integrated popup-window which
sits in front of the normal page content.

-----------------------------------------------------------
Usage:
Simply place a link to the this script in the head-section
of the XHTML page. The script will then automatically
execute on page load.

<script type="text/javascript" src="popupWindow.js"></script>

-----------------------------------------------------------
Example:
<script type="text/javascript" src="popupWindow.js"></script>


<a href="javascript:popup(false,false,false)">Open popup window</a>
<a href="javascript:popup('<h2>New HTML</h2><p>This text has been injected into the popup-window.</p>',false,2500)">Open time-limited popup window</a>


<div class="popupWindow">
  <div class="popupContainer">

    <div class="popup">
      <a class="close"><span>Close</span></a>

      <div class="popupContent">
        <h2>User notification</h2>
      </div>

    </div>

  </div>
</div>  

-----------------------------------------------------------
Dependencies:
windowOnLoad.js
string.js

Optional:
keyHandler.js

**********************************************************/

var popupWindow;  /* Base element for popup-structure */
var popupContainer;  /* Container-part of popup-structure */
var popupContent;  /* Content-part of popup-structure */

function initPopup() {
  if (!document.getElementsByTagName) return;

  var divs = document.getElementsByTagName("div");

  for (var i = 0; i < divs.length; i++) {
    if (divs[i].className.indexOf('popupWindow') > -1) {
      popupWindow = divs[i];
      break;
    }
  }

if (!popupWindow) addPopupWindow();
  
  /* Set height of popupwindow to cover the entire page using position:absolute in stead of position:fixed (for IE6-compatability)*/
  //popupWindow.style.height = document.documentElement.scrollHeight + "px";
  
  var anchors = popupWindow.getElementsByTagName("a");

  for (var i = 0; i < anchors.length; i++) {

    if (anchors[i].className.indexOf('close') > -1) {
      var me = anchors[i];
      me.onclick = function() {
        hidePopup();
      }
      break;
    }
  }

  var divs = popupWindow.getElementsByTagName("div");

  /* Identify the popupContainer */
  for (var i = 0; i < divs.length; i++) {
    if (divs[i].className.indexOf('popupContainer') > -1) {
      popupContainer = divs[i];
      break;
    }
  }

  /* Identify the popupContent */
  for (var i = 0; i < divs.length; i++) {
    if (divs[i].className.indexOf('popupContent') > -1) {
      popupContent = divs[i];
      break;
    }
  }

  /* center the alert box */
  var popupContainerWidth = trim(getStyle(popupContainer, "width"),'px');
  popupContainer.style.left = (document.documentElement.scrollWidth - popupContainerWidth) / 2 + "px";  

} addLoadEvent(function(){initPopup();});


function getStyle(element, styleProperty) {
  if (element.currentStyle) {
    var value = element.currentStyle[styleProperty];
  }
  else if (window.getComputedStyle) {
    var value = document.defaultView.getComputedStyle(element, null).getPropertyValue(styleProperty);
  }
  return value;
}


function addPopupWindow() {
  popupStructure = document.createElement('div');
  popupStructure.className = "popupWindow";

  popupStructure.innerHTML = "<div class=\"popupContainer\"><div class=\"popup\"><a class=\"close\"><span>Luk (esc) <span>x</span></span></a><div class=\"popupContent\"><h2>HTML for user notification goes here</h2></div></div></div>";

  document.body.appendChild(popupStructure);

  popupWindow = popupStructure;
}


function hidePopup() {
  popupWindow.className = "popupWindow";

  /* If keyHandler script is present, remove the active element */
  if(typeof removeActiveKeyElement == 'function') {
    removeActiveKeyElement();
  }
}


function popupTimer(time) {
  window.setTimeout(hidePopup,time);
}

function popup(message,classInformation,keepVisibleTime) {    
  if (!popupWindow) return;
  if (!popupContent) return;
  
  if (message) {
    popupContent.innerHTML = message;
  }
  else {
    popupContent.innerHTML = "";
  }

  if (classInformation) {
    popupWindow.className += " "+ classInformation;
  }

  popupWindow.className += " active";
  if (clickSource) { clickSource.blur(); }

  /* Add key-functions to the popupWindow */
  if (typeof addKeyAction == 'function') {
    addKeyAction(popupWindow, function () { hidePopup(); }, [13]);
    addKeyAction(popupWindow, function () { hidePopup(); }, [27]);
  }

  if (typeof setActiveKeyElement == 'function') {
    setActiveKeyElement(popupWindow);
  }

  if (keepVisibleTime) {
    addKeyAction(popupWindow, function () { void(0); }, [13]);
    popupTimer(keepVisibleTime);
  }
}

var clickSource;
function clickListener(event) {

  var evt = event || window.event;

  if (evt) {
    var targ;
    if (evt.target) { targ = evt.target; }
    else if (evt.srcElement) { targ = evt.srcElement; }
    if (targ.nodeType == 3) { /* defeat Safari bug */ targ = targ.parentNode; }

    clickSource = targ;
  }
} document.onclick = clickListener;
