/*
Created By: Chris Campbell
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;

/*-----------------------------------------------------------------------------------------------*/

//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' && version == '6'){
			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();
	},
	
	// Begin Ajax request based off of the href of the clicked linked
	loadInfo: function() {
		var myAjax = new Ajax.Request(
        this.content,
        {method: 'get', parameters: "", onComplete: this.processInfo.bindAsEventListener(this)}
		);
		$('overlay').style.MozOpacity = 0;
		$('overlay').style.filter = "alpha(opacity=0)";
		$('overlay').style.opacity = 0;
		$('lightbox').style.MozOpacity = 0;
		$('lightbox').style.filter = "alpha(opacity=0)";
		$('lightbox').style.opacity = 0;
		toggle('overlay',300);
		
	},
	
	// Display Ajax response
	processInfo: function(response){
		info = "<div id='lbContent'>" + response.responseText + "</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: 'get', 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' && version == '6'){
			this.setScroll(0,this.yPos);
			this.prepareIE("auto", "auto");
			this.hideSelects("visible");
		}
		
		this.displayLightbox("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]);
	}
}

// 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">' +
						  '<p></p>' +
						  '</div>';
	bod.appendChild(overlay);
	bod.appendChild(lb);
}
	/* toggle() checks to see if the images has already been faded
	   or not and sends the appropriate variables to opacity(); */
	function toggle(el,milli) {
		// Get the opacity style parameter from the image
		var currOpacity = document.getElementById(el).style.opacity;
		if(currOpacity != 0) { // if not faded
			fade(el, milli, 80, 0);
		} else { // else the images is already faded
			fade(el, milli, 0, 80);
		}
	} 
	
	/* changeOpacity() uses three different opacity settings to
	   achieve a cross-browser opacity changing function.  This
	   function can also be used to directly change the opacity
	   of an element. */
	function changeOpacity(el,opacity) {
		var image = document.getElementById(el);
		// For Mozilla
		image.style.MozOpacity = (opacity / 100);
		// For IE
		image.style.filter = "alpha(opacity=" + opacity + ")";
		// For others
		image.style.opacity = (opacity / 100);
		if(opacity == 80){
			toggle2('lightbox',250);
		}
	}
	
	/* fade() will fade the image in or out based on the starting
	   and ending opacity settings.  The speed of the fade is 
	   determined by the variable milli (total time of the fade
	   in milliseconds)*/
	function fade(el,milli,start,end) {
		var fadeTime = Math.round(milli/100);
		
		var i = 0;  // Fade Timer
		// Fade in
		if(start < end) {
			for(j = start; j <= end; j++) {
				// define the expression to be called in setTimeout()
				var expr = "changeOpacity('" + el + "'," + j + ")";
				var timeout = i * fadeTime;
				// setTimeout will call 'expr' after 'timeout' milliseconds
				setTimeout(expr,timeout);
				i++;
			}
		}
		// Fade out
		else if(start > end) {
			for(j = start; j >= end; j--) {
				var expr = "changeOpacity('" + el + "'," + j + ")";
				var timeout = i * fadeTime;
				setTimeout(expr,timeout);
				i++;
			}
		}
	} 
	/* toggle() checks to see if the images has already been faded
	   or not and sends the appropriate variables to opacity(); */
	function toggle2(el,milli) {
		// Get the opacity style parameter from the image
		var currOpacity = document.getElementById(el).style.opacity;
		if(currOpacity != 0) { // if not faded
			fade2(el, milli, 100, 0);
		} else { // else the images is already faded
			fade2(el, milli, 0, 100);
		}
	} 
	
	/* changeOpacity() uses three different opacity settings to
	   achieve a cross-browser opacity changing function.  This
	   function can also be used to directly change the opacity
	   of an element. */
	function changeOpacity2(el,opacity) {
		var image = document.getElementById(el);
		// For Mozilla
		image.style.MozOpacity = (opacity / 100);
		// For IE
		image.style.filter = "alpha(opacity=" + opacity + ")";
		// For others
		image.style.opacity = (opacity / 100);
	}
	
	/* fade() will fade the image in or out based on the starting
	   and ending opacity settings.  The speed of the fade is 
	   determined by the variable milli (total time of the fade
	   in milliseconds)*/
	function fade2(el,milli,start,end) {
		var fadeTime = Math.round(milli/100);
		
		var i = 0;  // Fade Timer
		// Fade in
		if(start < end) {
			for(j = start; j <= end; j++) {
				// define the expression to be called in setTimeout()
				var expr = "changeOpacity2('" + el + "'," + j + ")";
				var timeout = i * fadeTime;
				// setTimeout will call 'expr' after 'timeout' milliseconds
				setTimeout(expr,timeout);
				i++;
			}
		}
		// Fade out
		else if(start > end) {
			for(j = start; j >= end; j--) {
				var expr = "changeOpacity2('" + el + "'," + j + ")";
				var timeout = i * fadeTime;
				setTimeout(expr,timeout);
				i++;
			}
		}
	} 