if (!window.albums) albums = {};
TH = {
	// @private
	datePattern : /(\d{4})-(\d{1,2})(?:-(\d{1,2}))?/,

	// @private
	imageIndex : 0,

	// @private
	currentAlbum : null,

	// @private
	months : ['January', 'February', 'March', 'April', 'May', 'June', 'July',
					'August', 'September', 'October', 'November', 'December'],

	// @private
	ContentFormat : '<span class="title">{title}</span> ' +
							'<a class="permalink" href="#{id}" ' +
							'title="Permalink to this album">&para;</a><br />' +
							'<span class="date">{date}</span><br />',

	// @private
	MultipleImages : '<img class="hand" onclick="TH.getNextImage()" ' +
						'alt="Album Image" src="{src}" /><br />' +
						'<a class="hand nav" onclick="TH.getPrevImage()">' +
						'<img alt="Previous" src="images/prevbutton.gif" /></a>' +
						' <span class="count">Image {index} of {number}</span>' +
						' <a class="hand nav" onclick="TH.getNextImage()">' +
						'<img alt="Next" src="images/nextbutton.gif" /></a><br />' +
						'<a href="album.php?thumbnail={gallery}">Gallery View</a>' +
						'<br />',

	// @private
	SingleImage : '<img alt="Album Image src="{src}" /><br />' +
						'<span class="count">Image 1 of 1</span><br />',

	// @private
	$ : {},

	// @private
	init : function() {
		var self = TH;
		var hash = window.location.hash.slice(1);
		var Key = JSUtils.Key;

		// @private
		self.modal = new JSUtils.ui.Modal(document.body, { paddingTop : 30,
			OnShow : function(modal) {
				modal.reposition();
			}
		});

		document.onkeyup = function(e) {
			var key = (window.event)?event.keyCode:e.keyCode;

			if (self.modal.visible)
				switch(key) {
					case Key.Left: case Key.Up:
						self.getPrevImage(); break;
					case Key.Right: case Key.Down:
						self.getNextImage(); break;
					case Key.Escape:
						self.modal.hide(); break;
				}
		}

		document.onkeydown = function(e) {
			var key = (window.event)?event.keyCode:e.keyCode;

			if (self.modal.visible)
				switch(key) {
					case Key.Left: case Key.Up:
					case Key.Right: case Key.Down:
					case Key.Escape: return false;
				}
		}

		self.modal.dialog.className += ' content';

		for (var i in albums)
			self.$[i] = $('#' + i).click(self.createFormat(i));

		if (hash != '') {
			try {
				self.formatContentAndShow(hash);
				setTimeout(function() { self.modal.reposition(); }, 300);
			} catch (e) {
				// bad anchor
			}
		}
	},

	// @private
	createFormat : function(i) {
		return function() { TH.formatContentAndShow(i); TH.prefetch(i,1); };
	},

	// @private
	getPrevImage : function() {
		var self = TH;
		if (self.currentAlbum == null) return;
		if (self.imageIndex == 0)
			self.imageIndex = albums[self.currentAlbum].images.length - 1;
		else self.imageIndex--;

		self.formatContentAndShow(self.currentAlbum, self.imageIndex);
		self.prefetch(self.currentAlbum, self.imageIndex - 1);
		return false;
	},

	// @private
	getNextImage : function() {
		var self = TH;
		if (self.currentAlbum == null) return;
		if (++self.imageIndex == albums[self.currentAlbum].images.length)
			self.imageIndex = 0;

		self.formatContentAndShow(self.currentAlbum, self.imageIndex);
		self.prefetch(self.currentAlbum, self.imageIndex + 1);
		return false;
	},

	// @private
	prefetch : function(album, index) {
		if (index < 0) index = albums[album].images.length;
		else if (index >= albums[album].images.length) index = 0;

		try {
			new AJAXRequestor(albums[album].images[index], 'GET');
		} catch (e) {
			// silent error
		}
	},

	// @private
	formatContent : function(key, index) {
		var self = TH;
		var content = albums[key];
		self.currentAlbum = key;

		var albumDate = self.datePattern.exec(content.date);

		var date = content.date;

		if (albumDate != null && albumDate != undefined) {
			date = self.months[parseInt(albumDate[2])-1] + ' ' + albumDate[1];
		}

		var result = self.ContentFormat.format({title:content.title, id:key,
																date:date});
	
		if (content.images.length > 0) {
			if (index === null || index === undefined) {
				self.imageIndex = 0;
				var index = 0;
			}

			result += self.MultipleImages.format({src:content.images[index],
										index:index + 1, number:content.images.length,
										gallery:encodeURIComponent(content.thumbnail)});
		} else
			result += self.SingleImage.format({src:content.images[index]});
														
		if (typeof content.description == "string" ||
			content.description instanceof String) {
			result += '<div class="description">' + content.description + '</div>';
		}

		return result;
	},

	// @private
	formatContentAndShow : function(key, index) {
		var self = TH;
		self.modal.setContent($('<span>Loading Picture...</span>')[0]).resize().show();

		var album = albums[key];
		var content = self.formatContent(key, index);

		var uri = album.thumbnail;
		if (index === null || index === undefined) {
			if (album.images.length > 0) {
				uri = album.images[0];
			}

			setTimeout(function() {self.modal.reposition();}, 300);
		} else {
			uri = album.images[index];
		}

		new AJAXRequestor(uri, 'GET', '', {
			OnSuccess : function() {
				self.modal.setContent($('<div>' + content + '</div>')[0]);
				setTimeout(function() {self.modal.resize();}, 100);
		}});

		return false;
	}
}

$(TH.init);
