/*
Ported from the lightbox implementation found at http://particletree.com/features/lightbox-gone-wild/
*/

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

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

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

/*  Visibility showing, hiding, and checking the explicit visibility of elements */
/*  From mochikit Example at http://mochikit.com/doc/html/MochiKit/Style.html#element-visibility */
function toggleVisible(elem) {
    toggleElementClass("invisible", elem);
}

function makeVisible(elem) {
    removeElementClass(elem, "invisible");
}

function makeInvisible(elem) {
    addElementClass(elem, "invisible");
}

function isVisible(elem) {
    return (!hasElementClass(elem, "invisible") || getElement(elem).style.display == "none");
}

/* From mochikit trac at http://trac.mochikit.com/wiki/ParsingHtml */
function evalHTML(value) {

        if (typeof(value) != 'string') {
                return null;
        }
        value = MochiKit.Format.strip(value);
        if (value.length == 0) {
                return null;
        }
        var parser = MochiKit.DOM.DIV();
        var html = MochiKit.DOM.currentDocument().createDocumentFragment();

        var child;

        parser.innerHTML = value;
        while ((child = parser.firstChild)) {
                html.appendChild(child)
        }
        return html
}

//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;
};

  function Lightbox()
  {
    bindMethods(this);
  };
  
  Lightbox.prototype = update(new Lightbox(),
  {
    empty : function(e)
    {
      e.stop();
    },
      
    initialize : function(ctrl)
    {
  this.content = getNodeAttribute(ctrl, 'href');
      connect(ctrl, 'onclick', this.activate);
      connect(ctrl, 'onclick', this.empty);
    },
    
    activate : function()
    {
  		if (browser == 'Internet Explorer'){
  			this.getScroll();
  			this.prepareIE('100%', 'hidden');
  			this.setScroll(0,0);
  			this.hideSelects('hidden');
  		}
  		this.displayLightbox();
    },
    
    displayLightbox : function()
    {
      makeVisible('overlay');
  		makeVisible('lightbox');
      if(isVisible('lightbox'))
  		  this.loadInfo();
    },
    
    loadInfo : function()
    {
    	d = doSimpleXMLHttpRequest(this.content);
    	d.addCallback(this.processInfo);
    },
    
    processInfo : function(response)
    {
      makeInvisible('lbLoadMessage');
      this.info = DIV( {'id':'lbContent'}, createDOM(evalHTML(response.responseText)));
      appendChildNodes('lightbox', this.info);
      addElementClass('lightbox', 'done');
      this.actions();
    },
    
    actions : function()
    {
      lbActions = getElementsByTagAndClassName('*', 'lbAction');
      for(i in lbActions)
      {
        connect(lbActions[i], 'onclick', this[lbActions[i].rel]);
        connect(lbActions[i], 'onclick', this.empty);
      }
    },
    
    
    //Workarounds and/or non ported(but working without Prototype) stuff 
  	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); 
  	},

    // 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;
    	}
    },
    
    
    /* Custom Actions */
    deactivate: function()
    {
  		if (browser == "Internet Explorer")
      {
  			this.setScroll(0,this.yPos);
  			this.prepareIE("auto", "auto");
  			this.hideSelects("visible");
  		}
      removeElement(this.info);
      makeInvisible('lightbox');
      makeInvisible('overlay');
    },
    
  	insert: function(e)
    {
      removeElement(this.info);
    	d = doSimpleXMLHttpRequest(e.src());
    	d.addCallback(this.processInfo);
  	}
    
    
  });
  
  

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

// Onload, make all links that need to trigger a lightbox active
function initialize(){
	addLightboxMarkup();
	lbox = getElementsByTagAndClassName('*', 'lbOn');
	for(i in lbox) {
		lightbox1 = new Lightbox()
		lightbox1.initialize(lbox[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() {
  var doc = currentDocument();
  var overlay = DIV( {'id':'overlay', 'class':'invisible'});
  var lb      = DIV( {'id':'lightbox', 'class':'loading invisible'}, null);
  /* Here is the loading message */
  var lbLoading = DIV( {'id':'lbLoadMessage'}, P('Loading'));
  appendChildNodes(lb, lbLoading);
  appendChildNodes(doc.body, overlay);
  appendChildNodes(doc.body, lb);
};

connect(window, 'onload', function()
{ 
  initialize();
  getBrowserInfo();
}); 

