// variables globales
var moveTracker			= document.getElementById('goban-move');
var gobanCancel			= document.getElementById('goban-cancel');
var gobanClear			= document.getElementById('goban-reset');
var gobanSubmit			= document.getElementById('goban-submit');
var gobanProcessBar	= document.getElementById('goban-process-bar');
var gobanLoadingBar	= document.getElementById('goban-loading');
var gobanResultBar	= document.getElementById('goban-result');
var serverUrl				= "/ws/xmlGoban.php";
var sequence				= new Array();
var imgRoot 				= "/img/goban_pics/";
var gobanPExpr 			= new RegExp("(black|white).*");
var gobanLExpr 			= new RegExp("gobanL-([A-Z]{1,2})-([0-9]{1,2})");
var request; // variable for posting information


function loadXMLPosDoc(url, posData) {
	try {
	  request = new XMLHttpRequest();
	} catch (trymicrosoft) {
	  try {
	    request = new ActiveXObject("Msxml2.XMLHTTP");
	  } catch (othermicrosoft) {
	    try {
	      request = new ActiveXObject("Microsoft.XMLHTTP");
	    } catch (failed) {
	      request = false;
	    }
	  }
	}
	if (request) {
    request.onreadystatechange = processPosChange;
    request.open("POST", url, true);
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.send(posData);
  }
}


function processPosChange() {
	var gobanResultBar	= document.getElementById('goban-result');
	
	// page loaded "complete"
  if (request.readyState == 4) {
    // page is "OK"
    if (request.status == 200) {
    	statut = grabPosXML("statut");
    	//alert('statut: '+statut+' - sequence: '+sequence);
    	if ((!statut) || ( statut == 'NOTOK' )) { 
				//alert('Un problème est intervenu lors de l\'interrogation du serveur.\nVeuillez recommencer d\'ici quelques minutes.');
				gobanResultBar.innerHTML = 'erreur : ' + grabPosXML("erreur");
			} else {
				if ( statut == 'FAILED' ) {
					gobanResultBar.innerHTML = 'mauvaise réponse';
					gobanResultBar.className = 'notfound';
				} else {
					if ( statut == 'PARTIAL' ) {
						gobanResultBar.innerHTML = 'bon début mais réponse incomplète';
						gobanResultBar.className = 'notfound';
					} else {
						if ( statut == 'SUCCESS' ) { 
							gobanResultBar.innerHTML = 'trouvé ! réponse :\n' + grabPosXML("solution");
							gobanResultBar.className = 'found';
						} 
						else {
							gobanResultBar.innerHTML += 'erreur du serveur';
						}
					}
				}
			}
		} else gobanResultBar.innerHTML = 'erreur interne '+request.status+'- process failed';
	} //else gobanResultBar.innerHTML = 'échec de connexion';
	
	gHideLoadBar();
	gShowResultBar();
}


function grabPosXML(tagName) {
	//alert(tagName);
	return request.responseXML.documentElement.getElementsByTagName(tagName)[0].childNodes[0].nodeValue;
}

// initialisation goban
function gLoad()
{
	// charger le bloc goban
	var goban = document.getElementById('goban');
	if (!goban) {
		//alert('goban init error');
		return false;
	}
	
	// détecter tous les éléments actifs du goban et leur affecter un évènement onclick
	for(y=1;y<20;y++) {
		for(x=65;x<97;x++) {
			xchar = String.fromCharCode(x);
			gobanlink = document.getElementById('gobanL-'+xchar+'-'+y);
			if (gobanlink) {
				gobanlink.onclick = function() {gClick(this);}
			} else gobanlink = null;
		}
	}
}

// obtenir la source d'une image du goban
function gGetImg(x,y) 
{
	img = document.getElementById('gobanI-'+x+'-'+y);
	if (img) return (img.getAttribute('src'));
	else return false;
}

// modifier la source d'une image du goban
function gSetImg(x,y,color,num) 
{
	img = document.getElementById('gobanI-'+x+'-'+y);
	if (!img) return false;
	// coups à annuler sur les bords/coins/centre
	if (!color) color = "C_empty";
	if (!num) num = '';
	img.src = imgRoot + color + num +'.png';
	return true;
}

// alterner la couleur courante
function gColorAltern()
{
	if (moveColor == 'black') moveColor = 'white';
	else moveColor = 'black';
}

// action lors du clic sur le goban
function gClick(obj) 
{ 
	// vérifier si goban toujours cliquable (limite de coups non dépassée)
	if ((maxMoveNum > 0) && (sequence.length >= maxMoveNum)) {
		//alert('limite de '+maxMoveNum+' coup(s) atteinte\nenvoyez votre solution.');
		gReset();
		return true;
	}
	
	// extraire les coordonnées de l'objet cliqué
	objId = obj.getAttribute('id');
	coord = gobanLExpr.exec(objId);
	if (coord[1]) x = coord[1];
	if (coord[2]) y = coord[2];
	//alert ('x:'+x+' - y:'+y);
	
	// extraire la source de l'image cliquée
	imgSrc = gGetImg(x,y);
	if (!imgSrc) return false;
	
	// comparer le nom de l'image, si contient black|white coup déjà posé donc impossible à jouer	
	imgSrcP = gobanPExpr.exec(imgSrc);
	if (imgSrcP) {
		alert('coup impossible\nintersection '+x+'-'+y+' déjà occupée');
		return false;
	}
	
	// enregistrer le coup dans la séquence
	xy = x+'-'+y;
	sequence.push(xy);
	//alert(sequence);
	
	// incrémenter le compteur
	moveNum ++;
	if(moveTracker) moveTracker.value = moveNum;
	
	// afficher le coup sur le goban
	gSetImg(x,y,moveColor,moveNum);
	
	// alterner la prochaine couleur
	gColorAltern();
	
	// envoi auto de la réponse si séquence complète
	if ((sequence.length == maxMoveNum)) gSubmit();
	
	return true;
}

// annuler le dernier coup
function gUndo() 
{
	xy = sequence.pop();
	if (!xy) return false;
	coord = xy.split("-");
	x = coord[0];
	y = coord[1];
	
	// cas spéciaux (hoshis,bords,coins)
	xoaxis = (x=='D') || (x=='K') || (x=='Q');
	yoaxis = (y==4) || (y==10) || (y==16);
	if (xoaxis && yoaxis) color = 'C_hoshi';
	else {
		color = '';
		if (y==1)color += 'S';
		else if(y==19) color += 'N';
		if (x=='A') color += 'W';
		else if(x=='T') color += 'E';
		if (!color) color = "C";
		color += "_empty";
	}
	
	// supprimer l'image
	gSetImg(x,y,color);
	
	// alterner la couleur
	gColorAltern();
	
	// décrémenter le compteur
	moveNum --;
	if(moveTracker) moveTracker.value = moveNum;
	
	gHideResultBar();
	gHideLoadBar();
	
	return true;
}

// revenir à l'état initial du goban
function gReset() 
{
	do 
	{
		gUndo();
	}
	while(sequence.length > 0);
	sequence = new Array();
	if (moveTracker) moveTracker.value = 0;
	moveColor	= firstmoveColor;
	return true;
}

function gShowLoadBar() {
	var gobanLoadingBar	= document.getElementById('goban-loading');
	if (!gobanLoadingBar) return false;
	gobanLoadingBar.style.visibility = 'visible';
	//gobanLoadingBar.style.display = 'block';
	sentTimer = setTimeout("gHideLoadBar()",3000);
}
function gHideLoadBar() {
	var gobanLoadingBar	= document.getElementById('goban-loading');
	if (!gobanLoadingBar) return false;
	//gobanLoadingBar.style.display = 'none';
	gobanLoadingBar.style.visibility = 'hidden';
}

function gShowResultBar() {
	var gobanResultBar	= document.getElementById('goban-result');
	if (!gobanResultBar) return false;
	//gobanResultBar.style.display = 'block';
	gobanResultBar.style.visibility = 'visible';
}
function gHideResultBar() {
	var gobanResultBar	= document.getElementById('goban-result');
	if (!gobanResultBar) return false;
	//gobanResultBar.style.display = 'none';
	gobanResultBar.innerHTML = ''; // ah oui tiens bonne idée, copyright Le Dragon Catalan ;) 
	gobanResultBar.style.visibility = 'hidden';
}

function gSubmit() 
{
	if ((moveNumToSend > 0) && (sequence.length != moveNumToSend)) {
		alert('il faut soumettre une séquence de '+moveNumToSend+' coup(s)\n'+sequence.length+' coup(s) saisi(s)\n'+sequence);
		return false;
	}
	
	gHideResultBar();
	gShowLoadBar();
	
	// passage des paramètres POST
	//var stuff = 'g='+gobanId+'&s='+sequence+'&u='+uid;
	var stuff = 'g='+gobanId+'&s='+sequence+'&sid='+sid;
	//alert(serverUrl+' '+stuff);
	
	loadXMLPosDoc(serverUrl,stuff);
	
	return true;
}


// déclencher le chargement du goban et des évènements associés
addEvent(window, "load", gLoad);
//addEvent(window, "load", gHideLoadBar);
//if (moveTracker) moveTracker.value = '--';
if (gobanCancel) addEvent(gobanCancel, "click", gUndo);
if (gobanClear) addEvent(gobanClear, "click", gReset);
if (gobanSubmit) addEvent(gobanSubmit, "click", gSubmit);
