var tumbler = {
	objects: {}
	,cache:	{
		item: {}
	}
    ,data: {}
	,init: function()
{

	// Tooltip module
	(function()
	{
		var cache = {};
		var tooltipID = false;
		var tooltip = $(
			'<div class="itemTooltip"><table><tbody>' +
			'<tr><td id="ttInner"></td><th style="background-position: right top;"></th></tr>' +
			'<tr><th style="background-position: left bottom;"></th><th style="background-position: right bottom;">' +
			'</th></tr></tbody></table></div>'
		).appendTo('body');
		var tt = tooltip[0]; // For positioning, $.css is horribly slow
		var inner = document.getElementById('ttInner');

		$(document).bind('mouseover', mouseEvent, false);
		$(document).bind('mousemove', moveTooltip, false);

		function mouseEvent(event)
		{
			var target = event.target || event.srcElement;

			if(tooltipID) {
				if(target.nodeName == 'A')
					moveTooltip(event)
				else
					hideTooltip();

			} else {
				if(target.nodeName == 'A' && !tooltipID) {
					var id = target.href.match(/.*?item.*?=([0-9]+)/);
					if(id) {
						showTooltip(parseInt(id[1]));
						moveTooltip(event);
					}
				}
			}
		}

		function hideTooltip()
		{
			tooltip.hide();
			tooltipID = false;
		}

		function showTooltip(itemID)
		{
			var cache = tumbler.cache.item;
			if(!cache[itemID] && cache[itemID] !== null) {
				cache[itemID] = {tooltip: 'Loading...'};
				tumbler.fetchData('item', [itemID], itemID, function(id) {
					if(id == tooltipID) {
						showTooltip(itemID);
					}
				});
			}

			inner.innerHTML = cache[itemID].tooltip;
			tooltip.show();
			tooltipID = itemID;
		}

		function moveTooltip(event)
		{
			var viewportHeight 	= window.innerHeight || document.documentElement.clientHeight;
			var scrollTop 		= window.pageYOffset || document.documentElement.scrollTop;
			var mousePosition 	= window.innerHeight ? event.pageY : event.clientY + scrollTop;
			var tooltipHeight 	= tooltip.height();

			var x = window.innerWidth ? event.pageX : event.clientX + document.documentElement.scrollLeft;
			var y;

			// If room below element AND mouse on lower half of screen OR no room above element
			if(viewportHeight + scrollTop - mousePosition > tooltipHeight + 15 &&
			   (viewportHeight / 2 + scrollTop < mousePosition ||
				mousePosition - scrollTop < tooltipHeight + 15))
			{
				y = mousePosition + 15;
			}
			else
			{
				if(mousePosition - scrollTop > tooltipHeight + 15) {
					y = mousePosition - tooltipHeight - 15;
				} else {
					y = scrollTop;
				}
			}

			tt.style.left = x + 15;
			tt.style.top = y;
		}
	})();

    if(String(document.location).match(/import\.php/)) {
    	// Create basic raid structure for storing data
		tumbler.raid = {
			characters: {},
			loot: [],
			bosses: []
		}
		tumbler.itemCount = 0;
		tumbler.bossCount = 0;
		tumbler.editedLoot = null;

		$('#addBoss').click(tumbler.addBoss);
		$('#attendanceList').click(tumbler.showPlayer);
		$('#raidStart, #raidEnd').change(tumbler.updateRaidtimes);
		$('#raidInput button.addMember').click( function() {
			var members = $(this).prev().val().replace(/ /g, '').split(',');
			$(this).prev().val('');
			var standby = (this.parentNode.parentNode.id == 'standbyAttendance') ? 100 : 0;
			var raid = standby == 100 ? 0 : 100;

			for(var i=0; i < members.length; i++)
			{
				tumbler.addPlayer(members[i], raid, standby);
			}
		});
		$('#cancelPlayerChange').click(function() {
			$('#editPlayer').hide();
		});
		$('#savePlayerChange').click(tumbler.editPlayer);
		$('#removePlayer').click(tumbler.removePlayer);

		$('#addTrashloot').click(function(){
				var input = $(this).prev();
				tumbler.addLoot(input.val());
				input.val('');
		});

		$('#removeLoot').click(tumbler.removeLoot);
		$('#itemCancel').click(function() { $('#editLoot').hide() });
		$('#itemSave').click(tumbler.editLoot);

		$('#parse').click(function() {
			tumbler.parseString($('#trackerInput').val());
		});
		$('#submit').click(tumbler.submit);
    }
}
}

// Initializer
$(document).ready(tumbler.init);
