jQuery.fn.pileRender = function(id) {
	$(this).empty();
	if($(this).attr('id') == "drawpile") {
		for(i = 0; i < drawpile.cards.length/9; i++) {
			drawpile.cards[i].facedown = true;
			$(this).append(drawpile.cards[i].createNode());
		}
	} else if($(this).attr('id') == "drawpile-up") {
		var tmp = drawpileup.cards.slice(-3);
		for(i = 0; i < tmp.length; i++) {
			tmp[i].facedown = false;
			$(this).append(tmp[i].createNode());
		}
		$(".card:last-child",this).addClass("dpdrag");
	} else if($(this).attr('id').substring(0,8) == "playable") {
		var faceupcnt = 0;
		var tmpDom = $(this);
		for(i = 0; i < playable[id].cards.length; i++) {
			if(i == playable[id].cards.length-1) playable[id].cards[i].facedown = false;
			if(playable[id].cards[i].facedown == false) {
				$(tmpDom).append("<div class='draggable cgroup'></div>");
				tmpDom = $('.draggable',tmpDom);
			}
			$(tmpDom).append(playable[id].cards[i].createNode());
		}
		$(tmpDom).append("<div class='filler'></div>");
		return;
	} else if($(this).attr('id').substring(0,7) == "discard") {
		if(discard[id].cards.length > 0)
			$(this).append(discard[id].cards[discard[id].cards.length-1].createNode());
	}
}

function renderAll() {
	$("#drawpile-up").pileRender();
	$("#drawpile").pileRender();
	for(i = 0; i < 4; i++)
		$("#discard-"+(i+1)).pileRender(i);
	for(i = 0; i < 7; i++)
		$("#playable-"+(i+1)).pileRender(i);
}
function setDrags() {
	function canMoveP(card1, card2) {
		if(card2 == null)
			return card1.rank == 'K';
		if(rankCmp(card1.rank,card2.rank) != -1)
			return false;
		if(card1.color() == card2.color())
			return false;
		return true;
	}
	function canMoveD(card1, card2) {
		if(card2 == null)
			return card1.rank == 'A';
		if(rankCmp(card1.rank,card2.rank) != 1)
			return false;
		if(card1.suit != card2.suit)
			return false;
		return true;
	}

	$(".cgroup.draggable").each(function() {$(this).DraggableDestroy()});
	$(".cgroup.draggable").each(function() {
		var superthis = this;
		var tmp = $(this).parents(".playable");
		if(!$(tmp).attr("id")) return;
		var mcrd = parseInt($(tmp).attr("id").substring(9),10)-1;
		var mindex = $(".card.facedown",tmp).length;
		tmp = $(tmp).children(".draggable").eq(0);
		while($(".card img",tmp).eq(0).attr("id") != $(".card img",this).eq(0).attr("id")) {
			mindex++;
			tmp = $(".draggable",tmp).eq(0);
			if(mindex > 15) break;
		}

		$(this).Draggable({
			ghosting: true,
			opacity: 0.8,
			revert: true,
			fx: 100,
			onStop: function() {
				$(".playable").each(function() {
					$(this).DroppableDestroy();
				});
				$(".discard-pile").each(function() {
					$(this).DroppableDestroy();
				});
			},
			onStart: function() {
				$(".playable").each(function() {
					var tocrd = parseInt($(this).attr('id').substring(9),10)-1;
					var tc = playable[tocrd].cards[playable[tocrd].cards.length-1];
					if($(superthis).parents(".playable").attr("id") == $(this).attr("id"))
						return;
					$(this).Droppable({
						accept: 'draggable',
						hoverclass: 'drophover',
						ondrop: function(drag) {
							var mc = playable[mcrd].cards[mindex];
							if(!canMoveP(mc,tc))
								return;
							while(mindex < playable[mcrd].cards.length) {
								mc = playable[mcrd].cards[mindex];
								playable[tocrd].addCard(mc);
								playable[mcrd].draw(mindex);
							}
							$("#playable-"+(tocrd+1)).pileRender(tocrd);
							$("#playable-"+(mcrd+1)).pileRender(mcrd);
							$("#drawpile-up").pileRender();
							setDrags();
						}
					});
				});
				if($(this).children(".draggable").length == 0) {
					$(".discard-pile").each(function() {
						var tocrd = parseInt($(this).attr('id').substring(8),10)-1;
						var tc = discard[tocrd].cards[discard[tocrd].cards.length-1];
						$(this).Droppable({
							accept: 'draggable',
							hoverclass: 'drophover',
							ondrop: function(drag) {
								var mc = playable[mcrd].cards[mindex];
								if(!canMoveD(mc,tc)) return;
								discard[tocrd].addCard(mc);
								playable[mcrd].draw(mindex);
								$("#discard-"+(tocrd+1)).pileRender(tocrd);
								$("#playable-"+(mcrd+1)).pileRender(mcrd);
								setDrags();
								isWon();
							}
						});
					});
				}
			}
		});
	});

	function isWon() {
		for(i = 0; i < 4; i++) {
			if(discard[i].cards.length == 0)
				continue;
			if(discard[i].cards[discard[i].cards.length-1].rank != 'K')
				return;
		}
		alert("Winner!");
	}

	$(".dpdrag").each(function() {$(this).DraggableDestroy()});
	$(".dpdrag").each(function() {
		var mindex = drawpileup.cards.length-1;
		var mc = drawpileup.cards[mindex];
		$(this).Draggable({
			ghosting: true,
			opacity: 0.8,
			revert: true,
			fx: 100,
			onStop: function() {
				$(".playable").each(function() {
					$(this).DroppableDestroy();
				});
				$(".discard-pile").each(function() {
					$(this).DroppableDestroy();
				});
			},
			onStart: function() {
				$(".playable").each(function() {
					$(this).Droppable({
						accept: 'dpdrag',
						hoverclass: 'drophover',
						ondrop: function(drag) {
							var tocrd = parseInt($(this).attr('id').substring(9),10)-1;
							var tc = playable[tocrd].cards[playable[tocrd].cards.length-1];

							if(!canMoveP(mc,tc)) return;
							playable[tocrd].addCard(mc);
							drawpileup.draw(mindex);

							$("#playable-"+(tocrd+1)).pileRender(tocrd);
							$("#drawpile-up").pileRender();
							setDrags();
						}
					});
				});
				$(".discard-pile").each(function() {
					$(this).Droppable({
						accept: 'dpdrag',
						hoverclass: 'drophover',
						ondrop: function(drag) {
							var tocrd = parseInt($(this).attr('id').substring(8),10)-1;
							var tc = discard[tocrd].cards[discard[tocrd].cards.length-1];
							if(!canMoveD(mc,tc)) return;
							discard[tocrd].addCard(mc);
							drawpileup.draw(mindex);
							$("#discard-"+(tocrd+1)).pileRender(tocrd);
							$("#drawpile-up").pileRender();
							setDrags();
							isWon();
						}
					});
				});
			}
		});
	});
}
function dealMeIn() {
	drawpile.cards.length = 0;
	drawpile.makeDeck(1);
	drawpile.shuffle(3);
	drawpileup.cards.length = 0;

	for(j = 0; j < 7; j++) {
		playable[j].cards.length = 0;
		for(i = 0; i <= j; i++) {
			var card = drawpile.deal();
			playable[j].addCard(card);
			if(i==j) card.facedown = false;
		}
		$("#playable-"+(j+1)).pileRender(j);
	}

	for(i = 0; i < 4; i++) {
		discard[i].cards.length = 0;
	}
	$("#drawpile").pileRender();
	$("#drawpile-up").empty();
	$(".discard-pile").empty();

	setDrags();
}

