// Cartes interactives : sélection de zones. Les clicks sont interceptés nn pas sur la carte, mais sur un DIV vide placé par dessus
// afin de rester cliquable même sur le curseur et les points de sélection

var	full=false,					// true quand la sélection en cours atteint son maximum
	selections=new Array(),		// mémo des sélections de chaque carte
	a_zone=0,					// carte active (0..n) = index dans zones[]
	zone_cook=''				// Cookie spécifique

// Afficher la carte "z" -> init
function init_selboxes(z) {
	sd_showDiv(zones[z]['container'])
	a_zone=z
	var name=zones[z]['IDs'], f=document.getElementById(name+'-liste'), zone_cook=lect_cook(true,"zones"), ok_cook=false,l,
		cook_start=zone_cook.indexOf(':')+1,
		toreaff=''
	init_bte(f,z)							// Remplissage bte de sélection source "-liste"
	if(typeof(selections[z])=='undefined') selections[z]=''
	if(zone_cook) ok_cook=cook_start && zone_cook.substring(0,cook_start)==z + ':' && zone_cook.substring(cook_start,cook_start+3) != '000'
	if(ok_cook) {													// Maj de la bte de sélection des régions
		zone_cook=zone_cook.substring(cook_start)
		l=parseFloat(zone_cook.substring(0,3))
		toreaff='transfert(0,' + l + ',"' + zone_cook + '",'+z+')'			// Délai obligatoire pour bypasser l'ouverture douce...
	}
	// ajout des points de sélection sur la carte. un point doit déjà avoir été placé avec l'id 0, 
	// il sera dupliqué via le DOM. Si le pont '1' existe lui aussi, pas de dupliucaiotn (on est en réouverture d'une carte déjà initialisée)
	if(!document.getElementById(name+'-point1')) {
		var model=document.getElementById(name+'-point0'),toadd
		for(var i=1;i<zones[z]['max'];i++) {
			toadd=model.cloneNode(false)				// clone le node sans ses enfants (false)
			toadd.id=name+ '-point' + i.toString()		// modif de l'ID du node créé
			model.parentNode.appendChild(toadd)			// insertion de l'image		
		}
	}
	zone_restart(toreaff,zones[z]['container'])
}


// Réaffichage d'une zone -> effacement dès qu'elle est en display, et mise à jour après un délai
function zone_restart(cde,container) {
	if(document.getElementById(container).style.display=='none') setTimeout("zone_restart('"+cde+"','"+container+"')",30)
	else {
		efface()
		setTimeout(cde,400);
	}
}

// Fermeture de la carte "z"
function close_map() {
	sd_close()
	verif_regions(a_zone)
}


// Init d'une carte géographique : init des zones déjà sélectionnées -> selections[] et allume les points à l'écran
// Le timeout apporte une petite animation
// i=offset dans la chaine c, l=nb d'éléments à lire 
function transfert(i,l,c,z) {
	if(i<l) {
		var f=document.getElementById(zones[z]['IDs']+'-liste'),d=parseFloat(c.substring(3+(2*i),5+(2*i)))
		selections[z]+= (selections[z]? '|': '')+ zones[z][d].nom + '::' + d.toString() + '::' + i.toString()
		posit('sel',d,'on',i)
		var j=0, ok=false; while(j<f.length && !ok) ok=(f.options[j++].value==d); if(ok) reaff(--j,'add')	// Transfert de select -liste vers select -sel
		i++
		setTimeout('transfert(' + i + ',' + l + ',"' + c + '",'+z+')',80)
	}
}

// Remplissage de la boite 'f'
// On insère en laissant le marqueur initial, afin d'éviter les sautes de largeur, puis on le supprime à la fin.
// what : r-> régions, d->départements
function init_bte(f,z) {
	var j=1
	if(typeof(z)=='undefined') var z=a_zone		// si la zone z n'est pas précisée, on prend la zone active à la place
	for (var i in zones[z]) {
		if(parseInt(i,10)==i) {					// seuls les indices numériques contiennent des zones sélectionnables
			f.options[j]=new Option(zones[z][i].nom,i)
			f.options[j++].value=i
		}
	}
	f.options[j]=new Option('------- Fin de liste --------')
	f.options[j].value=-1
	f.options[0]=null
}

// Effacement de toute la sélection
// impossible d'utiliser france_clic point par point, IE5.1 sur iMac est si lent !...
function efface() {
	var f=document.getElementById(zones[a_zone]['IDs']+'-liste')

	// -- Effacement bte source
	while(f.options.length>1) {
		f.options[f.options.length-2]=null;
		var j=f.options[f.options.length-1].value;
	}

	// Remplissage bte source
	init_bte(f);

	// Effacement bte sel
	f=document.getElementById(zones[a_zone]['IDs']+'-sel')
	while(f.options.length>1) {
		f.options[f.options.length-2]=null;
		var j=f.options[f.options.length-1].value;
	}

	// Effacement des points
	var x= selections[a_zone] ? selections[a_zone].split('|') : ''
	for(var i in x) { z=x[i].split('::'); posit('sel',z[1],'off',z[2]) }
	selections[a_zone]='';
	full=false;

	// et du curseur
	document.getElementById(zones[a_zone]['IDs']+'-curseur').style.display='none'
}

// Double clic dans boite f (liste des choix dispo ou liste des sélections) -> action
function act(f) {
	var v=f.selectedIndex;
	if(v>-1) map_click(f.options[v].value,true);
}

// Clic simple dans boite f (liste des choix dispo ou liste des sélections) -> déplace le curseur sur la carte
function show(f) {
	var v=f.selectedIndex;
	if(v>-1) {
		v=f.options[v].value;
		if(v != -1) posit('ici',v,'on');	// affiche le marqueur de position
	}
}

// -- Mémorisaton -> cookie et fermeture de la carte
function memo() {
	if(selections[a_zone]) {
		var i,m='',n,z,x= selections[a_zone].split('|');
		for(i in x) {
			z=x[i].split('::');
			n='00' + z[1].toString();
			n=n.substring(n.length-2);		// Nr de zone conservée
			m=m+n;
		}
		n='000' + m.length/2;				// Nb de zones
		m=n.substring(n.length-3) + m;
	}
	else m='000'
	memo_cook(a_zone + ':' + m,"zones");
	close_map()
}

// -- Recherche du premier point libre, pour l'affecter à une zone active
function get_free() {
	var k=0;
	if(selections[a_zone]) {
		var x=selections[a_zone].split('|'),busy='';
		for(var i in x) {
			z=x[i].split('::');
			busy+= ':' + z[2].toString() + ':';
		}
		while(busy.indexOf(':' + k.toString() + ':')>-1 && k<zones[a_zone]['max']) k++;
	}
	return k;
}

// -- transfert de l'élément "d" d'une boite (source/sel) vers l'autre
// d= index dans boite source/sel de l'objet à transférer
// todo= add (source > sel) ou del (sel > source)
// positionne full=true si la sélection a atteind "max" éléments
function reaff(d,todo) {
	var f=document.getElementById(zones[a_zone]['IDs']+'-liste'),g=document.getElementById(zones[a_zone]['IDs']+'-sel')
	if(todo=='add') {
		var j=g.length-1;
		g.options[j+1]=new Option(g.options[j].text);
		g.options[j+1].value=g.options[j].value;
		g.options[j].text=f.options[d].text;
		g.options[j].value=f.options[d].value;
		f.options[d]=null;
	}

	else if(todo=='del') {
		var i=f.length-1,j=g.options[d].value,ok=false,k;
		k=j;
		if(j>=i) j=i-1;
		while(j>-1 && !ok) ok=(f.options[j--].value < k);
		if(ok) j++;

		// insertion dans source à l'emplacement j+1
		// décalage d'un élément vers le haut
		for(var k=i;k>j;k--) {
			f.options[k+1]=new Option(f.options[k].text);
			f.options[k+1].value=f.options[k].value;
		}

		// copie de l'élément sel > source
		f.options[k+1]=new Option(g.options[d].text);
		f.options[k+1].value=g.options[d].value;

		// Suppression de l'élément de la boite sel
		g.options[d]=null;
	}
	full=(g.length>zones[a_zone]['max']);	// nb maxi d'élments sélectionnable atteint
}

// -- positionnement du repère 't' ('ici' ou 'sel') sur zone 'd' (d : 0..n = index dans la bte de sélection)
// allume si q = on, éteind sinon, r=nr de pointeur si "sel"
function posit(t,d,q,r) {
	var p=zones[a_zone][d].centre.split(':'),name,xoffset=zones[a_zone]['xoffset'],yoffset=zones[a_zone]['yoffset'];
	var x=parseFloat(p[0],10)+xoffset
	var y=parseFloat(p[1],10)+yoffset
	if(t=='ici') {
		x-=15;
		y-=15;
		name=zones[a_zone]['IDs']+'-curseur'	// ID du curseur
	}
	else {
		x-=8;
		y-=8;
		name=zones[a_zone]['IDs'] + '-point' + r.toString();
	}
	var z= document.getElementById(name).style;
	z.left=x+'px';
	z.top=y+'px';
	z.display= (q=='on') ? 'block' : 'none';
}

// Clic sur carte -> retourne l'indice dans la database (0..n) de la zone cliquée
// l'ajoute dans la sélection si full=false (limite non atteinte)
// "direct" vrai -> e = offset dans database (suite à double click), sinon e contient l'événement souris
// la function 
function map_click(e,direct) {
	if(typeof(direct)=='undefined') var direct=false
	if(direct) i=e;		// Index de l'objet à bouger -> directement connu
	else {				// Sinon, calcul à partir de l'emplacement du clic
		if(typeof(e.layerX)!='undefined') { var mx=e.layerX, my=e.layerY }		// FF, Safari, Chrome
		else { var mx=e.x, my=e.y }												// IE 6
		mx-=zones[a_zone]['xoffset']; my-=zones[a_zone]['yoffset']
//		alert('x='+mx+' / y='+my)
		var i=-1
		if (mx) {
			mx=(mx - 0) / 1;
			my=(my - 0) / 1;
			var ok = false,i=0,j,p,x;
			while (!ok) {
				p=zones[a_zone][i].coord.split(',');
				for (j in p) {
					x=p[j].split(':');
					ok= ok || Math.abs(mx-x[0])<13 & Math.abs(my-x[1])<13;
				}
				if (!ok) {
					i++;
					if (typeof(zones[a_zone][i])=='undefined') {
						ok=true;
						i=-1;
					}
				}
			}
		}
	}
	// modif des pointeurs
	if(i>-1) {
		posit('ici',i,'on');			// Marqueur de position
		var x= (selections[a_zone]) ? selections[a_zone].split('|') : '';
		if(selections[a_zone].indexOf('::' + i.toString() + '::') == -1) {	// Ajouter à la sélection
			if(!full) {
				var j=get_free().toString();
				if(selections[a_zone]) selections[a_zone]+= '|';
				selections[a_zone]+= zones[a_zone][i].nom + '::' + i.toString() + '::' + j;
				posit('sel',i,'on',j);		// Ajoute marqueur de sélection
				var f=document.getElementById(zones[a_zone]['IDs']+'-liste')
				var j=0,k=f.length-1,ok=false;
				while(j<k && !ok) ok= (f.options[j++].text==zones[a_zone][i].nom);
				if(ok) reaff(j-1,'add');
			}
		}
		else {		// retirer de la sélection
			var n='',k=-1,z,l;
			for (var j in x) {
				if(x[j].indexOf('::' + i.toString() + '::') != -1) {
					z=x[j].split('::');
					k=z[2];
					l=j;
				}
				else n+='|' + x[j];
		}
		selections[a_zone]=n.substring(1);
			if(k>-1) {
				posit('sel',i,'off',k);		// Efface marqueur de sélection
				reaff(l,'del');
			}
		}
	}
}


