// POKERENGINE.JS
// Motore del gioco "poker square"
// -------------------------------
// dipende da: pokerscoring.js

// vettore degli elementi mobili
var floatingElements=['card1','card2','card3','card4','card5','card6','card7','card8','card9','card10','card11','card12','card13','card14','card15','card16','card17','card18','card19','card20','card21','card22','card23','card24','card25'];

// vettore degli elementi attiranti
var blackHoles=['fixed11','fixed12','fixed13','fixed14','fixed15','fixed21','fixed22','fixed23','fixed24','fixed25','fixed31','fixed32','fixed33','fixed34','fixed35','fixed41','fixed42','fixed43','fixed44','fixed45','fixed51','fixed52','fixed53','fixed54','fixed55'];

// tolleranza per porre una carta su un "blackhole"
var ray = 35;

// COSTANTI PER L'INTERFACCIA GRAFICA
var hoffset = 9;		// distanza tra una carta e l'altra (orizzontale)
var voffset = 9;		// distanza tra una carta e l'altra (verticale)

// VARIABILI PER LO STATO DEL GIOCO
var cardset = Array();	// mazzo di carte
var playset = Array();	// le 25 carte estratte a caso
var seeds = ['c','q','f','p'];	// semi
var cardsLeft = 25;	// le carte ancora in gioco
var scoreTypes=[0,0,0,0,0,0,0,0,0,0];	// classi di punteggi (n.scale, n.poker, etc..)
var totalScore=0; 		// punteggio totale
var rowScore=[0,0,0,0,0];	// punteggi di riga
var colScore=[0,0,0,0,0];	// punteggi di colonna

// matrix = campo di gioco (la griglia di 5x5 carte)
var matrix = Array(5)
for (i=0; i<5; i++)
{
	matrix[i] = Array(5);
	for (j=0; j<5; j++)
		matrix[i][j]="";
}


// costruisce il mazzo di carte (cardset)
function buildCardSet()
{
	k=0;
	for (i=0; i<=3; i++)
		for (j=1; j<=13; j++)
                {
                        cardset[k] = seeds[i]+j;
                        k++;
                }
}

function scrambleCards()
{
        var c1="";
        var c2="";

        buildCardSet();
        // prende una carta alla volta, dalla prima all'ultima
        // e la scambia con un'altra presa a caso
        for (i=0; i<52; i++)
        {
                rand = parseInt(52*Math.random());
		if (!rand)	// nel caso rand=NaN lo metto a zero.
			rand = 0;
                c1 = cardset[i];
                c2 = cardset[rand];
			cardset[i] = c2;
			cardset[rand] = c1;
        }
}

// estrae a caso le 25 carte per il nuovo gioco
function buildPlaySet()
{
        // mischio il mazzo di carte
        scrambleCards();
        // estraggo le prime 25
        for (i=0; i<25; i++)
                playset[i] = cardset[i];
}

//----------------------------------------------------------------------------------------
// inizializza le immagini dell'interfaccia grafica
function init()
{
	for (i=1; i<=9; i++)
		writeOnLayer('ps'+scoreNames[i]+'Count','0');

	iWidth  = getImage('endcard','Iendcard').width;
	iHeight = getImage('endcard','Iendcard').height;
	for (i=1; i<=5; i++)
	{
		// posiziono i blackholes
		for (j=1; j<=5; j++)
		{			
			newX = (j-1)*(iWidth+hoffset)+300;
			newY = (i-1)*(iHeight+voffset)+20;
			moveTo(obj("fixed"+i+j), newX, newY);
		}
		
		// posiziono i punteggi di riga e di colonna
		moveTo(obj("row"+i), 5*(iWidth+hoffset)+300, (i-1)*(iHeight+voffset)+(iHeight/2)+10);
		moveTo(obj("col"+i), (i-1)*(iWidth+hoffset)+(iWidth/2)+295, 5*(iHeight+voffset)+20);
	}
	moveTo(obj("cardsleft"), 35+(iWidth/2)-2, 30+iHeight);

	// inizializzazione dello stato del gioco
        buildPlaySet();

        // impilo le carte estratte
        for (i=25; i>=1; i--)
	{
                getImage("card"+i,"Icard"+i).src = "cards/"+playset[i-1]+".gif"
                obj("card"+i).zIndex = i;
		moveTo(obj("card"+i),40,30)
	}
	moveTo(obj("backcard"),40,30);
	obj("backcard").zIndex = 40;
	obj("card25").zIndex = 41;
}

// ripristina le condizioni iniziali per una nuova partita
function restartGame()
{
	floatingElements=['card1','card2','card3','card4','card5','card6','card7','card8','card9','card10','card11','card12','card13','card14','card15','card16','card17','card18','card19','card20','card21','card22','card23','card24','card25'];
	blackHoles=['fixed11','fixed12','fixed13','fixed14','fixed15','fixed21','fixed22','fixed23','fixed24','fixed25','fixed31','fixed32','fixed33','fixed34','fixed35','fixed41','fixed42','fixed43','fixed44','fixed45','fixed51','fixed52','fixed53','fixed54','fixed55'];
	cardsLeft = 25;
	scoreTypes=[0,0,0,0,0,0,0,0,0,0];
	totalScore=0;
	rowScore=[0,0,0,0,0];
	colScore=[0,0,0,0,0];
	for (i=1; i<=9; i++)
		writeOnLayer('ps'+scoreNames[i]+'Count','0');
	writeOnLayer('totalscore','<p class="green">Punteggio: 0</p>');
	writeOnLayer('cardsleft','25');

	for (i=1; i<=5; i++)
	{
		for (j=1; j<=5; j++)
		{			
			matrix[i-1][j-1] = "";
			
			// Azzero i punteggi di riga e colonna
		}
		writeOnLayer('col'+i,'0');
		writeOnLayer('row'+i,'0');
	}

	// inizializzazione dello stato del gioco
        buildPlaySet();

        // impilo le carte estratte
        for (i=25; i>=1; i--)
	{
                getImage("card"+i,"Icard"+i).src = "cards/"+playset[i-1]+".gif"
                obj("card"+i).zIndex = i;
		moveTo(obj("card"+i),40,30)
	}
	showLayer(obj("backcard"));
	moveTo(obj("backcard"),40,30);
	obj("backcard").zIndex = 40;
	obj("card25").zIndex = 41;
}

// funzione che gestisce il "blackHole" sul quale ho posato la carta
function holeHandler()
{
	prevScore = totalScore;
	cardsLeft--;

	writeOnLayer('cardsleft',cardsLeft);
	// impedisco alla carta appena posta di essere spostata
	floatingElements[cardsLeft] = "";
	row = parseInt(selectedHole.charAt(5))-1;
	col = parseInt(selectedHole.charAt(6))-1;
	// impedisco di porre piu' carte sullo stesso posto
	blackHoles[row*5+col] = "";
	matrix[row][col] = playset[cardsLeft];

	// estraggo la mano di poker della riga
	var rowhand=[];
	n=0;
	for (j=0; j<5; j++)
	{
		if (matrix[row][j] != "")
			rowhand[n++] = matrix[row][j];
	}
	sc_type=getScoreType(rowhand)
	totalScore = totalScore-scoreValues[rowScore[row]]+scoreValues[sc_type];
	scoreTypes[rowScore[row]]--;
	scoreTypes[sc_type]++;
	if (rowScore[row]) writeOnLayer('ps'+scoreNames[rowScore[row]]+'Count',
		scoreTypes[rowScore[row]]);
	if (sc_type)
	{
		row_string=row+1;
		writeOnLayer('row'+row_string,scoreValues[sc_type]);
		writeOnLayer('ps'+scoreNames[sc_type]+'Count',
			scoreTypes[sc_type]);
	}
	rowScore[row] = sc_type;

	// estraggo la mano di poker della colonna
	var colhand=[];
	n=0;
	for (i=0; i<5; i++)
	{
		if (matrix[i][col] != "")
			colhand[n++] = matrix[i][col];
	}
	sc_type=getScoreType(colhand)
	totalScore = totalScore-scoreValues[colScore[col]]+scoreValues[sc_type];
	scoreTypes[colScore[col]]--;
	scoreTypes[sc_type]++;
	if (colScore[col]) writeOnLayer('ps'+scoreNames[colScore[col]]+'Count',
		scoreTypes[colScore[col]]);
	if (sc_type)
	{
		col_string=col+1;
		writeOnLayer('col'+col_string,scoreValues[sc_type]);
		writeOnLayer('ps'+scoreNames[sc_type]+'Count',
			scoreTypes[sc_type]);
	}
	colScore[col] = sc_type;

	// aggiorno i punteggi totali
	if (prevScore != totalScore)
		writeOnLayer('totalscore','<p class="green">Punteggio: '+totalScore+'</p>');

	if (cardsLeft > 0)
		obj('card'+cardsLeft).zIndex = 41;
	if (cardsLeft == 1)
		hideLayer(obj('backcard'));

	if (cardsLeft == 0)
	{
		writeOnLayer('cardsleft','');
		alert("Fine gioco ("+totalScore+" punti)");
		// se la partita e' demo attraverso i pulsanti posso ricominciare
		// una nuova partita, altrimenti il punteggio viene registrato
		// nel database
		if (document['scoreForm'].tipo.value != "demo")
		{
			document['scoreForm'].totalScore.value = totalScore;
			document['scoreForm'].submit();
		}
	}
}
