var cacheOutput = function(func) {
	var cache = {};
	return function() {
		var args = [].splice.call(arguments, 0);
		var key = args.length+'|'+args.join('|');
		if (cache[key] === undefined)
			cache[key] = func.apply(this, arguments);
		return cache[key];
	};
};

var LettersPage = function() {
	var that = this;

	var getLinks = cacheOutput(function() {
		var links = [];
		$('a[href*="/letters/view"]').each(function() {
			var a = $(this);
			var url = a.attr('href');
			var matches = /\/letters\/view\/([^\/]+)/.exec(url);
			if (typeof matches[1] === 'undefined')
				return true;
			var link = new LettersLink(this, matches[1], that);
			links.push(link);
		});
		return links;
	});

	var getPage = cacheOutput(function() {
		return $('#main > .page');
	});

	that.showPage = function() {
		getPage().show();
	};

	that.hidePage = function() {
		getPage().hide();
	};

	var initialize = function() {
		var links = getLinks();
		var hash = Hash.get();
		if (hash) {
			for (var i = 0; i < links.length; i++) {
				if (hash === links[i].getId()) {
					links[i].activate(false);
					break;
				}
			}
		}
	};

	initialize();
};

var LettersLink = function(el, key, page) {
	var that = this;
	that.el = jQuery(el);
	that.key = key;

	that.getId = cacheOutput(function() {
		return 'letter-' + that.key;
	});

	that.getEnlargement = cacheOutput(function() {
		var enlargement = $('<div>');
		enlargement.attr('id', that.getId());
		enlargement.addClass('letter');
		enlargement.hide();
		
		var back = $('<a>');
		back.addClass('back');
		back.attr('href', 'javascript:');
		back.text('<<<BACK');
		back.click(that.deactivate);
		enlargement.append(back);
		
		var content = $('<div>');
		content.addClass('content');
		content.addClass('letter-content_html');
		content.addClass('richtext');
		enlargement.append(content);

		$('#main').append(enlargement);

		$.getJSON(that.el.attr('href'), function(data) {
			content.html(data.Letter.content_html);
		});

		return enlargement;
	});

	that.activate = function(animate) {
		var enlargement = that.getEnlargement();
		page.hidePage();
		var callback = function() {
			Hash.set(that.getId());
		};
		if (animate)
			enlargement.fadeIn(200, callback);
		else {
			enlargement.show();
			callback();
		}
	};

	that.deactivate = function() {
		var enlargement = that.getEnlargement();
		enlargement.hide();
		page.showPage();
		Hash.empty();
	};

	var initialize = function() {
		that.el.click(function() {
			that.activate(true);
			return false;
		});
	};

	initialize();
};

