// http://openweb.eu.org/articles/objet_xmlhttprequest/

// http://www.xulplanet.com/references/xpcomref/ifaces/nsIXMLHttpRequest.html
// http://www.developpez.net/forums/archive/index.php/f-23-p-16.html

/*----------------------- INITIALISATIONS VARIABLES GLOBALES -------------------------------*/

// taille d'une case en pixels
var caseSize = 56;

// hauteur et largeur de la portion de carte demandee
var mapWidth  = 8;
var mapHeight = 8;

// marge pour le déplacement du perso selectionne avant repositionnement
var mapDelta = 2;

// taille des images de mimichant en pixels
var imgW = 46;
var imgH = 65;

// position du centre de la carte
var centreX = 0;
var centreY = 0;

// type de deplacement gere par les fleche de la carte : carte ou personnage
var mapMovesType = 0;

/*-----------------------------------------------------------------------------------------*/

// id et login de l'utilisateur
var userId;
var userLogin = 'vous';

// booleen pour afficher ou non les flags de propriete
var showFlags = 0;
var flagsValid = 0;

// infos sur la case selectionnee
var caseX    = centreX;
var caseY    = centreY;
var caseType = -1;
var caseUid  = -1;

// infos sur le mimichant selectionne
var charId;
var charName;
var charX  = centreX;
var charY  = centreY;

// ID du  mimichant ennemi selectionne
var charOppId = -1;

// VARIABLE GLOBALE "FLAG / MUTEX" pour controler reussite/echec du deplacement
var moveCharManaged = 0;

var xhr = null;
var copule = 0;


function getXhr(){
if(window.XMLHttpRequest) // Firefox et autres
	   xhr = new XMLHttpRequest();
	else if(window.ActiveXObject){ // Internet Explorer
	   try {
				xhr = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				xhr = new ActiveXObject("Microsoft.XMLHTTP");
			}
	}
	else { // XMLHttpRequest non supporté par le navigateur
	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
	   xhr = false;
	}
}



function checkCopulate() {

	getXhr()
	xhr.onreadystatechange = function(){

	   if(xhr.readyState == 4 && xhr.status == 200){

		if(charOppId==-1){

			sendInfo('Personne avec qui copuler.', -1);
		}
		else {

			sendInfo('Vous tentez de faire copuler '+charId+' et '+charOppId, -1);
		}
	   }

	}


	xhr.open("POST","copule.php",true);
	xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xhr.send("charId="+charId+"&charOppId="+charOppId);
}


function checkEggAndSpace() {

	getXhr()
	xhr.onreadystatechange = function(){

	   if(xhr.readyState == 4 && xhr.status == 200){
		
	   }

	}


	xhr.open("POST","egg.php",true);
	xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	
}



function checkAttack() {
	if(charOppId==-1)
		sendInfo('Personne avec qui se battre.', -1);
	else
		sendInfo('Pour attaquer '+charOppId+' avec '+charId+' ...Y\'a qu\'à intégrer !', -1);
}

function checkJoinGuild() {
	if(charOppId==-1)
		sendInfo('Personne avec qui s\'allier.', -1);
	else
		sendInfo('Pour joindre la guilde du propriétaire de '+charOppId+' ...Y\'a qu\'à intégrer !', -1);
}

function checkConquer() {
	sendInfo('Tentative de capturer le terrain ('+caseX+', '+caseY+') ...', 0);
	takeGround(charId);
}

function checkStore() {
	sendInfo('Pour la boutique ...Y\'a qu\'à intégrer !', -1);
}

function checkBank() {
	sendInfo('Pour la banque ...Y\'a qu\'à intégrer !', -1);
}

function checkAnnouces() {
	sendInfo('Pour voir les annonces ...Y\'a qu\'à intégrer !', -1);
}





// demon appelle a intervalles regulier pour gerer les infossur la partie
function realTimeInfosDeamon() {
	
	document.getElementById('realTimeInfos').innerHTML = '';
	checkEggAndSpace();
}


function sendInfo(message,type) {

	var img = '';
	switch (type) {
		case -1 : img = '<img src="img/error.gif" alt="Error : " /> '; break; // erreur
		case  0 : img = '<img src="img/info.gif" alt="Info : " /> ';   break; // infos neutre
		case  1 : img = '<img src="img/accept.gif" alt="Ok : " /> ';   break; // validation
	}
	document.getElementById('realTimeInfos').innerHTML += img + message + '<br />';
}





/*----------------------------------------------------------------------------------------
setMiniMapAim
repositionne la cible dans la minimap
----------------------------------------------------------------------------------------*/
function setMiniMapAim() {

	var imgColorX = document.getElementById('imgColorX').value;
	var imgColorY = document.getElementById('imgColorY').value;
	var ratio     = document.getElementById('ratio').value;
	var Xmin      = document.getElementById('Xmin').value;
	var Ymin      = document.getElementById('Ymin').value;
	
	var realx = centreX-Xmin;
	var realy = centreY-Ymin;
	
	var x = Math.abs( realx * ratio ) - parseInt(imgColorX) - 2;
	var y = Math.abs( realy * ratio ) + parseInt(imgColorY) - 2;
	
	document.getElementById('minimap_aim').style.cssText = 'left: '+x+'px; top: '+y+'px;';
}



/*------------------------------------------------------------------------------------------
clic
Appellee au clic sur un terrain :
- selectionne la case (positionne le marqueur)
- actualise les infos detaillees sur le terrain (requete)
------------------------------------------------------------------------------------------*/
function clic(x,y,noInfos) {
	//alert('case ('+x+', '+y+')\n'+caseX+' '+caseY+'\n'+centreX+' '+centreY+'\nType: '+type+'\nUser: '+uid);
	caseX = x;
	caseY = y;
	
	// positionner le marqueur de selection
	var marker = document.getElementById('selector');
    x = ( -centreX + Math.abs(mapWidth/2)  + caseX );
    y = ( -centreY + Math.abs(mapHeight/2) + caseY );
	//alert("x: "+charX+" y: "+charY);
	// gestion des limites de la carte
	if( x<0 || x>=mapWidth || y<0 || y>=mapHeight )
		marker.style.display = 'none';
	else {
		
		marker.style.display = 'block';
		marker.style.cssText = 'position:absolute; left:'+x*caseSize+'px; top:'+y*caseSize+'px;';
	}
	if(noInfos!=1) // !!! sinon fait deux requetes en meme temps => bug
		getCaseInfos(caseX,caseY);
}


/*------------------------------------------------------------------------------------------
clicChar
IDEM clic() mais appellee au clic sur un mimichant
------------------------------------------------------------------------------------------*/
function clicChar(x,y,cid) {
	clic(x,y);
	// + envoie d'évenement "char selected" pour affichage utilisateur ?
}

function verifTerrier(chemin){
//alert("x: "+charX+" y: "+charY);
	
	//affichage des objets à acheter
	getXhr()
	// On défini ce qu'on va faire quand on aura la réponse
	xhr.onreadystatechange = function(){
		// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
		if(xhr.readyState == 4 && xhr.status == 200){
			if(xhr.responseText==1) 
			{
				window.location=chemin;
			}
			else
			{
				alert ("Vous n'êtes pas autorisé à accéder aux services : vous n'êtes pas sur un terrier");
			}
		}
	}
	xhr.open("POST","verifTerrain.php",true);
	xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xhr.send("posx="+charX+"&posy="+charY+"&idMimi="+charId);

}


/*------------------------------------------------------------------------------------------
switchMapCharMoves
switche entre le deplacement du perso et celui de la carte par les fleches
------------------------------------------------------------------------------------------*/
function switchMapCharMoves() {
	
	button = document.getElementById('movesTypeButton');
	
	if (mapMovesType==1) {
		mapMovesType = 0;
		button.title = 'déplacements carte';
		button.src = 'img/path.gif'
	} else {
		mapMovesType = 1;
		button.title = 'déplacements mimichant';
		button.src = 'img/path-no.gif'
	}
}




/*------------------------------------------------------------------------------------------
showHideFlags
affiche ou masque les flags de propriete (alliances) des terrains
------------------------------------------------------------------------------------------*/
function showHideFlags(normalUpdate) {
	
	flags  = document.getElementById('flags');
	button = document.getElementById('showHideFlagsButton');
	
	if (showFlags==1) {
		flags.style.display = 'none';
		showFlags = 0;
		button.title = 'afficher les blasons';
		button.src = 'img/flag.gif'
	} else {
		// demande les flags s'ils n'ont pas ete recalcules
		if (flagsValid==0) getFlags();
		flags.style.display = 'block';
		showFlags = 1;
		button.title = 'masquer les blasons';
		button.src = 'img/flag-no.gif'
	}
}

/*------------------------------------------------------------------------------------------
selectChar
gere la selection d'un perso par l'utilisateur
------------------------------------------------------------------------------------------*/
function selectChar(index) {
	
	var cselect = document.getElementById('charSelect');
	var index   = cselect.selectedIndex;
	var cid     = cselect[index].value;
	var cname   = cselect[index].innerHTML;
	
	charId = cid;       // MAJ des variables globales
	getCharPos(charId); // (  charX, charY )  depuis la BDD
	focusChar();        // recentrer la vue sur le mimichant selectionne
	
	sendInfo( cname+' sélectionné.', 1);
}

function selectCharA(idMimiSelect, nomMimiSelect) {
	
	
	charId = idMimiSelect;       // MAJ des variables globales
	charName = nomMimiSelect;
	getCharPos(charId); // (  charX, charY )  depuis la BDD
	focusChar();        // recentrer la vue sur le mimichant selectionne
	
	sendInfo( charName+' sélectionné.', 1);
}

/*------------------------------------------------------------------------------------------
move
gere les deplacements et leurs limites dans la carte
------------------------------------------------------------------------------------------*/
function move(direction) {
	
	if(mapMovesType == 1) moveMapMap(direction);
	else moveMapChar(direction);
}



/*------------------------------------------------------------------------------------------
moveMap
gere les deplacements de la carte
------------------------------------------------------------------------------------------*/
function moveMapMap(direction) {
	
	switch ( direction ) {
		case 'left' : centreX--; break;
		case 'right': centreX++; break;
		case 'up'   : centreY--; break;
		case 'down' : centreY++; break;
		
		case 'upleft'  : centreX--; centreY--; break;
		case 'upright' : centreX++; centreY--; break;
		
		case 'downleft'  : centreX--; centreY++; break;
		case 'downright' : centreX++; centreY++; break;
	}
	flagsValid = 0;
	getGrounds();
}

/*------------------------------------------------------------------------------------------
moveChar
gere les deplacements de mimichant et leurs limites dans la carte
------------------------------------------------------------------------------------------*/
function moveMapChar(direction) {
	
	var x_dir = 0;
	var y_dir = 0;
	
	switch ( direction ) {
		case 'left' : x_dir = -1; break;
		case 'right': x_dir =  1; break;
		case 'up'   : y_dir = -1; break;
		case 'down' : y_dir =  1; break;
		
		case 'upleft'  : x_dir = -1; y_dir = -1; break;
		case 'upright' : x_dir =  1; y_dir = -1; break;
		
		case 'downleft'  : x_dir = -1; y_dir = 1; break;
		case 'downright' : x_dir =  1; y_dir = 1; break;
	}
	
	// VARIABLE GLOBALE "FLAG / MUTEX" pour controler reussite/echec du deplacement
	moveCharManaged = 0;
	
	moveChar(charId, x_dir, y_dir);  // tentative de deplacement (  BDD  )  requete synchrone et bloquante
	
	if ( moveCharManaged == 1 ) {
		//  HYPER SUPRA IMPORTANT !!!  reconvertit en entier les valeurs devenues char !!!
		//  HYPER SUPRA IMPORTANT !!!  a n'effectuer que si moveChar a reussi !!!
		charX = parseInt(charX) + parseInt(x_dir);
		charY = parseInt(charY) + parseInt(y_dir);
		
		// position
		var xRel = ( charX - centreX ) + Math.abs(mapWidth/2);
		var yRel = ( charY - centreY ) + Math.abs(mapHeight/2);
		
		//alert('CHAR: '+charX+' '+charY+'\nREL: '+xRel+' '+yRel);
		
		// recentre la carte sur le perso s'il atteint la marge de deplacement
		if( xRel < mapDelta || xRel > mapWidth-mapDelta
		 || yRel < mapDelta || yRel > mapHeight-mapDelta ) focusChar();
		else getGrounds();
	}
	
	// REMISE DU "FLAG / MUTEX" a 0 IMPERATIVE
	moveCharManaged = 0;
}

/*------------------------------------------------------------------------------------------
focusChar
centre la vue sur le mimichant courant
------------------------------------------------------------------------------------------*/
function focusChar() {
	flagsValid = 0;
	getGrounds(true, charX,charY);
}




/*------------------------------------------------------------------------------------------
initCarte
Requete demandant les terrains autour de (centreX,centreY)
NB: "showFlags" permet de maintenir les flags affiches/masques selon le cas
------------------------------------------------------------------------------------------*/
function initMap(id,login,idMimi,nomMimi) {
	//alert("ok");
	// recup. id et login de l'utilisateur en global
	userId = id;
	userLogin = login;
	charId = idMimi;
	selectCharA(idMimi,nomMimi);
	
	
	// fond (cases inconnues)
	var fond = '<div id="map_background" style="width:'+mapWidth*caseSize+'px;height:'+mapHeight*caseSize+'px;"></div>';
	
	var cases  = '<div id="cases"></div>';    // les terrains
	var flags  = '<div id="flags"></div>';    // les flags/blasons/emblemes/drapeaux
	var persos = '<div id="chars"></div>';    // les personnages
	var marker = '<div id="selector"></div>'; // marqueur de selection
	
	// boutons de deplacement (haut, bas gauche, droite) - carres de 30px
	var w = mapWidth * caseSize;
	var h = mapHeight * caseSize;
	var mw = Math.abs(w/2) - 15;
	var mh = Math.abs(h/2) - 15;
	
	var hbis=h-10;
	var wbis=w-10;
	var buttons = '';
	// haut
	buttons += '<img class="moveButton" src="img/upleft.gif"  onclick="move(\'upleft\');"  style="left:-10px;top:-10px;" alt="" />';
	buttons += '<img class="moveButton" src="img/up.gif"      onclick="move(\'up\');"    style="left:'+mw+'px;top:-15px;" alt="" />';
	buttons += '<img class="moveButton" src="img/upright.gif" onclick="move(\'upright\');"  style="left:'+wbis+'px;top:-10px;" alt="" />';

	// centre
	buttons += '<img class="moveButton" src="img/left.gif"  onclick="move(\'left\');"  style="left:-15px;top:'+mh+'px;" alt="" />';
	buttons += '<img class="moveButton" src="img/right.gif" onclick="move(\'right\');" style="left:'+w+'px;top:'+mh+'px;" alt="" />';
	
	// bas

	buttons += '<img class="moveButton" src="img/downleft.gif"  onclick="move(\'downleft\');"  style="left:-10px;top:'+hbis+'px;" alt="" />';
	buttons += '<img class="moveButton" src="img/down.gif"  onclick="move(\'down\');"  style="left:'+mw+'px;top:'+h+'px;" alt="" />';
	buttons += '<img class="moveButton" src="img/downright.gif" onclick="move(\'downright\');"  style="left:'+wbis+'px;top:'+hbis+'px;" alt="" />';
	
	// insertion du code XHTML
	document.getElementById('map_detail_container').innerHTML = '<div id="map_detail">'+fond+cases+flags+marker+persos+buttons+'</div>';
	getGrounds(); // requete des terrains
	
	// lancement du demon sur les infos de la partie en temps reel
	setInterval(realTimeInfosDeamon, 6000);
}

