// 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 : '/images/lightbox/black.png',
				presetImage : '/images/lightbox/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</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="/images/lightbox/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();
}

/**
 * Seadragon Ajax 0.8.2 (build 12734 on 2008-11-21)
 * Copyright (c) 2008 Microsoft Corporation. All rights reserved.
 * For more information, visit: http://livelabs.com/seadragon-ajax/
 */
if(!window.Seadragon){window.Seadragon={};}
Seadragon.Config={debugMode:false,framesPerSecond:60,animationTime:1.5,blendTime:0.5,alwaysBlend:false,autoHideControls:true,immediateRender:false,minZoomDimension:64,maxZoomPixelRatio:4,visibilityRatio:0.1,springStiffness:5.0,imageLoaderLimit:2,clickTimeThreshold:200,clickDistThreshold:5,zoomPerClick:2.0,zoomPerScroll:1.2,zoomPerSecond:2.0,proxyUrl:null,imagePath:"img/"};Seadragon.Strings={Errors:{Failure:"Sorry, but Seadragon Ajax can't run on your browser!\n"+"Please try using IE 7 or Firefox 3.\n",Dzc:"Sorry, we don't support Deep Zoom Collections!",Dzi:"Hmm, this doesn't appear to be a valid Deep Zoom Image.",Xml:"Hmm, this doesn't appear to be a valid Deep Zoom Image.",Empty:"You asked us to open nothing, so we did just that.",ImageFormat:"Sorry, we don't support {0}-based Deep Zoom Images.",Security:"It looks like a security restriction stopped us from "+"loading this Deep Zoom Image.",Status:"This space unintentionally left blank ({0} {1}).",Unknown:"Whoops, something inexplicably went wrong. Sorry!"},Messages:{Loading:"Loading..."},Tooltips:{FullPage:"Toggle full page",Home:"Go home",ZoomIn:"Zoom in (you can also use your mouse's scroll wheel)",ZoomOut:"Zoom out (you can also use your mouse's scroll wheel)"}};Seadragon.Strings.getString=function(prop){var props=prop.split('.');var string=Seadragon.Strings;for(var i=0;i<props.length;i++){string=string[props[i]]||{};}
if(typeof(string)!="string"){string="";}
var args=arguments;return string.replace(/\{\d+\}/g,function(capture){var i=parseInt(capture.match(/\d+/))+1;return i<args.length?args[i]:"";});};Seadragon.Strings.setString=function(prop,value){var props=prop.split('.');var container=Seadragon.Strings;for(var i=0;i<props.length-1;i++){if(!container[props[i]]){container[props[i]]={};}
container=container[props[i]];}
container[props[i]]=value;};Seadragon.Debug=function(){this.log=function(msg,important){var console=window.console||{};var debug=Seadragon.Config.debugMode;if(debug&&console.log){console.log(msg);}else if(debug&&important){alert(msg);}};this.error=function(msg,e){var console=window.console||{};var debug=Seadragon.Config.debugMode;if(debug&&console.error){console.error(msg);}else if(debug){alert(msg);}
if(debug){throw e||new Error(msg);}};this.fail=function(msg){alert(Seadragon.Strings.getString("Errors.Failure"));throw new Error(msg);};};Seadragon.Debug=new Seadragon.Debug();Seadragon.Profiler=function(){var self=this;var midUpdate=false;var numUpdates=0;var lastBeginTime=null;var lastEndTime=null;var minUpdateTime=Infinity;var avgUpdateTime=0;var maxUpdateTime=0;var minIdleTime=Infinity;var avgIdleTime=0;var maxIdleTime=0;this.getAvgUpdateTime=function(){return avgUpdateTime;};this.getMinUpdateTime=function(){return minUpdateTime;};this.getMaxUpdateTime=function(){return maxUpdateTime;};this.getAvgIdleTime=function(){return avgIdleTime;};this.getMinIdleTime=function(){return minIdleTime;};this.getMaxIdleTime=function(){return maxIdleTime;};this.isMidUpdate=function(){return midUpdate;};this.getNumUpdates=function(){return numUpdates;};this.beginUpdate=function(){if(midUpdate){self.endUpdate();}
midUpdate=true;lastBeginTime=new Date().getTime();if(numUpdates<1){return;}
var time=lastBeginTime-lastEndTime;avgIdleTime=(avgIdleTime*(numUpdates-1)+time)/numUpdates;if(time<minIdleTime){minIdleTime=time;}
if(time>maxIdleTime){maxIdleTime=time;}};this.endUpdate=function(){if(!midUpdate){return;}
lastEndTime=new Date().getTime();midUpdate=false;var time=lastEndTime-lastBeginTime;numUpdates++;avgUpdateTime=(avgUpdateTime*(numUpdates-1)+time)/numUpdates;if(time<minUpdateTime){minUpdateTime=time;}
if(time>maxUpdateTime){maxUpdateTime=time;}};this.clearProfile=function(){midUpdate=false;numUpdates=0;lastBeginTime=null;lastEndTime=null;minUpdateTime=Infinity;avgUpdateTime=0;maxUpdateTime=0;minIdleTime=Infinity;avgIdleTime=0;maxIdleTime=0;};};Seadragon.Point=function(x,y){var self=this;this.x=typeof(x)=="number"?x:0;this.y=typeof(y)=="number"?y:0;this.plus=function(point){return new Seadragon.Point(self.x+point.x,self.y+point.y);};this.minus=function(point){return new Seadragon.Point(self.x-point.x,self.y-point.y);};this.times=function(factor){return new Seadragon.Point(self.x*factor,self.y*factor);};this.divide=function(factor){return new Seadragon.Point(self.x/factor,self.y/factor);};this.negate=function(){return new Seadragon.Point(-self.x,-self.y);};this.distanceTo=function(point){return Math.sqrt(Math.pow(self.x-point.x,2)+
Math.pow(self.y-point.y,2));};this.apply=function(func){return new Seadragon.Point(func(self.x),func(self.y));};this.equals=function(point){return(point instanceof Seadragon.Point)&&(self.x===point.x)&&(self.y===point.y);};this.toString=function(){return"("+self.x+","+self.y+")";};};Seadragon.Rect=function(x,y,width,height){var self=this;this.x=typeof(x)=="number"?x:0;this.y=typeof(y)=="number"?y:0;this.width=typeof(width)=="number"?width:0;this.height=typeof(height)=="number"?height:0;this.getAspectRatio=function(){return self.width/self.height;};this.getTopLeft=function(){return new Seadragon.Point(self.x,self.y);};this.getBottomRight=function(){return new Seadragon.Point(self.x+self.width,self.y+self.height);};this.getCenter=function(){return new Seadragon.Point(self.x+self.width/2.0,self.y+self.height/2.0);};this.getSize=function(){return new Seadragon.Point(self.width,self.height);};this.equals=function(other){return(other instanceof Seadragon.Rect)&&(self.x===other.x)&&(self.y===other.y)&&(self.width===other.width)&&(self.height===other.height);};this.toString=function(){return"["+self.x+","+self.y+","+self.width+"x"+
self.height+"]";};};Seadragon.Spring=function(initialValue){var currentValue=typeof(initialValue)=="number"?initialValue:0;var startValue=currentValue;var targetValue=currentValue;var currentTime=new Date().getTime();var startTime=currentTime;var targetTime=currentTime;function transform(x){var s=Seadragon.Config.springStiffness;return(1.0-Math.exp(-x*s))/(1.0-Math.exp(-s));}
this.getCurrent=function(){return currentValue;};this.getTarget=function(){return targetValue;};this.resetTo=function(target){targetValue=target;targetTime=currentTime;startValue=targetValue;startTime=targetTime;};this.springTo=function(target){startValue=currentValue;startTime=currentTime;targetValue=target;targetTime=startTime+1000*Seadragon.Config.animationTime;};this.shiftBy=function(delta){startValue+=delta;targetValue+=delta;};this.update=function(){currentTime=new Date().getTime();currentValue=(currentTime>=targetTime)?targetValue:startValue+(targetValue-startValue)*transform((currentTime-startTime)/(targetTime-startTime));};};Seadragon.Utils=function(){var Browser={UNKNOWN:0,IE:1,FIREFOX:2,SAFARI:3,CHROME:4,OPERA:5};Seadragon.Browser=Browser;var self=this;var arrActiveX=["Msxml2.XMLHTTP","Msxml3.XMLHTTP","Microsoft.XMLHTTP"];var fileFormats={"bmp":false,"jpeg":true,"jpg":true,"png":true,"tif":false,"wdp":false};var browser=Browser.UNKNOWN;var browserVersion=0;var urlParams={};(function(){var app=navigator.appName;var ver=navigator.appVersion;var ua=navigator.userAgent;if(app=="Microsoft Internet Explorer"&&!!window.attachEvent&&!!window.ActiveXObject){var ieOffset=ua.indexOf("MSIE");browser=Browser.IE;browserVersion=parseFloat(ua.substring(ieOffset+5,ua.indexOf(";",ieOffset)));}else if(app=="Netscape"&&!!window.addEventListener){var ffOffset=ua.indexOf("Firefox");var saOffset=ua.indexOf("Safari");var chOffset=ua.indexOf("Chrome");if(ffOffset>=0){browser=Browser.FIREFOX;browserVersion=parseFloat(ua.substring(ffOffset+8));}else if(saOffset>=0){var slash=ua.substring(0,saOffset).lastIndexOf("/");browser=(chOffset>=0)?Browser.CHROME:Browser.SAFARI;browserVersion=parseFloat(slash+1,saOffset);}}else if(app=="Opera"&&!!window.opera&&!!window.attachEvent){browser=Browser.OPERA;browserVersion=parseFloat(ver);}
var query=window.location.search.substring(1);var parts=query.split('&');for(var i=0;i<parts.length;i++){var part=parts[i];var sep=part.indexOf('=');if(sep>0){urlParams[part.substring(0,sep)]=decodeURIComponent(part.substring(sep+1));}}})();function getOffsetParent(elmt,isFixed){if(isFixed&&elmt!=document.body){return document.body;}else{return elmt.offsetParent;}}
this.getBrowser=function(){return browser;};this.getBrowserVersion=function(){return browserVersion;};this.getElement=function(elmt){if(typeof(elmt)=="string"){elmt=document.getElementById(elmt);}
return elmt;};this.getElementPosition=function(elmt){var elmt=self.getElement(elmt);var result=new Seadragon.Point();var isFixed=self.getElementStyle(elmt).position=="fixed";var offsetParent=getOffsetParent(elmt,isFixed);while(offsetParent){result.x+=elmt.offsetLeft;result.y+=elmt.offsetTop;if(isFixed){result=result.plus(self.getPageScroll());}
elmt=offsetParent;isFixed=self.getElementStyle(elmt).position=="fixed";offsetParent=getOffsetParent(elmt,isFixed);}
return result;};this.getElementSize=function(elmt){var elmt=self.getElement(elmt);return new Seadragon.Point(elmt.clientWidth,elmt.clientHeight);};this.getElementStyle=function(elmt){var elmt=self.getElement(elmt);if(elmt.currentStyle){return elmt.currentStyle;}else if(window.getComputedStyle){return window.getComputedStyle(elmt,"");}else{Seadragon.Debug.fail("Unknown element style, no known technique.");}};this.getEvent=function(event){return event?event:window.event;};this.getMousePosition=function(event){var event=self.getEvent(event);var result=new Seadragon.Point();if(event.type=="DOMMouseScroll"&&browser==Browser.FIREFOX&&browserVersion<3){result.x=event.screenX;result.y=event.screenY;}else if(typeof(event.pageX)=="number"){result.x=event.pageX;result.y=event.pageY;}else if(typeof(event.clientX)=="number"){result.x=event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;result.y=event.clientY+document.body.scrollTop+document.documentElement.scrollTop;}else{Seadragon.Debug.fail("Unknown event mouse position, no known technique.");}
return result;};this.getMouseScroll=function(event){var event=self.getEvent(event);var delta=0;if(typeof(event.wheelDelta)=="number"){delta=event.wheelDelta;}else if(typeof(event.detail)=="number"){delta=event.detail*-1;}else{Seadragon.Debug.fail("Unknown event mouse scroll, no known technique.");}
return delta?delta/Math.abs(delta):0;};this.getPageScroll=function(){var result=new Seadragon.Point();if(typeof(window.pageXOffset)=="number"){result.x=window.pageXOffset;result.y=window.pageYOffset;}else if(typeof(document.documentElement.scrollLeft)=="number"){result.x=document.documentElement.scrollLeft;result.y=document.documentElement.scrollTop;}else{Seadragon.Debug.fail("Unknown page scroll, no known technique.");}
return result;};this.getWindowSize=function(){var result=new Seadragon.Point();if(typeof(window.innerWidth)=='number'){result.x=window.innerWidth;result.y=window.innerHeight;}else if(document.documentElement&&typeof(document.documentElement.clientWidth)=="number"){result.x=document.documentElement.clientWidth;result.y=document.documentElement.clientHeight;}else if(document.body&&typeof(document.body.clientWidth)=="number"){result.x=document.body.clientWidth;result.y=document.body.clientHeight;}else{Seadragon.Debug.fail("Unknown window size, no known technique.");}
return result;};this.imageFormatSupported=function(ext){var ext=ext?ext:"";return!!fileFormats[ext.toLowerCase()];};this.makeCenteredNode=function(elmt){var elmt=Seadragon.Utils.getElement(elmt);var div=self.makeNeutralElement("div");var html=[];html.push('<div style="display:table; height:100%; width:100%;');html.push('#position:relative; overflow:hidden;">');html.push('<div style="#position:absolute; #top:50%; width:100%; ');html.push('display:table-cell; vertical-align:middle;">');html.push('<div style="#position:relative; #top:-50%; width:100%; ');html.push('text-align:center;"></div></div></div>');div.innerHTML=html.join('');div=div.firstChild;var innerDiv=div;var innerDivs=div.getElementsByTagName("div");while(innerDivs.length>0){innerDiv=innerDivs[0];innerDivs=innerDiv.getElementsByTagName("div");}
innerDiv.appendChild(elmt);return div;};this.makeNeutralElement=function(tagName){var elmt=document.createElement(tagName);var style=elmt.style;style.background="transparent none";style.border="none";style.margin="0px";style.padding="0px";style.position="static";return elmt;};this.makeTransparentImage=function(src){var img=self.makeNeutralElement("img");var elmt=null;if(browser==Browser.IE&&browserVersion<7){elmt=self.makeNeutralElement("span");elmt.style.display="inline-block";img.onload=function(){elmt.style.width=elmt.style.width||img.width+"px";elmt.style.height=elmt.style.height||img.height+"px";img.onload=null;img=null;};img.src=src;elmt.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+
src+"', sizingMethod='scale')";}else{elmt=img;elmt.src=src;}
return elmt;};this.setElementOpacity=function(elmt,opacity,usesAlpha){var elmt=self.getElement(elmt);if(usesAlpha&&(browser==Browser.IE||browser==Browser.CHROME)){opacity=Math.round(opacity);}
if(opacity<1){elmt.style.opacity=opacity;}else{elmt.style.opacity="";}
if(opacity==1){var prevFilter=elmt.style.filter||"";elmt.style.filter=prevFilter.replace(/alpha\(.*?\)/g,"");return;}
var ieOpacity=Math.round(100*opacity);var ieFilter=" alpha(opacity="+ieOpacity+") ";try{if(elmt.filters&&elmt.filters.alpha){elmt.filters.alpha.opacity=ieOpacity;}else{elmt.style.filter+=ieFilter;}}catch(e){elmt.style.filter+=ieFilter;}};this.addEvent=function(elmt,eventName,handler,useCapture){var elmt=self.getElement(elmt);if(elmt.addEventListener){if(eventName=="mousewheel"){elmt.addEventListener("DOMMouseScroll",handler,useCapture);}
elmt.addEventListener(eventName,handler,useCapture);}else if(elmt.attachEvent){elmt.attachEvent("on"+eventName,handler);if(useCapture&&elmt.setCapture){elmt.setCapture();}}else{Seadragon.Debug.fail("Unable to attach event handler, no known technique.");}};this.removeEvent=function(elmt,eventName,handler,useCapture){var elmt=self.getElement(elmt);if(elmt.removeEventListener){if(eventName=="mousewheel"){elmt.removeEventListener("DOMMouseScroll",handler,useCapture);}
elmt.removeEventListener(eventName,handler,useCapture);}else if(elmt.detachEvent){elmt.detachEvent("on"+eventName,handler);if(useCapture&&elmt.releaseCapture){elmt.releaseCapture();}}else{Seadragon.Debug.fail("Unable to detach event handler, no known technique.");}};this.cancelEvent=function(event){var event=self.getEvent(event);if(event.preventDefault){event.preventDefault();}
event.cancel=true;event.returnValue=false;};this.stopEvent=function(event){var event=self.getEvent(event);if(event.stopPropagation){event.stopPropagation();}
event.cancelBubble=true;};this.createCallback=function(object,method){var initialArgs=[];for(var i=2;i<arguments.length;i++){initialArgs.push(arguments[i]);}
return function(){var args=initialArgs.concat([]);for(var i=0;i<arguments.length;i++){args.push(arguments[i]);}
return method.apply(object,args);};};this.getUrlParameter=function(key){var value=urlParams[key];return value?value:null;};this.makeAjaxRequest=function(url,callback){var async=typeof(callback)=="function";var req=null;if(async){var actual=callback;var callback=function(){window.setTimeout(Seadragon.Utils.createCallback(null,actual,req),1);};}
if(window.ActiveXObject){for(var i=0;i<arrActiveX.length;i++){try{req=new ActiveXObject(arrActiveX[i]);break;}catch(e){continue;}}}else if(window.XMLHttpRequest){req=new XMLHttpRequest();}
if(!req){Seadragon.Debug.fail("Browser doesn't support XMLHttpRequest.");}
if(Seadragon.Config.proxyUrl){url=Seadragon.Config.proxyUrl+url;}
if(async){req.onreadystatechange=function(){if(req.readyState==4){req.onreadystatechange=new Function();callback();}};}
try{req.open("GET",url,async);req.send(null);}catch(e){Seadragon.Debug.log(e.name+" while making AJAX request: "+e.message);req.onreadystatechange=null;req=null;if(async){callback();}}
return async?null:req;};this.parseXml=function(string){var xmlDoc=null;if(window.ActiveXObject){try{xmlDoc=new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async=false;xmlDoc.loadXML(string);}catch(e){Seadragon.Debug.log(e.name+" while parsing XML (ActiveX): "+e.message);}}else if(window.DOMParser){try{var parser=new DOMParser();xmlDoc=parser.parseFromString(string,"text/xml");}catch(e){Seadragon.Debug.log(e.name+" while parsing XML (DOMParser): "+e.message);}}else{Seadragon.Debug.fail("Browser doesn't support XML DOM.");}
return xmlDoc;};};Seadragon.Utils=new Seadragon.Utils();(function(){if(Seadragon.MouseTracker){return;}
var isIE=Seadragon.Utils.getBrowser()==Seadragon.Browser.IE;var buttonDownAny=false;var ieCapturingAny=false;var ieTrackersActive={};var ieTrackersCapturing=[];function getMouseAbsolute(event){return Seadragon.Utils.getMousePosition(event);}
function getMouseRelative(event,elmt){var mouse=Seadragon.Utils.getMousePosition(event);var offset=Seadragon.Utils.getElementPosition(elmt);return mouse.minus(offset);}
function isChild(elmtA,elmtB){var body=document.body;while(elmtB&&elmtA!=elmtB&&body!=elmtB){try{elmtB=elmtB.parentNode;}catch(e){return false;}}
return elmtA==elmtB;}
function onGlobalMouseDown(){buttonDownAny=true;}
function onGlobalMouseUp(){buttonDownAny=false;}
(function(){if(isIE){Seadragon.Utils.addEvent(document,"mousedown",onGlobalMouseDown,false);Seadragon.Utils.addEvent(document,"mouseup",onGlobalMouseUp,false);}else{Seadragon.Utils.addEvent(window,"mousedown",onGlobalMouseDown,true);Seadragon.Utils.addEvent(window,"mouseup",onGlobalMouseUp,true);}})();Seadragon.MouseTracker=function(elmt){var self=this;var ieSelf=null;var hash=Math.random();var elmt=Seadragon.Utils.getElement(elmt);var tracking=false;var capturing=false;var buttonDownElmt=false;var insideElmt=false;var lastPoint=null;var lastMouseDownTime=null;var lastMouseDownPoint=null;this.target=elmt;this.enterHandler=null;this.exitHandler=null;this.pressHandler=null;this.releaseHandler=null;this.clickHandler=null;this.dragHandler=null;this.scrollHandler=null;function startTracking(){if(!tracking){Seadragon.Utils.addEvent(elmt,"mouseover",onMouseOver,false);Seadragon.Utils.addEvent(elmt,"mouseout",onMouseOut,false);Seadragon.Utils.addEvent(elmt,"mousedown",onMouseDown,false);Seadragon.Utils.addEvent(elmt,"mouseup",onMouseUp,false);Seadragon.Utils.addEvent(elmt,"mousewheel",onMouseScroll,false);Seadragon.Utils.addEvent(elmt,"click",onMouseClick,false);tracking=true;ieTrackersActive[hash]=ieSelf;}}
function stopTracking(){if(tracking){Seadragon.Utils.removeEvent(elmt,"mouseover",onMouseOver,false);Seadragon.Utils.removeEvent(elmt,"mouseout",onMouseOut,false);Seadragon.Utils.removeEvent(elmt,"mousedown",onMouseDown,false);Seadragon.Utils.removeEvent(elmt,"mouseup",onMouseUp,false);Seadragon.Utils.removeEvent(elmt,"mousewheel",onMouseScroll,false);Seadragon.Utils.removeEvent(elmt,"click",onMouseClick,false);releaseMouse();tracking=false;delete ieTrackersActive[hash];}}
function captureMouse(){if(!capturing){if(isIE){Seadragon.Utils.removeEvent(elmt,"mouseup",onMouseUp,false);Seadragon.Utils.addEvent(elmt,"mouseup",onMouseUpIE,true);Seadragon.Utils.addEvent(elmt,"mousemove",onMouseMoveIE,true);}else{Seadragon.Utils.addEvent(window,"mouseup",onMouseUpWindow,true);Seadragon.Utils.addEvent(window,"mousemove",onMouseMove,true);}
capturing=true;}}
function releaseMouse(){if(capturing){if(isIE){Seadragon.Utils.removeEvent(elmt,"mousemove",onMouseMoveIE,true);Seadragon.Utils.removeEvent(elmt,"mouseup",onMouseUpIE,true);Seadragon.Utils.addEvent(elmt,"mouseup",onMouseUp,false);}else{Seadragon.Utils.removeEvent(window,"mousemove",onMouseMove,true);Seadragon.Utils.removeEvent(window,"mouseup",onMouseUpWindow,true);}
capturing=false;}}
function triggerOthers(eventName,event){var trackers=ieTrackersActive;for(var otherHash in trackers){if(trackers.hasOwnProperty(otherHash)&&hash!=otherHash){trackers[otherHash][eventName](event);}}}
function hasMouse(){return insideElmt;}
function onMouseOver(event){var event=Seadragon.Utils.getEvent(event);if(isIE&&capturing&&!isChild(event.srcElement,elmt)){triggerOthers("onMouseOver",event);}
var to=event.target?event.target:event.srcElement;var from=event.relatedTarget?event.relatedTarget:event.fromElement;if(!isChild(elmt,to)||isChild(elmt,from)){return;}
insideElmt=true;if(typeof(self.enterHandler)=="function"){try{self.enterHandler(self,getMouseRelative(event,elmt),buttonDownElmt,buttonDownAny);}catch(e){Seadragon.Debug.error(e.name+" while executing enter handler: "+e.message,e);}}}
function onMouseOut(event){var event=Seadragon.Utils.getEvent(event);if(isIE&&capturing&&!isChild(event.srcElement,elmt)){triggerOthers("onMouseOut",event);}
var from=event.target?event.target:event.srcElement;var to=event.relatedTarget?event.relatedTarget:event.toElement;if(!isChild(elmt,from)||isChild(elmt,to)){return;}
insideElmt=false;if(typeof(self.exitHandler)=="function"){try{self.exitHandler(self,getMouseRelative(event,elmt),buttonDownElmt,buttonDownAny);}catch(e){Seadragon.Debug.error(e.name+" while executing exit handler: "+e.message,e);}}}
function onMouseDown(event){var event=Seadragon.Utils.getEvent(event);if(event.button==2){return;}
buttonDownElmt=true;lastPoint=getMouseAbsolute(event);lastMouseDownPoint=lastPoint;lastMouseDownTime=new Date().getTime();if(typeof(self.pressHandler)=="function"){try{self.pressHandler(self,getMouseRelative(event,elmt));}catch(e){Seadragon.Debug.error(e.name+" while executing press handler: "+e.message,e);}}
if(self.pressHandler||self.dragHandler){Seadragon.Utils.cancelEvent(event);}
if(!isIE||!ieCapturingAny){captureMouse();ieCapturingAny=true;ieTrackersCapturing=[ieSelf];}else if(isIE){ieTrackersCapturing.push(ieSelf);}}
function onMouseUp(event){var event=Seadragon.Utils.getEvent(event);var insideElmtPress=buttonDownElmt;var insideElmtRelease=insideElmt;if(event.button==2){return;}
buttonDownElmt=false;if(typeof(self.releaseHandler)=="function"){try{self.releaseHandler(self,getMouseRelative(event,elmt),insideElmtPress,insideElmtRelease);}catch(e){Seadragon.Debug.error(e.name+" while executing release handler: "+e.message,e);}}
if(insideElmtPress&&insideElmtRelease){handleMouseClick(event);}}
function onMouseUpIE(event){var event=Seadragon.Utils.getEvent(event);if(event.button==2){return;}
for(var i=0;i<ieTrackersCapturing.length;i++){var tracker=ieTrackersCapturing[i];if(!tracker.hasMouse()){tracker.onMouseUp(event);}}
releaseMouse();ieCapturingAny=false;event.srcElement.fireEvent("on"+event.type,document.createEventObject(event));Seadragon.Utils.stopEvent(event);}
function onMouseUpWindow(event){if(!insideElmt){onMouseUp(event);}
releaseMouse();}
function onMouseClick(event){if(self.clickHandler){Seadragon.Utils.cancelEvent(event);}}
function handleMouseClick(event){var event=Seadragon.Utils.getEvent(event);if(event.button==2){return;}
var time=new Date().getTime()-lastMouseDownTime;var point=getMouseAbsolute(event);var distance=lastMouseDownPoint.distanceTo(point);var quick=time<=Seadragon.Config.clickTimeThreshold&&distance<=Seadragon.Config.clickDistThreshold;if(typeof(self.clickHandler)=="function"){try{self.clickHandler(self,getMouseRelative(event,elmt),quick,event.shiftKey);}catch(e){Seadragon.Debug.error(e.name+" while executing click handler: "+e.message,e);}}}
function onMouseMove(event){var event=Seadragon.Utils.getEvent(event);var point=getMouseAbsolute(event);var delta=point.minus(lastPoint);lastPoint=point;if(typeof(self.dragHandler)=="function"){try{self.dragHandler(self,getMouseRelative(event,elmt),delta,event.shiftKey);}catch(e){Seadragon.Debug.error(e.name+" while executing drag handler: "+e.message,e);}
Seadragon.Utils.cancelEvent(event);}}
function onMouseMoveIE(event){for(var i=0;i<ieTrackersCapturing.length;i++){ieTrackersCapturing[i].onMouseMove(event);}
Seadragon.Utils.stopEvent(event);}
function onMouseScroll(event){var event=Seadragon.Utils.getEvent(event);var delta=Seadragon.Utils.getMouseScroll(event);if(typeof(self.scrollHandler)=="function"){if(delta){try{self.scrollHandler(self,getMouseRelative(event,elmt),delta,event.shiftKey);}catch(e){Seadragon.Debug.error(e.name+" while executing scroll handler: "+e.message,e);}}
Seadragon.Utils.cancelEvent(event);}}
(function(){ieSelf={hasMouse:hasMouse,onMouseOver:onMouseOver,onMouseOut:onMouseOut,onMouseUp:onMouseUp,onMouseMove:onMouseMove};})();this.isTracking=function(){return tracking;};this.setTracking=function(track){if(track){startTracking();}else{stopTracking();}};};})();Seadragon.EventManager=function(){var listeners={};this.addListener=function(eventName,handler){if(typeof(handler)!="function"){return;}
if(!listeners[eventName]){listeners[eventName]=[];}
listeners[eventName].push(handler);};this.removeListener=function(eventName,handler){var handlers=listeners[eventName];if(typeof(handler)!="function"){return;}else if(!handlers){return;}
for(var i=0;i<handlers.length;i++){if(handler==handlers[i]){handlers.splice(i,1);return;}}};this.clearListeners=function(eventName){if(listeners[eventName]){delete listeners[eventName];}};this.trigger=function(eventName){var handlers=listeners[eventName];var args=[];if(!handlers){return;}
for(var i=1;i<arguments.length;i++){args.push(arguments[i]);}
for(var i=0;i<handlers.length;i++){try{handlers[i].apply(window,args);}catch(e){Seadragon.Debug.error(e.name+" while executing "+eventName+" handler: "+e.message,e);}}};};(function(){var TIMEOUT=5000;function Job(src,callback){var image=null;var timeout=null;function finish(success){image.onload=null;image.onabort=null;image.onerror=null;if(timeout){window.clearTimeout(timeout);}
window.setTimeout(function(){callback(src,success?image:null);},1);}
this.start=function(){image=new Image();var successFunc=function(){finish(true);};var failureFunc=function(){finish(false);};var timeoutFunc=function(){Seadragon.Debug.log("Image timed out: "+src);finish(false);};image.onload=successFunc;image.onabort=failureFunc;image.onerror=failureFunc;timeout=window.setTimeout(timeoutFunc,TIMEOUT);image.src=src;};}
Seadragon.ImageLoader=function(){var downloading=0;function onComplete(callback,src,image){downloading--;if(typeof(callback)=="function"){try{callback(image);}catch(e){Seadragon.Debug.error(e.name+" while executing "+src+" callback: "+e.message,e);}}}
this.loadImage=function(src,callback){if(downloading>=Seadragon.Config.imageLoaderLimit){return false;}
var func=Seadragon.Utils.createCallback(null,onComplete,callback);var job=new Job(src,func);downloading++;job.start();return true;};};})();(function(){var ButtonState={REST:0,GROUP:1,HOVER:2,DOWN:3};Seadragon.Button=function(tooltip,srcRest,srcGroup,srcHover,srcDown,onPress,onRelease,onClick,onEnter,onExit){var button=Seadragon.Utils.makeNeutralElement("span");var currentState=ButtonState.GROUP;var tracker=new Seadragon.MouseTracker(button);var imgRest=Seadragon.Utils.makeTransparentImage(srcRest);var imgGroup=Seadragon.Utils.makeTransparentImage(srcGroup);var imgHover=Seadragon.Utils.makeTransparentImage(srcHover);var imgDown=Seadragon.Utils.makeTransparentImage(srcDown);var onPress=typeof(onPress)=="function"?onPress:null;var onRelease=typeof(onRelease)=="function"?onRelease:null;var onClick=typeof(onClick)=="function"?onClick:null;var onEnter=typeof(onEnter)=="function"?onEnter:null;var onExit=typeof(onExit)=="function"?onExit:null;var fadeDelay=0;var fadeLength=2000;var fadeBeginTime=null;var shouldFade=false;this.elmt=button;function scheduleFade(){window.setTimeout(updateFade,20);}
function updateFade(){if(shouldFade){var currentTime=new Date().getTime();var deltaTime=currentTime-fadeBeginTime;var opacity=1.0-deltaTime/fadeLength;opacity=Math.min(1.0,opacity);opacity=Math.max(0.0,opacity);Seadragon.Utils.setElementOpacity(imgGroup,opacity,true);if(opacity>0){scheduleFade();}}}
function beginFading(){shouldFade=true;fadeBeginTime=new Date().getTime()+fadeDelay;window.setTimeout(scheduleFade,fadeDelay);}
function stopFading(){shouldFade=false;Seadragon.Utils.setElementOpacity(imgGroup,1.0,true);}
function inTo(newState){if(newState>=ButtonState.GROUP&&currentState==ButtonState.REST){stopFading();currentState=ButtonState.GROUP;}
if(newState>=ButtonState.HOVER&&currentState==ButtonState.GROUP){imgHover.style.visibility="";currentState=ButtonState.HOVER;}
if(newState>=ButtonState.DOWN&&currentState==ButtonState.HOVER){imgDown.style.visibility="";currentState=ButtonState.DOWN;}}
function outTo(newState){if(newState<=ButtonState.HOVER&&currentState==ButtonState.DOWN){imgDown.style.visibility="hidden";currentState=ButtonState.HOVER;}
if(newState<=ButtonState.GROUP&&currentState==ButtonState.HOVER){imgHover.style.visibility="hidden";currentState=ButtonState.GROUP;}
if(newState<=ButtonState.REST&&currentState==ButtonState.GROUP){beginFading();currentState=ButtonState.REST;}}
function enterHandler(tracker,position,buttonDownElmt,buttonDownAny){if(buttonDownElmt){inTo(ButtonState.DOWN);if(onEnter){onEnter();}}else if(!buttonDownAny){inTo(ButtonState.HOVER);}}
function exitHandler(tracker,position,buttonDownElmt,buttonDownAny){outTo(ButtonState.GROUP);if(buttonDownElmt&&onExit){onExit();}}
function pressHandler(tracker,position){inTo(ButtonState.DOWN);if(onPress){onPress();}}
function releaseHandler(tracker,position,insideElmtPress,insideElmtRelease){if(insideElmtPress&&insideElmtRelease){outTo(ButtonState.HOVER);if(onRelease){onRelease();}}else if(insideElmtPress){outTo(ButtonState.GROUP);}else{inTo(ButtonState.HOVER);}}
function clickHandler(tracker,position,quick,shift){if(onClick&&quick){onClick();}}
this.notifyGroupEnter=function(){inTo(ButtonState.GROUP);};this.notifyGroupExit=function(){outTo(ButtonState.REST);};(function(){button.style.display="inline-block";button.style.position="relative";button.title=tooltip;button.appendChild(imgRest);button.appendChild(imgGroup);button.appendChild(imgHover);button.appendChild(imgDown);var styleRest=imgRest.style;var styleGroup=imgGroup.style;var styleHover=imgHover.style;var styleDown=imgDown.style;styleGroup.position=styleHover.position=styleDown.position="absolute";styleGroup.top=styleHover.top=styleDown.top="0px";styleGroup.left=styleHover.left=styleDown.left="0px";styleHover.visibility=styleDown.visibility="hidden";if(Seadragon.Utils.getBrowser()==Seadragon.Browser.FIREFOX&&Seadragon.Utils.getBrowserVersion()<3){styleGroup.top=styleHover.top=styleDown.top="";}
tracker.enterHandler=enterHandler;tracker.exitHandler=exitHandler;tracker.pressHandler=pressHandler;tracker.releaseHandler=releaseHandler;tracker.clickHandler=clickHandler;tracker.setTracking(true);outTo(ButtonState.REST);})();};Seadragon.ButtonGroup=function(buttons){var group=Seadragon.Utils.makeNeutralElement("span");var buttons=buttons.concat([]);var tracker=new Seadragon.MouseTracker(group);this.elmt=group;function enterHandler(tracker,position,buttonDownElmt,buttonDownAny){for(var i=0;i<buttons.length;i++){buttons[i].notifyGroupEnter();}}
function exitHandler(tracker,position,buttonDownElmt,buttonDownAny){if(!buttonDownElmt){for(var i=0;i<buttons.length;i++){buttons[i].notifyGroupExit();}}}
function releaseHandler(tracker,position,insideElmtPress,insideElmtRelease){if(!insideElmtRelease){for(var i=0;i<buttons.length;i++){buttons[i].notifyGroupExit();}}}
this.emulateEnter=function(){enterHandler();};this.emulateExit=function(){exitHandler();};(function(){group.style.display="inline-block";for(var i=0;i<buttons.length;i++){group.appendChild(buttons[i].elmt);}
tracker.enterHandler=enterHandler;tracker.exitHandler=exitHandler;tracker.releaseHandler=releaseHandler;tracker.setTracking(true);})();};})();Seadragon.TileSource=function(width,height,tileSize,tileOverlap,minLevel,maxLevel){var self=this;this.aspectRatio=width/height;this.dimensions=new Seadragon.Point(width,height);this.minLevel=minLevel?minLevel:0;this.maxLevel=maxLevel?maxLevel:Math.ceil(Math.log(Math.max(width,height))/Math.log(2));this.tileSize=tileSize?tileSize:0;this.tileOverlap=tileOverlap?tileOverlap:0;this.getLevelScale=function(level){return 1/(1<<(self.maxLevel-level));};this.getNumTiles=function(level){var scale=self.getLevelScale(level);var x=Math.ceil(scale*self.dimensions.x/self.tileSize);var y=Math.ceil(scale*self.dimensions.y/self.tileSize);return new Seadragon.Point(x,y);};this.getPixelRatio=function(level){var imageSizeScaled=self.dimensions.times(self.getLevelScale(level));var rx=1.0/imageSizeScaled.x;var ry=1.0/imageSizeScaled.y;return new Seadragon.Point(rx,ry);};this.getTileAtPoint=function(level,point){var pixel=point.times(self.dimensions.x).times(self.getLevelScale(level));var tx=Math.floor(pixel.x/self.tileSize);var ty=Math.floor(pixel.y/self.tileSize);return new Seadragon.Point(tx,ty);};this.getTileBounds=function(level,x,y){var dimensionsScaled=self.dimensions.times(self.getLevelScale(level));var px=(x===0)?0:self.tileSize*x-self.tileOverlap;var py=(y===0)?0:self.tileSize*y-self.tileOverlap;var sx=self.tileSize+(x===0?1:2)*self.tileOverlap;var sy=self.tileSize+(y===0?1:2)*self.tileOverlap;sx=Math.min(sx,dimensionsScaled.x-px);sy=Math.min(sy,dimensionsScaled.y-py);var scale=1.0/dimensionsScaled.x;return new Seadragon.Rect(px*scale,py*scale,sx*scale,sy*scale);};this.getTileUrl=function(level,x,y){throw new Error("Method not implemented.");};this.tileExists=function(level,x,y){var numTiles=self.getNumTiles(level);return level>=self.minLevel&&level<=self.maxLevel&&x>=0&&y>=0&&x<numTiles.x&&y<numTiles.y;};};Seadragon.DisplayRect=function(x,y,width,height,minLevel,maxLevel){Seadragon.Rect.apply(this,arguments);this.minLevel=minLevel;this.maxLevel=maxLevel;};Seadragon.DisplayRect.prototype=new Seadragon.Rect();Seadragon.DziTileSource=function(width,height,tileSize,tileOverlap,tilesUrl,fileFormat,displayRects){Seadragon.TileSource.apply(this,[width,height,tileSize,tileOverlap]);var self=this;var levelRects={};this.fileFormat=fileFormat;this.displayRects=displayRects;(function(){for(var i=displayRects.length-1;i>=0;i--){var rect=displayRects[i];for(var level=rect.minLevel;level<=rect.maxLevel;level++){if(!levelRects[level]){levelRects[level]=[];}
levelRects[level].push(rect);}}})();this.getTileUrl=function(level,x,y){return[tilesUrl,level,'/',x,'_',y,'.',fileFormat].join('');};this.tileExists=function(level,x,y){var rects=levelRects[level];if(!rects||!rects.length){return true;}
for(var i=rects.length-1;i>=0;i--){var rect=rects[i];if(level<rect.minLevel||level>rect.maxLevel){continue;}
var scale=self.getLevelScale(level);var xMin=rect.x*scale;var yMin=rect.y*scale;var xMax=xMin+rect.width*scale;var yMax=yMin+rect.height*scale;xMin=Math.floor(xMin/tileSize);yMin=Math.floor(yMin/tileSize);xMax=Math.ceil(xMax/tileSize);yMax=Math.ceil(yMax/tileSize);if(xMin<=x&&x<xMax&&yMin<=y&&y<yMax){return true;}}
return false;};};Seadragon.DziTileSource.prototype=new Seadragon.TileSource();(function(){function DziError(message){Error.apply(this,arguments);this.message=message;}
DziError.prototype=new Error();function getError(e){if(!(e instanceof DziError)){Seadragon.Debug.error(e.name+" while creating DZI from XML: "+e.message);e=new DziError(Seadragon.Strings.getString("Errors.Unknown"));}
return e;}
function processResponse(xhr,tilesUrl){if(!xhr){throw new DziError(Seadragon.Strings.getString("Errors.Security"));}else if(xhr.status!==200&&xhr.status!==0){var status=xhr.status;var statusText=(status==404)?"Not Found":xhr.statusText;throw new DziError(Seadragon.Strings.getString("Errors.Status",status,statusText));}
var doc=null;if(xhr.responseXML&&xhr.responseXML.documentElement){doc=xhr.responseXML;}else if(xhr.responseText){doc=Seadragon.Utils.parseXml(xhr.responseText);}
return processXml(doc,tilesUrl);}
function processXml(xmlDoc,tilesUrl){if(!xmlDoc||!xmlDoc.documentElement){throw new DziError(Seadragon.Strings.getString("Errors.Xml"));}
var root=xmlDoc.documentElement;var rootName=root.tagName;if(rootName=="Image"){try{return processDzi(root,tilesUrl);}catch(e){var defMsg=Seadragon.Strings.getString("Errors.Dzi");throw(e instanceof DziError)?e:new DziError(defMsg);}}else if(rootName=="Collection"){throw new DziError(Seadragon.Strings.getString("Errors.Dzc"));}else if(rootName=="Error"){return processError(root);}
throw new DziError(Seadragon.Strings.getString("Errors.Dzi"));}
function processDzi(imageNode,tilesUrl){var fileFormat=imageNode.getAttribute("Format");if(!Seadragon.Utils.imageFormatSupported(fileFormat)){throw new DziError(Seadragon.Strings.getString("Errors.ImageFormat",fileFormat.toUpperCase()));}
var sizeNode=imageNode.getElementsByTagName("Size")[0];var dispRectNodes=imageNode.getElementsByTagName("DisplayRect");var width=parseInt(sizeNode.getAttribute("Width"),10);var height=parseInt(sizeNode.getAttribute("Height"),10);var tileSize=parseInt(imageNode.getAttribute("TileSize"));var tileOverlap=parseInt(imageNode.getAttribute("Overlap"));var dispRects=[];for(var i=0;i<dispRectNodes.length;i++){var dispRectNode=dispRectNodes[i];var rectNode=dispRectNode.getElementsByTagName("Rect")[0];dispRects.push(new Seadragon.DisplayRect(parseInt(rectNode.getAttribute("X"),10),parseInt(rectNode.getAttribute("Y"),10),parseInt(rectNode.getAttribute("Width"),10),parseInt(rectNode.getAttribute("Height"),10),0,parseInt(dispRectNode.getAttribute("MaxLevel"),10)));}
return new Seadragon.DziTileSource(width,height,tileSize,tileOverlap,tilesUrl,fileFormat,dispRects);}
function processError(errorNode){var messageNode=errorNode.getElementsByTagName("Message")[0];var message=messageNode.firstChild.nodeValue;throw new DziError(message);}
Seadragon.DziTileSource.createFromXml=function(xmlUrl,xmlString,callback){var async=typeof(callback)=="function";var error=null;if(!xmlUrl){error=Seadragon.Strings.getString("Errors.Empty");if(async){window.setTimeout(function(){callback(null,error);},1);return null;}
throw new DziError(error);}
var urlParts=xmlUrl.split('/');var filename=urlParts[urlParts.length-1];var lastDot=filename.lastIndexOf('.');if(lastDot>-1){urlParts[urlParts.length-1]=filename.slice(0,lastDot);}
var tilesUrl=urlParts.join('/')+"_files/";function finish(func,obj){try{return func(obj,tilesUrl);}catch(e){if(async){error=getError(e).message;return null;}else{throw getError(e);}}}
if(async){if(xmlString){window.setTimeout(function(){var source=finish(processXml,Seadragon.Utils.parseXml(xmlString));callback(source,error);},1);}else{Seadragon.Utils.makeAjaxRequest(xmlUrl,function(xhr){var source=finish(processResponse,xhr);callback(source,error);});}
return null;}
if(xmlString){return finish(processXml,Seadragon.Utils.parseXml(xmlString));}else{return finish(processResponse,Seadragon.Utils.makeAjaxRequest(xmlUrl));}};})();Seadragon.Viewport=function(containerSize,contentSize){var self=this;var containerSize=new Seadragon.Point(containerSize.x,containerSize.y);var contentHeight=contentSize.y/contentSize.x;var centerSpringX=new Seadragon.Spring(0);var centerSpringY=new Seadragon.Spring(0);var zoomSpring=new Seadragon.Spring(1);var zoomPoint=null;var homeBounds=new Seadragon.Rect(0,0,1,contentHeight);var homeZoom=null;function init(){self.goHome(true);self.update();homeZoom=self.getZoom();}
function getMinZoom(){var zoom=(contentSize.x<=contentSize.y)?Seadragon.Config.minZoomDimension/containerSize.x:Seadragon.Config.minZoomDimension/(containerSize.x*contentHeight);return homeZoom?Math.min(zoom,homeZoom):-Infinity;}
function getMaxZoom(){var zoom=contentSize.x*Seadragon.Config.maxZoomPixelRatio/containerSize.x;return homeZoom?Math.max(zoom,homeZoom):Infinity;}
this.getAspectRatio=function(){return containerSize.x/containerSize.y;};this.getContainerSize=function(){return new Seadragon.Point(containerSize.x,containerSize.y);};this.getBounds=function(current){var center=self.getCenter(current);var width=1.0/self.getZoom(current);var height=width/self.getAspectRatio();return new Seadragon.Rect(center.x-width/2.0,center.y-height/2.0,width,height);};this.getCenter=function(current){var centerCurrent=new Seadragon.Point(centerSpringX.getCurrent(),centerSpringY.getCurrent());var centerTarget=new Seadragon.Point(centerSpringX.getTarget(),centerSpringY.getTarget());if(current){return centerCurrent;}else if(!zoomPoint){return centerTarget;}
var oldZoomPixel=self.pixelFromPoint(zoomPoint,true);var zoom=self.getZoom();var width=1.0/zoom;var height=width/self.getAspectRatio();var bounds=new Seadragon.Rect(centerCurrent.x-width/2.0,centerCurrent.y-height/2.0,width,height);var newZoomPixel=zoomPoint.minus(bounds.getTopLeft()).times(containerSize.x/bounds.width);var deltaZoomPixels=newZoomPixel.minus(oldZoomPixel);var deltaZoomPoints=deltaZoomPixels.divide(containerSize.x*zoom);return centerTarget.plus(deltaZoomPoints);};this.getZoom=function(current){if(current){return zoomSpring.getCurrent();}else{return zoomSpring.getTarget();}};this.ensureVisible=function(immediately){var bounds=self.getBounds();var visibilityRatio=Seadragon.Config.visibilityRatio;var horThres=visibilityRatio*bounds.width;var verThres=visibilityRatio*bounds.height;var left=bounds.x+bounds.width;var right=1-bounds.x;var top=bounds.y+bounds.height;var bottom=contentHeight-bounds.y;var dx=0;if(left<horThres){dx=horThres-left;}else if(right<horThres){dx=right-horThres;}
var dy=0;if(top<verThres){dy=verThres-top;}else if(bottom<verThres){dy=bottom-verThres;}
if(dx||dy){bounds.x+=dx;bounds.y+=dy;self.fitBounds(bounds,immediately);}};this.fitBounds=function(bounds,immediately){var aspect=self.getAspectRatio();var center=bounds.getCenter();var newBounds=new Seadragon.Rect(bounds.x,bounds.y,bounds.width,bounds.height);if(newBounds.getAspectRatio()>=aspect){newBounds.height=bounds.width/aspect;newBounds.y=center.y-newBounds.height/2;}else{newBounds.width=bounds.height*aspect;newBounds.x=center.x-newBounds.width/2;}
self.panTo(self.getCenter(true),true);self.zoomTo(self.getZoom(true),null,true);var zoom=1/newBounds.width;if(zoom==self.getZoom()){self.panTo(center,immediately);return;}
var oldBounds=self.getBounds();var refPoint=oldBounds.getTopLeft().times(containerSize.x/oldBounds.width).minus(newBounds.getTopLeft().times(containerSize.x/newBounds.width)).divide(containerSize.x/oldBounds.width-containerSize.x/newBounds.width);self.zoomTo(zoom,refPoint,immediately);};this.goHome=function(immediately){self.fitBounds(homeBounds,immediately);};this.panBy=function(delta,immediately){var center=new Seadragon.Point(centerSpringX.getTarget(),centerSpringY.getTarget());self.panTo(center.plus(delta),immediately);};this.panTo=function(center,immediately){if(immediately){centerSpringX.resetTo(center.x);centerSpringY.resetTo(center.y);}else{centerSpringX.springTo(center.x);centerSpringY.springTo(center.y);}};this.zoomBy=function(factor,refPoint,immediately){self.zoomTo(zoomSpring.getTarget()*factor,refPoint,immediately);};this.zoomTo=function(zoom,refPoint,immediately){zoom=Math.max(zoom,getMinZoom());zoom=Math.min(zoom,getMaxZoom());if(immediately){zoomSpring.resetTo(zoom);}else{zoomSpring.springTo(zoom);}
zoomPoint=refPoint instanceof Seadragon.Point?refPoint:null;};this.resize=function(newContainerSize,maintain){var oldBounds=self.getBounds();var newBounds=oldBounds;var widthDeltaFactor=newContainerSize.x/containerSize.x;containerSize=new Seadragon.Point(newContainerSize.x,newContainerSize.y);if(maintain){newBounds.width=oldBounds.width*widthDeltaFactor;newBounds.height=newBounds.width/self.getAspectRatio();}
self.fitBounds(newBounds,true);};this.update=function(){var oldCenterX=centerSpringX.getCurrent();var oldCenterY=centerSpringY.getCurrent();var oldZoom=zoomSpring.getCurrent();if(zoomPoint){var oldZoomPixel=self.pixelFromPoint(zoomPoint,true);}
zoomSpring.update();if(zoomPoint&&zoomSpring.getCurrent()!=oldZoom){var newZoomPixel=self.pixelFromPoint(zoomPoint,true);var deltaZoomPixels=newZoomPixel.minus(oldZoomPixel);var deltaZoomPoints=self.deltaPointsFromPixels(deltaZoomPixels,true);centerSpringX.shiftBy(deltaZoomPoints.x);centerSpringY.shiftBy(deltaZoomPoints.y);}else{zoomPoint=null;}
centerSpringX.update();centerSpringY.update();return centerSpringX.getCurrent()!=oldCenterX||centerSpringY.getCurrent()!=oldCenterY||zoomSpring.getCurrent()!=oldZoom;};this.deltaPixelsFromPoints=function(deltaPoints,current){return deltaPoints.times(containerSize.x*self.getZoom(current));};this.deltaPointsFromPixels=function(deltaPixels,current){return deltaPixels.divide(containerSize.x*self.getZoom(current));};this.pixelFromPoint=function(point,current){var bounds=self.getBounds(current);return point.minus(bounds.getTopLeft()).times(containerSize.x/bounds.width);};this.pointFromPixel=function(pixel,current){var bounds=self.getBounds(current);return pixel.divide(containerSize.x/bounds.width).plus(bounds.getTopLeft());};init();};(function(){var QUOTA=100;var MIN_PIXEL_RATIO=0.5;var browser=Seadragon.Utils.getBrowser();var subpixelRenders=(browser==Seadragon.Browser.FIREFOX||browser==Seadragon.Browser.OPERA);var useCanvas=typeof(document.createElement("canvas").getContext)=="function"&&subpixelRenders;function Tile(level,x,y,bounds,exists,url){this.level=level;this.x=x;this.y=y;this.bounds=bounds;this.exists=exists;this.url=url;this.elmt=null;this.image=null;this.loaded=false;this.loading=false;this.style=null;this.position=null;this.size=null;this.blendStart=null;this.opacity=null;this.distance=null;this.visibility=null;this.beingDrawn=false;this.lastTouchTime=0;}
Tile.prototype.toString=function(){return this.level+"/"+this.x+"_"+this.y;};Tile.prototype.drawHTML=function(container){if(!this.loaded){Seadragon.Debug.error("Attempting to draw tile "+this.toString()+" when it's not yet loaded.");return;}
if(!this.elmt){this.elmt=Seadragon.Utils.makeNeutralElement("img");this.elmt.src=this.url;this.style=this.elmt.style;this.style.position="absolute";}
var elmt=this.elmt;var style=this.style;var position=this.position.apply(Math.floor);var size=this.size.apply(Math.ceil);if(elmt.parentNode!=container){container.appendChild(elmt);}
style.left=position.x+"px";style.top=position.y+"px";style.width=size.x+"px";style.height=size.y+"px";Seadragon.Utils.setElementOpacity(elmt,this.opacity);};Tile.prototype.drawCanvas=function(context){if(!this.loaded){Seadragon.Debug.error("Attempting to draw tile "+this.toString()+" when it's not yet loaded.");return;}
var position=this.position;var size=this.size;context.globalAlpha=this.opacity;context.drawImage(this.image,position.x,position.y,size.x,size.y);};Tile.prototype.unload=function(){if(this.elmt&&this.elmt.parentNode){this.elmt.parentNode.removeChild(this.elmt);}
this.elmt=null;this.image=null;this.loaded=false;this.loading=false;}
var Placement={CENTER:0,TOP_LEFT:1,TOP:2,TOP_RIGHT:3,RIGHT:4,BOTTOM_RIGHT:5,BOTTOM:6,BOTTOM_LEFT:7,LEFT:8};Seadragon.OverlayPlacement=Placement;function createAdjustmentFunction(placement){switch(placement){case Placement.TOP_LEFT:return function(position,size){};case Placement.TOP:return function(position,size){position.x-=size.x/2;};case Placement.TOP_RIGHT:return function(position,size){position.x-=size.x;};case Placement.RIGHT:return function(position,size){position.x-=size.x;position.y-=size.y/2;};case Placement.BOTTOM_RIGHT:return function(position,size){position.x-=size.x;position.y-=size.y;};case Placement.BOTTOM:return function(position,size){position.x-=size.x/2;position.y-=size.y;};case Placement.BOTTOM_LEFT:return function(position,size){position.y-=size.y;};case Placement.LEFT:return function(position,size){position.y-=size.y/2;};case Placement.CENTER:default:return function(position,size){position.x-=size.x/2;position.y-=size.y/2;};}}
function Overlay(elmt,loc,placement){this.elmt=elmt;this.scales=(loc instanceof Seadragon.Rect);this.bounds=new Seadragon.Rect(loc.x,loc.y,loc.width,loc.height);this.adjust=createAdjustmentFunction(loc instanceof Seadragon.Point?placement:Placement.TOP_LEFT);this.position=new Seadragon.Point(loc.x,loc.y);this.size=new Seadragon.Point(loc.width,loc.height);this.style=elmt.style;}
Overlay.prototype.destroy=function(){var elmt=this.elmt;var style=this.style;if(elmt.parentNode){elmt.parentNode.removeChild(elmt);}
style.top="";style.left="";style.position="";if(this.scales){style.width="";style.height="";}};Overlay.prototype.drawHTML=function(container){var elmt=this.elmt;var style=this.style;var scales=this.scales;if(elmt.parentNode!=container){container.appendChild(elmt);}
if(!scales){this.size=Seadragon.Utils.getElementSize(elmt);}
var position=this.position;var size=this.size;this.adjust(position,size);position=position.apply(Math.floor);size=size.apply(Math.ceil);style.left=position.x+"px";style.top=position.y+"px";style.position="absolute";if(scales){style.width=size.x+"px";style.height=size.y+"px";}};Overlay.prototype.update=function(loc,placement){this.scales=(loc instanceof Seadragon.Rect);this.bounds=new Seadragon.Rect(loc.x,loc.y,loc.width,loc.height);this.adjust=createAdjustmentFunction(loc instanceof Seadragon.Point?placement:Placement.TOP_LEFT);};Seadragon.Drawer=function(source,viewport,elmt){var container=Seadragon.Utils.getElement(elmt);var canvas=Seadragon.Utils.makeNeutralElement(useCanvas?"canvas":"div");var context=useCanvas?canvas.getContext("2d"):null;var imageLoader=new Seadragon.ImageLoader();var profiler=new Seadragon.Profiler();var minLevel=source.minLevel;var maxLevel=source.maxLevel;var tileSize=source.tileSize;var tileOverlap=source.tileOverlap;var normHeight=source.dimensions.y/source.dimensions.x;var cacheNumTiles={};var cachePixelRatios={};var tilesMatrix={};var tilesLoaded=[];var coverage={};var overlays=[];var lastDrawn=[];var lastResetTime=0;var midUpdate=false;var updateAgain=true;this.elmt=container;this.profiler=profiler;(function(){canvas.style.width="100%";canvas.style.height="100%";canvas.style.position="absolute";container.appendChild(canvas);})();function getNumTiles(level){if(!cacheNumTiles[level]){cacheNumTiles[level]=source.getNumTiles(level);}
return cacheNumTiles[level];}
function getPixelRatio(level){if(!cachePixelRatios[level]){cachePixelRatios[level]=source.getPixelRatio(level);}
return cachePixelRatios[level];}
function getTile(level,x,y,time){if(!tilesMatrix[level]){tilesMatrix[level]={};}
if(!tilesMatrix[level][x]){tilesMatrix[level][x]={};}
if(!tilesMatrix[level][x][y]){var bounds=source.getTileBounds(level,x,y);var exists=source.tileExists(level,x,y);var url=source.getTileUrl(level,x,y);tilesMatrix[level][x][y]=new Tile(level,x,y,bounds,exists,url);}
var tile=tilesMatrix[level][x][y];tile.lastTouchTime=time;return tile;}
function loadTile(tile,time){tile.loading=imageLoader.loadImage(tile.url,Seadragon.Utils.createCallback(null,onTileLoad,tile,time));}
function onTileLoad(tile,time,image){tile.loading=false;if(midUpdate){Seadragon.Debug.error("Tile load callback in middle of drawing routine.");return;}else if(!image){Seadragon.Debug.log("Tile "+tile+" failed to load: "+tile.url);tile.exists=false;return;}else if(time<lastResetTime){Seadragon.Debug.log("Ignoring tile "+tile+" loaded before reset: "+tile.url);return;}
tile.loaded=true;tile.image=image;var insertionIndex=tilesLoaded.length;if(tilesLoaded.length>=QUOTA){var cutoff=Math.ceil(Math.log(tileSize)/Math.log(2));var worstTile=null;var worstTileIndex=-1;for(var i=tilesLoaded.length-1;i>=0;i--){var prevTile=tilesLoaded[i];if(prevTile.level<=cutoff||prevTile.beingDrawn){continue;}else if(!worstTile){worstTile=prevTile;worstTileIndex=i;continue;}
var prevTime=prevTile.lastTouchTime;var worstTime=worstTile.lastTouchTime;var prevLevel=prevTile.level;var worstLevel=worstTile.level;if(prevTime<worstTime||(prevTime==worstTime&&prevLevel>worstLevel)){worstTile=prevTile;worstTileIndex=i;}}
if(worstTile&&worstTileIndex>=0){worstTile.unload();insertionIndex=worstTileIndex;}}
tilesLoaded[insertionIndex]=tile;updateAgain=true;}
function clearTiles(){tilesMatrix={};tilesLoaded=[];}
function providesCoverage(level,x,y){if(!coverage[level]){return false;}
if(x===undefined||y===undefined){var rows=coverage[level];for(var i in rows){if(rows.hasOwnProperty(i)){var cols=rows[i];for(var j in cols){if(cols.hasOwnProperty(j)&&!cols[j]){return false;}}}}
return true;}
return(coverage[level][x]===undefined||coverage[level][x][y]===undefined||coverage[level][x][y]===true);}
function isCovered(level,x,y){if(x===undefined||y===undefined){return providesCoverage(level+1);}else{return(providesCoverage(level+1,2*x,2*y)&&providesCoverage(level+1,2*x,2*y+1)&&providesCoverage(level+1,2*x+1,2*y)&&providesCoverage(level+1,2*x+1,2*y+1));}}
function setCoverage(level,x,y,covers){if(!coverage[level]){Seadragon.Debug.error("Setting coverage for a tile before its "+"level's coverage has been reset: "+level);return;}
if(!coverage[level][x]){coverage[level][x]={};}
coverage[level][x][y]=covers;}
function resetCoverage(level){coverage[level]={};}
function compareTiles(prevBest,tile){if(!prevBest){return tile;}
if(tile.visibility>prevBest.visibility){return tile;}else if(tile.visibility==prevBest.visibility){if(tile.distance<prevBest.distance){return tile;}}
return prevBest;}
function getOverlayIndex(elmt){for(var i=overlays.length-1;i>=0;i--){if(overlays[i].elmt==elmt){return i;}}
return-1;}
function updateActual(){updateAgain=false;var _canvas=canvas;var _context=context;var _container=container;var _useCanvas=useCanvas;var _lastDrawn=lastDrawn;while(_lastDrawn.length>0){var tile=_lastDrawn.pop();tile.beingDrawn=false;}
_canvas.innerHTML="";if(_useCanvas){var viewportSize=viewport.getContainerSize();_canvas.width=viewportSize.x;_canvas.height=viewportSize.y;_context.clearRect(0,0,viewportSize.x,viewportSize.y);}
var viewportBounds=viewport.getBounds(true);var viewportTL=viewportBounds.getTopLeft();var viewportBR=viewportBounds.getBottomRight();if(viewportBR.x<0||viewportBR.y<0||viewportTL.x>1||viewportTL.y>normHeight){return;}
var _getNumTiles=getNumTiles;var _getPixelRatio=getPixelRatio;var _getTile=getTile;var _isCovered=isCovered;var _setCoverage=setCoverage;var _resetCoverage=resetCoverage;var _providesCoverage=providesCoverage;var _tileOverlap=tileOverlap;var _abs=Math.abs;var _ceil=Math.ceil;var _floor=Math.floor;var _log=Math.log;var _max=Math.max;var _min=Math.min;var _deltaPixelsFromPoints=viewport.deltaPixelsFromPoints;var _pixelFromPoint=viewport.pixelFromPoint;var _getTileAtPoint=source.getTileAtPoint;var alwaysBlend=Seadragon.Config.alwaysBlend;var blendTimeMillis=1000*Seadragon.Config.blendTime;var immediateRender=Seadragon.Config.immediateRender;var minDimension=Seadragon.Config.minZoomDimension;viewportTL.x=_max(viewportTL.x,0);viewportTL.y=_max(viewportTL.y,0);viewportBR.x=_min(viewportBR.x,1);viewportBR.y=_min(viewportBR.y,normHeight);var best=null;var haveDrawn=false;var currentTime=new Date().getTime();var viewportCenter=_pixelFromPoint(viewport.getCenter());var zeroRatioT=_deltaPixelsFromPoints(_getPixelRatio(0),false).x;var optimalPixelRatio=immediateRender?1:zeroRatioT;var lowestLevel=_max(minLevel,_floor(_log(minDimension)/_log(2)));var zeroRatioC=_deltaPixelsFromPoints(_getPixelRatio(0),true).x;var highestLevel=_min(maxLevel,_floor(_log(zeroRatioC/MIN_PIXEL_RATIO)/_log(2)));lowestLevel=_min(lowestLevel,highestLevel);for(var level=highestLevel;level>=lowestLevel;level--){var drawLevel=false;var renderPixelRatioC=_deltaPixelsFromPoints(_getPixelRatio(level),true).x;if((!haveDrawn&&renderPixelRatioC>=MIN_PIXEL_RATIO)||level==lowestLevel){drawLevel=true;haveDrawn=true;}else if(!haveDrawn){continue;}
_resetCoverage(level);var levelOpacity=_min(1,(renderPixelRatioC-0.5)/0.5);var renderPixelRatioT=_deltaPixelsFromPoints(_getPixelRatio(level),false).x;var levelVisibility=optimalPixelRatio/_abs(optimalPixelRatio-renderPixelRatioT);var tileTL=_getTileAtPoint(level,viewportTL);var tileBR=_getTileAtPoint(level,viewportBR);var numTiles=_getNumTiles(level);var numX=_min(tileBR.x,numTiles.x-1);var numY=_min(tileBR.y,numTiles.y-1);for(var x=tileTL.x;x<=numX;x++){for(var y=tileTL.y;y<=numY;y++){var tile=_getTile(level,x,y,currentTime);var drawTile=drawLevel;_setCoverage(level,x,y,false);if(!tile.exists){continue;}
if(haveDrawn&&!drawTile){if(_isCovered(level,x,y)){_setCoverage(level,x,y,true);}else{drawTile=true;}}
if(!drawTile){continue;}
var boundsTL=tile.bounds.getTopLeft();var boundsSize=tile.bounds.getSize();var positionC=_pixelFromPoint(boundsTL,true);var sizeC=_deltaPixelsFromPoints(boundsSize,true);if(!_tileOverlap){sizeC=sizeC.plus(new Seadragon.Point(1,1));}
var positionT=_pixelFromPoint(boundsTL,false);var sizeT=_deltaPixelsFromPoints(boundsSize,false);var tileCenter=positionT.plus(sizeT.divide(2));var tileDistance=viewportCenter.distanceTo(tileCenter);tile.position=positionC;tile.size=sizeC;tile.distance=tileDistance;tile.visibility=levelVisibility;if(tile.loaded){if(!tile.blendStart){tile.blendStart=currentTime;}
var deltaTime=currentTime-tile.blendStart;var opacity=_min(1,deltaTime/blendTimeMillis);if(alwaysBlend){opacity*=levelOpacity;}
tile.opacity=opacity;_lastDrawn.push(tile);if(opacity==1){_setCoverage(level,x,y,true);}else if(deltaTime<blendTimeMillis){updateAgain=true;}}else if(tile.loading){}else{best=compareTiles(best,tile);}}}
if(_providesCoverage(level)){break;}}
for(var i=_lastDrawn.length-1;i>=0;i--){var tile=_lastDrawn[i];if(_useCanvas){tile.drawCanvas(_context);}else{tile.drawHTML(_canvas);}
tile.beingDrawn=true;}
var numOverlays=overlays.length;for(var i=0;i<numOverlays;i++){var overlay=overlays[i];var bounds=overlay.bounds;overlay.position=_pixelFromPoint(bounds.getTopLeft(),true);overlay.size=_deltaPixelsFromPoints(bounds.getSize(),true);overlay.drawHTML(container);}
if(best){loadTile(best,currentTime);updateAgain=true;}}
this.addOverlay=function(elmt,loc,placement){var elmt=Seadragon.Utils.getElement(elmt);if(getOverlayIndex(elmt)>=0){return;}
overlays.push(new Overlay(elmt,loc,placement));updateAgain=true;};this.updateOverlay=function(elmt,loc,placement){var elmt=Seadragon.Utils.getElement(elmt);var i=getOverlayIndex(elmt);if(i>=0){overlays[i].update(loc,placement);updateAgain=true;}};this.removeOverlay=function(elmt){var elmt=Seadragon.Utils.getElement(elmt);var i=getOverlayIndex(elmt);if(i>=0){overlays[i].destroy();overlays.splice(i,1);updateAgain=true;}};this.clearOverlays=function(){while(overlays.length>0){overlays.pop().destroy();updateAgain=true;}};this.needsUpdate=function(){return updateAgain;};this.numTilesLoaded=function(){return tilesLoaded.length;};this.reset=function(){clearTiles();lastResetTime=new Date().getTime();updateAgain=true;};this.update=function(){profiler.beginUpdate();midUpdate=true;updateActual();midUpdate=false;profiler.endUpdate();};this.idle=function(){};};})();(function(){var SIGNAL="----seadragon----";var browser=Seadragon.Utils.getBrowser();var Anchor={NONE:0,TOP_LEFT:1,TOP_RIGHT:2,BOTTOM_RIGHT:3,BOTTOM_LEFT:4};Seadragon.ControlAnchor=Anchor;function addToAnchor(elmt,anchor,container){if(anchor==Anchor.TOP_RIGHT||anchor==Anchor.BOTTOM_RIGHT){container.insertBefore(elmt,container.firstChild);}else{container.appendChild(elmt);}}
function Control(elmt,anchor,container){var wrapper=Seadragon.Utils.makeNeutralElement("span");this.elmt=elmt;this.anchor=anchor;this.container=container;this.wrapper=wrapper;wrapper.style.display="inline-block";wrapper.appendChild(elmt);if(anchor==Anchor.NONE){wrapper.style.width=wrapper.style.height="100%";}
addToAnchor(wrapper,anchor,container);}
Control.prototype.destroy=function(){this.wrapper.removeChild(this.elmt);this.container.removeChild(this.wrapper);};Control.prototype.isVisible=function(){return this.wrapper.style.display!="none";};Control.prototype.setVisible=function(visible){this.wrapper.style.display=visible?"inline-block":"none";};Control.prototype.setOpacity=function(opacity){if(this.elmt[SIGNAL]&&browser==Seadragon.Browser.IE){Seadragon.Utils.setElementOpacity(this.elmt,opacity,true);}else{Seadragon.Utils.setElementOpacity(this.wrapper,opacity,true);}}
var FULL_PAGE="fullpage";var HOME="home";var ZOOM_IN="zoomin";var ZOOM_OUT="zoomout";var REST="_rest.png";var GROUP="_grouphover.png";var HOVER="_hover.png";var DOWN="_pressed.png";function makeNavControl(viewer){var group=null;var zooming=false;var zoomFactor=null;var lastZoomTime=null;function onHome(){if(viewer.viewport){viewer.viewport.goHome();}}
function onFullPage(){viewer.setFullPage(!viewer.isFullPage());group.emulateExit();if(viewer.viewport){viewer.viewport.ensureVisible();}}
function beginZoomingIn(){lastZoomTime=new Date().getTime();zoomFactor=Seadragon.Config.zoomPerSecond;zooming=true;scheduleZoom();}
function beginZoomingOut(){lastZoomTime=new Date().getTime();zoomFactor=1.0/Seadragon.Config.zoomPerSecond;zooming=true;scheduleZoom();}
function endZooming(){zooming=false;}
function scheduleZoom(){window.setTimeout(doZoom,10);}
function doZoom(){if(zooming&&viewer.viewport){var currentTime=new Date().getTime();var deltaTime=currentTime-lastZoomTime;var adjustedFactor=Math.pow(zoomFactor,deltaTime/1000);viewer.viewport.zoomBy(adjustedFactor);viewer.viewport.ensureVisible();lastZoomTime=currentTime;scheduleZoom();}}
function doSingleZoomIn(){if(viewer.viewport){zooming=false;viewer.viewport.zoomBy(Seadragon.Config.zoomPerClick/1.0);viewer.viewport.ensureVisible();}}
function doSingleZoomOut(){if(viewer.viewport){zooming=false;viewer.viewport.zoomBy(1.0/Seadragon.Config.zoomPerClick);viewer.viewport.ensureVisible();}}
function lightUp(){group.emulateEnter();group.emulateExit();}
function url(prefix,postfix){return Seadragon.Config.imagePath+prefix+postfix;}
var zoomIn=new Seadragon.Button(Seadragon.Strings.getString("Tooltips.ZoomIn"),url(ZOOM_IN,REST),url(ZOOM_IN,GROUP),url(ZOOM_IN,HOVER),url(ZOOM_IN,DOWN),beginZoomingIn,endZooming,doSingleZoomIn,beginZoomingIn,endZooming);var zoomOut=new Seadragon.Button(Seadragon.Strings.getString("Tooltips.ZoomOut"),url(ZOOM_OUT,REST),url(ZOOM_OUT,GROUP),url(ZOOM_OUT,HOVER),url(ZOOM_OUT,DOWN),beginZoomingOut,endZooming,doSingleZoomOut,beginZoomingOut,endZooming);var goHome=new Seadragon.Button(Seadragon.Strings.getString("Tooltips.Home"),url(HOME,REST),url(HOME,GROUP),url(HOME,HOVER),url(HOME,DOWN),null,onHome,null,null,null);var fullPage=new Seadragon.Button(Seadragon.Strings.getString("Tooltips.FullPage"),url(FULL_PAGE,REST),url(FULL_PAGE,GROUP),url(FULL_PAGE,HOVER),url(FULL_PAGE,DOWN),null,onFullPage,null,null,null);group=new Seadragon.ButtonGroup([zoomIn,zoomOut,goHome,fullPage]);group.elmt[SIGNAL]=true;viewer.addEventListener("open",lightUp);return group.elmt;}
Seadragon.Viewer=function(container){var self=this;var parent=Seadragon.Utils.getElement(container);var container=Seadragon.Utils.makeNeutralElement("div");var canvas=Seadragon.Utils.makeNeutralElement("div");var placeholder=Seadragon.Utils.makeNeutralElement("div");var controlsTL=Seadragon.Utils.makeNeutralElement("div");var controlsTR=Seadragon.Utils.makeNeutralElement("div");var controlsBR=Seadragon.Utils.makeNeutralElement("div");var controlsBL=Seadragon.Utils.makeNeutralElement("div");var source=null;var drawer=null;var viewport=null;var profiler=null;var eventManager=new Seadragon.EventManager();var innerTracker=new Seadragon.MouseTracker(canvas);var outerTracker=new Seadragon.MouseTracker(container);var controls=[];var controlsShouldFade=true;var controlsFadeBeginTime=null;var navControl=null;var controlsFadeDelay=1000;var controlsFadeLength=2000;var controlsFadeBeginTime=null;var controlsShouldFade=false;var bodyWidth=document.body.style.width;var bodyHeight=document.body.style.height;var bodyOverflow=document.body.style.overflow;var docOverflow=document.documentElement.style.overflow;var fsBoundsDelta=new Seadragon.Point(1,1);var prevContainerSize=null;var lastOpenStartTime=0;var lastOpenEndTime=0;var animating=false;var forceRedraw=false;var mouseInside=false;this.elmt=container;this.source=null;this.drawer=null;this.viewport=null;this.profiler=null;function initialize(){var canvasStyle=canvas.style;var containerStyle=container.style;var controlsTLStyle=controlsTL.style;var controlsTRStyle=controlsTR.style;var controlsBRStyle=controlsBR.style;var controlsBLStyle=controlsBL.style;containerStyle.width="100%";containerStyle.height="100%";containerStyle.position="relative";container.style.left="0px";container.style.top="0px";container.style.fontFamily="Verdana";container.style.fontSize="10pt";canvasStyle.width="100%";canvasStyle.height="100%";canvasStyle.overflow="hidden";canvasStyle.position="absolute";canvasStyle.top="0px";canvasStyle.left="0px";controlsTLStyle.position=controlsTRStyle.position=controlsBRStyle.position=controlsBLStyle.position="absolute";controlsTLStyle.top=controlsTRStyle.top="0px";controlsTLStyle.left=controlsBLStyle.left="0px";controlsTRStyle.right=controlsBRStyle.right="0px";controlsBLStyle.bottom=controlsBRStyle.bottom="0px";innerTracker.clickHandler=onCanvasClick;innerTracker.dragHandler=onCanvasDrag;innerTracker.releaseHandler=onCanvasRelease;innerTracker.scrollHandler=onCanvasScroll;innerTracker.setTracking(true);navControl=makeNavControl(self);navControl.style.marginRight="4px";navControl.style.marginBottom="4px";self.addControl(navControl,Anchor.BOTTOM_RIGHT);outerTracker.enterHandler=onContainerEnter;outerTracker.exitHandler=onContainerExit;outerTracker.releaseHandler=onContainerRelease;outerTracker.setTracking(true);window.setTimeout(beginControlsAutoHide,1);container.appendChild(canvas);container.appendChild(controlsTL);container.appendChild(controlsTR);container.appendChild(controlsBR);container.appendChild(controlsBL);parent.appendChild(container);parent.appendChild(placeholder);}
function setMessage(message){canvas.innerHTML="";canvas.appendChild(Seadragon.Utils.makeCenteredNode(document.createTextNode(message)));}
function beforeOpen(){if(source){onClose();}
lastOpenStartTime=new Date().getTime();window.setTimeout(function(){if(lastOpenStartTime>lastOpenEndTime){setMessage(Seadragon.Strings.getString("Messages.Loading"));}},2000);return lastOpenStartTime;}
function onOpen(time,_source,error){lastOpenEndTime=new Date().getTime();if(time<lastOpenStartTime){Seadragon.Debug.log("Ignoring out-of-date open.");eventManager.trigger("ignore",self);return;}else if(!_source){setMessage(error);eventManager.trigger("error",self);return;}
canvas.innerHTML="";prevContainerSize=Seadragon.Utils.getElementSize(container);source=_source;viewport=new Seadragon.Viewport(prevContainerSize,source.dimensions);drawer=new Seadragon.Drawer(source,viewport,canvas);profiler=new Seadragon.Profiler();self.source=source;self.viewport=viewport;self.drawer=drawer;self.profiler=profiler;animating=false;forceRedraw=true;scheduleUpdate(updateMulti);eventManager.trigger("open",self);}
function onClose(){self.source=source=null;self.viewport=viewport=null;self.drawer=drawer=null;self.profiler=profiler=null;canvas.innerHTML="";}
function scheduleUpdate(updateFunc,prevUpdateTime){var currentTime=new Date().getTime();var prevUpdateTime=prevUpdateTime?prevUpdateTime:currentTime;var targetTime=prevUpdateTime+1000/Seadragon.Config.framesPerSecond;var deltaTime=animating?1:Math.max(1,targetTime-currentTime);return window.setTimeout(updateFunc,deltaTime);}
function updateOnce(){if(!source){return;}
profiler.beginUpdate();var containerSize=Seadragon.Utils.getElementSize(container);if(!containerSize.equals(prevContainerSize)){viewport.resize(containerSize,true);prevContainerSize=containerSize;eventManager.trigger("resize",self);}
var animated=viewport.update();if(!animating&&animated){eventManager.trigger("animationstart",self);abortControlsAutoHide();}
if(animated){drawer.update();eventManager.trigger("animation",self);}else if(forceRedraw||drawer.needsUpdate()){drawer.update();forceRedraw=false;}else{drawer.idle();}
if(animating&&!animated){eventManager.trigger("animationfinish",self);if(!mouseInside){beginControlsAutoHide();}}
animating=animated;profiler.endUpdate();}
function updateMulti(){if(!source){return;}
var beginTime=new Date().getTime();updateOnce();scheduleUpdate(arguments.callee,beginTime);}
function getControlIndex(elmt){for(var i=controls.length-1;i>=0;i--){if(controls[i].elmt==elmt){return i;}}
return-1;}
function scheduleControlsFade(){window.setTimeout(updateControlsFade,20);}
function updateControlsFade(){if(controlsShouldFade){var currentTime=new Date().getTime();var deltaTime=currentTime-controlsFadeBeginTime;var opacity=1.0-deltaTime/controlsFadeLength;opacity=Math.min(1.0,opacity);opacity=Math.max(0.0,opacity);for(var i=controls.length-1;i>=0;i--){controls[i].setOpacity(opacity);}
if(opacity>0){scheduleControlsFade();}}}
function abortControlsAutoHide(){controlsShouldFade=false;for(var i=controls.length-1;i>=0;i--){controls[i].setOpacity(1.0);}}
function beginControlsAutoHide(){if(!Seadragon.Config.autoHideControls){return;}
controlsShouldFade=true;controlsFadeBeginTime=new Date().getTime()+controlsFadeDelay;window.setTimeout(scheduleControlsFade,controlsFadeDelay);}
function onContainerEnter(tracker,position,buttonDownElmt,buttonDownAny){mouseInside=true;abortControlsAutoHide();}
function onContainerExit(tracker,position,buttonDownElmt,buttonDownAny){if(!buttonDownElmt){mouseInside=false;if(!animating){beginControlsAutoHide();}}}
function onContainerRelease(tracker,position,insideElmtPress,insideElmtRelease){if(!insideElmtRelease){mouseInside=false;if(!animating){beginControlsAutoHide();}}}
function onCanvasClick(tracker,position,quick,shift){if(viewport&&quick){var zoomPerClick=Seadragon.Config.zoomPerClick;var factor=shift?1.0/zoomPerClick:zoomPerClick;viewport.zoomBy(factor,viewport.pointFromPixel(position,true));viewport.ensureVisible();}}
function onCanvasDrag(tracker,position,delta,shift){if(viewport){viewport.panBy(viewport.deltaPointsFromPixels(delta.negate()));}}
function onCanvasRelease(tracker,position,insideElmtPress,insideElmtRelease){if(insideElmtPress&&viewport){viewport.ensureVisible();}}
function onCanvasScroll(tracker,position,delta,shift){if(viewport){var factor=Math.pow(Seadragon.Config.zoomPerScroll,delta);viewport.zoomBy(factor,viewport.pointFromPixel(position,true));viewport.ensureVisible();}}
this.isOpen=function(){return!!source;};this.openDzi=function(xmlUrl,xmlString){var currentTime=beforeOpen();Seadragon.DziTileSource.createFromXml(xmlUrl,xmlString,Seadragon.Utils.createCallback(null,onOpen,currentTime));};this.openTileSource=function(tileSource){var currentTime=beforeOpen();window.setTimeout(function(){onOpen(currentTime,tileSource);},1);};this.close=function(){if(!source){return;}
onClose();};this.addControl=function(elmt,anchor){var elmt=Seadragon.Utils.getElement(elmt);if(getControlIndex(elmt)>=0){return;}
var div=null;switch(anchor){case Anchor.TOP_RIGHT:div=controlsTR;elmt.style.position="relative";break;case Anchor.BOTTOM_RIGHT:div=controlsBR;elmt.style.position="relative";break;case Anchor.BOTTOM_LEFT:div=controlsBL;elmt.style.position="relative";break;case Anchor.TOP_LEFT:div=controlsTL;elmt.style.position="relative";break;case Anchor.NONE:default:div=container;elmt.style.position="absolute";break;}
controls.push(new Control(elmt,anchor,div));};this.removeControl=function(elmt){var elmt=Seadragon.Utils.getElement(elmt);var i=getControlIndex(elmt);if(i>=0){controls[i].destroy();controls.splice(i,1);}};this.clearControls=function(){while(controls.length>0){controls.pop().destroy();}};this.getNavControl=function(){return navControl;};this.isDashboardEnabled=function(){for(var i=controls.length-1;i>=0;i--){if(controls[i].isVisible()){return true;}}
return false;};this.isFullPage=function(){return container.parentNode==document.body;};this.isMouseNavEnabled=function(){return innerTracker.isTracking();};this.isVisible=function(){return container.style.visibility!="hidden";};this.setDashboardEnabled=function(enabled){for(var i=controls.length-1;i>=0;i--){controls[i].setVisible(enabled);}};this.setFullPage=function(fullPage){if(fullPage==self.isFullPage()){return;}
var body=document.body;var bodyStyle=body.style;var docStyle=document.documentElement.style;var containerStyle=container.style;var canvasStyle=canvas.style;if(fullPage){bodyOverflow=bodyStyle.overflow;docOverflow=docStyle.overflow;bodyStyle.overflow="hidden";docStyle.overflow="hidden";bodyWidth=bodyStyle.width;bodyHeight=bodyStyle.height;bodyStyle.width="100%";bodyStyle.height="100%";canvasStyle.backgroundColor="black";canvasStyle.color="white";containerStyle.position="fixed";containerStyle.zIndex="99999999";body.appendChild(container);prevContainerSize=Seadragon.Utils.getWindowSize();onContainerEnter();}else{bodyStyle.overflow=bodyOverflow;docStyle.overflow=docOverflow;bodyStyle.width=bodyWidth;bodyStyle.height=bodyHeight;canvasStyle.backgroundColor="";canvasStyle.color="";containerStyle.position="relative";containerStyle.zIndex="";parent.insertBefore(container,placeholder);prevContainerSize=Seadragon.Utils.getElementSize(parent);onContainerExit();}
if(viewport){var oldBounds=viewport.getBounds();viewport.resize(prevContainerSize);var newBounds=viewport.getBounds();if(fullPage){fsBoundsDelta=new Seadragon.Point(newBounds.width/oldBounds.width,newBounds.height/oldBounds.height);}else{viewport.update();viewport.zoomBy(Math.max(fsBoundsDelta.x,fsBoundsDelta.y),null,true);}
forceRedraw=true;eventManager.trigger("resize",self);updateOnce();}};this.setMouseNavEnabled=function(enabled){innerTracker.setTracking(enabled);};this.setVisible=function(visible){container.style.visibility=visible?"":"hidden";};this.addEventListener=function(eventName,handler){eventManager.addListener(eventName,handler);};this.removeEventListener=function(eventName,handler){eventManager.removeListener(eventName,handler);};initialize();};})();Seadragon.Config.imagePath="http://seadragon.com/ajax/0.8/img/";

ArtQuiver.Events = {};

ArtQuiver.Events.addItemEvent = function(item_id, slug, session_authenticity_token) {
    new Ajax.Request('/event/add_item_event', {
	    parameters: ('item_id=' + item_id + '&event_slug=' + slug + '&authenticity_token=' + session_authenticity_token )
	});
};

ArtQuiver.Events.Ticker = {};
ArtQuiver.Events.Ticker.paused = false;
ArtQuiver.Events.Ticker.requestingNewData = false;
ArtQuiver.Events.Ticker.animating = false;
ArtQuiver.Events.Ticker.sessionAuthenticityToken = null;
ArtQuiver.Events.Ticker.size = 'large';

ArtQuiver.Events.Ticker.initialize = function(sessionAuthenticityToken, size) {
    ArtQuiver.Events.Ticker.sessionAuthenticityToken = sessionAuthenticityToken;
    ArtQuiver.Events.Ticker.size = size;
    ArtQuiver.Events.Ticker.tick.delay(2);
    $$('div.feed-item').each(function(f) {
	    f.onmouseover = function() {f.addClassName('selected')};
	    f.onmouseout = function() {f.removeClassName('selected')};
	});
};

ArtQuiver.Events.Ticker.pausePlay = function() {
    $('play_pause').toggleClassName('paused');
    if (ArtQuiver.Events.Ticker.paused) {
	ArtQuiver.Events.Ticker.paused = false;
    } else {
	ArtQuiver.Events.Ticker.paused = true;
    }
};

ArtQuiver.Events.Ticker.pause = function() {
    $('play_pause').addClassName('paused');
    ArtQuiver.Events.Ticker.paused = true;
};

ArtQuiver.Events.Ticker.rewindOne = function() {
    if (ArtQuiver.Events.Ticker.rewinding) {
	return;
    }
    ArtQuiver.Events.Ticker.pause();
    ArtQuiver.Events.Ticker.moveOne(true);
};

ArtQuiver.Events.Ticker.moveOne = function(rewind) {
    if (ArtQuiver.Events.Ticker.animating) {
	return true;
    }

    ArtQuiver.Events.Ticker.animating = true;
    $('item-highlight-border').setStyle({zIndex: 99});
    var currentlyHighlightedItem = $$('div.feed-panel div.highlighted').first();
    var newItem = null;
    var moveOffset = 0;
    moveOffset = ArtQuiver.Events.Ticker.size == 'large' ? (190+14+14) : (125 + 8 + 8 + 4);
    if (rewind) {
	newItem = currentlyHighlightedItem.previous('div.feed-item');
	if (currentlyHighlightedItem.previousSiblings().length < 4) {
	    ArtQuiver.Events.Ticker.animating = false;
	    return false;
	}
    } else {
	newItem = currentlyHighlightedItem.next('div.feed-item');
	moveOffset = -moveOffset;
    }

    if (newItem) {
	$$('div.feed-panel div.highlighted').each(function(h){h.removeClassName('highlighted');});
	if (rewind) {
	    newItem.addClassName('rewinding');
	} else {
	    newItem.addClassName('highlighting');
	}

	if (!rewind) {
	    $('feed_panel_0').setStyle({width: (($('feed_panel_0').getWidth() + 200)) + 'px'});
	}
	
	new Effect.Move('feed_panel_0', {x: moveOffset, y: 0, mode: 'relative'});
	new Effect.Morph(newItem, {backgroundColor: 'white'});
	new Effect.Tween('item-highlight-border', 1, 0, { queue: 'end' },function(p){
		newItem.addClassName('highlighted');
		$('item-highlight-border').setStyle({zIndex: 0});
		newItem.removeClassName('highlighting');
		newItem.removeClassName('rewinding');
		if (p == 0) {
		    (function () {ArtQuiver.Events.Ticker.animating = false;}).delay(0.1);
		}
	});

	return true;
    } else {
	ArtQuiver.Events.Ticker.animating = false;
	return false;
    }
};

ArtQuiver.Events.Ticker.tick = function() {

    if (ArtQuiver.Events.Ticker.paused) {
	ArtQuiver.Events.Ticker.tick.delay(2);
	return;
    }

    var currentlyHighlightedItem = $$('div.feed-panel div.highlighted').first();
    var feedItemsLeft = currentlyHighlightedItem.nextSiblings();
    if (feedItemsLeft.length < 2 && !ArtQuiver.Events.Ticker.requestingNewData) {
	ArtQuiver.Events.Ticker.requestNewData();
    }

    if (ArtQuiver.Events.Ticker.moveOne()) {
	ArtQuiver.Events.Ticker.tick.delay(5);
    } else {
	ArtQuiver.Events.Ticker.tick.delay(1);
    }

};

ArtQuiver.Events.Ticker.addToQuiver = function(itemId) {

    new Ajax.Request(
		     '/my_quiver/add?item_id=' + itemId, {
			 asynchronous:true,
			 evalScripts:true,
			 parameters: ('skip_disabling_buttons=1&authenticity_token=' 
				      + ArtQuiver.Events.Ticker.sessionAuthenticityToken),
			 onSuccess: function(transport) 
			 {
			     $$('a.add-to-quiver-' + itemId).each(function(l){l.hide();});
			     $$('a.in-quiver-' + itemId).each(function(l){l.show();});
			 }
		     });

};

ArtQuiver.Events.Ticker.requestNewData = function() {
    ArtQuiver.Events.Ticker.requestingNewData = true;
    new Ajax.Request('/right_now/next_strip', {
	    parameters: ('authenticity_token=' + ArtQuiver.Events.Ticker.sessionAuthenticityToken + '&size=' + ArtQuiver.Events.Ticker.size),
	    onFailure: function(transport) {
		ArtQuiver.Events.Ticker.requestingNewData = false;
	    },
	    onSuccess: function(transport) {
		$$('div#feed_panel_1 div.feed-item').each(function(newFeeditem) {
			newFeeditem.remove();
			$('feed_panel_0').insert(newFeeditem);
		    });
		$$('div.feed-item').each(function(f) {
			f.onmouseover = function() {f.addClassName('selected')};
			f.onmouseout = function() {f.removeClassName('selected')};
		    });
		ArtQuiver.Events.Ticker.requestingNewData = false;
	    }
    });
};

ArtQuiver.Item = {};

ArtQuiver.Item.voteForArtist = function(url, artist) {
    
    if (!ArtQuiver.Item.vote_window) {
	ArtQuiver.Item.vote_window = new lightwindow();
    }

    ArtQuiver.Item.vote_window.activateWindow({
	    href: url,
	    title: '',
	    type: 'page',
	    resizeSpeed: 10,
	    height: '400px',
	    width: '600px'});

    ArtQuiver.Tracking.trackEvent('item', 'vote_for', artist);
};


ArtQuiver.Item.Zoom = {};

Seadragon.Config.maxZoomPixelRatio = 1;
Seadragon.Config.minZoomDimension = 300;
Seadragon.Config.clickTimeThreshold = 500;
Seadragon.Config.zoomPerClick = 2;
Seadragon.Config.imagePath="/images/deep_zoom/";

ArtQuiver.Item.Zoom.show = function(main_zoom, action) {
    var act = 'zoom'
    if (action) {
	act = action;
    }
    ArtQuiver.Tracking.trackEvent('item', act, ArtQuiver.Item.currentItemLabel);

    if (!ArtQuiver.Item.Zoom.window) {
	ArtQuiver.Item.Zoom.window = new lightwindow();
    }

    $$('div#lightwindow_contents div.zoom-container').each(function(e) {e.remove()});
    ArtQuiver.Item.viewer = null;

    ArtQuiver.Item.Zoom.window.activateWindow({
	    href: '#zoom-content',
	    title: '',
	    type: 'inline',
	    height: '500px',
	    width: '950px'});

    ArtQuiver.Item.Zoom.switchTo.delay(4, main_zoom,  $$('div#lightwindow_contents a.main-zoom-thumb').first(), -1)

};

ArtQuiver.Item.Zoom.redisplayImagePosition = function() {
    if (ArtQuiver.Item.currentZoom.is_main_zoom) {
	x_scale = 220;
	y_scale = 154;
	border_allowance = 4;
	x_correction = ArtQuiver.Item.currentZoom.x_correction;
	y_correction = ArtQuiver.Item.currentZoom.y_correction;
    } else {
	x_scale = 100;
	y_scale = 100;
	border_allowance = 2;
	x_correction = 0;
	y_correction = 0;
    }
    c = ArtQuiver.Item.viewer.viewport.getBounds(true);
    z = ArtQuiver.Item.viewer.viewport.getZoom(true);
    i = (x_scale - (2 * x_correction))
    x = c.x * i  + x_correction;
    y = c.y * i + y_correction;
    w = i / z;
    h = (i /  ArtQuiver.Item.viewer.viewport.getAspectRatio())  / z;

    if (x < x_correction) {
	x = x_correction;
    }
    if (y < y_correction) {
	y = y_correction;
    }
    if (y < 0) {
	y = 0;
    }
    if ((x + w) > (x_scale - x_correction - border_allowance)) {
	w = x_scale - x_correction - x - border_allowance;
    }
    if ((y + h) > (y_scale - y_correction - border_allowance)) {
	h = y_scale - y_correction - y - border_allowance;
    }

    ArtQuiver.Item.currentImageHint.show();
    style = {left: x + 'px', top: y + 'px', width: w + 'px', height: h + 'px'};
    ArtQuiver.Item.currentImageHint.setStyle(style);
};

ArtQuiver.Item.Zoom.switchTo = function(zoom, element, index) {
    if (!ArtQuiver.Item.viewer) {
	ArtQuiver.Item.viewport = $(element).up('div.zoom-container').down('div.zoom-viewport')
	ArtQuiver.Item.viewer = new Seadragon.Viewer(ArtQuiver.Item.viewport);
	ArtQuiver.Item.viewer.clearControls();
	ArtQuiver.Item.navbar = ArtQuiver.Item.Zoom.makeNavBar(ArtQuiver.Item.viewer);
	ArtQuiver.Item.viewer.addControl(ArtQuiver.Item.navbar, Seadragon.ControlAnchor.NONE);
    }
    if (ArtQuiver.Item.currentImageHint) {
	ArtQuiver.Item.currentImageHint.hide();
    }
    ArtQuiver.Item.currentImageHint = $(element).down('span');
    ArtQuiver.Item.currentImage = $(element).down('img');
    ArtQuiver.Item.currentZoom = zoom;
    ArtQuiver.Item.viewer.openDzi(zoom.dzi);
    ArtQuiver.Item.viewer.addEventListener("animation", ArtQuiver.Item.Zoom.redisplayImagePosition);
    ArtQuiver.Item.viewer.addEventListener('resize', ArtQuiver.Item.Zoom.onResize);
    Element.setStyle(ArtQuiver.Item.navbar, {left:  (660 / 2 - 60) + 'px', top: (460 - 40) + 'px'});

    $$('div.detail-marker').each(function(e){e.hide()});
    $$('div.detail-marker-' + index).each(function(e){e.show()});

    ArtQuiver.Events.addItemEvent(
				  ArtQuiver.Item.Zoom.currentItemId,
				  (index == -1 ? 'zoom' : 'zoom_detail'),
				  ArtQuiver.Item.Zoom.currentAuthenticityToken);
};

ArtQuiver.Item.Zoom.onResize = function(viewer) {
    var size = viewer.viewport.getContainerSize();
    Element.setStyle(ArtQuiver.Item.navbar, {left:  (size.x / 2 - 60) + 'px', top: (size.y - 35) + 'px'});
};

ArtQuiver.Item.Zoom.makeNavBar = function(viewer) {

    var FULL_PAGE = "fullpage";
    var HOME = "home";
    var ZOOM_IN = "zoomin";
    var ZOOM_OUT = "zoomout";
    var REST = ".png";
    var GROUP = "_hover.png";
    var HOVER = "_hover.png";
    var DOWN = "_hover.png";

	var group = null;
	var zooming = false;
	var zoomFactor = null;
	var lastZoomTime = null;
	function onHome() {
	    if (viewer.viewport) {
		viewer.viewport.goHome();
	    }
	}
        function onFullPage() {
            viewer.setFullPage(!viewer.isFullPage());
            group.emulateExit();
            if (viewer.viewport) {
                viewer.viewport.ensureVisible();
            }
        }
	function beginZoomingIn() {
	    lastZoomTime = new Date().getTime();
	    zoomFactor = Seadragon.Config.zoomPerSecond;
	    zooming = true;
	    scheduleZoom();
	}
	function beginZoomingOut() {
	    lastZoomTime = new Date().getTime();
	    zoomFactor = 1.0 / Seadragon.Config.zoomPerSecond;
	    zooming = true;
	    scheduleZoom();
	}
	function endZooming() {
	    zooming = false;
	}
	function scheduleZoom() {
	    window.setTimeout(doZoom, 10);
	}
	function doZoom() {
	    if (zooming && viewer.viewport) {
		var currentTime = new Date().getTime();
		var deltaTime = currentTime - lastZoomTime;
		var adjustedFactor = Math.pow(zoomFactor, deltaTime / 1000);
		viewer.viewport.zoomBy(adjustedFactor);
		viewer.viewport.ensureVisible();
		lastZoomTime = currentTime;
		scheduleZoom();
	    }
	}
	function doSingleZoomIn() {
	    if (viewer.viewport) {
		zooming = false;
		viewer.viewport.zoomBy(Seadragon.Config.zoomPerClick / 1.0);
		viewer.viewport.ensureVisible();
	    }
	}
	function doSingleZoomOut() {
	    if (viewer.viewport) {
		zooming = false;
		zoom_before = viewer.viewport.getZoom();
		zoom_by = 1.0 / Seadragon.Config.zoomPerClick;
		new_zoom = zoom_before * zoom_by;
		if (new_zoom < 1 && zoom_before > 1) {
		    viewer.viewport.zoomTo(1);
		} else {
		    viewer.viewport.zoomBy(zoom_by);
		}
		viewer.viewport.ensureVisible();
	    }
	}
	function lightUp() {
	    group.emulateEnter();
	    group.emulateExit();
	}
	function url(prefix, postfix) {
	    u = '/images/deep_zoom/' + prefix + postfix;
	    return u;
	}
	var zoomIn = new Seadragon.Button(Seadragon.Strings.getString("Tooltips.ZoomIn"), url(ZOOM_IN, REST), url(ZOOM_IN, GROUP), url(ZOOM_IN, HOVER), url(ZOOM_IN, DOWN), beginZoomingIn, endZooming, doSingleZoomIn, beginZoomingIn, endZooming);
	var zoomOut = new Seadragon.Button(Seadragon.Strings.getString("Tooltips.ZoomOut"), url(ZOOM_OUT, REST), url(ZOOM_OUT, GROUP), url(ZOOM_OUT, HOVER), url(ZOOM_OUT, DOWN), beginZoomingOut, endZooming, doSingleZoomOut, beginZoomingOut, endZooming);
	var goHome = new Seadragon.Button(Seadragon.Strings.getString("Tooltips.Home"), url(HOME, REST), url(HOME, GROUP), url(HOME, HOVER), url(HOME, DOWN), null, onHome, null, null, null);
        var fullPage = new Seadragon.Button(Seadragon.Strings.getString("Tooltips.FullPage"), url(FULL_PAGE, REST), url(FULL_PAGE, GROUP), url(FULL_PAGE, HOVER), url(FULL_PAGE, DOWN), null, onFullPage, null, null, null);
	group = new Seadragon.ButtonGroup([zoomIn, zoomOut, goHome, fullPage]);

	return group.elmt;
};

ArtQuiver.ArtistVote = {};

ArtQuiver.ArtistVote.submitVote = function(url, authToken) {
    var params = 'authenticity_token=' + authToken;
    params = params + '&vote_email=' + $('vote_email').value;

    new Ajax.Request(url, {
	    parameters: params,
		asynchronous:true
		});
};

ArtQuiver.ArtistVote.startHinting = function(input, hint) {
    if(!input.hintText) {
	input.hintText = hint;

	on_click = function(e) {
	    var elem = e.element();
	    elem.removeClassName('hinting');
	    if (elem.value == elem.hintText) {
		elem.value = '';
	    }
	}

	input.observe('blur', function(e) {
		var elem = e.element();
		if (elem.value == elem.hintText || elem.value == '') {
		    elem.value = elem.hintText;
		    elem.addClassName('hinting');
		}
	    });
	
	input.observe('focus', function(e) {
		var elem = e.element();
		elem.removeClassName('hinting');
		if (elem.value == elem.hintText) {
		    elem.value = '';
		}
	});
	
	input.observe('click', on_click);
	on_click(
		 {
		     element: function() { return input;}
		 }
		 );
    }
};