if (typeof Panagora != 'object' || typeof Panagora == 'undefined')
	var Panagora = {};
	
if (typeof console != 'object')
	var console = { log: function() {}, info: function() {} }

Panagora.CreateModalFromElement = function(content, toggleLink, options) {
	var InitializeModalWindow = function(e) {
		if (e)
			Event.stop(e); // stop click event
		
		if (typeof options != 'object') options = {};

		if (toggleLink == undefined)
			// if this is a once-only popup, kill it on hide
			options.callbacks = {
				hide: ShutDown
			};
		
		content.modalWindow = new Panagora.ModalWindow(options);
		
		// inject content
		content.modalWindow.SetContent(content);
		
		// go gadget!
		content.modalWindow.Show();
		
		if (typeof toggleLink == 'object')
		{
			// redefine click event from init to simple show
			Event.stopObserving(toggleLink, 'click', InitializeModalWindow);
			Event.observe(toggleLink, 'click', function(e) {
				Event.stop(e);
				content.modalWindow.Show();
			});
		}
	}
	
	var ShutDown = function() {
		content.modalWindow.ShutDown();
		content.modalWindow = null;
	}
	
	var options = options;
	
	// get elements if we only have ids
	content = $(content);
	toggleLink = $(toggleLink);
	
	Event.observe(window, 'load', function() {
		if (typeof toggleLink == 'object') {
			// we've been asked to set up a click event
			Event.observe(toggleLink, 'click', InitializeModalWindow);
		}
		else {
			// just do it, man!
			InitializeModalWindow();
		}
	});
}

Panagora.AddImageZoom = function(id, options) {
	var InitializeModalWindow = function(e) {
		Event.stop(e);
		
		// create modal window
		options.width = 0;
		options.height = 0;
		options.resizable = false;
		options.callbacks = {
			hide: ShutDown
		};
		link.modalWindow = new Panagora.ModalWindow(options);
		
		// create image element
		var image = new Element('img', { 'src' : '/images/wait.gif' });

		// load progress animation
		link.modalWindow.SetContent(image);

		
		// load big image
		img = new Image();
		img.onload = function() {
			Event.observe(img, 'click', ShutDown); // click to close
	
			// add image
			link.modalWindow.SetContent(img);
	
			// show window
			link.modalWindow.Show();
			
			// zoom controls
			// Event.observe(document, 'keyup', HandleKeyUp);
		}
		img.src = link.href;
		
		// create flash image viewer (shouldn't exist, but who knows?)
		// var elem = $('image_zoom_' + link.href) || new Element('div', { 'id' : 'image_zoom_' + link.href });
		/*
		// initialize flash
		elem.iz = new FlashObject('/lib/javascript/iz.swf', 'image_zoom_flash_' + link.href, link.modalWindow.GetContentWidth(), link.modalWindow.GetContentHeight(), '8', '#336699');
		elem.iz.addParam('wmode', 'transparent');
		elem.iz.addVariable('image', smallImgUrl);
		elem.iz.addVariable('imagebig', link.href);
		elem.iz.addVariable('imgW', link.modalWindow.GetContentWidth());
		elem.iz.addVariable('imgH', link.modalWindow.GetContentHeight());
		elem.iz.write('image_zoom_' + link.href);
		*/
		
	}
	
	/*
	var HandleKeyUp = function(e) {
		var arrowKeys = {
			189 : 'minus',
			187 : 'plus',
			109 : 'minus',
			107 : 'plus',
			61 : 'plus'
		};

		if (arrowKeys[e.keyCode]) {
			var dims = img.getDimensions();
			var change = 1;

			switch (arrowKeys[e.keyCode]) {
				case 'minus':
					change = 0.9;
					break;
				case 'plus':
					change = 1.1;
					break;
			}

	        var widthRatio = img.width / (img.width * change);
	        var heightRatio = img.height / (img.height * change);
	        
	        console.log(widthRatio, heightRatio, Math.max(widthRatio, heightRatio));
	        
	        var ratio = Math.max(widthRatio, heightRatio);
	        img.width = Math.floor(img.width / ratio);
	        img.height = Math.floor(img.height / ratio);
			
			link.modalWindow.ResizeContainer();
			link.modalWindow.PositionContainer();
		}
	}
	*/
	
	var ShutDown = function() {
		link.modalWindow.ShutDown();
		link.modalWindow = null;
	}

	// get link element
	var link = $(id);
	
	// declare img variable for later use
	var img;
	
	Event.observe(window, 'load', function() {
		Event.observe(link, 'click', InitializeModalWindow);
	});
}

Panagora.ModalWindow = function(options) {

	//
	// Renders the three containers
	//
	var RenderContainer = function() {
		
		// create position and size container
		outerContainer = new Element('div');
		outerContainer.style.position = 'absolute';
		outerContainer.style.visibility = 'hidden';
		outerContainer.style.zIndex = 1001;
		
		// create stylable container
		container = new Element('div', { 'class' : 'modal_container' });
		container.style.position = 'relative';
		container.style.width = '100%';
		container.style.height = '100%';
		outerContainer.appendChild(container);

		// create and append close button
		var close = new Element('div', { 'class' : 'modal_close' }).update('x');
		close.style.position = 'absolute';
		container.appendChild(close);
		Event.observe(close, 'click', Hide);
	
		// create and append inner container
		innerContainer = new Element('div');
		innerContainer.style.height = '100%';
		innerContainer.style.overflow = 'auto';
		container.appendChild(innerContainer);

		// append to body
		document.body.appendChild(outerContainer);
	}
	
	//
	// Renders the stylable (.modal_overlay) overlay
	//
	var RenderOverlay = function() {
		var elem = new Element('div', { 'id' : 'modal_overlay' });
		elem.style.visibility = 'hidden';

		// prepend to body
		document.body.insertBefore(elem, document.body.firstChild);
		
		return elem;
	}
	
	//
	// Fires on window resize
	//
	var ResizeHandler = function() {
		ResizeOverlay();
		if (options.resizable)
			ResizeContainer();
		PositionContainer();
	}
	
	//
	// Fires on window scroll, repositions overlay
	//
	var ScrollHandler = function() {
		var so = Panagora.GetScrollingOffset();
		modalOverlay.style.top = so.top + 'px';
		modalOverlay.style.left = so.left + 'px';
		
		if (customContent && customContent.getHeight() < Panagora.GetWindowSize().height)
			PositionContainer();
	}
	
	//
	// Resizes overlay to cover the page
	//
	var ResizeOverlay = function() {
		var wDims = Panagora.GetWindowSize();
		//var bDims = Panagora.GetBodySize();

		modalOverlay.style.width = '100%';
		modalOverlay.style.height = wDims.height + 'px';
	}
	
	//
	// Resizes the outer container according to options
	//
	var ResizeContainer = function() {
		var width, height;
		if (options.wFactor || options.hFactor) {
			// relative modal window size is prioritized

			var wDims = Panagora.GetWindowSize();
			options.width = wDims.width * (options.wFactor || 1);
			options.height = wDims.height * (options.hFactor || 1);
		}
		else if (options.hMargin > 0 || options.vMargin > 0) {
			// margins make your life easier
			
			var wDims = Panagora.GetWindowSize();
			
			if (options.hMargin)
				options.width = wDims.width - options.hMargin * 2;
			
			if (options.vMargin)
				options.height = wDims.height - options.vMargin * 2;
		}
		else if (dynamicSize && customContent && (!options.width || !options.height))
		{
			if (!options.width)
				width = customContent.offsetWidth; // getWidth();
			if (!options.height)
				height = customContent.offsetHeight; // getHeight();
		}
		else if (dynamicSize && !customContent)
		{
			if (!options.width)
				width = 100;
			if (!options.height)
				height = 100;
		}
		
		// use dimension options if we have 'em
		if (options.width) width = options.width;
		if (options.height) height = options.height;

		// size it!
		outerContainer.style.width = ((width) - containerPadding * 0) + 'px';
		outerContainer.style.height = ((height) - containerPadding * 0) + 'px';
	}
	this.ResizeContainer = ResizeContainer; // make public
	
	//
	// Centers the outer container
	//
	var PositionContainer = function() {
		var topPos = 0, leftPos = 0;
		var wDims = Panagora.GetWindowSize();
		var cDims;
		if (dynamicSize && customContent)
			cDims = customContent.getDimensions();
		else
			cDims = { width: options.width, height: options.height };
		leftPos = wDims.width / 2 - cDims.width / 2;
		topPos = wDims.height / 2 - cDims.height / 2;
		
		// we don't allow our modal windows to move outside the browser window
		if (leftPos < 0)
			leftPos = 0;
		if (topPos < 0)
			topPos = 0;

		var so = (customContent && customContent.getHeight() < Panagora.GetWindowSize().height) ? Panagora.GetScrollingOffset() : { top: 0, left: 0 };

		outerContainer.style.top = (so.top + topPos) + 'px';
		outerContainer.style.left = (so.left + leftPos) + 'px';
	}
	this.PositionContainer = PositionContainer; // make public
	
	//
	// Appends an element to the inner container
	//
	this.SetContent = function(content) {
		if (dynamicSize)
			outerContainer.style.visibility = 'hidden';
			
		innerContainer.innerHTML = '';
		innerContainer.appendChild(content);
		customContent = content;
		if (dynamicSize)
		{
			// we need a timeout for the rendering to catch up
			setTimeout(function() {
				ResizeContainer();
				PositionContainer();
				outerContainer.style.visibility = '';
			}, 20);
		}
	}

	//
	// Reveals the modal window
	//
	this.Show = function() {
		//modalOverlay.show();
		modalOverlay.style.visibility = '';
		//outerContainer.show();
		outerContainer.style.visibility = '';
		Event.observe(window, 'resize', ResizeHandler);
		Event.observe(window, 'scroll', ScrollHandler);

		if (document.all) // if ie
			// hide all selects
			$$('select').each(function(select) {
				if (!select.up('.modal_container') || select.up('.modal_container') != container) {
					select.style.visibility = 'hidden';
				}
			});

		// esc-key capturing
		Event.observe(document, 'keyup', HandleKeyUp);
		
		// callback
		if (typeof options.callbacks.show == 'function')
			options.callbacks.show();
			
		PositionContainer();
	}

	//
	// Hides the modal window
	//
	this.Hide = function() {
		//modalOverlay.hide();
		modalOverlay.style.visibility = 'hidden';
		//outerContainer.hide();
		outerContainer.style.visibility = 'hidden';

		if (document.all) // if ie
			// display all selects
			$$('select').each(function(select) {
				if (!select.up('.modal_container') || select.up('.modal_container') != container) {
					select.style.visibility = '';
				}
			});

		// remove esc-key capturing
		Event.stopObserving(document, 'keyup', HandleKeyUp);
		
		// callback
		if (typeof options.callbacks.hide == 'function')
			options.callbacks.hide();

	}
	
	//
	// Removes events and kills the modal window
	//
	this.ShutDown = function() {
		modalOverlay.parentNode.removeChild(modalOverlay);
		outerContainer.parentNode.removeChild(outerContainer);
		
		if (document.all) // if ie
			// display all selects
			$$('select').each(function(select) {
				if (!select.up('.modal_container') || select.up('.modal_container') != container) {
					select.style.visibility = '';
				}
			});

		// remove events
		Event.stopObserving(window, 'resize', ResizeHandler);
		Event.stopObserving(window, 'scroll', ScrollHandler);
		Event.stopObserving(document, 'keyup', HandleKeyUp);

		// callback
		if (typeof options.callbacks.shutDown == 'function')
			options.callbacks.shutDown();
	}
	
	//
	// Keypress handler
	//
	var HandleKeyUp = function(e) {
		if (e.keyCode == 27) // esc
			Hide();
	}
	
	var Hide = this.Hide;
	
	//
	// Returns the width of the inner container
	//
	this.GetContentWidth = function() {
		return innerContainer.getWidth();
	}

	//
	// Returns the height of the inner container
	//
	this.GetContentHeight = function() {
		return innerContainer.getHeight();
	}
	
	//
	// Initialize modal window object
	//
	
	// get the window size
	var wDims = Panagora.GetWindowSize();

	// prep containers
	var outerContainer, container, innerContainer, customContent;
	
	// option object
	if (typeof options != 'object')
		options = {};
		
	// callbacks are good for you
	if (typeof options.callbacks != 'object')
		options.callbacks = {};

	// default options
	options.resizable = typeof options.resizable == 'boolean' ? options.resizable : true;
	options.alwaysCenter = typeof options.alwaysCenter == 'boolean' ? options.resizable : true;
	options.vMargin = !isNaN(options.vMargin) ? options.vMargin : 0;
	options.hMargin = !isNaN(options.hMargin) ? options.hMargin : 0;
	options.width = options.width || 0;
	options.height = options.height || 0;
	dynamicSize = (!options.width && !options.height && !options.vMargin && !options.hMargin);
		
	// relative sizes (in percent) are possible
	if (typeof options.width == 'string' && options.width.search(/%$/) > -1) {
		options.wFactor = parseInt(options.width.replace(/[^\d]/g, '')) / 100;
		options.width = wDims.width * options.wFactor;
	}
	if (typeof options.height == 'string' && options.height.search(/%$/) > -1) {
		options.hFactor = parseInt(options.height.replace(/[^\d]/g, '')) / 100;
		options.height = wDims.height * options.hFactor;
	}

	// render and position everything
	var modalOverlay = $('modal_overlay') || RenderOverlay();
	ResizeOverlay();
	ScrollHandler(); // position overlay
	RenderContainer();

	// we need the padding to withdraw it from the container size
	var containerPadding = parseInt(container.getStyle('padding-left').replace(/[^\d]/g, '')) * 2;
	
	if (!dynamicSize)
	{
		ResizeContainer();
		PositionContainer();
	}
}

Panagora.GetWindowSize = function() {
	var x,y;
	if (document.body.offsetWidth && self.innerHeight) // all except Explorer
	{
		x = document.body.offsetWidth;
		//y = document.body.offsetHeight;
		//x = self.innerWidth;
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight)
		// Explorer 6 Strict Mode
	{
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}
	return { 'height': y, 'width': x };
}

Panagora.GetBodySize = function() {
	var x,y;
	var wDims = Panagora.GetWindowSize();
	x = document.body.offsetWidth;
	y = wDims.height > document.body.offsetHeight ? wDims.height : document.body.offsetHeight;
	return { 'height': y, 'width': x };
}

Panagora.GetScrollingOffset = function() {
	var x,y;
	if (self.pageYOffset) // all except Explorer
	{
		x = self.pageXOffset;
		y = self.pageYOffset;
	}
	else if (document.documentElement && document.documentElement.scrollTop)
		// Explorer 6 Strict
	{
		x = document.documentElement.scrollLeft;
		y = document.documentElement.scrollTop;
	}
	else if (document.body) // all other Explorers
	{
		x = document.body.scrollLeft;
		y = document.body.scrollTop;
	}
	return { left: x, top: y };
}
