var colMov=-1;

function an(movs, tipus, posIni) {
	if (tipus==undefined) tipus="N";
	if (posIni==undefined) posIni="TCADRACTPPPPPPPP                                pppppppptcadract";
	nmov=0;
	
	posAct = posIni;
	arrMovs = movs.split(" ")
	for (i=0; i<arrMovs.length; i++) {
		posAnt = posAct;
		posAct = anMov(arrMovs[i], tipus, posAct);
		if (posAnt!=posAct) p_a.mesMov(arrMovs[i], posAct,i);
	}
	
	return false;
}

function anMov(mov, tipus, posAct) {
	canvi = new Array();
	canviP = new Array();
	ncanvis=0;
	escac=0; mat=0; corona_="";
	restrX=restrY="";
	car0 = mov.substring(0,1);
	if (isNaN(parseInt(car0))) {
		if (mov.substring(mov.length-1,mov.length)=="+") { // és escac?
			escac=1;
			mov = mov.substring(0,mov.length-1);
		}
		if (mov.substring(mov.length-1,mov.length)=="+") { // és mat?
			mat=1;
			mov = mov.substring(0,mov.length-1);
		}
		if (mov=="O-O-O") { // és enroc?
			canvi[0]= (colMov?56:0); canviP[0]=" ";
			canvi[1]= (colMov?60:4); canviP[1]=" ";
			canvi[2]= (colMov?58:2); canviP[2]="R";
			canvi[3]= (colMov?59:3); canviP[3]="T";
			ncanvis=4;
		} else if (mov=="O-O") {
			canvi[0]= (colMov?63:7); canviP[0]=" ";
			canvi[1]= (colMov?60:4); canviP[1]=" ";
			canvi[2]= (colMov?62:6); canviP[2]="R";
			canvi[3]= (colMov?61:5); canviP[3]="T";
			ncanvis=4;
		} else { // no és enroc?
			if (mov.substring(mov.length-2,mov.length-1)=="=") { // corona?
				corona_ = mov.substring(mov.length-1,mov.length);
				mov = mov.substring(0,mov.length-2);
			}
			posMenja=mov.indexOf("x");
			if (posMenja>-1) { // menja? identificar origen i destí
				movOrig=mov.substring(0,posMenja);
				movDest=mov.substring(posMenja+1, mov.length);
			} else { // no menja? identificar origen i destí
				movDest=mov.substring(mov.length-2, mov.length);
				movOrig=mov.substring(0,mov.length-2);
			}
				
			if ("CATDR".indexOf(car0)>-1) { // trobar peça d'origen
				pecaOrigen = car0;
				movOrig = movOrig.substring(1,movOrig.length);
			} else {
				pecaOrigen = "P";
			}
	
			if (movOrig.length) {
				if ("abcdefgh".indexOf(movOrig.substring(0,1))>-1) { // trobar abscissa
					restrX= movOrig.substring(0,1);
					movOrig= movOrig.substring(1,movOrig.length);
				}
				if (movOrig.length) {
					if ("12345678".indexOf(movOrig.substring(0,1))>-1) { // trobar abscissa
						restrY= movOrig.substring(0,1);
						movOrig= movOrig.substring(1,movOrig.length);
					}
				}
			}
	
			canviP[ncanvis]= pecaOrigen; if (corona_!="") canviP[ncanvis]= corona_;
			posDesti = transCoord(movDest);
			canvi[ncanvis]= posDesti; 
			ncanvis++;

			mortPas=mortAlPas(posAct, pecaOrigen, posDesti);
			if (mortPas>-1) {
				canviP[ncanvis]= " ";
				canvi[ncanvis] = mortPas;
				ncanvis++;
			}

			posOrigen = trobarOrig(posAct, pecaOrigen, restrX, restrY, posDesti);
			if (posOrigen>-1) {
				canviP[ncanvis]= " ";
				canvi[ncanvis] = posOrigen;
				ncanvis++;
				p_a.movp0[nmov]=posOrigen%8 + (parseInt(posOrigen/8)*10);
				p_a.movp1[nmov]=posDesti%8 + (parseInt(posDesti/8)*10);
			}
	
		} // fi else enroc
		
	for (j=0; j<ncanvis; j++) {
		if (colMov) canviP[j] = canviP[j].toLowerCase();
		if (canvi[j]==0) posAct = canviP[j] + posAct.substring(1,posAct.length);
		else if (canvi[j]==posAct.length) posAct = posAct.substring(0,posAct.length-1) + canviP[j];
		else 
		posAct=posAct.substring(0,canvi[j]) + canviP[j] + posAct.substring(canvi[j]+1,posAct.length);
	}
	
	
		colMov=1;
	} else { // estem analitzant un moviment...
		colMov=0;
	}

	return posAct; 
	
}
	
function transCoord(coord) { // Transforma coordenades
	X="abcdefgh".indexOf(coord.substring(0,1));
	Y="12345678".indexOf(coord.substring(1,2));
	return X+Y*8;
}

function mortAlPas(posAct, pecaOrigen, posOrigen) {
	if (pecaOrigen=="P") {
		if (posAct.substring(posOrigen, posOrigen+1)==" ")
			return posOrigen+(colMov?8:-8);
	}
	return -1
}
function trobarOrig(posAct, pecaOrigen, restrX, restrY, posOrigen) {
	restrNX = "abcdefgh".indexOf(restrX);
	restrNY = "12345678".indexOf(restrY);
	if (pecaOrigen=="P") {
		if (colMov) pecaOrigen = pecaOrigen.toLowerCase();
		iniciY=parseInt(posOrigen/8);
		if (restrX=="") iniciX=posOrigen%8;
		else iniciX=restrNX;
		signeR = (colMov?1:-1);
		for (k=iniciY+signeR; k>=0 && k<=7; k+=signeR) {
			pos = iniciX+k*8;
			if (posAct.substring(pos,pos+1)==pecaOrigen) {
				return pos;
			}
		}
		return -1;
	} else {
		dirX = new Array();
		dirY = new Array();
		parar = new Array();
		ndirs=0;

		switch (pecaOrigen) {
			case "C": for (d1=-2; d1<=2; d1++) {
						for (d2=-2; d2<=2; d2++) {
							if (Math.abs(d1) + Math.abs(d2)==3) {
								dirX[ndirs]=d1; dirY[ndirs]=d2; ndirs++;
							}
						}
					} lim=1; break;
			case "R": for (d1=-1; d1<=1; d1++) {
						for (d2=-1; d2<=1; d2++) {
							if (d1!=0 || d2!=0) {
								dirX[ndirs]=d1; dirY[ndirs]=d2; ndirs++;
							}
						}
					} lim=1; break;
			case "D": for (d1=-1; d1<=1; d1++) {
						for (d2=-1; d2<=1; d2++) {
							if (d1!=0 || d2!=0) {
								dirX[ndirs]=d1; dirY[ndirs]=d2; ndirs++;
							}
						}
					} lim=8; break;
			case "A": for (d1=-1; d1<=1; d1+=2) {
						for (d2=-1; d2<=1; d2+=2) {
							if (d1!=0 && d2!=0) {
								dirX[ndirs]=d1; dirY[ndirs]=d2; ndirs++;
							}
						}
					} lim=8; break;
			case "T": for (d1=-1; d1<=1; d1++) {
						for (d2=-1; d2<=1; d2++) {
							if (d1==0 || d2==0) {
								dirX[ndirs]=d1; dirY[ndirs]=d2; ndirs++;
							}
						}
					} lim=8; break;
		}
		
		if (colMov) pecaOrigen = pecaOrigen.toLowerCase();
		posX = (posOrigen%8);
		posY = parseInt(posOrigen/8);
		for (s=0; s<ndirs; s++) parar[s]=0; 
		for (r=1; r<=lim; r++) {
			for (s=0; s<ndirs; s++) {
				if (!parar[s]) {
					NposX = posX + r*dirX[s];
					NposY = posY + r*dirY[s];
					if (NposX>7 || NposX<0 || NposY>7 || NposY<0) parar[s]=1;
					else {
						pos = NposX+NposY*8
						peca = posAct.substring(pos,pos+1);
						if (peca==pecaOrigen && (restrX=="" || restrNX==NposX) && (restrY=="" || restrNY==NposY)) {
							return pos;
						}
						else if (peca!=" ") parar[s]=1;
					}
				}
			}
		}
			
	}
	return -1
}
