function setupFloatingSitemap() 
{
	var nav           = $('#navigation');
	var topSitemap    = $('#top-sitemap-research');
	var bottomSitemap = $('#bottom-sitemap');
	var sections      = $('.section.research');

	var floatingSitemap = topSitemap
		.clone()
		  .attr({'id': 'floating-sitemap', 'class': 'sitemap'})
		  .find('*')
		    .removeAttr('id')
		  .end()
		  .css({'opacity': 0, 'display': 'none'})
		  .appendTo($('body'));

	var opacity = 0.0;

	var NAV_TOP    = nav.offset().top;
	var NAV_BOTTOM = NAV_TOP + nav.height();

	var TOP_SITEMAP_TOP    = topSitemap.offset().top;
	var TOP_SITEMAP_BOTTOM = $(sections[0]).offset().top;

	var BOTTOM_SITEMAP_TOP = bottomSitemap.offset().top;

	$(window).scroll(
		function() 
		{
			var BOTTOM_SITEMAP_TOP = bottomSitemap.offset().top; // need to recompute this due to imageswitcher!

			var viewportTop = $(window).scrollTop();
			var viewportBottom = viewportTop + $(window).height();

			var oldOpacity = opacity;

			var isSitemapVisible = (viewportTop < NAV_BOTTOM || viewportBottom > BOTTOM_SITEMAP_TOP);
			opacity = (isSitemapVisible)? 0.0 : 1.0;

			if (oldOpacity != opacity)
			{
				floatingSitemap.css({'display': 'block'});
				floatingSitemap.fadeTo(
					250, opacity, 
					function() 
					{
						if (opacity == 0) floatingSitemap.css('display', 'none');
					}
				);
			}
		}
	);
}

var ImageSwitcher = 
{
	elementsPerPage : 2,

	currentPage : [],
	totalPages  : [],
	viewports   : [],
	thumbs      : [],

	prev : function(ev)
	{
		var switcherNum = ev.data['switcherNum'];

		var newPageNum = ImageSwitcher.currentPage[switcherNum] - 1;
		if (newPageNum < 0) newPageNum = ImageSwitcher.totalPages[switcherNum] - 1

		ev.data['newPageNum'] = newPageNum;
		ImageSwitcher.goToPage(ev);

		return false;
	},

	next : function(ev)
	{
		var switcherNum = ev.data['switcherNum'];

		var newPageNum = ImageSwitcher.currentPage[switcherNum] + 1;
		if (newPageNum >= ImageSwitcher.totalPages[switcherNum]) newPageNum = 0;

		ev.data['newPageNum'] = newPageNum;
		ImageSwitcher.goToPage(ev);

		return false;
	},

	goToPage : function(ev)
	{
		var switcherNum = ev.data['switcherNum'];
		var newPageNum = ev.data['newPageNum'];

		var oldPage = ImageSwitcher.currentPage[switcherNum];
		ImageSwitcher._hidePage(switcherNum, oldPage);
		ImageSwitcher._showPage(switcherNum, newPageNum);

		ImageSwitcher.currentPage[switcherNum] = newPageNum;

		return false;
	},

	_hidePage : function(switcherNum, pageNum)
	{
		$(ImageSwitcher.viewports[switcherNum].children()[pageNum]).hide();
		$(ImageSwitcher.thumbs[switcherNum].children()[pageNum]).removeClass('active');
	},

	_showPage : function(switcherNum, pageNum)
	{
		$(ImageSwitcher.viewports[switcherNum].children()[pageNum]).show();
		$(ImageSwitcher.thumbs[switcherNum].children()[pageNum]).addClass('active');
	},

	init : function() 
	{
		var switchers = $('.imgsw');
		this.currentPage = [];
		this.totalPage = [];

		for (var i = 0; i < switchers.length; i++) 
		{
			switcher = $(switchers[i]);
			switcher.removeClass('imgsw').addClass('imgsw-toplevel');

			var children = switcher.children();

			numPages = Math.ceil(children.length / ImageSwitcher.elementsPerPage);

			var controls = $('<div class="imgsw-controls">');
			var prev     = $('<a href="#" class="imgsw-prev">').text('previous');
			var next     = $('<a href="#" class="imgsw-next">').text('next');
			var thumbs   = $('<div class="imgsw-thumbs">');
			var viewport = $('<div class="imgsw-viewport">');
			var page     = $('<div class="imgsw-page">');

			prev.click({switcherNum : i}, ImageSwitcher.prev);
			next.click({switcherNum : i}, ImageSwitcher.next);

			for (var j = 0; j < numPages; j++) 
			{
				var thumbLink = $('<a href="#">').click({switcherNum:i, newPageNum:j}, ImageSwitcher.goToPage);
				var newPage = page.clone();

				for (var k = 0; k < this.elementsPerPage; k++)
				{
					var child = $(children[j * this.elementsPerPage + k]).detach();

					if (child[0].nodeName == 'IMG' && numPages > 1) 
						child = thumbLink
							.clone().addClass('imgsw-link-img')
							.click({switcherNum : i}, ImageSwitcher.next)
							.append(child);

					newPage.append(child);
				}

				var thumb = thumbLink.text(j+1);
				thumbs.append(thumb);

				newPage.hide();
				viewport.append(newPage);
			}

			if (numPages > 1)
			{
				controls.append(prev, next, thumbs);
				switcher.prepend(controls, viewport);
			}
			else
			{
				switcher.prepend(viewport);
			}

			this.currentPage[i] = 0;
			this.totalPages[i] = numPages;
			this.viewports[i] = viewport;
			this.thumbs[i] = thumbs;

			this._showPage(i, 0);
		}
	}
}

$('document').ready(
	function() 
	{
		ImageSwitcher.init();
	}
);


