function render(pile) {
	var ploc = $("#pile-"+pile);
	$(ploc).empty();
	if(piles[pile-1].cards.length == 0) return;
	var rank = piles[pile-1].cards[piles[pile-1].cards.length-1].rank;
	var cnt = 1;
	for(var i = piles[pile-1].cards.length-2; i >= 0; i--) {
		if(rank == piles[pile-1].cards[i].rank)
			cnt++;
		else
			break;
	}
	for(var i = 0; i < piles[pile-1].cards.length; i++) {
		if(cnt != 4) {
			if(cnt >= piles[pile-1].cards.length-i) {
				$(ploc).append("<div class='draggable cgroup'></div>");
				ploc = $('.draggable',ploc);
			}
		}
		piles[pile-1].cards[i].facedown = (i == 3 && cnt == 4);
		$(ploc).append(piles[pile-1].cards[i].createNode());
	}
	$(ploc).append("<div class='filler'></div>");
}
function isWon() {
	for(var i = 0; i < piles.length; i++) {
		if(piles[i].cards.length == 0)
			continue;
		if(piles[i].cards.length < 4)
			return;
		for(var j = 1; j < 4; j++) {
			if(piles[i].cards[j].rank != piles[i].cards[j-1].rank)
				return false;
		}
	}
	alert("You win!");
}
function setDrags() {
	$(".pile .draggable").each(function() {
		var m = this;
		$(this).DraggableDestroy();
		$(this).Draggable({
			ghosting: true,
			opacity: 0.8,
			revert: true,
			cursorAt: {top:54, left:37},
			fx: 100,
			onStart: function() {
				$(".pile").each(function() {
					$(this).Droppable({
						accept: 'draggable',
						hoverclass: 'drophover',
						ondrop: function(drag) {
							var t = this; // move to
							var tindex = $(this).attr("id").substr(5,6);
							var tcnt = 0;
							tcnt = $(t).children(".card").length;
							while(t = $(t).children(".draggable")[0]) {
								tcnt++;
							}
							var mindex = $(m).parents(".pile").attr("id").substr(5,6);
							mcnt = 1;
							var m2 = m;
							while(m2 = $(m2).children(".draggable")[0]) {
								mcnt++;
							}
							if(tcnt+mcnt>4) return;
							if(mindex == tindex) return;
							if(piles[tindex-1].cards.length!=0)
								if(piles[tindex-1].cards[piles[tindex-1].cards.length-1].rank != piles[mindex-1].cards[piles[mindex-1].cards.length-1].rank)
									return;
							
							undoAppend(mindex-1, tindex-1);
							redo.length = 0;
							for(var i = mcnt; i > 0; i--) {
								piles[tindex-1].cards.push(piles[mindex-1].cards.pop());
							}
							render(tindex);
							render(mindex);
							isWon();
							setDrags();
						}
					});
				});
			},
			onStop: function() {
				$(".pile").each(function() {
					$(this).DroppableDestroy();
				});
			}
		});
	});
}

function dealMeIn() {
	deck.makeDeck(1);
	deck.shuffle(3);
	undo.length = redo.length = 0;
	for(var i = 0; i < 15; i++) {
		piles[i].cards.length = 0;
		for(var j = 0; j < 4 && deck.cards.length != 0; j++) {
			piles[i].cards[j] = deck.cards.shift();
			piles[i].cards[j].facedown= false;
		}
		render(i+1);
	}
	setDrags();
}

function undoUndo() {
	if(undo.length == 0) return;
	var i = undo.length-1;
	
	redoAppend(undo[i].i1.index,undo[i].i2.index);
	piles[undo[i].i1.index].cards = undo[i].i1.content;
	piles[undo[i].i2.index].cards = undo[i].i2.content;
	render(undo[i].i1.index+1);
	render(undo[i].i2.index+1);
	undo.length--;
	setDrags();
}
function undoRedo() {
	if(redo.length == 0) return;
	
	var i = redo.length-1;
	
	undoAppend(redo[i].i1.index,redo[i].i2.index);
	piles[redo[i].i1.index].cards = redo[i].i1.content;
	piles[redo[i].i2.index].cards = redo[i].i2.content;
	render(redo[i].i1.index+1);
	render(redo[i].i2.index+1);
	redo.length--;
	
	setDrags();
}
function undoAppend(a, b) {
	var t = {
		i1: {
			index: a,
			content: piles[a].cards.concat()
		},
		i2: {
			index: b,
			content: piles[b].cards.concat()
		}
	};
	
	undo[undo.length] = t;
}
function redoAppend(a, b) {
	var t = {
		i1: {
			index: a,
			content: piles[a].cards.concat()
		},
		i2: {
			index: b,
			content: piles[b].cards.concat()
		}
	};
	
	redo[redo.length] = t;
}
