/*
Created By: Chris Campbell
Modified By: Noah Winecoff (http://www.findmotive.com)
Website: http://particletree.com
Date: 2/1/2006

Inspired by the lightbox implementation found at http://www.huddletogether.com/projects/lightbox/
*/

/*-------------------------------GLOBAL VARIABLES------------------------------------*/

var detect = navigator.userAgent.toLowerCase();
var OS,browser,version,total,thestring;
var defaultOverlayBox;

/*-----------------------------------------------------------------------------------------------*/

//Browser detect script origionally created by Peter Paul Koch at http://www.quirksmode.org/

function getBrowserInfo() {
  if (checkIt('konqueror')) {
    browser = "Konqueror";
    OS = "Linux";
  }
  else if (checkIt('safari')) browser   = "Safari"
  else if (checkIt('omniweb')) browser  = "OmniWeb"
  else if (checkIt('opera')) browser    = "Opera"
  else if (checkIt('webtv')) browser    = "WebTV";
  else if (checkIt('icab')) browser     = "iCab"
  else if (checkIt('msie')) browser     = "Internet Explorer"
  else if (!checkIt('compatible')) {
    browser = "Netscape Navigator"
    version = detect.charAt(8);
  }
  else browser = "An unknown browser";

  if (!version) version = detect.charAt(place + thestring.length);

  if (!OS) {
    if (checkIt('linux')) OS    = "Linux";
    else if (checkIt('x11')) OS   = "Unix";
    else if (checkIt('mac')) OS   = "Mac"
    else if (checkIt('win')) OS   = "Windows"
    else OS                 = "an unknown operating system";
  }
}

function checkIt(string) {
  place = detect.indexOf(string) + 1;
  thestring = string;
  return place;
}

/*-----------------------------------------------------------------------------------------------*/

Event.observe(window, 'load', initialize, false);
Event.observe(window, 'load', getBrowserInfo, false);
Event.observe(window, 'unload', Event.unloadCache, false);

var lightbox = Class.create();

lightbox.prototype = {

  yPos : 0,
  xPos : 0,

  initialize: function(ctrl) {
    this.content = ctrl.href;
    Event.observe(ctrl, 'click', this.activate.bindAsEventListener(this), false);
    ctrl.onclick = function(){return false;};
  },
  
  // Turn everything on - mainly the IE fixes
  activate: function(){
    if (browser == 'Internet Explorer'){
      this.getScroll();
      this.prepareIE('100%', 'hidden');
      this.setScroll(0,0);
      this.hideSelects('hidden');
    }
    this.displayLightbox("block");
  },
  
  // Ie requires height to 100% and overflow hidden or else you can scroll down past the lightbox
  prepareIE: function(height, overflow){
    bod = document.getElementsByTagName('body')[0];
    bod.style.height = height;
    bod.style.overflow = overflow;
  
    htm = document.getElementsByTagName('html')[0];
    htm.style.height = height;
    htm.style.overflow = overflow; 
  },
  
  // In IE, select elements hover on top of the lightbox
  hideSelects: function(visibility){
    selects = document.getElementsByTagName('select');
    for(i = 0; i < selects.length; i++) {
      selects[i].style.visibility = visibility;
    }
  },
  
  // Taken from lightbox implementation found at http://www.huddletogether.com/projects/lightbox/
  getScroll: function(){
    if (self.pageYOffset) {
      this.yPos = self.pageYOffset;
    } else if (document.documentElement && document.documentElement.scrollTop){
      this.yPos = document.documentElement.scrollTop; 
    } else if (document.body) {
      this.yPos = document.body.scrollTop;
    }
  },
  
  setScroll: function(x, y){
    window.scrollTo(x, y); 
  },
  
  displayLightbox: function(display){
    $('overlay').style.display = display;
    $('lightbox').style.display = display;
    if(display != 'none')  {
      this.loadInfo();
      var pagesize = getPageSize();  
      var arrayPageScroll = getPageScrollTop();        
      $('lightbox').style.left = (arrayPageScroll[0] + (pagesize[0] - 650)/2)+"px";
      $('lightbox').style.top = (arrayPageScroll[1] + (pagesize[1]-580)/2)+"px"
    }
    Event.observe($('overlay'), 'click', this.deactivate.bindAsEventListener(this), false);
    $('overlay').onclick = function(){return false;};
  },
  
  // Write an iFrame instead of using an AJAX call to pull the content
  loadInfo: function() {
    
    info = "<div id='lbContent'><center><a href='#' class='lbAction' rel='deactivate' style='color:#FFFFFF'>close</a></center><iframe frameborder=\"0\" width=\"650\" height=\"580\" src=\"" + this.content + "\"</iframe></div>";
    new Insertion.Before($('lbLoadMessage'), info)
    $('lightbox').className = "done"; 
        
    this.actions();     
    
  },
  
  // Search through new links within the lightbox, and attach click event
  actions: function(){
    lbActions = document.getElementsByClassName('lbAction');

    for(i = 0; i < lbActions.length; i++) {
      Event.observe(lbActions[i], 'click', this[lbActions[i].rel].bindAsEventListener(this), false);
      lbActions[i].onclick = function(){return false;};
    }

  },
  
  // Example of creating your own functionality once lightbox is initiated
  insert: function(e){
     link = Event.element(e).parentNode;
     Element.remove($('lbContent'));
   
     var myAjax = new Ajax.Request(
        link.href,
        {method: 'post', parameters: "", onComplete: this.processInfo.bindAsEventListener(this)}
     );
   
  },
  
  // Example of creating your own functionality once lightbox is initiated
  deactivate: function(){
    Element.remove($('lbContent'));
    
    if (browser == "Internet Explorer"){
      this.setScroll(0,this.yPos);
      this.prepareIE("auto", "auto");
      this.hideSelects("visible");
    }
    
    this.displayLightbox("none");
  }
}

/*----------------------------------------------------------------------------------*/
var overlay_class = Class.create();

overlay_class.prototype = {

  yPos : 0,
  xPos : 0,

  initialize: function(ctrl) {
    this.content = ctrl.href;
    Event.observe(ctrl, 'click', this.activate.bindAsEventListener(this), false);
    ctrl.onclick = function(){return false;};
  },
  
  // Turn everything on - mainly the IE fixes
  activate: function(){
    if (browser == 'Internet Explorer'){
      this.getScroll();
      this.prepareIE('100%', 'hidden','auto');
      this.setScroll(0,0);
      this.hideSelects('hidden');
    }
    this.displayOverlay("block");
  },
  
  // Ie requires height to 100% and overflow hidden or else you can scroll down past the overlay
  prepareIE: function(height, overflowx,overflowy){
    bod = document.getElementsByTagName('body')[0];
    bod.style.height = height;
    bod.style.overflowX = overflowx;
    bod.style.overflowY = overflowy;

    htm = document.getElementsByTagName('html')[0];
    htm.style.height = height;
    htm.style.overflowX = overflowx;
    htm.style.overflowY = overflowy;
  },
  
  // In IE, select elements hover on top of the overlay
  hideSelects: function(visibility){
    selects = document.getElementsByTagName('select');
    for(i = 0; i < selects.length; i++) {
      selects[i].style.visibility = visibility;
    }
  },
  
  // Taken from overlay implementation found at http://www.huddletogether.com/projects/overlay/
  getScroll: function(){
    if (self.pageYOffset) {
      this.yPos = self.pageYOffset;
    } else if (document.documentElement && document.documentElement.scrollTop){
      this.yPos = document.documentElement.scrollTop; 
    } else if (document.body) {
      this.yPos = document.body.scrollTop;
    }
  },
  
  setScroll: function(x, y){
    window.scrollTo(x, y); 
  },
  
  displayOverlay: function(display){
    $('overlay').style.display = display;
    $('loadingImage').style.display = display;
    Event.observe($('overlay'), 'click', this.deactivate.bindAsEventListener(this), false);
    $('overlay').onclick = function(){return false;};
  },
  // Search through new links within the overlay, and attach click event
  actions: function(){
    lbActions = document.getElementsByClassName('lbAction');

    for(i = 0; i < lbActions.length; i++) {
      Event.observe(lbActions[i], 'click', this[lbActions[i].rel].bindAsEventListener(this), false);
      lbActions[i].onclick = function(){return false;};
    }

  },
  
  // Example of creating your own functionality once overlay is initiated
  deactivate: function(){ 
    if (browser == "Internet Explorer"){
      this.setScroll(0,this.yPos);
      this.prepareIE('auto', 'auto','auto');      
      this.hideSelects("visible");
    }
    
    this.displayOverlay("none");
  }
}

/*-----------------------------------------------------------------------------------------------*/

// Onload, make all links that need to trigger a lightbox active
function initialize(){
  addLightboxMarkup();
  lbox = document.getElementsByClassName('lbOn');
  for(i = 0; i < lbox.length; i++) {
    valid = new lightbox(lbox[i]);
  }
  obox = document.getElementsByClassName('olOn');
  for(i = 0; i < obox.length; i++) {
    defaultOverlayBox = new overlay_class(obox[i]);
  }  
}

// Add in markup necessary to make this work. Basically two divs:
// Overlay holds the shadow
// Lightbox is the centered square that the content is put into.
function addLightboxMarkup() {
  bod         = document.getElementsByTagName('body')[0];
  overlay       = document.createElement('div');
  overlay.id    = 'overlay';
  lb          = document.createElement('div');
  lb.id       = 'lightbox';
  lb.className  = 'loading';
  lb.innerHTML  = '<div id="lbLoadMessage">' +
              'loading' +
              '</div>';
              
  var objLoadingImage = document.createElement("img");
  objLoadingImage.src = "http://www.snapgalaxy.net/images/loadingAnimation.gif";
  objLoadingImage.setAttribute('id','loadingImage');
  objLoadingImage.style.position = 'absolute';
  objLoadingImage.style.zIndex = '150';
  objLoadingImage.style.display = 'none';
  overlay.appendChild(objLoadingImage);
              
  bod.appendChild(overlay);
  bod.appendChild(lb);
  
}

function getPageSize(){
  var de = document.documentElement;
  var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
  var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight
  arrayPageSize = new Array(w,h) 
  return arrayPageSize;
}
function getPageScrollTop(){
  var yScrolltop;
  var xScrollleft;
  if (self.pageYOffset || self.pageXOffset) {
    yScrolltop = self.pageYOffset;
    xScrollleft = self.pageXOffset;
  } else if (document.documentElement && document.documentElement.scrollTop || document.documentElement.scrollLeft ){  // Explorer 6 Strict
    yScrolltop = document.documentElement.scrollTop;
    xScrollleft = document.documentElement.scrollLeft;
  } else if (document.body) {// all other Explorers
    yScrolltop = document.body.scrollTop;
    xScrollleft = document.body.scrollLeft;
  }
  arrayPageScroll = new Array(xScrollleft,yScrolltop) 
  return arrayPageScroll;
}