function find_popup(n) {
  var docs = new Array;
  var popup_div;
  docs.push(document);
  if (top.document) docs.push(top.document);
  if (window.parent.document) docs.push(window.parent.document);
  
  for (i = 0; i < docs.length; i++) {
    popup_div = docs[i].getElementById('_popup_' + n) ||
                docs[i].getElementById(n);
    if (popup_div) break;
  }
  return popup_div;
}

var fade_in;
if (navigator.userAgent.indexOf('Safari') != -1) {
  fade_in = 300;
}
else if (navigator.userAgent.indexOf('MSIE') != -1) {
  fade_in = 75;
}
else if (navigator.userAgent.indexOf('Firefox') != -1) {
  fade_in = 500;
}
else {
  fade_in = 200;
}

function popup_to_top(mydiv) {
  if (!mydiv.style) mydiv = find_popup(mydiv);
  if (!mydiv) return;
  if (mydiv.style.display != 'block') return;

  mydiv.style.zIndex = 999;
  
  // All other popups get pushed down one position.
  var other_popups = getElementsByClass('popup',null,'DIV');
  for (var d = 0; d < other_popups.length; d++) {
    if (other_popups[d] != mydiv) {
      other_popups[d].style.zIndex--;
    }
  }
}

function popup(d,evt) {
  var mydiv = find_popup(d);
  if (mydiv == null) {alert("Can't find '" + d + "'"); return;}
  if (mydiv.style.display == 'block') { popup_to_top(mydiv); return }

  // Seems necessary to get some browsers to correctly calculate the
  // div's dimensions.
  mydiv.style.display    = 'block';
  mydiv.style.visibility = 'hidden';

  var viewport = get_viewport();
  // Adjust the width if the popup is wider than the browser.
  //console_debug(viewport);
  
  if (mydiv.style.width > viewport[0]) {
    mydiv.style.width = viewport[0] - 2 + 'px';
  }
  
  // First time display; the 'close' link tends to float up into the text
  // unless we adjust the popup's height.
  if (mydiv.style.height == 'auto' ||
      mydiv.style.height == '') {

    var h = 0;
    var closers = getElementsByClass('popup_close',mydiv,null);
    for (var i = 0; i < closers.length; i++) {
      h += closers[i].offsetHeight;
    }

    if (h > 0) mydiv.style.height = (mydiv.offsetHeight + h) + 'px';
  }

  var dsoc = get_dsoc();

  var mousePos = (evt.Xcoord || evt.Ycoord)
                 ? evt
                 : getMouseXY(top.evt);

  if (mousePos) {
    // Default position is where the mouse was clicked.
    mydiv.style.left = mousePos.Xcoord + 'px';

    if (mydiv.offsetHeight + mousePos.Ycoord < dsoc[1]) {
      mydiv.style.top = mousePos.Ycoord + 'px';
    }
    else {
      var top_pos = mousePos.Ycoord - mydiv.offsetHeight;
      if (top_pos < 10) {
        mydiv.style.top = '10px';
      }
      else {
        mydiv.style.top = top_pos + 'px';
      }
      mydiv.style.bottom = '10px';
    }
    
    //console_debug(mousePos);
    //console_debug(window.innerHeight);
  }
  else {
    // Should only happen for broken browsers.
    mydiv.style.left = '0px';
    mydiv.style.top  = '0px';
  }

  // Don't let the div slide off the left edge.
  if (findPosX(mydiv) < 0) {
    mydiv.style.left = '0px';
  }

  // Or the right edge.
  if (findPosX(mydiv) + mydiv.offsetWidth + 10 > viewport[0]) {
    mydiv.style.left = 'auto';
    mydiv.style.right = '1px';
  }

  // Or the top.
  if (findPosY(mydiv) < dsoc[1]) {
    mydiv.style.top = dsoc[1] + 5 + 'px';
  }

  // Or the bottom.
  if (findPosY(mydiv) + mydiv.offsetHeight > dsoc[1] + viewport[1]) {
    //mydiv.style.top = dsoc[1] + 5 + 'px';
    mydiv.style.top = 'auto';
    mydiv.style.bottom = '5px';
  }

  /*
  alert('findPosY() = ' + findPosY(mydiv) +
       '; dsoc[1] = ' + dsoc[1] +
       '; viewport[1] = ' + viewport[1] +
       '; mydiv.offsetHeight = ' + mydiv.offsetHeight +
       '; .top = ' + mydiv.style.top +
       '; .bottom = ' + mydiv.style.bottom);
  */
  popup_to_top(mydiv);

  // Fade it in.
  mydiv.style.visibility = 'visible'; // must happen before fiddling with opacity
  opacity(mydiv.id,10,100,fade_in);

  omniture_track_popup(mydiv);
  
  return;
}

function popup_close(d) {
  var mydiv = find_popup(d);
  if (!mydiv) return;

  mydiv.style.display = 'none';
  return;
}

function setup_popup_elements() {
  // This gets done here rather than in the tag because the onclick
  // needs the event passed in.
  var popups = getElementsByClass('show_popup',null,null);
  for (var i = 0; i < popups.length; i++) {
    if (popups[i].href == '') {
      popups[i].href = '#';
    }

    // This funky definition is required because popups might be nested
    // within an <IFRAME>; this is the only way I've found to get it working.
    // I think it's because the clicked element and the popup element are
    // in different documents displayed in different windows.
    popups[i].onclick = function(evt){
      var e = evt || window.event || window.Event;
      top.popup(this.getAttribute("popup"),top.getMouseXY(e)); return false; };
  }

  var divs = getElementsByClass('popup',null,null);
  
  for (var i = 0; i < divs.length; i++) {
    var div = divs[i];

    div.onmouseover = function(evt){
      popup_to_top(this);
    };

    // Any links inside the popup should have "target=_top".
    var links = new Array;
    var iframes = div.getElementsByTagName('iframe');
    for (var j = 0; j < iframes.length; j++) {
      var idoc = iframes[j].contentDocument;
      if (idoc == null) idoc = iframes[j].contentWindow.document;
      if (idoc.getElementsByTagName) {
        var ilinks = idoc.getElementsByTagName('a');
        for (var k = 0; k < ilinks.length; k++) {
          links.push(ilinks[k]);
        }
      }
    }
    var dlinks = div.getElementsByTagName('a');
    for (var j = 0; j < dlinks.length; j++) {
      links.push(dlinks[j]);
    }

    for (var j = 0; j < links.length; j++) {
      var anchor = links[j];
      
      if (anchor.getAttribute('href') &&
          anchor.className != 'show_popup') {
        anchor.target = '_top';
      }
    }

    var w = top;
    if (top.parent) w = top.parent;
    var body_tags = w.document.getElementsByTagName('body');
    if (body_tags.length > 0) var bod = body_tags[0];
    if (bod) bod.appendChild(div);
  }

  // Popup close links have to be massaged for MSIE.
  var closers = getElementsByClass('popup_close',null,null);
  for (var i = 0; i < closers.length; i++) {
    closers[i].onmouseover = function(){ jscss('add',   this,'popup_hover') };
    closers[i].onmouseout  = function(){ jscss('remove',this,'popup_hover') };
  }
}

addLoadEvent(setup_popup_elements);
