/*
Backer's Dozen, ©Copyright 2008-bezumie.com, All Rights Reserved
Дузината на Хлебаря, ©Copyright 2008-bezumie.com, Всички права запазени
*/
var oTable, tableau=[], foundation=[];
var defDeck=2, defSize=4, widthInx=10, heightInx=7, maxWidth=0.92, maxHeight=0;
var result, gameIsOver=true;
var zInd=100, drawTO=35, vGap=.18;

function closeHelp(){
	document.getElementById('help').style.display='none';
}
function showHelp(){
	oTable.div.appendChild(document.getElementById('help'));
	document.getElementById('help').style.display = 'inline';
}
function changeWidth(){
	document.getElementById('infoLine').style.width=oTable.width+'px';
}
function changeDeck(id){
	oTable.setDeck(id);
	changeWidth();
	oTable.loadCards(null);
}
function changeSize(size){
	oTable.setSize(size);
	changeWidth();
	oTable.loadCards(null);
}
function plus(){
	if(oTable.cardSize<9)
		changeSize(oTable.cardSize+1);
}
function minus(){
	if(oTable.cardSize>1)
		changeSize(oTable.cardSize-1);
}
function setResult(newResult){
	result=newResult;
	var r=document.getElementById('result');
	r.innerHTML=newResult;
}
function win(){
	oTable.showWin();
}
function hidewin(){
	oTable.hideWin();
}
function moveCard(card, stack){
	var i=stack.cards.length;
	card.div.style.zIndex=++zInd;
	oTable.addCardToStack(card, stack, 0, i*vGap);
}
function canDiscard(card,stack){
	if(stack.myName!='foundation')return false;
	if(stack.cards.length){
		lc=stack.lastCard();
		if((lc.suit==card.suit)&&(lc.value==card.value-1)){
			return true;
		}
	}
	else if(card.value==1){
		return true;
	}
	return false;
}
function discardCard(card,stack){
	card.div.style.zIndex=++zInd;
	oTable.addCardToStack(card, stack, 0, 0);
	var r=0;
	for(var i=0;i<4;i++){
		r+=foundation[i].cards.length;
	}
	if(r>result){
		setResult(r);
		if(result==52)win();
	}
	return true;
}
function dragStart(card){
	if(card.stack.lastCard()!==card)return false;
	card.stack.div.style.zIndex=++zInd;
	card.div.style.zIndex=++zInd;
}
function rst(card){
	oTable.resetCardPos(card);
	return false;
}
function dragDrop(card){
	var stack=oTable.cardPos2Stack(card);
	if(!stack)return rst(card);
	var cs=card.stack;
	if(stack==cs)return rst(card);
	if(stack.myName=='foundation'){
		if(canDiscard(card,stack))return discardCard(card,stack);
		else return rst(card);
	}
	var lc=stack.lastCard();
	if(lc&&(lc.value==card.value+1)){
		moveCard(card,stack);
	}
	else{
		rst(card);
	}
}
function cardDblClick(card){
	if(card.stack.lastCard()!==card)return;
	for(var i=0;i<4;i++){
		if(canDiscard(card,foundation[i])){
			discardCard(card, foundation[i]);
			return true;
		}
	}
}
function rearangeK(){
	var i,j,card,st;
	for(i=0;i<13;i++){
		st=[];
		for(j=3;j>=0;j--){
			if(tableau[i].cards[j].value==13){
				card=tableau[i].cards[j];
				st.push(card);
				oTable.removeCardFromStack(card);
			}
		}
		if(st.length){
			while(tableau[i].cards.length){
				card=tableau[i].cards[0];
				st.push(card);
				oTable.removeCardFromStack(card);
			}
			for(j=0;j<4;j++){
				moveCard(st[j], tableau[i]);
			}
		}
	}
}
function drawCards(){
	var cnt=oTable.oStack.cards.length;
	if(!cnt){
		rearangeK();
		gameIsOver=false;
		return;
	}
	var card=oTable.lastCard();
	var i=12-((cnt-1)%13);
	card.faceUp(true);
	moveCard(card, tableau[i]);
	setTimeout('drawCards()', drawTO);
}
function newGame(){
	oTable.hideWin();
	oTable.removeAll();
	oTable.shuffle();
	setResult(0);
	drawCards();
}
function init2(){
	var i,t,l;
	var card;
	for(i=0;i<13;i++){
		if(i<7){
			t=0.2;
			l=i*0.15 + i + 0.3;
		}
		else {
			t=3.7;
			l=i-7+(0.15*(i-7))+0.3;
		}
		tableau[i]=oTable.addStack('tableau'+i, 53, l, t);
		tableau[i].myName='tableau';
		oTable.stackDropZone(tableau[i], 0, 0, 0, 3);
	}
	for(i=0;i<4;i++){
		foundation[i]=oTable.addStack('foundation'+i, 54, 8.5, i+(0.3*i)+0.2);
		foundation[i].myName='foundation';
	}
	for(i=0;i<52;i++){
		card=oTable.oCards.cards[i];
		card.ondblclick=cardDblClick;
		card.ondragstart=dragStart;
		card.ondrop=dragDrop;
	}
	newGame();
}
function init(containerName){
	oTable=new Table(containerName, defDeck, defSize, widthInx, maxWidth, heightInx, maxHeight, lang);
	oStockLeft=oTable.addLabel('stockLeft', 0.35, 1.3);
	changeWidth();
	oTable.loadCards(init2);
}