// lightWindow.js v1.1//// Copyright (c) 2007 Einstein Industries// 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!");var lightWindow = Class.create();	lightWindow.prototype = {	//	//	Setup Variables	//	element : null,	contentToFetch : null,	boxOverFlow : 'hidden',	retroIE : null,	windowType : null,	animating : false,	scrollX : null,	scrollY : null,	imageArray : [],	preloadImage : null,	activeGallery : null,	activeImage : 0,	galleryDirection : null,	showDataToggle : false,	galleryToggle : false,	showTitleToggle : false,	//	//	Initialize the lightWindow.	//	initialize : function(options) {		this.options = Object.extend({			resizeSpeed : 9,			cushion : 10,			dimensions : {				image : {height : 250, width : 250},				page : {height : 250, width : 500},				inline : {height : 250, width : 500},				media : {height : 250, width : 250},				external : {height : 250, width : 250},				dataHeight : 40,				titleHeight : 25			},			classNames : {					standard : 'lWOn',				action : 'lWAction'			},			fileTypes : {				page : ['htm', 'html', 'rhtml', 'phtml', 'txt', 'php', 'shtml', 'php4', 'php3', 'php', 'php5', 'asp', 'aspx', 'vbs', 'pl', 'cgi', 'rb'],				media : ['mpg', 'mp4', 'avi', 'mov', 'mp3', 'aif', 'wmv', 'wav', 'mpeg', 'flv', 'aiff', 'aac', 'ac3', 'asf', 'divx', 'qt', 'rm', 'ram', 'swf', 'wma', 'moov'],				image : ['png', 'jpg', 'gif', 'bmp', 'tiff']			},			loadingDialog : {				message : 'Loading',				image :  'http://www.billalbertsauto.com/images/lightWindow/ajax-loading.gif',				options : '<a onclick="javascript: mylightWindow.deactivate();">Cancel</a>',				delay : 3.0			},			authorLead : 'by ',			galleryTab : {				name : 'Galleries',				height : 20,				visible : true			},			overlay : {				color : '#000000',				opacity : 70,				image : 'http://www.billalbertsauto.com/images/lightWindow/black-70.png'			},			formMethod : 'get',			hideFlash : true,			showTitleBar : true		}, options || {})		this.duration = ((11-this.options.resizeSpeed)*0.15);		this.setupLinks();		this.addLightWindowMarkup(false);		this.setupDimensions(true);	},	// 	//  Set Links Up	//	setupLinks : function () {		var links = $$('.'+this.options.classNames.standard);		links.each(function(link) {			if (this.fileType(link.href) == 'image') {				if (gallery = this.getGalleryInfo(link.rel)) {					if (!this.imageArray[gallery[0]]) this.imageArray[gallery[0]] = new Array();					if (!this.imageArray[gallery[0]][gallery[1]]) this.imageArray[gallery[0]][gallery[1]] = new Array();					this.imageArray[gallery[0]][gallery[1]].push(new Array(link.href, link.getAttribute('title'), link.getAttribute('caption'), link.getAttribute('author'), link.getAttribute('rel'), link.getAttribute('params')));				}			}			var url = link.getAttribute('href');			if (link.href.indexOf('?') > -1) url = url.substring(0, url.indexOf('?'));			container = url.substring(url.indexOf('#')+1);			if($(container)) $(container).style.display = 'none';			Event.observe(link, 'click', this.activate.bindAsEventListener(this, link));			link.onclick = function() {return false;};		}.bind(this));		},	//	//  Initialize specific window	//	initializeWindow : function (id) {		var link = $(id);		if (this.fileType(link.href) == 'image') {			if (gallery = this.getGalleryInfo(link.rel)) {				if (!this.imageArray[gallery[0]]) this.imageArray[gallery[0]] = new Array();				if (!this.imageArray[gallery[0]][gallery[1]]) this.imageArray[gallery[0]][gallery[1]] = new Array();				this.imageArray[gallery[0]][gallery[1]].push(new Array(link.href, link.getAttribute('title'), link.getAttribute('caption'), link.getAttribute('author'), link.getAttribute('rel'), link.getAttribute('params')));			}		}		var url = link.getAttribute('href');		if (link.href.indexOf('?') > -1) url = url.substring(0, url.indexOf('?'));		container = url.substring(url.indexOf('#')+1);		if($(container)) $(container).style.display = 'none';		Event.observe(link, 'click', this.activate.bindAsEventListener(this, link));		link.onclick = function() {return false;};	},	//	//	Add the markup to the page.	//	addLightWindowMarkup : function(rebuild) {	    if (!rebuild) {			var overlay = document.createElement('div');			overlay.setAttribute('id', 'overlay');			if (this.checkBrowser('mac') && this.checkBrowser('firefox')) {		    	overlay.style.backgroundImage = 'url('+this.options.overlay.image+')';			    overlay.style.backgroundRepeat = 'repeat';			} else {				overlay.style.backgroundColor = this.options.overlay.color;			    overlay.style.MozOpacity = '.'+this.options.overlay.opacity;			    overlay.style.opacity = '.'+this.options.overlay.opacity;			    overlay.style.filter = 'alpha(opacity='+this.options.overlay.opacity+')';			}			var lw = document.createElement('div');			lw.setAttribute('id', 'lightWindow');		} else {			var lw = $('lightWindow');		}		if (this.options.showTitleBar) lw = this.addTitleBarMarkup(lw);						var lwc = document.createElement('div');		lwc.setAttribute('id', 'lightWindow-contents');				var lwcc = document.createElement('div');		lwcc.setAttribute('id', 'lightWindow-contents-container');		lwc.appendChild(lwcc);														var lwl = document.createElement('div');		lwl.setAttribute('id', 'lightWindow-loading');		var lwi = document.createElement('img');		lwi.setAttribute('src', this.options.loadingDialog.image);		lwl.appendChild(lwi);		var lwld = document.createElement('span');		lwld.setAttribute('id', 'lightWindow-loading-message');		lwld.innerHTML += this.options.loadingDialog.message;		lwl.appendChild(lwld);				var lwlo = document.createElement('span');		lwlo.setAttribute('id', 'lightWindow-loading-options');		lwlo.setAttribute('style', 'display:none;');		lwlo.innerHTML += this.options.loadingDialog.options;		lwl.appendChild(lwlo);				lwc.appendChild(lwl);				lw.appendChild(lwc);				if (!rebuild) {			var body = document.getElementsByTagName('body')[0];			body.appendChild(overlay);			body.appendChild(lw);				Event.observe(overlay, 'click', this.deactivate.bindAsEventListener(this), false);			overlay.onclick = function() {return false;};		}		this.addDataWindowMarkup();		this.actions('#lightWindow-loading-options');	},	//	//	Add the Title Bar Markup	//	addTitleBarMarkup : function(lw) {			var lwdt = document.createElement('div');		lwdt.setAttribute('id', 'lightWindow-title-bar');		lwdt.style.display = 'none';		var lwdtt = document.createElement('div');		lwdtt.setAttribute('id', 'lightWindow-title-bar-title');		lwdt.appendChild(lwdtt);						var lwdtc = document.createElement('div');		lwdtc.setAttribute('id', 'lightWindow-title-bar-close');		var lwdtca = document.createElement('a');		lwdtca.setAttribute('id', 'lightWindow-title-bar-close-link');		lwdtca.innerHTML = 'close';		Event.observe(lwdtca, 'click', this.deactivate.bindAsEventListener(this));		lwdtca.onclick = function() {return false;};		lwdtc.appendChild(lwdtca);		lwdt.appendChild(lwdtc);				lw.appendChild(lwdt);		return lw;			},	//	//	Add the Data Window Markup	//	addDataWindowMarkup : function() {		var lw = $('lightWindow');				var lwd = document.createElement('div');		lwd.setAttribute('id', 'lightWindow-data');			lwd.style.display = 'none';		// This container needs to be here to get the data slide to slide as a group		var lwds = document.createElement('div');		lwds.setAttribute('id', 'lightWindow-data-slide');				if (!this.options.showTitleBar) {			var lwdt = document.createElement('div');			lwdt.setAttribute('id', 'lightWindow-data-title');				lwds.appendChild(lwdt);		}				var lwdc = document.createElement('div');		lwdc.setAttribute('id', 'lightWindow-data-caption');			lwds.appendChild(lwdc);						var lwda = document.createElement('div');		lwda.setAttribute('id', 'lightWindow-data-author');			lwds.appendChild(lwda);						var lwdi = document.createElement('div');		lwdi.setAttribute('id', 'lightWindow-data-image');			lwds.appendChild(lwdi);		lwd.appendChild(lwds);		lw.appendChild(lwd);	},	//	//	Add Photo Window Markup	//	addPhotoWindowMarkup : function() {		var lwc = $('lightWindow-contents');				var lwpc = document.createElement('div');		lwpc.setAttribute('id', 'lightWindow-photo-container');		lwpc.style.display = 'none';				if (images = parseInt(this.getParam('lWShowImages'))) {			for (var x = 0; x < images; x++) {				lwp = document.createElement('img');	    		lwp.setAttribute('id', 'lightWindow-photo-'+x);	    		lwpc.appendChild(lwp);			}		} else {			lwp = document.createElement('img');    		lwp.setAttribute('id', 'lightWindow-photo-0');    		lwpc.appendChild(lwp);		}				// You ask why I do this?  I ask why you insist on using a browser worse than IE? ...Safari!		lwps = document.createElement('img');		lwps.setAttribute('id', 'lightWindow-photo-sizer');		lwps.style.display = 'none';		lwps.style.height = '1px';			lwpc.appendChild(lwps);    	lwc.appendChild(lwpc);	},	//	//	Add Gallery Window Markup	//	addGalleryWindowMarkup : function() {		var lwpc = $('lightWindow-photo-container');		var lwpg = document.createElement('div');		lwpg.setAttribute('id', 'lightWindow-photo-galleries');		lwpg.style.display = 'none';		if (!this.options.galleryTab.visible) lwpg.style.visibility = 'hidden';				var lwptc = document.createElement('div');		lwptc.setAttribute('id', 'lightWindow-photo-tab-container');				var lwpgt = document.createElement('a');		lwpgt.setAttribute('id', 'lightWindow-photo-galleries-tab');		lwpgt.className = 'up';		lwpgt.innerHTML = this.options.galleryTab.name;		Event.observe(lwpgt, 'click', this.getGallery.bindAsEventListener(this));		lwpgt.onclick = function() {return false;};				lwptc.appendChild(lwpgt);		lwpg.appendChild(lwptc);								var lwpgl = document.createElement('div');		lwpgl.setAttribute('id', 'lightWindow-photo-galleries-list');			lwpg.appendChild(lwpgl);    	lwpc.appendChild(lwpg);	},	//	//	Activate the lightWindow.	//	activate : function(e, link){		link.blur();		this.element = link;		this.element.title = link.getAttribute('title');		this.element.author = link.getAttribute('author');		this.element.caption = link.getAttribute('caption');		this.element.rel = link.getAttribute('rel');		this.element.params = this.element.getAttribute('params');		this.windowType = this.fileType(this.contentToFetch = link.href);		if (this.element.caption || this.element.author) this.showDataToggle = true;		if (this.options.showTitleBar && this.element.title) this.showTitleToggle = true;		else if (!this.options.showTitleBar && this.element.title) this.showDataToggle = true;		if (this.getGalleryInfo(this.element.rel)) this.galleryToggle = true;		this.prepareIE(true);		this.toggleTroubleElements('hidden', false);		this.displayLightWindow(true);		this.setupDimensions(true);		this.monitorKeyboard(true);			this.loadInfo();		},	//	//	Turn off the window	//	deactivate : function(){		var queue = Effect.Queues.get('lightWindowAnimation').each(function(e) {e.cancel();});		queue = Effect.Queues.get('lightWindowAnimation-loading').each(function(e) {e.cancel();});		if ($('lightWindow-iframe')) Element.remove($('lightWindow-iframe'));		Element.remove($('lightWindow-contents'));		if ($('lightWindow-data')) Element.remove($('lightWindow-data'));		if ($('lightWindow-title-bar')) Element.remove($('lightWindow-title-bar'));		this.displayLightWindow(false);			this.boxOverFlow = 'hidden';		this.prepareIE(false);		this.setStatus(false);		this.showDataToggle = this.galleryToggle = this.showTitleToggle = false;		this.addLightWindowMarkup(true);		this.setupDimensions(true);		this.monitorKeyboard(false);		this.toggleTroubleElements('visible', false);			},	//	//	Setup our actions	//	actions : function(prefix) {		if (prefix) links = $$(prefix+' .'+this.options.classNames.action);		else links = $$('.'+this.options.classNames.action);		links.each(function(link) {			Event.observe(link, 'click', this[link.rel].bindAsEventListener(this, link), false);			link.onclick = function() {return false;};		}.bind(this));	},	//	//	Set the staus of our animation to keep things from getting clunky	//	setStatus : function(status) {		this.animating = status;		// We have to put this here to avoid a flicker in FF Mac		if (this.showTitleToggle && !status && $('lightWindow-title-bar')) {			$('lightWindow-title-bar').setStyle({ 				display : 'block' 			});		}	},	//	//	Setup Dimensions of lightWindow.	//	setupDataDimensions : function() {		if ($('lightWindow-contents') && $('lightWindow-data') && this.showDataToggle) {			$('lightWindow-data').setStyle({				height : this.options.dimensions.dataHeight+'px',		  		width : (parseFloat($('lightWindow-contents').style.width)+this.options.cushion*2)+'px'			});			$('lightWindow-data-slide').setStyle({				height : this.options.dimensions.dataHeight+'px',		  		overflow : 'hidden' // Because of IE			});		}			if (this.showTitleToggle && $('lightWindow-title-bar')) {			$('lightWindow-title-bar').setStyle({				height : this.options.dimensions.titleHeight+'px',	  			width : (parseFloat($('lightWindow-contents').style.width)+this.options.cushion*2)+'px'			});		}	},	//	//	Setup Dimensions of lightWindow.	//	setupDimensions : function(reset) {		if (this.showDataToggle || (this.galleryToggle && this.options.galleryTab.visible)) var adjust = this.options.dimensions.dataHeight;		else var adjust = 0;		var originalHeight, originalWidth, titleHeight;		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;						}		if (this.showTitleToggle) titleHeight = this.options.dimensions.titleHeight-1; // We subtract one to smooth out the hiccup when the title bar is added		else titleHeight = 0;				if (reset) {			if (parseFloat($('lightWindow-contents').style.height) != originalHeight) {				$('lightWindow-contents').setStyle({					top : titleHeight+'px',				  	width : (originalWidth+this.options.cushion)+'px',				  	height : (originalHeight+this.options.cushion)+'px'				});			} else {				$('lightWindow-contents').setStyle({				  	width : (originalWidth+this.options.cushion)+'px',				  	height : (originalHeight+this.options.cushion)+'px'				});			}			$('lightWindow').setStyle({				padding : '0 0 0 0',			  	width : '0px',			  	height : '0px',						margin : (-(((originalHeight+this.options.cushion*3)/2)+(adjust/2)+(titleHeight/2)))+'px 0 0 '+(-((originalWidth+this.options.cushion*3)/2))+'px'			});		} else {			$('lightWindow').setStyle({				padding : parseFloat($('lightWindow-contents').style.height)+2*this.options.cushion+titleHeight+'px 0 0 0',	  			width : '0px',	  			height : '0px',				margin : (-(((parseFloat($('lightWindow-contents').style.height)+this.options.cushion*2)/2)+(adjust/2)+(titleHeight/2)))+'px 0 0 '+(-((parseFloat($('lightWindow-contents').style.width)+this.options.cushion*2)/2))+'px'			});			if (parseFloat($('lightWindow-contents').style.height) != originalHeight) {				$('lightWindow-contents').setStyle({					top : titleHeight+'px',					left : '0px'				});			}		}	}, 	// 	// Setup the Overlay (Special Thanks to quirksmode.com and huddletogether.com)	//	setupOverlay : 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){			pageHeight = windowHeight;		} else { 			pageHeight = yScroll;		}		if(xScroll < windowWidth){				pageWidth = windowWidth;		} else {			pageWidth = xScroll;		}				$('overlay').style.height = pageHeight;		$('overlay').style.width = pageWidth;	},  	//	//	Display the lightWindow.	//	displayLightWindow : function(display) {		if (display) {			$('overlay').style.display = $('lightWindow').style.display = $('lightWindow-contents').style.display = 'block';			} else {			$('overlay').style.display = $('lightWindow').style.display = 'none'; 			}	},  	//	//	Is this IE?	//	checkBrowser : function(type) {		var detect = navigator.userAgent.toLowerCase();		var version = parseInt(navigator.appVersion);		var place = detect.indexOf(type)+1;		return place;	},	//	//	Prepare the window for IE.	//	prepareIE : function(setup) {		if (this.checkBrowser('msie')) {			var height, overflowX, overflowY;			if (setup) { 				this.getScroll();				this.setScroll(0, 0);				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;			html.style.margin = body.style.margin = '0';			this.setupOverlay();			if (!setup) this.setScroll(this.scrollX, this.scrollY);						}	},	//	//	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 scroll for the page.	//	getScroll : function(){      	if(typeof(window.pageYOffset) == 'number') {        	this.scrollY = window.pageYOffset;        	this.scrollX = window.pageXOffset;      	} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {        	this.scrollY = document.body.scrollTop;        	this.scrollX = document.body.scrollLeft;      	} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {        	this.scrollY = document.documentElement.scrollTop;        	this.scrollX = document.documentElement.scrollLeft;      	}	},	//	//	Reset the scroll.	//	setScroll : function(x, y) {		document.documentElement.scrollLeft = x; 		document.documentElement.scrollTop = y; 	},	//	//	Get the value from the params attribute string.	//	getParam : function(strParamName, strParams) {        if (!strParams) {			if (this.element.params) strParams = this.element.params;			else return;		}		var strReturn;        var aQueryString = strParams.split(',');        var cmpstring = strParamName+'=';        var cmplen = cmpstring.length;        for (var iParam = 0; iParam < aQueryString.length; iParam++) {        	if (aQueryString[iParam].substr(0, cmplen) == cmpstring) {            	var aParam = aQueryString[iParam].split('=');                strReturn = aParam[1];                break;            }        }		if (!strReturn) return false;        else return unescape(strReturn);    },	//	//	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 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;	},	//	//	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 || !this.galleryToggle) return;		switch (String.fromCharCode(keycode).toLowerCase()) {			case 'p':				this.galleryDirection = -1;				this.changeImage();				break;							case 'n':				this.galleryDirection = 1;				this.changeImage();				break;							default:				break;		}	},  	//	//	Make the Data Box for the Window	//	showData : function() {		if (this.galleryToggle) $('lightWindow-photo-galleries').style.display = 'block';		this.setupDataDimensions();		this.setupDimensions(false);				if (this.showDataToggle) {			var showDatabox = new Effect.Parallel(				[new Effect.SlideDown( 'lightWindow-data', {sync: true, duration: this.duration+1.0, from: 0.0, to: 1.0}), 			 	new Effect.Appear('lightWindow-data', {sync: true, duration: 1.0}) ], 				{duration: 0.65, afterFinish: this.setStatus.bind(this, false), queue: {position: 'end', scope: 'lightWindowAnimation'} } 			);		} else {			 this.setStatus(false);		}	},	//	//	Insert Data into Window	//	insertData : function() {		if (this.element.title) {			if (this.showTitleToggle) $('lightWindow-title-bar-title').innerHTML = this.element.title; 			else $('lightWindow-data-title').innerHTML = this.element.title;		}		if (this.element.caption) $('lightWindow-data-caption').innerHTML = this.element.caption;		if (this.element.author) $('lightWindow-data-author').innerHTML = this.options.authorLead+this.element.author;		},	//	//	Reset the scroll.	//	getGalleryInfo : function(rel) {		if (rel.indexOf('[') > -1) {			return new Array(escape(rel.substring(0, rel.indexOf('['))), escape(rel.substring(rel.indexOf('[')+1, rel.indexOf(']'))));		} else {			return false;		}	},	// 	//	Choose a gallery/category	//	getGallery : function() {		var isBadBrowser = this.checkBrowser('msie 6');		if (!$('lightWindow-photo-galleries').style.height || parseInt($('lightWindow-photo-galleries').style.height) == this.options.galleryTab.height) {			if (isBadBrowser) {				var gallerySize = 100;			} else {				var gallerySize = ((parseInt($('lightWindow-contents').style.height)*0.95)/this.options.galleryTab.height)*100;			}						$('lightWindow-photo-galleries-list').setStyle({				height : (parseInt($('lightWindow-contents').style.height)*0.95)-this.options.galleryTab.height+'px'			});			// Get out Galleries from the imageArray			$('lightWindow-photo-galleries-list').innerHTML = '';			var output = '';			for (i in this.imageArray) {				if (typeof this.imageArray[i] == 'object') {					output += '<div class="lightWindow-photo-gallery-listing"><h1>'+unescape(i)+'</h1><ul>';					for (j in this.imageArray[i]) {						if (typeof this.imageArray[i][j] == 'object') {							if (this.imageArray[i][j][0][5]) showImages = ',lWShowImages='+this.getParam('lWShowImages', this.imageArray[i][j][0][5]);							else showImages = '';							output += '<li><a href="#" params="lWGallery='+escape(i)+',lWCategory='+escape(j)+''+showImages+'" class="'+this.options.classNames.action+'" rel="reloadGallery" >'+unescape(j)+'</a></li>';						}					}					output += '</ul></div>';				}			}			new Insertion.Top('lightWindow-photo-galleries-list', output);			this.actions('.lightWindow-photo-gallery-listing');			// IE CSS support sucks and I cannot scale from the bottom....			if (isBadBrowser) {				$('lightWindow-photo-galleries').setStyle({					height : (parseInt($('lightWindow-contents').style.height)*0.95)+'px',					bottom : '0px'				});								$('lightWindow-photo-galleries-tab').className = 'down';			} else {				var showGalleries = new Effect.CushionScale('lightWindow-photo-galleries', gallerySize, {duration: this.duration, afterFinish: function(){$('lightWindow-photo-galleries-list').style.overflow = 'auto'; $('lightWindow-photo-galleries-tab').className = 'down';}, scaleX: false, scaleY: true, scaleContent: false, scaleFromCenter: false, queue: {position: 'end', scope: 'lightWindowAnimation'}});					}		} else {			if (isBadBrowser) {				var bottom = -(parseInt($('lightWindow-contents').style.height)*0.95)+this.options.galleryTab.height;						} else {				var bottom = 0;			}						$('lightWindow-photo-galleries').setStyle({				height : this.options.galleryTab.height+'px',				bottom : bottom+'px',				top : ''			});			$('lightWindow-photo-galleries-list').setStyle({				overflow : 'hidden'			});			$('lightWindow-photo-galleries-tab').className = 'up';		}	},	//	//	Set the gallery up.	//	setupGallery : function(gallery, start) 	{		var lwc = $('lightWindow-photo-container');		if (!(images = parseInt(this.getParam('lWShowImages')))) images = 1;						for (var x = 0; x < this.imageArray[gallery[0]][gallery[1]].length; x++) {			if (this.imageArray[gallery[0]][gallery[1]][x][0] == this.contentToFetch) break;		}		this.activeImage = x;		this.activeGallery = gallery;				var lwn = document.createElement("div");		lwn.setAttribute('id','lightWindow-navigation');		lwc.appendChild(lwn);						if (x != 0 && this.imageArray[gallery[0]][gallery[1]][x-images]) {			var lwnp = document.createElement("a");			lwnp.setAttribute('id','lightWindow-previous');			lwnp.setAttribute('href','#');			lwn.appendChild(lwnp);			Event.observe(lwnp, 'click', this.changeImage.bindAsEventListener(this, this.imageArray[gallery[0]][gallery[1]][x-images][0], this.imageArray[gallery[0]][gallery[1]][x-images][1], this.imageArray[gallery[0]][gallery[1]][x-images][2], this.imageArray[gallery[0]][gallery[1]][x-images][3], this.imageArray[gallery[0]][gallery[1]][x-images][4]));			lwnp.onclick = function(){return false;};		}		if ((x+1) < this.imageArray[gallery[0]][gallery[1]].length && this.imageArray[gallery[0]][gallery[1]][x+images]) {			var lwnn = document.createElement("a");			lwnn.setAttribute('id','lightWindow-next');			lwnn.setAttribute('href','#');			lwn.appendChild(lwnn);			Event.observe(lwnn, 'click', this.changeImage.bindAsEventListener(this, this.imageArray[gallery[0]][gallery[1]][x+images][0], this.imageArray[gallery[0]][gallery[1]][x+images][1], this.imageArray[gallery[0]][gallery[1]][x+images][2], this.imageArray[gallery[0]][gallery[1]][x+images][3], this.imageArray[gallery[0]][gallery[1]][x+images][4]));			lwnn.onclick = function(){return false;};		}			if (images == 1) $('lightWindow-data-image').innerHTML = 'Image '+(x+1)+' of '+this.imageArray[gallery[0]][gallery[1]].length;		this.addGalleryWindowMarkup();	},	//	//	Get the contents for the window	//	loadInfo : function() {			var showLoadingOptions = new Effect.Appear('lightWindow-loading-options', {delay: this.options.loadingDialog.delay, duration: this.duration, queue: {position: 'front', scope: 'lightWindowAnimation-loading'}});		switch (this.windowType) {			case 'image' :				this.preloadImage = new Array();				if (!$('lightWindow-photo-container')) {					this.addPhotoWindowMarkup();					this.addDataWindowMarkup();					this.addGalleryWindowMarkup();				}				var totalWidth = 0;				var totalHeight = 0;				var gallery = this.getGalleryInfo(this.element.rel);				if (images = parseInt(this.getParam('lWShowImages'))) {					for (var z = 0; z < this.imageArray[gallery[0]][gallery[1]].length; z++) {						if (this.imageArray[gallery[0]][gallery[1]][z][0] == this.contentToFetch) break;					}					$('lightWindow-photo-container').style.display = 'none';					this.loading = images-1;					for (var x = 0; x < images; x++) {						if (this.imageArray[gallery[0]][gallery[1]][x+z]) {							this.preloadImage[x] = new Image();							this.preloadImage[x].onload=function(){								if ($('lightWindow-photo-container').style.display != 'block') {									for (var t = 0; t <= x; t++) {										if (this.preloadImage[t] && (this.preloadImage[t].width != 0 && this.preloadImage[t].height != 0)) {											totalWidth = totalWidth+this.preloadImage[t].width;											totalHeight = this.preloadImage[t].height;											this.preloadImage.splice(t, 1);											this.loading--;											}									}									if (this.loading < 0) {										$('lightWindow-photo-container').setStyle({											display : 'block'										});										$('lightWindow-photo-sizer').setStyle({											width : totalWidth+'px',											height : totalHeight+'px'										});										this.processInfo();									}								}							}.bind(this, x);							this.preloadImage[x].src = $('lightWindow-photo-'+x).src = this.imageArray[gallery[0]][gallery[1]][x+z][0];						}					}					this.activeImage = this.activeImage+x-1;					if (this.galleryToggle) this.setupGallery(this.getGalleryInfo(this.element.rel));				} else {					this.preloadImage[0] = new Image();					this.preloadImage[0].onload=function(){						totalWidth = this.preloadImage[0].width;						totalHeight = this.preloadImage[0].height;						$('lightWindow-photo-container').setStyle({							display : 'block'						});						$('lightWindow-photo-sizer').setStyle({							width : totalWidth+'px',							height : totalHeight+'px'						});						this.processInfo();					}.bind(this);					this.preloadImage[0].src = $('lightWindow-photo-0').src = this.contentToFetch;					if (this.galleryToggle) this.setupGallery(this.getGalleryInfo(this.element.rel));				}				break;						case 'media' :					// Don't question it.... damn safari				var lwi = '<iframe id="lightWindow-iframe" name="lightWindow-iframe" height="100%" width="100%" frameborder="0" scrolling="no"></iframe>';				new Insertion.Top($('lightWindow-contents'), lwi);				parent.$('lightWindow-iframe').style.visibility = 'hidden';					this.processInfo();				break;			case 'external' :					// Don't question it.... damn safari				var lwi = '<iframe id="lightWindow-iframe" name="lightWindow-iframe" height="100%" width="100%" frameborder="0" scrolling="auto"></iframe>';				new Insertion.Top($('lightWindow-contents'), lwi);				parent.$('lightWindow-iframe').style.visibility = 'hidden';				this.processInfo();				break;								case 'page' :				var newAJAX = new Ajax.Request(        			this.contentToFetch,        			{method: 'get', parameters: '', onComplete: this.processInfo.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-container'), $(content).innerHTML);				this.toggleTroubleElements('hidden', true); 				this.processInfo();				break;							default : 				throw('Page Type could not be determined, please amend this lightWindow URL '+this.contentToFetch);				break;			}	},	//	//	Finish the loading process and clean up.	//	loadFinish : function() {		this.actions();			this.insertData(false);		switch (this.windowType) {			case 'page' :				var hideLoading = new Effect.Fade('lightWindow-loading', {duration: this.duration, afterFinish: this.windowAdjust.bind(this), queue: {position: 'end', scope: 'lightWindowAnimation'}});				break;			case 'image' :				var hideLoading = new Effect.Fade('lightWindow-loading', {duration: this.duration, afterFinish: this.windowAdjust.bind(this), queue: {position: 'end', scope: 'lightWindowAnimation'}});				break;							case 'media' :				parent.$('lightWindow-iframe').src = this.contentToFetch;				var hideLoading = new Effect.Fade('lightWindow-loading', {duration: this.duration, afterFinish: this.windowAdjust.bind(this), queue: {position: 'end', scope: 'lightWindowAnimation'}});				break;						case 'external' : 				parent.$('lightWindow-iframe').src = this.contentToFetch;				var hideLoading = new Effect.Fade('lightWindow-loading', {duration: this.duration, afterFinish: this.windowAdjust.bind(this), queue: {position: 'end', scope: 'lightWindowAnimation'}});				break;							case 'inline' :				var hideLoading = new Effect.Fade('lightWindow-loading', {duration: this.duration, afterFinish: this.windowAdjust.bind(this), queue: {position: 'end', scope: 'lightWindowAnimation'}});				break;							default :				break;		}	},		// 	//  Adjust the Window and add the data box if it needs it	//	windowAdjust : function() {		if (this.windowType == 'external' || this.windowType == 'media') {			// No I don't like this but it works with a small flicker, FF for the Mac is a little more buggy than I would have thought			// Of Note this is really for the quicktime samples as far as I can tell....			if (this.checkBrowser('mac') && this.checkBrowser('firefox')) {				if ($('overlay').style.height == '100%' || !$('overlay').style.height) $('overlay').style.height = '101%';				else $('overlay').style.height = '100%';			}			parent.$('lightWindow-iframe').style.visibility = 'visible';		}		$('lightWindow-contents').style.overflow = this.boxOverFlow;		this.toggleTroubleElements('visible', true);		if (this.showDataToggle || this.showTitleToggle) {			this.showData();		}	},	//	//	Get the content into the window and show it off.	//	processInfo : function(response) {			if(this.checkBrowser('msie')) {            var windowHeight = document.documentElement.clientHeight;            var windowWidth = document.documentElement.clientWidth;           } else {            var windowHeight = window.innerHeight;            var windowWidth = window.innerWidth;        }		// What if the window size is ridiculously small? If so we need some overrides to make it fit and make it usable (even on set dimensions)		if (this.showDataToggle) var dataWindow = this.options.dimensions.dataHeight;		else var dataWindow = 0;		if (this.options.showTitleBar) titleHeight = this.options.dimensions.titleHeight;		else titleHeight = 0;		var lWcWidth = parseInt($('lightWindow-contents').style.width);		var lWcHeight = parseInt($('lightWindow-contents').style.height);		var availableHeight = windowHeight-dataWindow-2*this.options.cushion-titleHeight;		var availableWidth = windowWidth-2*this.options.cushion;      	var boxWidth, boxScrollWidth, boxHeight, boxScrollHeight, scaleX, scaleY;			var totalHeight = 0;		var totalWidth = 0;			switch (this.windowType) {			case 'image' :				if (!(images = parseInt(this.getParam('lWShowImages')))) images = 1;				boxWidth = $('lightWindow-contents').offsetWidth;				boxHeight = $('lightWindow-contents').offsetHeight;					if ($('lightWindow-photo-0').height > availableHeight) {					var totalWidth = 0;					for (var x = 0; x < images; x++) {						$('lightWindow-photo-'+x).height = availableHeight;						totalWidth = totalWidth+$('lightWindow-photo-'+x).width;					}					if (images > 1) totalWidth++; // This is needed for putting images side by side when we resize the iamge only					boxScrollHeight = availableHeight;					boxScrollWidth = totalWidth;					$('lightWindow-photo-sizer').style.height = availableHeight+'px';					$('lightWindow-photo-sizer').style.width = totalWidth+'px';				} else {					boxScrollHeight = parseInt($('lightWindow-photo-sizer').style.height);							boxScrollWidth = parseInt($('lightWindow-photo-sizer').style.width);				}				break;							case 'external' :						    	boxWidth = $('lightWindow-contents').offsetWidth;				boxHeight = $('lightWindow-contents').offsetHeight;							break;						case 'media' :							    boxWidth = $('lightWindow-contents').offsetWidth;				boxHeight = $('lightWindow-contents').offsetHeight;							break;								case 'page' :				new Insertion.Top($('lightWindow-contents-container'), response.responseText);				this.toggleTroubleElements('hidden', true); 				boxWidth = $('lightWindow-contents').offsetWidth;				boxScrollWidth = $('lightWindow-contents').scrollWidth;				boxHeight = $('lightWindow-contents').offsetHeight;				boxScrollHeight = $('lightWindow-contents').scrollHeight;				break;						case 'inline' :				boxWidth = $('lightWindow-contents').offsetWidth;				boxScrollWidth = $('lightWindow-contents').scrollWidth;				boxHeight = $('lightWindow-contents').offsetHeight;				boxScrollHeight = $('lightWindow-contents').scrollHeight+3;				break;								default : 				break;						}		// Were dimensions set?		// This also resizes to fit the window, for things like flash!		var ignorelWHeight = false;      	if (lWWidth = this.getParam('lWWidth')) {			boxScrollWidth = parseFloat(lWWidth);			if (boxScrollWidth > (windowWidth*.95)) {				tmp = boxScrollWidth;				boxScrollWidth = 0.90*windowWidth;				lWHeight = this.getParam('lWHeight'); // For this case I require a height to be set, why would you set width and not set height?				boxScrollHeight = parseFloat(lWHeight);				boxScrollHeight = boxScrollHeight * (boxScrollWidth/tmp)				ignorelWHeight = true;			}		}		if (lWHeight = this.getParam('lWHeight')) {			if (!ignorelWHeight) {				boxScrollHeight = parseFloat(lWHeight);				if (boxScrollHeight > (windowHeight*.8)) {					boxScrollHeight = 0.8*windowHeight;				}			}		}				if (lWOverflow = this.getParam('lWOverflow')) this.boxOverFlow = lWOverflow;		if ((boxScrollHeight < (windowHeight*.8)) && this.windowType != 'external' && this.windowType != 'image') {			scaleY = parseFloat((boxScrollHeight/boxHeight)*100);		} else if (this.windowType == 'external' && !lWHeight) {			scaleY = parseFloat((windowHeight/(1.2*boxHeight))*100);		} else if (this.windowType == 'external' && lWHeight) {			scaleY = parseFloat((boxScrollHeight/(boxHeight))*100);		} else if (this.windowType == 'image' || this.windowType == 'media') {			scaleY = parseFloat(((boxScrollHeight)/boxHeight)*100);		} else {			if (this.windowType != 'media') this.boxOverFlow = 'auto';			$('lightWindow-contents-container').marginRight = '16px';			scaleY = parseFloat((windowHeight/(1.2*boxHeight))*100);		}		if ((boxScrollWidth < (windowWidth*.8)) && this.windowType != 'external' && this.windowType != 'image' && this.windowType != 'media') {			scaleX = parseFloat(((boxScrollWidth)/boxWidth)*100);		} else if (this.windowType == 'external' && !lWWidth) {			scaleX = parseFloat((windowWidth/(1.1*boxWidth))*100);		} else if (this.windowType == 'external' && lWWidth) {			scaleX = parseFloat((boxScrollWidth/(boxWidth))*100);		} else if (this.windowType == 'image' || this.windowType == 'media') {			scaleX = parseFloat(((boxScrollWidth)/boxWidth)*100);		} else {			if (this.windowType != 'media') this.boxOverFlow = 'auto';			$('lightWindow-contents-container').marginRight = '16px';			scaleX = parseFloat((windowWidth/(1.1*boxWidth))*100);		}				this.setStatus(true);		var doDelay = 0;		if (scaleX != 100 && lWcWidth != boxScrollWidth) {			if (scaleY == 100) var doX = new Effect.CushionScale('lightWindow-contents', scaleX, {duration: this.duration, scaleX: true, scaleY: false, scaleCushion: {top: this.options.cushion, left: this.options.cushion}, afterFinish: this.loadFinish.bind(this), scaleFromCenter: true, scaleContent: false, queue: {position: 'front', scope: 'lightWindowAnimation'}});				else var doX = new Effect.CushionScale('lightWindow-contents', scaleX, {duration: this.duration, scaleX: true, scaleY: false, scaleCushion: {top: this.options.cushion, left: this.options.cushion}, scaleContent: false, scaleFromCenter: true, queue: {position: 'front', scope: 'lightWindowAnimation'}});				doDelay = this.duration/2;		}		if (scaleY != 100 && lWcHeight != boxScrollHeight) {			var doY = new Effect.CushionScale('lightWindow-contents', scaleY, {duration: this.duration, delay: doDelay, scaleX: false, scaleY: true, scaleCushion: {top: this.options.cushion, left: this.options.cushion}, afterFinish: this.loadFinish.bind(this), scaleContent: false, scaleFromCenter: true, queue: {position: 'end', scope: 'lightWindowAnimation'}});		}		if ((!doX && !doY) || (doX && scaleY != 100 && !doY)) this.loadFinish();		},		//	//	Reload the window with another location	//	reloadWindow : function(element) {		Element.remove($('lightWindow-contents'));		if ($('lightWindow-data')) Element.remove($('lightWindow-data'));		this.element = element;		this.contentToFetch = this.element.href;		this.addLightWindowMarkup(true);		this.setupDimensions(true);		this.displayLightWindow(true);		this.loadInfo();	},	//	//  Reload the Gallery	//	reloadGallery : function(e, link) {		this.element.params = link.getAttribute('params');		var gallery = this.getParam('lWGallery', this.element.params);		var category = this.getParam('lWCategory', this.element.paramse);		this.element.rel = this.imageArray[gallery][category][0][4];		this.element.title = this.imageArray[gallery][category][0][1];		this.element.caption = this.imageArray[gallery][category][0][2];		this.element.author = this.imageArray[gallery][category][0][3];		this.contentToFetch = this.imageArray[gallery][category][0][0];		Element.remove($('lightWindow-photo-container'));		if ($('lightWindow-data')) Element.remove($('lightWindow-data'));		if ($('lightWindow-title-bar')) $('lightWindow-title-bar').style.display = 'none';		this.galleryToggle = true;		this.activeGallery[0] = gallery		this.activeGallery[1] = category;		this.activeImage = 0;		// Becuase of IE we have to use either Appear or setOpacity/show		var showLoading = Effect.Appear('lightWindow-loading', {duration: 0, afterFinish: this.loadInfo.bind(this)});	},	//	//	Change the Image	//	changeImage : function(e) {	  	var data = $A(arguments);	  	data.shift();		if (data != '') {			this.contentToFetch = data[0];			this.element.title = data[1];			this.element.caption = data[2];			this.element.author = data[3];			this.element.rel = data[4];		} else {			if (!(images = parseInt(this.getParam('lWShowImages')))) images = 1;			if ((this.galleryDirection < 0 && (this.activeImage-1*images) < 0) || (this.galleryDirection > 0 && (this.activeImage+1*images) >= this.imageArray[this.activeGallery[0]][this.activeGallery[1]].length)) return false;			this.element.title = this.imageArray[this.activeGallery[0]][this.activeGallery[1]][this.activeImage+this.galleryDirection*images][1];			this.element.caption = this.imageArray[this.activeGallery[0]][this.activeGallery[1]][this.activeImage+this.galleryDirection*images][2];			this.element.author = this.imageArray[this.activeGallery[0]][this.activeGallery[1]][this.activeImage+this.galleryDirection*images][3];				this.element.params = this.imageArray[this.activeGallery[0]][this.activeGallery[1]][0][5];							this.element.rel = unescape(this.activeGallery[0]+'['+this.activeGallery[1]+']');						this.contentToFetch = this.imageArray[this.activeGallery[0]][this.activeGallery[1]][this.activeImage+this.galleryDirection*images][0];			this.activeImage = this.activeImage+this.galleryDirection*images;			}		// Preload the previous and next images		if ((this.activeImage-1) >= 0) {			var preloadNextImage = new Image();			preloadNextImage.src = this.imageArray[this.activeGallery[0]][this.activeGallery[1]][this.activeImage-1][0];		}		if ((this.activeImage+1) < this.imageArray[this.activeGallery[0]][this.activeGallery[1]].length) {			var preloadPrevImage = new Image();			preloadPrevImage.src = this.imageArray[this.activeGallery[0]][this.activeGallery[1]][this.activeImage+1][0];		}		Element.remove($('lightWindow-photo-container'));		if ($('lightWindow-data')) Element.remove($('lightWindow-data'));		if ($('lightWindow-title-bar')) $('lightWindow-title-bar').style.display = 'none';		this.galleryToggle = true;		$('lightWindow-loading-options').style.display = 'none';		// Becuase of IE we have to use either Appear or setOpacity/show		var showLoading = Effect.Appear('lightWindow-loading', {duration: 0, afterFinish: this.loadInfo.bind(this)});	},	//	//	Submit a form to another lightWindow	//	insertForm : function(e) {		var element = Event.element(e).parentNode;		var parameterString = Form.serialize(this.getParam('lWForm', element.getAttribute('params')));		if (this.options.formMethod == 'post') {			var newAJAX = new Ajax.Request(			    element.href,			    {method: 'post', postBody: parameterString, onComplete: this.reloadWindow.bind(this, element)}			);		} else if (this.options.formMethod == 'get') {			var newAJAX = new Ajax.Request(			    element.href,			    {method: 'get', parameters: parameterString, onComplete: this.reloadWindow.bind(this, element)}			);					}	}}/*-----------------------------------------------------------------------------------------------*/Event.observe(window, 'load', lightWindowInit, false);////	Set up all of our links//var mylightWindow = null;function lightWindowInit() {	mylightWindow = new lightWindow({galleryTab:{visible:false}});}/*-----------------------------------------------------------------------------------------------	Problem:		This effect does not take into account padding or a border on an element, especially an		absolutely position element. 		Added: 		Options:			scaleCushion: 0	// or {top, left} with provided values						Example:				scaleCushion: {top: 10, left: 10}				Code:			To setDimensions: function(height, width)							Original:		    		if(this.options.scaleY) d.top = this.originalTop-topd + 'px';	        		if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';													New:			    	if(this.options.scaleCushion == 'none') {		        		if(this.options.scaleY) d.top = this.originalTop-topd + 'px';		        		if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';					} else {			        	if(this.options.scaleY) d.top = (this.originalTop-topd-this.options.scaleCushion.top-this.options.scaleCushion.bottom) + 'px';			        	if(this.options.scaleX) d.left = (this.originalLeft-leftd-this.options.scaleCushion.right-this.options.scaleCushion.left) + 'px';							}			Credit: Kevin P Miller http://www.stickmanlabs.com-----------------------------------------------------------------------------------------------*/Effect.CushionScale = Class.create();Object.extend(Object.extend(Effect.CushionScale.prototype, Effect.Base.prototype), {  initialize: function(element, percent) {    this.element = $(element);    if(!this.element) throw(Effect._elementDoesNotExistError);    var options = Object.extend({      scaleX: true,      scaleY: true,      scaleContent: true,      scaleFromCenter: false,      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values      scaleFrom: 100.0,      scaleTo: percent,	  scaleCushion: 'none'	   // 'none' or {} with provided values    }, arguments[2] || {});    this.start(options);  },  setup: function() {    this.restoreAfterFinish = this.options.restoreAfterFinish || false;    this.elementPositioning = this.element.getStyle('position');        this.originalStyle = {};    ['top','left','width','height','fontSize'].each( function(k) {      this.originalStyle[k] = this.element.style[k];    }.bind(this));          this.originalTop  = this.element.offsetTop;    this.originalLeft = this.element.offsetLeft;        var fontSize = this.element.getStyle('font-size') || '100%';    ['em','px','%','pt'].each( function(fontSizeType) {      if(fontSize.indexOf(fontSizeType)>0) {        this.fontSize     = parseFloat(fontSize);        this.fontSizeType = fontSizeType;      }    }.bind(this));        this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;        this.dims = null;    if(this.options.scaleMode=='box')      this.dims = [this.element.offsetHeight, this.element.offsetWidth];    if(/^content/.test(this.options.scaleMode))      this.dims = [this.element.scrollHeight, this.element.scrollWidth];    if(!this.dims)      this.dims = [this.options.scaleMode.originalHeight,                   this.options.scaleMode.originalWidth];  },  update: function(position) {    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);    if(this.options.scaleContent && this.fontSize)      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);  },  finish: function(position) {    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);  },  setDimensions: function(height, width) {    var d = {};	if(this.options.scaleX) d.width = width + 'px';	if(this.options.scaleY) d.height = height + 'px';	if(this.options.scaleFromCenter) {      var topd  = (height - this.dims[0])/2;      var leftd = (width  - this.dims[1])/2;      if(this.elementPositioning == 'absolute') {	    if(this.options.scaleCushion == 'none') {        	if(this.options.scaleY) d.top = this.originalTop-topd + 'px';        	if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';		} else {        	if(this.options.scaleY) d.top = (this.originalTop-topd-this.options.scaleCushion.top) + 'px';        	if(this.options.scaleX) d.left = (this.originalLeft-leftd-this.options.scaleCushion.left) + 'px';					}      } else {        if(this.options.scaleY) d.top = -topd + 'px';        if(this.options.scaleX) d.left = -leftd + 'px';      }    }    this.element.setStyle(d);  }});