var BingoBook = function(callback)
{
	var self = this;

	self.player_list_cache = [];
	self.player_list_cache_count = [];
	self.player_cache = [];

	self.init = function (callback)
	{
		// bind tab events
		$('#book_pages div[id^="tab-"]').live('click', function ()
		{
			$('#book_pages div.tab.active').removeClass('active');
			$(this).addClass('active');
			self.loadPlayersFromCache($(this).attr('id').replace('tab-', ''));
			return false;
		});

		$('#players div[id^=plyr-]').live('click', function ()
		{
			var player_name = $(this).attr('id').replace('plyr-', '').replace('_',' ');
			self.loadPlayerInfo(player_name, function (data)
			{
				if (typeof data === 'undefined') return false;
				$('#players').hide();
				$('#player_info div.bottom').empty();
				$('#player_info').show();

				$('#player_info div.name').html(data.LASTNAME ? data.NAME + ',&nbsp;&nbsp;&nbsp; ' + data.LASTNAME : data.NAME);
				$('#player_info div.gender').html( '<div>Gender:</div><div>' + data.SEX + '</div>');
				$('#player_info div.village').html('<div>Village:</div><div>' + data.VILLAGE + '</div>');
				$('#player_info div.bloodtype').html('<div>Bloodtype:</div><div>' + (data.BLOODTYPE || "Unknown") + '</div>');
				$('#player_info div.right').html('<img src="imgs/' + data.VILLAGE + '.png" />');

				if (data.TITLE) {
					$('#player_info div.bottom').append('<div class="nickname">\
						<div>Nickname:</div><div>' +
							(data.LASTNAME ? data.LASTNAME + ' ' : '') + data.NAME + ' ' + data.TITLE +
						'</div>\
					</div>');
				}

				if (data.BIO) {
					$('#player_info div.bottom').append('<div class="bio">\
						<div>Known History:</div><div>' + parseColor(data.BIO) + '</div>\
					</div>');
				}
			});

		});

		self.cachePlayers(callback);
	};

	self.cachePlayers = function (callback)
	{
		$.get('/info/players.info', function (data) {
			var i, index, player, players_raw = data.split("\n"), players = [];
			players_raw.sort();
			for (i in players_raw) {
				if (typeof players_raw[i] === 'function') continue;
				player = players_raw[i].split(", ");
				if (player[0] === '') continue;

				index = player[0].toLowerCase()[0];

				if (typeof players[index] === 'undefined') {
					players[index] = [];
					self.player_list_cache_count[index] = 0;
				}

				players[index].push({
					name : player[0],
					village : player[1],
					rank : player[2]
				});
				self.player_list_cache_count[index] += 1;
			}
			self.player_list_cache = players;
			if (callback || false) {
				callback();
			}
		});
	};

	self.loadPlayersFromCache = function (letter, page)
	{
		$('#player_info').hide();
		$('#players').show();

		page = page || 0;
		$('div[id^=plyr-], #players div.navigation').remove();
		if (!$.isArray(self.player_list_cache[letter])) {
			return;
		}

		var i = 0, count = 20, start = page ? (page * count - 1): 0, player, name;
		for (i = start; i < start + count; i++) {
			player = this.player_list_cache[letter][i];
			if (typeof player !== 'undefined') {
				name = / /.test(player.name) ? player.name.split(' ').reverse().join(' ') : player.name;
					$('#players').append('<div class="book_player" id="plyr-' + player.name.replace(' ', '_') + '">\
					<div class="name">' + name + '</div>\
					<div class="village">' + player.village + '</div>\
					<div class="rank">' + player.rank + '</div> \
				</div>');
			}
		}

		if (this.player_list_cache_count[letter] - (count * page)) {
			$('#players').append('<div class="navigation"><div class="prev"></div><div class="next"></div></div>');

			if (page) {
				$('#players div.prev').html('Previous');
				$('#players div.prev').bind('click', function ()
				{
					self.loadPlayersFromCache(letter, page >= 1 ? page - 1 : 1);
				});
			}

			if (this.player_list_cache_count[letter] - (count * page) > count) {
				$('#players div.next').html('Next');
				$('#players div.next').bind('click', function ()
				{
					self.loadPlayersFromCache(letter, page >= 1 ? page + 1 : 1);
				});
			}
		}
	};

	self.loadPlayerInfo = function (player, callback)
	{
		if (/ /.test(player)) {
			player = player.split(' ')[0];
		}

		$.getJSON('players/' + player + '.json', function (data)
		{
			if (data.error || false) {
				self.handleError(data.error);
				return false;
			}

			data = data[0].PLAYER;
			for (var i in data) {
				self.player_cache[data[i].NAME] = data[i];
			}

			if (callback || false) {
				callback(self.player_cache[player]);
			}
		});

	};

	/**
	 * Do something with an error returned from the JSON response
	 * @param error
	 */
	self.handleError = function (error)
	{
		alert(error);
	};


	self.init(callback);
};

