// lightwindow.js v2.0



//



// Copyright (c) 2007 stickmanlabs



// Author: Kevin P Miller | http://www.stickmanlabs.com



// 



// LightWindow is freely distributable under the terms of an MIT-style license.



//



// I don't care what you think about the file size...



//   Be a pro: 



//	    http://www.thinkvitamin.com/features/webapps/serving-javascript-fast



//      http://rakaz.nl/item/make_your_pages_load_faster_by_combining_and_compressing_javascript_and_css_files



//







/*-----------------------------------------------------------------------------------------------*/







if(typeof Effect == 'undefined')



  throw("lightwindow.js requires including script.aculo.us' effects.js library!");







// This will stop image flickering in IE6 when elements with images are moved



try {



	document.execCommand("BackgroundImageCache", false, true);



} catch(e) {}







var lightwindow = Class.create();	



lightwindow.prototype = {



	//



	//	Setup Variables



	//



	element : null,



	contentToFetch : null,



	windowActive : false,



	dataEffects : [],



	dimensions : {



		cruft : null,



		container : null,



		viewport : {



			height : null,



			width : null,



			offsetTop : null,



			offsetLeft : null



		}



	},



	pagePosition : {



		x : 0,



		y : 0



	},



	pageDimensions : {



		width : null,



		height : null



	},



	preloadImage : [],



	preloadedImage : [],



	galleries : [],



	resizeTo : {



		height : null,



		heightPercent : null,



		width : null,



		widthPercent : null,



		fixedTop : null,



		fixedLeft : null



	},



	scrollbarOffset : 18,



	navigationObservers : {



		previous : null,



		next : null



	},



	containerChange : {



		height : 0,



		width : 0



	},



	activeGallery : false,



	galleryLocation : {



		current : 0,



		total : 0



	},



	//



	//	Initialize the lightwindow.



	//



	initialize : function(options) {



		this.options = Object.extend({



			resizeSpeed : 8,



			contentOffset : {



				height : 20,



				width : 20



			},



			dimensions : {



				image : {height : 250, width : 250},



				page : {height : 250, width : 250},



				inline : {height : 250, width : 250},



				media : {height : 250, width : 250},



				external : {height : 250, width : 250},



				titleHeight : 25



			},



			classNames : {	



				standard : 'lightwindow',



				action : 'lightwindow_action'



			},



			fileTypes : {



				page : ['asp', 'aspx', 'cgi', 'cfm', 'htm', 'html', 'pl', 'php4', 'php3', 'php', 'php5', 'phtml', 'rhtml', 'shtml', 'txt', 'vbs', 'rb'],



				media : ['aif', 'aiff', 'asf', 'avi', 'divx', 'm1v', 'm2a', 'm2v', 'm3u', 'mid', 'midi', 'mov', 'moov', 'movie', 'mp2', 'mp3', 'mpa', 'mpa', 'mpe', 'mpeg', 'mpg', 'mpg', 'mpga', 'pps', 'qt', 'rm', 'ram', 'swf', 'viv', 'vivo', 'wav'],



				image : ['bmp', 'gif', 'jpg', 'png', 'tiff']



			},



			mimeTypes : {



				avi : 'video/avi',



				aif : 'audio/aiff',



				aiff : 'audio/aiff',



				gif : 'image/gif',



				bmp : 'image/bmp',



				jpeg : 'image/jpeg',



				m1v : 'video/mpeg',



				m2a : 'audio/mpeg',



				m2v : 'video/mpeg',



				m3u : 'audio/x-mpequrl',



				mid : 'audio/x-midi',



				midi : 'audio/x-midi',



				mjpg : 'video/x-motion-jpeg',



				moov : 'video/quicktime',



				mov : 'video/quicktime',



				movie : 'video/x-sgi-movie',



				mp2 : 'audio/mpeg',



				mp3 : 'audio/mpeg3',



				mpa : 'audio/mpeg',



				mpa : 'video/mpeg',



				mpe : 'video/mpeg',



				mpeg : 'video/mpeg',



				mpg : 'audio/mpeg',



				mpg : 'video/mpeg',



				mpga : 'audio/mpeg',



				pdf : 'application/pdf',



				png : 'image/png',



				pps : 'application/mspowerpoint',



				qt : 'video/quicktime',



				ram : 'audio/x-pn-realaudio-plugin',



				rm : 'application/vnd.rn-realmedia',



				swf	: 'application/x-shockwave-flash',



				tiff : 'image/tiff',



				viv : 'video/vivo',



				vivo : 'video/vivo',



				wav : 'audio/wav',



				wmv : 'application/x-mplayer2'			



			},	



			classids : {



				mov : 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',



				swf : 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',



				wmv : 'clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6'



			},



			codebases : {



				mov : 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',



				swf : 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0',



				wmv : 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715'



			},	



			viewportPadding : 10,



			EOLASFix : 'swf,wmv,fla,flv',



			overlay : {



				opacity : 0.7,



				image : '../assets/scripts/lightwindow/images/black.png',



				presetImage : '../assets/scripts/lightwindow/images/black-70.png'



			},



			skin : 	{



				main : 	'<div id="lightwindow_container" >'+



							'<div id="lightwindow_title_bar" >'+



								'<div id="lightwindow_title_bar_inner" >'+



									'<span id="lightwindow_title_bar_title"></span>'+



									'<a id="lightwindow_title_bar_close_link" >CLOSE X</a>'+



								'</div>'+



							'</div>'+



							'<div id="lightwindow_stage" >'+



								'<div id="lightwindow_contents" >'+



								'</div>'+



								'<div id="lightwindow_navigation" >'+



									'<a href="#" id="lightwindow_previous" >'+



										'<span id="lightwindow_previous_title"></span>'+



									'</a>'+



									'<a href="#" id="lightwindow_next" >'+



										'<span id="lightwindow_next_title"></span>'+



									'</a>'+



									'<iframe name="lightwindow_navigation_shim" id="lightwindow_navigation_shim" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>'+



								'</div>'+								



								'<div id="lightwindow_galleries">'+



									'<div id="lightwindow_galleries_tab_container" >'+



										'<a href="#" id="lightwindow_galleries_tab" >'+



											'<span id="lightwindow_galleries_tab_span" class="up" >Galleries</span>'+



										'</a>'+



									'</div>'+



									'<div id="lightwindow_galleries_list" >'+



									'</div>'+



								'</div>'+



							'</div>'+



							'<div id="lightwindow_data_slide" >'+



								'<div id="lightwindow_data_slide_inner" >'+



									'<div id="lightwindow_data_details" >'+



										'<div id="lightwindow_data_gallery_container" >'+



											'<span id="lightwindow_data_gallery_current"></span>'+



											' of '+



											'<span id="lightwindow_data_gallery_total"></span>'+



										'</div>'+



										'<div id="lightwindow_data_author_container" >'+



											'by <span id="lightwindow_data_author"></span>'+



										'</div>'+



									'</div>'+



									'<div id="lightwindow_data_caption" >'+



									'</div>'+



								'</div>'+



							'</div>'+



						'</div>',	



				loading : 	'<div id="lightwindow_loading" >'+



								'<img src="../assets/scripts/lightwindow/images/ajax-loading.gif" alt="loading" />'+



								'<span>Loading or <a href="javascript: myLightWindow.deactivate();">Cancel</a></span>'+



								'<iframe name="lightwindow_loading_shim" id="lightwindow_loading_shim" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>'+



							'</div>',



				iframe : 	'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+



							'<html xmlns="http://www.w3.org/1999/xhtml">'+



								'<body>'+



									'{body_replace}'+



								'</body>'+



							'</html>',



				gallery : {



					top :		'<div class="lightwindow_galleries_list">'+



									'<h1>{gallery_title_replace}</h1>'+



									'<ul>',



					middle : 			'<li>'+



											'{gallery_link_replace}'+



										'</li>',



					bottom : 		'</ul>'+



								'</div>'



				}



			},



			formMethod : 'get',



			hideFlash : false,



			hideGalleryTab : false,



			showTitleBar : true,



			animationHandler : false,



			navigationHandler : false,



			transitionHandler : false,



			finalAnimationHandler : false,



			formHandler : false,



			galleryAnimationHandler : false,



			showGalleryCount : true



		}, options || {});



		this.duration = ((11-this.options.resizeSpeed)*0.15);



		this._setupLinks();



		this._getScroll();



		this._getPageDimensions();



		this._browserDimensions();



		this._addLightWindowMarkup(false);



		this._setupDimensions(); 



		this.buildGalleryList();



	},



	//



	//	Activate the lightwindow.



	//



	activate : function(e, link){		



		// Clear out the window Contents



		this._clearWindowContents(true);



			



		// Add back in out loading panel



		this._addLoadingWindowMarkup();







		// Setup the element properties



		this._setupWindowElements(link);



		



		// Setup everything



		this._getScroll();



		this._browserDimensions();



		this._setupDimensions();



		this._toggleTroubleElements('hidden', false);



		this._displayLightWindow('block', 'hidden');



		this._setStatus(true);



		this._monitorKeyboard(true);



		this._prepareIE(true);



		this._loadWindow();



	},



	//



	//	Turn off the window



	//



	deactivate : function(){



		// The window is not active



		this.windowActive = false;



		



		// There is no longer a gallery active



		this.activeGallery = false;



		if (!this.options.hideGalleryTab) {



			this._handleGalleryAnimation(false);



		}



		



		// Kill the animation



		this.animating = false;



		



		// Clear our element



		this.element = null;



		



		// hide the window.



		this._displayLightWindow('none', 'visible');



		



		// Clear out the window Contents



		this._clearWindowContents(false);



		



		// Stop all animation



		var queue = Effect.Queues.get('lightwindowAnimation').each(function(e){e.cancel();});



		



		// Undo the setup



		this._prepareIE(false);



		this._setupDimensions();



		this._toggleTroubleElements('visible', false);	



		this._monitorKeyboard(false);	



	},



	//



	//  Initialize specific window



	//



	createWindow : function(element, attributes) {



		this._processLink($(element));



	},



	//



	//  Open a Window from a hash of attributes



	//



	activateWindow : function(options) {



		this.element = Object.extend({



			href : null,



			title : null,



			author : null,



			caption : null,



			rel : null,



			top : null,



			left : null,



			type : null,



			showImages : null,



			height : null,



			width : null,



			loadingAnimation : null,



			iframeEmbed : null,



			form : null



		}, options || {});



		



		// Set the window type



		this.contentToFetch = this.element.href;



		this.windowType = this.element.type ? this.element.type : this._fileType(this.element.href);	



		



		// Clear out the window Contents



		this._clearWindowContents(true);



			



		// Add back in out loading panel



		this._addLoadingWindowMarkup();



		



		// Setup everything



		this._getScroll();



		this._browserDimensions();



		this._setupDimensions();



		this._toggleTroubleElements('hidden', false);



		this._displayLightWindow('block', 'hidden');



		this._setStatus(true);



		this._monitorKeyboard(true);



		this._prepareIE(true);



		this._loadWindow();



	},



	//



	//  Fire off our Form handler



	//



	submitForm : function(e) {



		if (this.options.formHandler) {



			this.options.formHandler(e);



		} else {



			this._defaultFormHandler(e);



		}



	},



	//



	//	Reload the window with another location



	//



	openWindow : function(element) {



		var element = $(element);







		// The window is active



		this.windowActive = true;



		



		// Clear out the window Contents



		this._clearWindowContents(true);



		



		// Add back in out loading panel



		this._addLoadingWindowMarkup();



		



		// Setup the element properties



		this._setupWindowElements(element);







		this._setStatus(true);



		this._handleTransition();



	},



	//



	//  Navigate the window



	//



	navigateWindow : function(direction) {



		this._handleNavigation(false);



		if (direction == 'previous') {



			this.openWindow(this.navigationObservers.previous);



		} else if (direction == 'next'){ 



			this.openWindow(this.navigationObservers.next);



		}



	},



	//



	//  Build the Gallery List and Load it



	//



	buildGalleryList : function() {



		var output = '';



		var galleryLink;



		for (i in this.galleries) {



			if (typeof this.galleries[i] == 'object') {



				output += (this.options.skin.gallery.top).replace('{gallery_title_replace}', unescape(i));



				for (j in this.galleries[i]) {



					if (typeof this.galleries[i][j] == 'object') {						



						galleryLink = '<a href="#" id="lightwindow_gallery_'+i+'_'+j+'" >'+unescape(j)+'</a>';



						output += (this.options.skin.gallery.middle).replace('{gallery_link_replace}', galleryLink);



					}



				}



				output += this.options.skin.gallery.bottom;



			}



		}



		new Insertion.Top('lightwindow_galleries_list', output);



		



		// Attach Events



		for (i in this.galleries) {



			if (typeof this.galleries[i] == 'object') {



				for (j in this.galleries[i]) {



					if (typeof this.galleries[i][j] == 'object') {



						Event.observe($('lightwindow_gallery_'+i+'_'+j), 'click', this.openWindow.bind(this, this.galleries[i][j][0]), false);



						$('lightwindow_gallery_'+i+'_'+j).onclick = function() {return false;};	



					}



				}



			}



		}



	},



	// 



	//  Set Links Up



	//



	_setupLinks : function() {



		var links = $$('.'+this.options.classNames.standard);



		links.each(function(link) {



			this._processLink(link);



		}.bind(this));	



	},



	//



	//  Process a Link



	//



	_processLink : function(link) {



		if ((this._fileType(link.getAttribute('href')) == 'image' || this._fileType(link.getAttribute('href')) == 'media')) {



			if (gallery = this._getGalleryInfo(link.rel)) {



				if (!this.galleries[gallery[0]]) {



					this.galleries[gallery[0]] = new Array();



				}



				if (!this.galleries[gallery[0]][gallery[1]]) {



					this.galleries[gallery[0]][gallery[1]] = new Array();



				}



				this.galleries[gallery[0]][gallery[1]].push(link);



			}



		}



		



		// Take care of our inline content



		var url = link.getAttribute('href');



		if (url.indexOf('?') > -1) {



			url = url.substring(0, url.indexOf('?'));



		}



		



		var container = url.substring(url.indexOf('#')+1);



		if($(container)) {



			$(container).setStyle({



				display : 'none'



			});



		}



		



		Event.observe(link, 'click', this.activate.bindAsEventListener(this, link), false);



		link.onclick = function() {return false;};		



	},



	//



	//	Setup our actions



	//



	_setupActions : function() {



		var links = $$('#lightwindow_container .'+this.options.classNames.action);



		links.each(function(link) {



			Event.observe(link, 'click', this[link.getAttribute('rel')].bindAsEventListener(this, link), false);



			link.onclick = function() {return false;};



		}.bind(this));



	},



	//



	//	Add the markup to the page.



	//



	_addLightWindowMarkup : function(rebuild) {



		var overlay = Element.extend(document.createElement('div'));



		overlay.setAttribute('id', 'lightwindow_overlay');		



		// FF Mac has a problem with putting Flash above a layer without a 100% opacity background, so we need to use a pre-made



		if (Prototype.Browser.Gecko) {



			overlay.setStyle({



				backgroundImage: 'url('+this.options.overlay.presetImage+')',



				backgroundRepeat: 'repeat',



				height: this.pageDimensions.height+'px'



			});			



		} else {



			overlay.setStyle({



				opacity: this.options.overlay.opacity,



				backgroundImage: 'url('+this.options.overlay.image+')',



				backgroundRepeat: 'repeat',



				height: this.pageDimensions.height+'px'



			});



		}



		



		var lw = document.createElement('div');



		lw.setAttribute('id', 'lightwindow');



		lw.innerHTML = this.options.skin.main;



		



		var body = document.getElementsByTagName('body')[0];



		body.appendChild(overlay);



		body.appendChild(lw);	



				



		if ($('lightwindow_title_bar_close_link')) {



			Event.observe('lightwindow_title_bar_close_link', 'click', this.deactivate.bindAsEventListener(this));



			$('lightwindow_title_bar_close_link').onclick = function() {return false;};



		}



			



		Event.observe($('lightwindow_previous'), 'click', this.navigateWindow.bind(this, 'previous'), false);



		$('lightwindow_previous').onclick = function() {return false;};		



		Event.observe($('lightwindow_next'), 'click', this.navigateWindow.bind(this, 'next'), false);



		$('lightwindow_next').onclick = function() {return false;};







		if (!this.options.hideGalleryTab) {



			Event.observe($('lightwindow_galleries_tab'), 'click', this._handleGalleryAnimation.bind(this, true), false);



			$('lightwindow_galleries_tab').onclick = function() {return false;};



		}



		



		// Because we use position absolute, kill the scroll Wheel on animations



		if (Prototype.Browser.IE) {



			Event.observe(document, 'mousewheel', this._stopScrolling.bindAsEventListener(this), false);



		} else {



			Event.observe(window, 'DOMMouseScroll', this._stopScrolling.bindAsEventListener(this), false);



		}



				



		Event.observe(overlay, 'click', this.deactivate.bindAsEventListener(this), false);



		overlay.onclick = function() {return false;};



	},



	//



	//  Add loading window markup



	//



	_addLoadingWindowMarkup : function() {



		$('lightwindow_contents').innerHTML += this.options.skin.loading;



	},



	//



	//  Setup the window elements



	//



	_setupWindowElements : function(link) {



		this.element = link;



		this.element.title = null ? '' : link.getAttribute('title');



		this.element.author = null ? '' : link.getAttribute('author');



		this.element.caption = null ? '' : link.getAttribute('caption');



		this.element.rel = null ? '' : link.getAttribute('rel');



		this.element.params = null ? '' : link.getAttribute('params');







		// Set the window type



		this.contentToFetch = this.element.href;



		this.windowType = this._getParameter('lightwindow_type') ? this._getParameter('lightwindow_type') : this._fileType(this.contentToFetch);	



	},



	//



	//  Clear the window contents out



	//



	_clearWindowContents : function(contents) {



		// If there is an iframe, its got to go



		if ($('lightwindow_iframe')) {



			Element.remove($('lightwindow_iframe'));



		}







		// Stop playing an object if its still around



		if ($('lightwindow_media_primary')) {



			try {



				$('lightwindow_media_primary').Stop();



			} catch(e) {}



			Element.remove($('lightwindow_media_primary'));



		}







		// Stop playing an object if its still around		



		if ($('lightwindow_media_secondary')) {



			try {



				$('lightwindow_media_secondary').Stop();



			} catch(e) {}



			Element.remove($('lightwindow_media_secondary'));



		}



		



		this.activeGallery = false;



		this._handleNavigation(this.activeGallery);



		



		if (contents) {



			// Empty the contents



			$('lightwindow_contents').innerHTML = '';



			



			// Reset the scroll bars



			$('lightwindow_contents').setStyle({



				overflow: 'hidden'



			});		



			



			if (!this.windowActive) {



				$('lightwindow_data_slide_inner').setStyle({



					display: 'none'



				});







				$('lightwindow_title_bar_title').innerHTML = '';



			}







			// Because of browser differences and to maintain flexible captions we need to reset this height at close



			$('lightwindow_data_slide').setStyle({



				height: 'auto'



			});



		}



		



		this.resizeTo.height = null;



		this.resizeTo.width = null;



	},



	//



	//	Set the status of our animation to keep things from getting clunky



	//



	_setStatus : function(status) {



		this.animating = status;



		if (status) {



			Element.show('lightwindow_loading');



		}



		if (!(/MSIE 6./i.test(navigator.userAgent))) {



			this._fixedWindow(status);



		}



	},



	//



	//  Make this window Fixed



	//



	_fixedWindow : function(status) {



		if (status) {



			if (this.windowActive) {



				this._getScroll();



				$('lightwindow').setStyle({



					position: 'absolute',



					top: parseFloat($('lightwindow').getStyle('top'))+this.pagePosition.y+'px',



					left: parseFloat($('lightwindow').getStyle('left'))+this.pagePosition.x+'px'



				});		



			} else {



				$('lightwindow').setStyle({



					position: 'absolute'



				});						



			}



		} else {



			if (this.windowActive) {



				this._getScroll();



				$('lightwindow').setStyle({



					position: 'fixed',



					top: parseFloat($('lightwindow').getStyle('top'))-this.pagePosition.y+'px',



					left: parseFloat($('lightwindow').getStyle('left'))-this.pagePosition.x+'px'



				});		



			} else {



				if ($('lightwindow_iframe')) {



					// Ideally here we would set a 50% value for top and left, but Safari rears it ugly head again and we need to do it by pixels



					this._browserDimensions();



				}



				$('lightwindow').setStyle({



					position: 'fixed',



					top: (parseFloat(this._getParameter('lightwindow_top')) ? parseFloat(this._getParameter('lightwindow_top'))+'px' : this.dimensions.viewport.height/2+'px'),



					left: (parseFloat(this._getParameter('lightwindow_left')) ? parseFloat(this._getParameter('lightwindow_left'))+'px' : this.dimensions.viewport.width/2+'px')



				});



			}



		}



	},



	//



	//	Prepare the window for IE.



	//



	_prepareIE : function(setup) {



		if (Prototype.Browser.IE) {



			var height, overflowX, overflowY;



			if (setup) { 



				var height = '100%';



			} else {



				var height = 'auto';



			}



			var body = document.getElementsByTagName('body')[0];



			var html = document.getElementsByTagName('html')[0];



			html.style.height = body.style.height = height;



		}



	},



	_stopScrolling : function(e) {



		if (this.animating) {



			if (e.preventDefault) {



				e.preventDefault();



			}



			e.returnValue = false;		



		}



	},



	//



	//	Get the scroll for the page.



	//



	_getScroll : function(){



      	if(typeof(window.pageYOffset) == 'number') {



        	this.pagePosition.x = window.pageXOffset;



        	this.pagePosition.y = window.pageYOffset;



      	} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {



	       	this.pagePosition.x = document.body.scrollLeft;



        	this.pagePosition.y = document.body.scrollTop;



		} else if(document.documentElement) {



        	this.pagePosition.x = document.documentElement.scrollLeft;



        	this.pagePosition.y = document.documentElement.scrollTop;



      	}



	},



	//



	//	Reset the scroll.



	//



	_setScroll : function(x, y) {



		document.documentElement.scrollLeft = x; 



		document.documentElement.scrollTop = y; 



	},



	//



	//	Hide Selects from the page because of IE.



	//     We could use iframe shims instead here but why add all the extra markup for one browser when this is much easier and cleaner



	//



	_toggleTroubleElements : function(visibility, content){



		



		if (content) {



			var selects = $('lightwindow_contents').getElementsByTagName('select');



		} else {



			var selects = document.getElementsByTagName('select');



		}



		



		for(var i = 0; i < selects.length; i++) {



			selects[i].style.visibility = visibility;



		}



		



		if (!content) {



			if (this.options.hideFlash){



				var objects = document.getElementsByTagName('object');



				for (i = 0; i != objects.length; i++) {



					objects[i].style.visibility = visibility;



				}



				var embeds = document.getElementsByTagName('embed');



				for (i = 0; i != embeds.length; i++) {



					embeds[i].style.visibility = visibility;



				}



			}



			var iframes = document.getElementsByTagName('iframe');



			for (i = 0; i != iframes.length; i++) {



				iframes[i].style.visibility = visibility;



			}



		}



	},



	// 



	//  Get the actual page size



	//



	_getPageDimensions : function() {



		var xScroll, yScroll;



		if (window.innerHeight && window.scrollMaxY) {	



			xScroll = document.body.scrollWidth;



			yScroll = window.innerHeight + window.scrollMaxY;



		} else if (document.body.scrollHeight > document.body.offsetHeight){ 



			xScroll = document.body.scrollWidth;



			yScroll = document.body.scrollHeight;



		} else { 



			xScroll = document.body.offsetWidth;



			yScroll = document.body.offsetHeight;



		}







		var windowWidth, windowHeight;



		if (self.innerHeight) {	



			windowWidth = self.innerWidth;



			windowHeight = self.innerHeight;



		} else if (document.documentElement && document.documentElement.clientHeight) { 



			windowWidth = document.documentElement.clientWidth;



			windowHeight = document.documentElement.clientHeight;



		} else if (document.body) { 



			windowWidth = document.body.clientWidth;



			windowHeight = document.body.clientHeight;



		}	







		if(yScroll < windowHeight){



			this.pageDimensions.height = windowHeight;



		} else { 



			this.pageDimensions.height = yScroll;



		}







		if(xScroll < windowWidth){	



			this.pageDimensions.width = windowWidth;



		} else {



			this.pageDimensions.width = xScroll;



		}



	},



	//



	//	Display the lightWindow.



	//



	_displayLightWindow : function(display, visibility) {



		$('lightwindow_overlay').style.display = $('lightwindow').style.display = $('lightwindow_container').style.display = display;	



		$('lightwindow_overlay').style.visibility = $('lightwindow').style.visibility = $('lightwindow_container').style.visibility = visibility;



	},



	//



	//	Setup Dimensions of lightwindow.







	//



	_setupDimensions : function() {







		var originalHeight, originalWidth;



		switch (this.windowType) {



			case 'page' :



				originalHeight = this.options.dimensions.page.height;



				originalWidth = this.options.dimensions.page.width;



				break;







			case 'image' :



				originalHeight = this.options.dimensions.image.height;



				originalWidth = this.options.dimensions.image.width;



				break;



				



			case 'media' :



				originalHeight = this.options.dimensions.media.height;



				originalWidth = this.options.dimensions.media.width;



				break;



			



			case 'external' : 



				originalHeight = this.options.dimensions.external.height;



				originalWidth = this.options.dimensions.external.width;



				break;



				



			case 'inline' :



				originalHeight = this.options.dimensions.inline.height;



				originalWidth = this.options.dimensions.inline.width;



				break;



				



			default :



				originalHeight = this.options.dimensions.page.height;



				originalWidth = this.options.dimensions.page.width;



				break;



				



		}







		var offsetHeight = this._getParameter('lightwindow_top') ? parseFloat(this._getParameter('lightwindow_top'))+this.pagePosition.y : this.dimensions.viewport.height/2+this.pagePosition.y;



		var offsetWidth = this._getParameter('lightwindow_left') ? parseFloat(this._getParameter('lightwindow_left'))+this.pagePosition.x : this.dimensions.viewport.width/2+this.pagePosition.x;



		



		// So if a theme has say shadowed edges, they should be consistant and take care of in the contentOffset



		$('lightwindow').setStyle({



			top: offsetHeight+'px',



			left: offsetWidth+'px'



		});



		



		$('lightwindow_container').setStyle({



			height: originalHeight+'px',



			width: originalWidth+'px',



			left: -(originalWidth/2)+'px',



			top: -(originalHeight/2)+'px'



		});







		$('lightwindow_contents').setStyle({



			height: originalHeight+'px',



			width: originalWidth+'px'



		});



	},



	//



	//	Get the type of file.



	//



	_fileType : function(url) {



		var image = new RegExp("[^\.]\.("+this.options.fileTypes.image.join('|')+")\s*$", "i");



		if (image.test(url)) return 'image';



		if (url.indexOf('#') > -1 && (document.domain == this._getDomain(url))) return 'inline';		



		if (url.indexOf('?') > -1) url = url.substring(0, url.indexOf('?'));



		var type = 'unknown';



		var page = new RegExp("[^\.]\.("+this.options.fileTypes.page.join('|')+")\s*$", "i");



		var media = new RegExp("[^\.]\.("+this.options.fileTypes.media.join('|')+")\s*$", "i");



		if (document.domain != this._getDomain(url)) type = 'external';



	  	if (media.test(url)) type = 'media';



		if (type == 'external' || type == 'media') return type;



	  	if (page.test(url) || url.substr((url.length-1), url.length) == '/') type = 'page';



		return type;



	},



	//



	//  Get file Extension



	//



	_fileExtension : function(url) {



		if (url.indexOf('?') > -1) {



			url = url.substring(0, url.indexOf('?'));



		}



		var extenstion = '';



		for (var x = (url.length-1); x > -1; x--) {



			if (url.charAt(x) == '.') {



				return extenstion;



			}



			extenstion = url.charAt(x)+extenstion;



		}



	},



	//



	//	Monitor the keyboard while this lightwindow is up



	//



	_monitorKeyboard : function(status) {



		if (status) document.onkeydown = this._eventKeypress.bind(this); 



		else document.onkeydown = '';



	},



	//



	//  Perform keyboard actions



	//



	_eventKeypress : function(e) {



		if (e == null) {



			var keycode = event.keyCode;



		} else {



			var keycode = e.which;



		}



		



		switch (keycode) { 



			case 27: 



				this.deactivate(); 



				break;



			



			case 13:



				return;



				



			default:



				break;



		}



	



		// Gotta stop those quick fingers



		if (this.animating) {



			return false;



		}



		



		switch (String.fromCharCode(keycode).toLowerCase()) {



			case 'p':



				if (this.navigationObservers.previous) {



					this.navigateWindow('previous');



				}



				break;



				



			case 'n':



				if (this.navigationObservers.next) {



					this.navigateWindow('next');



				}



				break;



				



			default:



				break;



		}



	},



	//



	//	Get Gallery Information



	//



	_getGalleryInfo : function(rel) {



		if (!rel) return false;



		if (rel.indexOf('[') > -1) {



			return new Array(escape(rel.substring(0, rel.indexOf('['))), escape(rel.substring(rel.indexOf('[')+1, rel.indexOf(']'))));



		} else {



			return false;



		}



	},



	//



	//	Get the domain from a string.



	//



	_getDomain : function(url) {    



        var leadSlashes = url.indexOf('//');



        var domainStart = leadSlashes+2;



        var withoutResource = url.substring(domainStart, url.length);



        var nextSlash = withoutResource.indexOf('/');



        var domain = withoutResource.substring(0, nextSlash);



		if (domain.indexOf(':') > -1){



			var portColon = domain.indexOf(':');



			domain = domain.substring(0, portColon);



       	}



		return domain;



    },



	//



	//	Get the value from the params attribute string.



	//



	_getParameter : function(parameter, parameters) {



		if (!this.element) return false;



		if (parameter == 'lightwindow_top' && this.element.top) {



			return unescape(this.element.top);



		} else if (parameter == 'lightwindow_left' && this.element.left) {



			return unescape(this.element.left);



		} else if (parameter == 'lightwindow_type' && this.element.type) {



			return unescape(this.element.type);



		} else if (parameter == 'lightwindow_show_images' && this.element.showImages) {



			return unescape(this.element.showImages);



		} else if (parameter == 'lightwindow_height' && this.element.height) {



			return unescape(this.element.height);



		} else if (parameter == 'lightwindow_width' && this.element.width) {



			return unescape(this.element.width);



		} else if (parameter == 'lightwindow_loading_animation' && this.element.loadingAnimation) {



			return unescape(this.element.loadingAnimation);



		} else if (parameter == 'lightwindow_iframe_embed' && this.element.iframeEmbed) {



			return unescape(this.element.iframeEmbed);



		} else if (parameter == 'lightwindow_form' && this.element.form) {



			return unescape(this.element.form);



		} else {



			if (!parameters) {



				if (this.element.params) parameters = this.element.params;



				else return;



			}



			var value;



			var parameterArray = parameters.split(',');



			var compareString = parameter+'=';



			var compareLength = compareString.length;



			for (var i = 0; i < parameterArray.length; i++) {



				if (parameterArray[i].substr(0, compareLength) == compareString) {



					var currentParameter = parameterArray[i].split('=');



					value = currentParameter[1];



					break;



				}



			}



			if (!value) return false;



			else return unescape(value);



		}



	},



	//



	//  Get the Browser Viewport Dimensions



	//



	_browserDimensions : function() {



		if (Prototype.Browser.IE) {



            this.dimensions.viewport.height = document.documentElement.clientHeight;



            this.dimensions.viewport.width = document.documentElement.clientWidth;   



        } else {



            this.dimensions.viewport.height = window.innerHeight;



            this.dimensions.viewport.width = document.width || document.body.offsetWidth;



        }



	},



	//



	//  Get the scrollbar offset, I don't like this method but there is really no other way I can find.



	//



	_getScrollerWidth : function() {



	    var scrollDiv = Element.extend(document.createElement('div'));



		scrollDiv.setAttribute('id', 'lightwindow_scroll_div');



		scrollDiv.setStyle({



			position: 'absolute',



			top: '-10000px',



			left: '-10000px',



			width: '100px',



			height: '100px',



			overflow: 'hidden'



		});















	    var contentDiv = Element.extend(document.createElement('div'));



		contentDiv.setAttribute('id', 'lightwindow_content_scroll_div');



		contentDiv.setStyle({



			width: '100%',



			height: '200px'



		});







	    scrollDiv.appendChild(contentDiv);







		var body = document.getElementsByTagName('body')[0];



		body.appendChild(scrollDiv);







	    var noScroll = $('lightwindow_content_scroll_div').offsetWidth;



	    scrollDiv.style.overflow = 'auto';



    	var withScroll = $('lightwindow_content_scroll_div').offsetWidth;







	   	Element.remove($('lightwindow_scroll_div'));







	    this.scrollbarOffset = noScroll-withScroll;



	},



	







	//



	//  Add a param to an object dynamically created



	//



	_addParamToObject : function(name, value, object, id) {



		var param = document.createElement('param');



		param.setAttribute('value', value);



		param.setAttribute('name', name);



		if (id) {



			param.setAttribute('id', id);



		}



		object.appendChild(param);



		return object;



	},



	//



	//  Get the outer HTML of an object CROSS BROWSER



	//



	_outerHTML : function(object) {



 		if (Prototype.Browser.IE) {



			return object.outerHTML;



		} else {



			var clone = object.cloneNode(true);



			var cloneDiv = document.createElement('div');



			cloneDiv.appendChild(clone);



			return cloneDiv.innerHTML;



		}



	},



	//



	//  Convert an object to markup



	//



	_convertToMarkup : function(object, closeTag) {



		var markup = this._outerHTML(object).replace('</'+closeTag+'>', '');



		if (Prototype.Browser.IE) {



			for (var i = 0; i < object.childNodes.length; i++){



				markup += this._outerHTML(object.childNodes[i]);



			}



			markup += '</'+closeTag+'>';



		}



		return markup;



	},



	//



	//  Depending what type of browser it is we have to append the object differently... DAMN YOU IE!!



	//



	_appendObject : function(object, closeTag, appendTo) {



		if (Prototype.Browser.IE) {



			appendTo.innerHTML += this._convertToMarkup(object, closeTag);



			



			// Fix the Eolas activate thing but only for specified media, for example doing this to a quicktime film breaks it.



			if (this.options.EOLASFix.indexOf(this._fileType(this.element.href)) > -1) {



				var objectElements = document.getElementsByTagName('object');



				for (var i = 0; i < objectElements.length; i++) {



					if (objectElements[i].getAttribute("data")) objectElements[i].removeAttribute('data');



					objectElements[i].outerHTML = objectElements[i].outerHTML;



					objectElements[i].style.visibility = "visible";



				}



			}



		} else {



			appendTo.appendChild(object);	



		}	



	},



	//



	//  Add in iframe



	//



	_appendIframe : function(scroll) {



		var iframe = document.createElement('iframe');



		iframe.setAttribute('id', 'lightwindow_iframe');



		iframe.setAttribute('name', 'lightwindow_iframe');



		iframe.setAttribute('src', 'about:blank');



		iframe.setAttribute('height', '100%');



		iframe.setAttribute('width', '100%');



		iframe.setAttribute('frameborder', '0');



		iframe.setAttribute('marginwidth', '0');



		iframe.setAttribute('marginheight', '0');



		iframe.setAttribute('scrolling', scroll);	



		



		this._appendObject(iframe, 'iframe', $('lightwindow_contents'));



	},



	//



	//  Write Content to the iframe using the skin



	//



	_writeToIframe : function(content) {



		var template = this.options.skin.iframe;



		template = template.replace('{body_replace}', content); 



		if ($('lightwindow_iframe').contentWindow){



			$('lightwindow_iframe').contentWindow.document.open();



			$('lightwindow_iframe').contentWindow.document.write(template);



			$('lightwindow_iframe').contentWindow.document.close();



		} else {



			$('lightwindow_iframe').contentDocument.open();



			$('lightwindow_iframe').contentDocument.write(template);



			$('lightwindow_iframe').contentDocument.close();



		}



	},



	//



	//  Load the window Information



	//  



	_loadWindow : function() {



		switch (this.windowType) {



			case 'image' :







				var current = 0;



				var images = [];



				this.checkImage = [];



				this.resizeTo.height = this.resizeTo.width = 0;



				this.imageCount = this._getParameter('lightwindow_show_images') ? parseInt(this._getParameter('lightwindow_show_images')) : 1;







				// If there is a gallery get it



				if (gallery = this._getGalleryInfo(this.element.rel)) {	



					for (current = 0; current < this.galleries[gallery[0]][gallery[1]].length; current++) {



						if (this.contentToFetch.indexOf(this.galleries[gallery[0]][gallery[1]][current].href) > -1) {



							break;



						}



					}



					if (this.galleries[gallery[0]][gallery[1]][current-this.imageCount]) {



						this.navigationObservers.previous = this.galleries[gallery[0]][gallery[1]][current-this.imageCount];



					} else {



						this.navigationObservers.previous = false;



					}



					if (this.galleries[gallery[0]][gallery[1]][current+this.imageCount]) {



						this.navigationObservers.next = this.galleries[gallery[0]][gallery[1]][current+this.imageCount];



					} else {



						this.navigationObservers.next = false;



					}



					



					this.activeGallery = true;



				} else {



					this.navigationObservers.previous = false;



					this.navigationObservers.next = false;					







					this.activeGallery = false;



				}



				



				for (var i = current; i < (current+this.imageCount); i++) {



		



					if (gallery && this.galleries[gallery[0]][gallery[1]][i]) {



						this.contentToFetch = this.galleries[gallery[0]][gallery[1]][i].href;



						



						this.galleryLocation = {current: (i+1)/this.imageCount, total: (this.galleries[gallery[0]][gallery[1]].length)/this.imageCount};



											



						if (!this.galleries[gallery[0]][gallery[1]][i+this.imageCount]) {



							$('lightwindow_next').setStyle({



								display: 'none'



							});



						} else {



							$('lightwindow_next').setStyle({



								display: 'block'



							});



							$('lightwindow_next_title').innerHTML = this.galleries[gallery[0]][gallery[1]][i+this.imageCount].title;



						}



						



						if (!this.galleries[gallery[0]][gallery[1]][i-this.imageCount]) {



							$('lightwindow_previous').setStyle({



								display: 'none'



							});



						} else {



							$('lightwindow_previous').setStyle({



								display: 'block'



							});



							$('lightwindow_previous_title').innerHTML = this.galleries[gallery[0]][gallery[1]][i-this.imageCount].title;



						}



					}







					images[i] = document.createElement('img');



					images[i].setAttribute('id', 'lightwindow_image_'+i);



					images[i].setAttribute('border', '0');



					images[i].setAttribute('src', this.contentToFetch);



					$('lightwindow_contents').appendChild(images[i]);







					// We have to do this instead of .onload 



					this.checkImage[i] = new PeriodicalExecuter(function(i) {



						if (!(typeof $('lightwindow_image_'+i).naturalWidth != "undefined" && $('lightwindow_image_'+i).naturalWidth == 0)) {



	



							this.checkImage[i].stop();



	



							var imageHeight = $('lightwindow_image_'+i).getHeight();



							if (imageHeight > this.resizeTo.height) {



								this.resizeTo.height = imageHeight;



							}



							this.resizeTo.width += $('lightwindow_image_'+i).getWidth();



							this.imageCount--;



	



							$('lightwindow_image_'+i).setStyle({



								height: '100%'



							});



	



						 	if (this.imageCount == 0) {



								this._processWindow();



						 	}



						}



					



					}.bind(this, i), 1);			



				}











			break;



		



		case 'media' :			



		



			var current = 0;



			this.resizeTo.height = this.resizeTo.width = 0;







			// If there is a gallery get it



			if (gallery = this._getGalleryInfo(this.element.rel)) {	



				for (current = 0; current < this.galleries[gallery[0]][gallery[1]].length; current++) {



					if (this.contentToFetch.indexOf(this.galleries[gallery[0]][gallery[1]][current].href) > -1) {



						break;



					}



				}



				



				if (this.galleries[gallery[0]][gallery[1]][current-1]) {



					this.navigationObservers.previous = this.galleries[gallery[0]][gallery[1]][current-1];



				} else {



					this.navigationObservers.previous = false;



				}



				if (this.galleries[gallery[0]][gallery[1]][current+1]) {



					this.navigationObservers.next = this.galleries[gallery[0]][gallery[1]][current+1];



				} else {



					this.navigationObservers.next = false;



				}



		



				this.activeGallery = true;



			} else {



				this.navigationObservers.previous = false;



				this.navigationObservers.next = false;



				



				this.activeGallery = false;



			}



		







			if (gallery && this.galleries[gallery[0]][gallery[1]][current]) {



				this.contentToFetch = this.galleries[gallery[0]][gallery[1]][current].href;







				this.galleryLocation = {current: current+1, total: this.galleries[gallery[0]][gallery[1]].length};



				



				if (!this.galleries[gallery[0]][gallery[1]][current+1]) {



					$('lightwindow_next').setStyle({



						display: 'none'



					});



				} else {



					$('lightwindow_next').setStyle({



						display: 'block'



					});



					$('lightwindow_next_title').innerHTML = this.galleries[gallery[0]][gallery[1]][current+1].title;



				}



				



				if (!this.galleries[gallery[0]][gallery[1]][current-1]) {



					$('lightwindow_previous').setStyle({



						display: 'none'



					});



				} else {



					$('lightwindow_previous').setStyle({



						display: 'block'



					});



					$('lightwindow_previous_title').innerHTML = this.galleries[gallery[0]][gallery[1]][current-1].title;



				}



			}



			



			if (this._getParameter('lightwindow_iframe_embed')) {



				this.resizeTo.height = this.dimensions.viewport.height;



				this.resizeTo.width = this.dimensions.viewport.width;	



			} else {



				this.resizeTo.height = this._getParameter('lightwindow_height');



				this.resizeTo.width = this._getParameter('lightwindow_width');				



			}



			



			this._processWindow();



			



			break;







		case 'external' :		







			this._appendIframe('auto');







			this.resizeTo.height = this.dimensions.viewport.height;



			this.resizeTo.width = this.dimensions.viewport.width;



						



			this._processWindow();







			break;



				



		case 'page' :	



			



			var newAJAX = new Ajax.Request(



				this.contentToFetch, {



					method: 'get', 



					parameters: '', 



					onComplete: function(response) {



						$('lightwindow_contents').innerHTML += response.responseText;



						this.resizeTo.height = $('lightwindow_contents').scrollHeight+(this.options.contentOffset.height);



						this.resizeTo.width = $('lightwindow_contents').scrollWidth+(this.options.contentOffset.width);



						this._processWindow();



					}.bind(this)



				}



			);



			



			break;



			



		case 'inline' : 



		



			var content = this.contentToFetch;



			if (content.indexOf('?') > -1) {



				content = content.substring(0, content.indexOf('?'));



			}



			content = content.substring(content.indexOf('#')+1);



			



			new Insertion.Top($('lightwindow_contents'), $(content).innerHTML);



			



			this.resizeTo.height = $('lightwindow_contents').scrollHeight+(this.options.contentOffset.height);



			this.resizeTo.width = $('lightwindow_contents').scrollWidth+(this.options.contentOffset.width);



			



			this._toggleTroubleElements('hidden', true); 			



			this._processWindow();



			



			break;



			



		default : 



			throw("Page Type could not be determined, please amend this lightwindow URL "+this.contentToFetch);



			break;



		}



	},



	//



	//  Resize the Window to fit the viewport if necessary



	//



	_resizeWindowToFit : function() {



		if (this.resizeTo.height+this.dimensions.cruft.height > this.dimensions.viewport.height) {



			var heightRatio = this.resizeTo.height/this.resizeTo.width;



			this.resizeTo.height = this.dimensions.viewport.height-this.dimensions.cruft.height-(2*this.options.viewportPadding);



			// We only care about ratio's with this window type			



			if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {



				this.resizeTo.width = this.resizeTo.height/heightRatio;



				$('lightwindow_data_slide_inner').setStyle({



					width: this.resizeTo.width+'px'



				});			



			}



		} 



		if (this.resizeTo.width+this.dimensions.cruft.width > this.dimensions.viewport.width) {



			var widthRatio = this.resizeTo.width/this.resizeTo.height;



			this.resizeTo.width = this.dimensions.viewport.width-2*this.dimensions.cruft.width-(2*this.options.viewportPadding);



			// We only care about ratio's with this window type



			if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {



				this.resizeTo.height = this.resizeTo.width/widthRatio;



				$('lightwindow_data_slide_inner').setStyle({



					height: this.resizeTo.height+'px'



				});



			}



		}



			



	},



	//



	//  Set the Window to a preset size



	//



	_presetWindowSize : function() {



		if (this._getParameter('lightwindow_height')) {



			this.resizeTo.height = parseFloat(this._getParameter('lightwindow_height'));



		}



		if (this._getParameter('lightwindow_width')) {



			this.resizeTo.width = parseFloat(this._getParameter('lightwindow_width'));



		}



	},



	//



	//  Process the Window



	//



	_processWindow : function() {



		// Clean out our effects



		this.dimensions.dataEffects = [];







		// Set up the data-slide if we have caption information



		if (this.element.caption || this.element.author || (this.activeGallery && this.options.showGalleryCount)) {



			if (this.element.caption) {



				$('lightwindow_data_caption').innerHTML = this.element.caption;



				$('lightwindow_data_caption').setStyle({



					display: 'block'



				});



			} else {



				$('lightwindow_data_caption').setStyle({



					display: 'none'



				});				



			}



			if (this.element.author) {



				$('lightwindow_data_author').innerHTML = this.element.author;



				$('lightwindow_data_author_container').setStyle({



					display: 'block'



				});



			} else {



				$('lightwindow_data_author_container').setStyle({



					display: 'none'



				});				



			}



			if (this.activeGallery && this.options.showGalleryCount) {



				$('lightwindow_data_gallery_current').innerHTML = this.galleryLocation.current;



				$('lightwindow_data_gallery_total').innerHTML = this.galleryLocation.total;



				$('lightwindow_data_gallery_container').setStyle({



					display: 'block'



				});



			} else {



				$('lightwindow_data_gallery_container').setStyle({



					display: 'none'



				});				



			}







			$('lightwindow_data_slide_inner').setStyle({



				width: this.resizeTo.width+'px',



				height: 'auto',



				visibility: 'visible',



				display: 'block'



			});



			$('lightwindow_data_slide').setStyle({



				height: $('lightwindow_data_slide').getHeight()+'px',



				width: '1px',



				overflow: 'hidden',



				display: 'block'



			});



		} else {



			$('lightwindow_data_slide').setStyle({



				display: 'none',



				width: 'auto'



			});



			$('lightwindow_data_slide_inner').setStyle({



				display: 'none',



				visibility: 'hidden',



				width: this.resizeTo.width+'px',



				height: '0px'



			});



		}



				



		if (this.element.title != 'null') {		



			$('lightwindow_title_bar_title').innerHTML = this.element.title;



		} else {



			$('lightwindow_title_bar_title').innerHTML = '';



		}



		



		var originalContainerDimensions = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};



		// Position the window



    	$('lightwindow_container').setStyle({



			height: 'auto',



			// We need to set the width to a px not auto as opera has problems with it



			width: $('lightwindow_container').getWidth()+this.options.contentOffset.width-(this.windowActive ? this.options.contentOffset.width : 0)+'px'



		});



		var newContainerDimensions = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};



 		



		// We need to record the container dimension changes



		this.containerChange = {height: originalContainerDimensions.height-newContainerDimensions.height, width: originalContainerDimensions.width-newContainerDimensions.width};







		// Get out general dimensions



		this.dimensions.container = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};



		this.dimensions.cruft = {height: this.dimensions.container.height-$('lightwindow_contents').getHeight()+this.options.contentOffset.height, width: this.dimensions.container.width-$('lightwindow_contents').getWidth()+this.options.contentOffset.width};



		



		// Set Sizes if we need too



		this._presetWindowSize();



		this._resizeWindowToFit(); // Even if the window is preset we still don't want it to go outside of the viewport







		if (!this.windowActive) {



			// Position the window



		   	$('lightwindow_container').setStyle({



				left: -(this.dimensions.container.width/2)+'px',



				top: -(this.dimensions.container.height/2)+'px'



			});



		}



	   	$('lightwindow_container').setStyle({



			height: this.dimensions.container.height+'px',



			width: this.dimensions.container.width+'px'



		});



		



		// We are ready, lets show this puppy off!



		this._displayLightWindow('block', 'visible');



		this._animateLightWindow();



	},



	//



	//  Fire off our animation handler



	//



	_animateLightWindow : function() {



		if (this.options.animationHandler) {



			this.options.animationHandler().bind(this);



		} else {



			this._defaultAnimationHandler();



		}



	},



	//



	//  Fire off our transition handler



	//



	_handleNavigation : function(display) {



		if (this.options.navigationHandler) {



			this.options.navigationHandler().bind(this, display);



		} else {



			this._defaultDisplayNavigation(display);



		}



	},



	//



	//  Fire off our transition handler



	//



	_handleTransition : function() {



		if (this.options.transitionHandler) {



			this.options.transitionHandler().bind(this);



		} else {



			this._defaultTransitionHandler();



		}



	},



	//



	//  Handle the finish of the window animation



	// 



	_handleFinalWindowAnimation : function(delay) {



		if (this.options.finalAnimationHandler) {



			this.options.finalAnimationHandler().bind(this, delay);



		} else {



			this._defaultfinalWindowAnimationHandler(delay);



		}		



	},



	//



	//  Handle the gallery Animation



	// 



	_handleGalleryAnimation : function(list) {



		if (this.options.galleryAnimationHandler) {



			this.options.galleryAnimationHandler().bind(this, list);



		} else {



			this._defaultGalleryAnimationHandler(list);



		}		



	},



	//



	//  Display the navigation 



	//



	_defaultDisplayNavigation : function(display) {



		if (display) {



			$('lightwindow_navigation').setStyle({



				display: 'block',



				height: $('lightwindow_contents').getHeight()+'px',



				width: '100%',



				marginTop: this.options.dimensions.titleHeight+'px'



			});			



		} else {



			$('lightwindow_navigation').setStyle({



				display: 'none',



				height: 'auto',



				width: 'auto'



			});			



		}



	},



	//



	//  This is the default animation handler for LightWindow



	//



	_defaultAnimationHandler : function() {	



		// Now that we have figures out the cruft lets make the caption go away and add its effects



		if (this.element.caption || this.element.author || (this.activeGallery && this.options.showGalleryCount)) {



			$('lightwindow_data_slide').setStyle({



				display: 'none',



				width: 'auto'



			});



			this.dimensions.dataEffects.push(



				new Effect.SlideDown('lightwindow_data_slide', {sync: true}),



				new Effect.Appear('lightwindow_data_slide', {sync: true, from: 0.0, to: 1.0})



			);



		}







		// Set up the Title if we have one



		$('lightwindow_title_bar_inner').setStyle({



			height: '0px',



			marginTop: this.options.dimensions.titleHeight+'px'



		});



		



		// We always want the title bar as well



		this.dimensions.dataEffects.push(



			new Effect.Morph('lightwindow_title_bar_inner', {sync: true, style: {height: this.options.dimensions.titleHeight+'px', marginTop: '0px'}}),



		 	new Effect.Appear('lightwindow_title_bar_inner', {sync: true, from: 0.0, to: 1.0})



		);		



		



		if (!this.options.hideGalleryTab) {



			this._handleGalleryAnimation(false);



			if ($('lightwindow_galleries_tab_container').getHeight() == 0) {



				this.dimensions.dataEffects.push(



					new Effect.Morph('lightwindow_galleries_tab_container', {sync: true, style: {height: '20px', marginTop: '0px'}})



				);



				$('lightwindow_galleries').setStyle({



					width: '0px'



				});



			}



		}



		



		var resized = false;



		var ratio = this.dimensions.container.width-$('lightwindow_contents').getWidth()+this.resizeTo.width+this.options.contentOffset.width;



		if (ratio != $('lightwindow_container').getWidth()) {



			new Effect.Parallel([



					new Effect.Scale('lightwindow_contents', 100*(this.resizeTo.width/$('lightwindow_contents').getWidth()), {scaleFrom: 100*($('lightwindow_contents').getWidth()/($('lightwindow_contents').getWidth()+(this.options.contentOffset.width))), sync: true,  scaleY: false, scaleContent: false}),



					new Effect.Scale('lightwindow_container', 100*(ratio/(this.dimensions.container.width)), {sync: true, scaleY: false, scaleFromCenter: true, scaleContent: false})



				], {



					duration: this.duration, 



					delay: 0.25,



					queue: {position: 'end', scope: 'lightwindowAnimation'}



				}



			);		



		}



		



		ratio = this.dimensions.container.height-$('lightwindow_contents').getHeight()+this.resizeTo.height+this.options.contentOffset.height;



		if (ratio != $('lightwindow_container').getHeight()) {



			new Effect.Parallel([



					new Effect.Scale('lightwindow_contents', 100*(this.resizeTo.height/$('lightwindow_contents').getHeight()), {scaleFrom: 100*($('lightwindow_contents').getHeight()/($('lightwindow_contents').getHeight()+(this.options.contentOffset.height))), sync: true, scaleX: false, scaleContent: false}),



					new Effect.Scale('lightwindow_container', 100*(ratio/(this.dimensions.container.height)), {sync: true, scaleX: false, scaleFromCenter: true, scaleContent: false})



				], {



					duration: this.duration, 



					afterFinish: function() {				



						if (this.dimensions.dataEffects.length > 0) {



							if (!this.options.hideGalleryTab) {



								$('lightwindow_galleries').setStyle({



									width: this.resizeTo.width+'px'



								});



							}



							new Effect.Parallel(this.dimensions.dataEffects, {



									duration: this.duration,



									afterFinish: function() {



										this._finishWindow();



									}.bind(this),



									queue: {position: 'end', scope: 'lightwindowAnimation'} 



								}



							);



						}



					}.bind(this), 



					queue: {position: 'end', scope: 'lightwindowAnimation'} 



				}



			);



			resized = true;



		}



		



		// We need to do our data effect since there was no resizing



		if (!resized && this.dimensions.dataEffects.length > 0) {	



			new Effect.Parallel(this.dimensions.dataEffects, {



					duration: this.duration,



					beforeStart: function() {



						if (!this.options.hideGalleryTab) {



							$('lightwindow_galleries').setStyle({



								width: this.resizeTo.width+'px'



							});



						}



						if (this.containerChange.height != 0 || this.containerChange.width != 0) {



							new Effect.MoveBy('lightwindow_container', this.containerChange.height, this.containerChange.width, {transition: Effect.Transitions.sinoidal});



						}



					}.bind(this),			



					afterFinish: function() {



						this._finishWindow();



					}.bind(this),



					queue: {position: 'end', scope: 'lightwindowAnimation'} 



				}



			);



		}			



		



	},



	//



	//  Finish up Window Animation



	//



	_defaultfinalWindowAnimationHandler : function(delay) {



		if (this.windowType == 'media' || this._getParameter('lightwindow_loading_animation')) {	



			// Because of major flickering with the overlay we just hide it in this case



			Element.hide('lightwindow_loading');



			this._handleNavigation(this.activeGallery);



			this._setStatus(false);



		} else {



			Effect.Fade('lightwindow_loading', {



				duration: 0.75,



				delay: 1.0, 



				afterFinish: function() {



					// Just in case we need some scroll goodness (this also avoids the swiss cheese effect)



					if (this.windowType != 'image' && this.windowType != 'media' && this.windowType != 'external') {



						$('lightwindow_contents').setStyle({



							overflow: 'auto'



						});



					}



					this._handleNavigation(this.activeGallery);



					this._defaultGalleryAnimationHandler();



					this._setStatus(false);



				}.bind(this),



				queue: {position: 'end', scope: 'lightwindowAnimation'}



			});



		}



	},



	//



	//  Handle the gallery Animation



	//



	_defaultGalleryAnimationHandler : function(list) {



		if (this.activeGallery) {



			$('lightwindow_galleries').setStyle({



				display: 'block',



				marginBottom: $('lightwindow_data_slide').getHeight()+this.options.contentOffset.height/2+'px'



			});



			$('lightwindow_navigation').setStyle({



				height: $('lightwindow_contents').getHeight()-20+'px'



			});



		} else {



			$('lightwindow_galleries').setStyle({



				display: 'none'



			});	



			$('lightwindow_galleries_tab_container').setStyle({



				height: '0px',



				marginTop: '20px'



			});



			$('lightwindow_galleries_list').setStyle({



				height: '0px'



			});



			return false;



		}



		



		if (list) {



			if ($('lightwindow_galleries_list').getHeight() == 0) {



				var height = $('lightwindow_contents').getHeight()*0.80;



				$('lightwindow_galleries_tab_span').className = 'down';



			} else {



				var height = 0;



				$('lightwindow_galleries_tab_span').className = 'up';



			}







			new Effect.Morph('lightwindow_galleries_list', {



				duration: this.duration,



				transition: Effect.Transitions.sinoidal,



				style: {height: height+'px'},



				beforeStart: function() {



					$('lightwindow_galleries_list').setStyle({



						overflow: 'hidden'



					});					



				},



				afterFinish: function() {



					$('lightwindow_galleries_list').setStyle({



						overflow: 'auto'



					});



				},



				queue: {position: 'end', scope: 'lightwindowAnimation'}



			});	



		}



		



		



	},



	//



	//  Default Transition Handler



	//



	_defaultTransitionHandler : function() {



		// Clean out our effects



		this.dimensions.dataEffects = [];







		// Now that we have figures out the cruft lets make the caption go away and add its effects



		if ($('lightwindow_data_slide').getStyle('display') != 'none') {



			this.dimensions.dataEffects.push(



				new Effect.SlideUp('lightwindow_data_slide', {sync: true}),



				new Effect.Fade('lightwindow_data_slide', {sync: true, from: 1.0, to: 0.0})



			);



		}



		



		if (!this.options.hideGalleryTab) {



			if ($('lightwindow_galleries').getHeight() != 0 && !this.options.hideGalleryTab) {



				this.dimensions.dataEffects.push(



					new Effect.Morph('lightwindow_galleries_tab_container', {sync: true, style: {height: '0px', marginTop: '20px'}})



				);



			}



			



			if ($('lightwindow_galleries_list').getHeight() != 0) {



				$('lightwindow_galleries_tab_span').className = 'up';



				this.dimensions.dataEffects.push(



					new Effect.Morph('lightwindow_galleries_list', {



						sync: true, 



						style: {height: '0px'},



						transition: Effect.Transitions.sinoidal,



						beforeStart: function() {



							$('lightwindow_galleries_list').setStyle({



								overflow: 'hidden'



							});					



						},



						afterFinish: function() {



							$('lightwindow_galleries_list').setStyle({



								overflow: 'auto'



							});



						}



					})



				);



			}



		}



		



		// We always want the title bar as well



		this.dimensions.dataEffects.push(



			new Effect.Morph('lightwindow_title_bar_inner', {sync: true, style: {height: '0px', marginTop: this.options.dimensions.titleHeight+'px'}}),



		 	new Effect.Fade('lightwindow_title_bar_inner', {sync: true, from: 1.0, to: 0.0})



		);







		new Effect.Parallel(this.dimensions.dataEffects, {



				duration: this.duration,



				afterFinish: function() {



					this._loadWindow();



				}.bind(this),



				queue: {position: 'end', scope: 'lightwindowAnimation'} 



			}



		);	



	},



	//



	//	Default Form handler for LightWindow



	//



	_defaultFormHandler : function(e) {



		var element = Event.element(e).parentNode;



		var parameterString = Form.serialize(this._getParameter('lightwindow_form', element.getAttribute('params')));



		if (this.options.formMethod == 'post') {



			var newAJAX = new Ajax.Request(element.href, { 



				method: 'post', 



				postBody: parameterString, 



				onComplete: this.openWindow.bind(this, element)



			});



		} else if (this.options.formMethod == 'get') {



			var newAJAX = new Ajax.Request(element.href, { 



				method: 'get', 



				parameters: parameterString, 



				onComplete: this.openWindow.bind(this, element)



			});



		}



	},



	// 



	//  Wrap everything up



	//



	_finishWindow : function() {



		if (this.windowType == 'external') {



			// We set the externals source here because it allows for a much smoother animation



			$('lightwindow_iframe').setAttribute('src', this.element.href);



			this._handleFinalWindowAnimation(1);	



		} else if (this.windowType == 'media') {







			var outerObject = document.createElement('object');



			outerObject.setAttribute('classid', this.options.classids[this._fileExtension(this.contentToFetch)]);



			outerObject.setAttribute('codebase', this.options.codebases[this._fileExtension(this.contentToFetch)]);



			outerObject.setAttribute('id', 'lightwindow_media_primary');



			outerObject.setAttribute('name', 'lightwindow_media_primary');



			outerObject.setAttribute('width', this.resizeTo.width);



			outerObject.setAttribute('height', this.resizeTo.height);



			outerObject = this._addParamToObject('movie', this.contentToFetch, outerObject);



			outerObject = this._addParamToObject('src', this.contentToFetch, outerObject);



			outerObject = this._addParamToObject('controller', 'true', outerObject);



			outerObject = this._addParamToObject('wmode', 'transparent', outerObject);



			outerObject = this._addParamToObject('cache', 'false', outerObject);



			outerObject = this._addParamToObject('quality', 'high', outerObject);







			if (!Prototype.Browser.IE) {



				var innerObject = document.createElement('object');



				innerObject.setAttribute('type', this.options.mimeTypes[this._fileExtension(this.contentToFetch)]);



				innerObject.setAttribute('data', this.contentToFetch);



				innerObject.setAttribute('id', 'lightwindow_media_secondary');



				innerObject.setAttribute('name', 'lightwindow_media_secondary');



				innerObject.setAttribute('width', this.resizeTo.width);



				innerObject.setAttribute('height', this.resizeTo.height);



				innerObject = this._addParamToObject('controller', 'true', innerObject);



				innerObject = this._addParamToObject('wmode', 'transparent', innerObject);



				innerObject = this._addParamToObject('cache', 'false', innerObject);



				innerObject = this._addParamToObject('quality', 'high', innerObject);



			



				outerObject.appendChild(innerObject);



			}	



			



			if (this._getParameter('lightwindow_iframe_embed')) {



				this._appendIframe('no');



				this._writeToIframe(this._convertToMarkup(outerObject, 'object'));



			} else {



				this._appendObject(outerObject, 'object', $('lightwindow_contents'));



			}







			this._handleFinalWindowAnimation(0);



		} else {



			this._handleFinalWindowAnimation(0);



		}







		// Initialize any actions



		this._setupActions();



	}



}







/*-----------------------------------------------------------------------------------------------*/







Event.observe(window, 'load', lightwindowInit, false);







//



//	Set up all of our links



//



var myLightWindow = null;



function lightwindowInit() {



	myLightWindow = new lightwindow();



}