var allHats;
var allHatsAllSelected = false;
var tradeItemDef;
var tradeItemId;
var waitingOnServer = false;
var waitingForTradePageLoad = false;

function cancelEditHatTrade() {
	$("#editTrade").slideUp("fast", function() {
		// delete all the children
		$(this).children().each( function() { $(this).remove(); })
	});
	$("#items").slideDown("fast");
	$("#currentTradesItems").slideDown("fast");
}

function cancelHatTrade() {
	$("#newTrade").slideUp("fast", function() {
		// delete all the children
  		$(this).children().each( function() { $(this).remove(); })
	});
	$("#items").slideDown("fast");
	if(countCurrentTrades() > 0) {
		$("#currentTrades").slideDown("fast");
	}
}

function countCurrentTrades() {
	var numTrades = 0;
	$("#currentTradesItems .invBox").each(function(i) { numTrades++ } );
	return numTrades;
}

function displayErrorMessage(message) {
	$(".tradingContents").html("<h1 style=\"color: red;\">" + message + "</h1>");
}


function enableHoverEffects() {
	$(".tradingButtonEnabled").hover(function() {
		$(this).addClass("tradingButtonHover");
	}, function() {
		$(this).removeClass("tradingButtonHover");
	});
}

function getEditTradeInfo() {
	$.ajax({
	type: "GET",
	url: "gettradeinfo.php",
	cache: false,
	data: { itemid : tradeItemId },
	dataType: "json",
	success: function(data) {
		if(!data.error) {
			$.each(data.wants, function(i, item) {
				$("#allHats" + item).parent().addClass("cellSelected");
			});
			updateSelectAllButton();
		}
	}
	});
}

function handleLocationHash() {
	if(window.location.hash == "#matches")
	{
		$("#viewMatches").removeClass("tradingButtonEnabled");
		$("#viewMatches").addClass("tradingButtonDisabled");
		$(".tradingContents").html("<h1>Loading matches...</h1>");

		viewMatches();

		if(typeof pageTracker == "undefined")
		{
			pageTracker._trackPageview("/trading/matches");
		}
	}
	else if(window.location.hash == "#trade")
	{
		$("#tradeHats").removeClass("tradingButtonEnabled");
		$("#tradeHats").addClass("tradingButtonDisabled");
		$(".tradingContents").html("<h1>Loading trading...</h1>");

		$.ajax({
		type: "POST",
		url: "trade_hats.php",
		cache: false,
		dataType: "json",
		success: function(data) {
			waitingForTradePageLoad = false;
			if(data.error) {
				displayErrorMessage(data.errmsg);
			} else {
				$(".tradingContents").html(data.contents);
				allHats = data.allhats;
				installTooltips();
				hookTradeHatClick();
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			waitingForTradePageLoad = false;
			displayErrorMessage("An error occured on the server. Try again.");
		}
		});

		if(typeof pageTracker == "undefined")
		{
			pageTracker._trackPageview("/trading/trade");
		}
	}
	else if(window.location.hash == "#tradeItems")
	{
		$("#tradeItems").removeClass("tradingButtonEnabled");
		$("#tradeItems").addClass("tradingButtonDisabled");
		$(".tradingContents").html("<h1>Loading trading...</h1>");

		$.ajax({
		type: "POST",
		url: "trade_items.php",
		cache: false,
		dataType: "json",
		success: function(data) {
			waitingForTradePageLoad = false;
			if(data.error) {
				displayErrorMessage(data.errmsg);
			} else {
				$(".tradingContents").html(data.contents);
				allHats = data.allhats;
				installTooltips();
				hookTradeHatClick();
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			waitingForTradePageLoad = false;
			displayErrorMessage("An error occured on the server. Try again.");
		}
		});

		if(typeof pageTracker == "undefined")
		{
			pageTracker._trackPageview("/trading/tradeItems");
		}
	}
	else if(window.location.hash == "#advanced")
	{
		$("#advancedTrading").removeClass("tradingButtonEnabled");
		$("#advancedTrading").addClass("tradingButtonDisabled");
		$(".tradingContents").html("<h1>Loading trading...</h1>");
		waitingForTradePageLoad = false;
		pageTracker._trackPageview("/trading/advanced");
	}
	else if(window.location.hash == "#stats")
	{
		$("#tradeStats").removeClass("tradingButtonEnabled");
		$("#tradeStats").addClass("tradingButtonDisabled");
		$(".tradingContents").html("<h1>Loading trading...</h1>");

		$.ajax({
		type: "POST",
		url: "trade_stats.php",
		cache: false,
		dataType: "json",
		success: function(data) {
			waitingForTradePageLoad = false;
			if(data.error) {
				displayErrorMessage(data.errmsg);
			} else {
				$(".tradingContents").html(data.contents);
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			waitingForTradePageLoad = false;
			displayErrorMessage("An error occured on the server. Try again.");
		}
		});

		if(typeof pageTracker == "undefined")
		{
			pageTracker._trackPageview("/trading/stats");
		}
	}
}

function hookButtonClick() {
	if(window.location.hash != "#matches")
	{
		$("#viewMatches").click(function() {
			tradeButtonClickHandler("matches");
		});
	}
	if(window.location.hash != "#trade")
	{
		$("#tradeHats").click(function() {
			tradeButtonClickHandler("trade");
		});
	}
	if(window.location.hash != "#tradeItems")
	{
		$("#tradeItems").click(function() {
			tradeButtonClickHandler("tradeItems");
		});
	}
	if(window.location.hash != "#advanced")
	{
		$("#advancedTrading").click(function() {
			tradeButtonClickHandler("advanced");
		});
	}
	if(window.location.hash != "#stats")
	{
		$("#tradeStats").click(function() {
			tradeButtonClickHandler("stats");
		});
	}
}

function tradeButtonClickHandler(newHash) {
	if(!waitingForTradePageLoad) {
		waitingForTradePageLoad = true;
		window.location.hash = newHash;
		locationHashChanged();
	}
}

function hookEditTradeButtons()
{
	$("#editTradeButtons .tradingButtonEnabled").hover(function() {
		$(this).addClass("tradingButtonHover");
	}, function() {
		$(this).removeClass("tradingButtonHover");
	});

	$("#acceptTrade").click(function() {
		var hatsToTrade = "";

		if(waitingOnServer) {
			return;
		}

		$("#tradeErrMsg").text("");

		$("#allHats img").each(function(i) {
			var thisId = $(this).attr("id");
			var parentDiv = $(this).parent();

			if(thisId.match("^allHats[0-9]+$")) {
				if(parentDiv.hasClass("cellSelected")) {
					var itemDefIndex = thisId.substring(7);
					hatsToTrade = hatsToTrade + itemDefIndex + ";";
				}
			}
		});


		if(hatsToTrade.length > 0) {
			waitingOnServer = true;
			$.ajax({
			type: "POST",
			url: "newtrade.php",
			cache: false,
			data: {'have' : tradeItemDef + ";" + tradeItemId, 'want' : hatsToTrade, 'edit' : 1},
			dataType: "json",
			success: function(data) {
				waitingOnServer = false;
				if(data.error) {
					$("#tradeErrMsg").text(data.errmsg);
				} else {
					cancelEditHatTrade();
					installTooltips();
					hookTradeHatClick();
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				waitingOnServer = false;
				$("#tradeErrMsg").text("An error occured on the server.");
			}
			});
		} else {
			$("#tradeErrMsg").text("No item types selected. Click the delete button to delete this trade.");
		}
	});

	$("#cancelTrade").click(cancelEditHatTrade);

	$("#deleteTrade").click(function() {
		if(waitingOnServer) {
			return;
		}

		$("#tradeErrMsg").text("");

		waitingOnServer = true;
		$.ajax({
		type: "POST",
		url: "deletetrade.php",
		cache: false,
		data: {'have' : tradeItemId},
		dataType: "json",
		success: function(data) {
			waitingOnServer = false;
			if(data.error) {
				$("#tradeErrMsg").text(data.errmsg);
			} else {
				$("#cannotTradeHats").hide();
				cancelEditHatTrade();
				$("#" + tradeItemDef + "_" + tradeItemId).appendTo("#items");

				if(countCurrentTrades() == 0) {
					$("#currentTrades").hide();
				}

				installTooltips();
				hookTradeHatClick();
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			waitingOnServer = false;
			$("#tradeErrMsg").text("An error occured on the server.");
		}
		});
	});
}

function hookNewHatButtons()
{
	$("#allHats img.item").click(function() {
		if($(this).attr("src") == "selectall.png") {
			selectAllTradeHats();
		} else {
			var parentDiv = $(this).parent();
			if(parentDiv.hasClass("cellSelected")) {
				$(this).parent().removeClass("cellSelected");
			} else {
				$(this).parent().addClass("cellSelected");
			}

			updateSelectAllButton();
		}
		$("#tradeErrMsg").text("");
	});
}

function hookNewTradeButtons()
{
	$("#newTradeButtons .tradingButtonEnabled").hover(function() {
		$(this).addClass("tradingButtonHover");
	}, function() {
		$(this).removeClass("tradingButtonHover");
	});

	$("#acceptTrade").click(function() {
		var hatsToTrade = "";

		if(waitingOnServer) {
			return;
		}

		$("#tradeErrMsg").text("");

		$("#allHats img").each(function(i) {
			var thisId = $(this).attr("id");
			var parentDiv = $(this).parent();

			if(thisId.match("^allHats[0-9]+$")) {
				if(parentDiv.hasClass("cellSelected")) {
					var itemDefIndex = thisId.substring(7);
					hatsToTrade = hatsToTrade + itemDefIndex + ";";
				}
			}
		});


		if(hatsToTrade.length > 0) {
			waitingOnServer = true;
			$.ajax({
			type: "POST",
			url: "newtrade.php",
			cache: false,
			data: {'have' : tradeItemDef + ";" + tradeItemId, 'want' : hatsToTrade, 'edit' : 0},
			dataType: "json",
			success: function(data) {
				waitingOnServer = false;
				if(data.error) {
					$("#tradeErrMsg").text(data.errmsg);
				} else {
					if(countCurrentTrades() == 0) {
						$("#currentTrades").show();
					}
					cancelHatTrade();
					$("#" + tradeItemDef + "_" + tradeItemId).appendTo("#currentTradesItems");
					installTooltips();
					hookTradeHatClick();
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				waitingOnServer = false;
				$("#tradeErrMsg").text("An error occured on the server.");
			}
			});
		} else {
			$("#tradeErrMsg").text("No item types selected.");
		}
	});

	$("#cancelTrade").click(cancelHatTrade);
}

function hookTradeHatClick()
{
	$("#items .invBox").unbind("click");
	$("#items .invBox").click(function() {
		var newTrade = $("#newTrade");
		var itemName = $("img", this).attr("alt");
		var itemImage = $("img", this).attr("src");

		newTrade.html("<h2>New Trade</h2>");
		$(this).clone().removeClass("cellHover").appendTo(newTrade);
		newTrade.append("<br/><span style=\"font-size: 1.5em;\">" + itemName + "</span>");
		newTrade.append("<div style=\"clear: both;\"></div>");
		newTrade.append("<h2>Trade for...</h2>");
		newTrade.append("<span>Click on one or more item types you wish to receive in exchange for your " + itemName + ".</span>");
		newTrade.append("<div style=\"clear: both;\"></div>");
		newTrade.append(allHats);
		newTrade.append("<div id=\"tradeErrMsg\" style=\"clear: both; color: red; font-size: x-large;\"></div>");
		newTrade.append("<div id=\"newTradeButtons\" style=\"width: 100%; min-width: 216px; \">" +

				"<button id=\"cancelTrade\" class=\"tradingButtonEnabled buttonCancel tradingButton\" style=\"float: right; margin: 0 8px;\" title=\"Cancel New Trade\"></button>" +
				"<button id=\"acceptTrade\" class=\"tradingButtonEnabled buttonOk tradingButton\" style=\"float: right; margin: 0 8px;\" title=\"Create New Trade Request\"></button>" +

				"</div>");

		var clickedId = $(this).attr("id");
		// Don't show the hat being traded
		$("#allHats img").each(function(i) {
			if($(this).attr("src") == itemImage) {
				tradeItemDef = /^[0-9]+/.exec(clickedId);
				tradeItemId = /[0-9]+$/.exec(clickedId);
				$(this).parent().remove();
			}
		});

		hookNewTradeButtons();
		hookNewHatButtons();
		installTooltips();
		allHatsAllSelected = false;

		if(!newTrade.is(":visible")) {
			$("#items").slideUp("fast");
			$("#currentTrades").slideUp("fast");
			newTrade.slideDown("fast");
		}
	});

	$("#currentTradesItems .invBox").unbind("click");
	$("#currentTradesItems .invBox").click(function() {
		var editTrade = $("#editTrade");
		var itemName = $("img", this).attr("alt");
		var itemImage = $("img", this).attr("src");

		editTrade.html("<h2>Edit Trade</h1>");
		$(this).clone().removeClass("cellHover").appendTo(editTrade);
		editTrade.append("<br/><span style=\"font-size: 1.5em;\">" + itemName + "</span>");
		editTrade.append("<div style=\"clear: both;\"></div>");
		editTrade.append("<h2>Trade for...</h2>");
		editTrade.append("<span>Click on one or more item types you wish to receive in exchange for your " + itemName + ".</span>");
		editTrade.append("<div style=\"clear: both;\"></div>");
		editTrade.append(allHats);
		editTrade.append("<div id=\"tradeErrMsg\" style=\"clear: both; color: red; font-size: x-large;\"></div>");
		editTrade.append("<div id=\"editTradeButtons\" style=\"width: 100%; min-width: 216px; \">" +

				"<button id=\"cancelTrade\" class=\"tradingButtonEnabled buttonCancel tradingButton\" style=\"float: right; margin: 0 8px;\" title=\"Cancel Edit\"></button>" +
				"<button id=\"acceptTrade\" class=\"tradingButtonEnabled buttonOk tradingButton\" style=\"float: right; margin: 0 8px;\" title=\"Accept Changes\"></button>" +
				"<div style=\"clear: right;\"></div>" + 
				"<button id=\"deleteTrade\" class=\"tradingButtonEnabled buttonDelete tradingButton\" style=\"float: right; margin: 6px 8px 0 8px;\" title=\"Delete Trade\"></button>" +

				"</div>");

		var clickedId = $(this).attr("id");
		// Don't show the hat being traded
		$("#allHats img").each(function(i) {
			if($(this).attr("src") == itemImage) {
				tradeItemDef = /^[0-9]+/.exec(clickedId);
				tradeItemId = /[0-9]+$/.exec(clickedId);
				$(this).parent().remove();
			}
		});

		getEditTradeInfo();
		hookEditTradeButtons();
		hookNewHatButtons();
		installTooltips();
		allHatsAllSelected = false;

		if(!editTrade.is(":visible")) {
			$("#items").slideUp("fast");
			$("#currentTradesItems").slideUp("fast");
			// chrome some issue with the slide here. ok cancel dissapears. fix later?
			//var isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
			//if(isChrome) {
				editTrade.slideDown("fast", function() {
					$("#editTradeButtons").hide();
					setTimeout("$('#editTradeButtons').show()", 1);
				});
			//} else {
			//	editTrade.slideDown("fast");
			//}
		}
	});
}

function locationHashChanged() {
	resetButtons();
	hookButtonClick();
	handleLocationHash();
	enableHoverEffects();
}

function resetButtons() {
	$("#viewMatches").unbind().removeClass("tradingButtonDisabled").removeClass("tradingButtonHover").addClass("tradingButtonEnabled");
	$("#tradeHats").unbind().removeClass("tradingButtonDisabled").removeClass("tradingButtonHover").addClass("tradingButtonEnabled");
	$("#tradeItems").unbind().removeClass("tradingButtonDisabled").removeClass("tradingButtonHover").addClass("tradingButtonEnabled");
	$("#advancedTrading").unbind().removeClass("tradingButtonDisabled").removeClass("tradingButtonHover").addClass("tradingButtonEnabled");
	$("#tradeStats").unbind().removeClass("tradingButtonDisabled").removeClass("tradingButtonHover").addClass("tradingButtonEnabled");
}

function selectAllTradeHats() {
	$("#allHats img.item").each(function(i) {
		var parentDiv = $(this).parent();
		if(allHatsAllSelected) {
			$(this).parent().removeClass("cellSelected");
		} else {
			$(this).parent().addClass("cellSelected");
		}
	});

	updateSelectAllButton();
}

function updateSelectAllButton() {
	allHatsAllSelected = true;
	$("#allHats img.item").each(function(i) {
		if($(this).attr("src") != "selectall.png") {
			var parentDiv = $(this).parent();

			if(!parentDiv.hasClass("cellSelected")) {
				allHatsAllSelected = false;
			}
		}
	});

	if(allHatsAllSelected) {
		$("#selectAll").parent().addClass("cellSelected");
	} else {
		$("#selectAll").parent().removeClass("cellSelected");
	}
}

$(hookButtonClick);
$(handleLocationHash);
$(enableHoverEffects);
