// Les variables globales

var kindmap = null;    // VE = virtualEarth  - GM = GoogleMap
var mapstyle=null;    // type de la carte : R : road- A : aerial- H : hybrid
var autozoom = true;

// Positionnement initial de la carte
var startLat = 0;
var startLong=0;
var unitKm = true;

// Tracé des cartes
var map = null;
var timer = null;
var posis = new Array(); // Tableau associatif : les positions et traces des concurrents
var route = null; // les GPoints qui dessinent le parcours 
var tps = null;     // Tableau des topPoints y compris les CPs
var manpts = null;  // points obligatoire
var selectedalpha = null;   // pour le rafraichissement auto de la fenêtre d'infos
var selectedCompet = null;  // pour choisir la couleur
var timerdelay = 15000;
var selectedAllClassArray = new Array();

// Pour le replay
var isReplay = false;
var selectedCompetsCnt = 0; // on limite à 5
var replayPosList = new Array(); // Tableau associatif. Clé : alpha - objet une liste de positions et de speed
var replayTimer = null;
var currentSeq = 0; // La 1ère séquence est indexée 1
var maxSequences = 0; // 
var period=0; // de 1000 à 1000/n  -  n est fixé par le slider ZERO qd l'init n'a pas encore été fait
var startPausebtn = new Image();
var rewindbtn = new Image();
var onpause = true; // A l'arrêt au lancement
var replayFinished = false;
var trackingPeriod = 120;   // A lire par programme sert à l'affichage de l'heure

// Pour la trace des concurrents
var dayStageId = 0; //pas d'étape ce jour
var traceStageId = 0;   // toutes les étapes
var activeList = 0;    // 0 : teams  - 1 les traces

var traceIds = new Array(); // ceux qui sont cochés

// Scripts appelés par la page web - Ce sont les fonctions de base
// ils appellent, selon la valeur de la variable kindmap,
// soit des scripts GoogleMap soit des scripts VirtualEarth

    if (document.cookie)
    {
        kindmap = getCookieVal("kindmap");
        mapstyle = getCookieVal("mapstyle");
    }
    else
    {
        kindmap = "VE";
        mapstyle = "R";
        writeCookie(kindmap,mapstyle);
   }
    
    /*initialiser la surveillance de Netscape*/
    if(!window.largeur && window.innerWidth)
    {
       window.onresize = reconstruction;
       largeur = largeur_fenetre();
       hauteur = hauteur_fenetre();
  }
  //***********************************************************
  function PageUnLoaded() {
      var params = { "kind": "UNLOAD", "ident": null };
      UnregisterUser(JSON.stringify(params), 'unLoad');
  }
  //-------------------------------------------------------------
  function DoUnload(p1,p2) {
     // rien à faire. N'est jamais appelé
  }
  //***********************************************************
function PageLoaded(doReplay,tracktime,stageId,dayStId,unitIsKm) {
    
   // startLat = lat;
  //  startLong = lng;
    unitKm =  unitIsKm;
    isReplay = doReplay;
    trackingPeriod = tracktime;
    traceStageId = stageId;
    dayStageId = dayStId;
    
    var rdbtn = null;
    if (kindmap == "VE")
        rdbtn = document.getElementById("msMap");
    else
        rdbtn = document.getElementById("googleMap");
        
    rdbtn.checked="cheked";

    if (typeof(WebForm_CallbackComplete) == "function") // CORRECTION BUG MICROSOFT
    {
        // remplace la version originale par la version patchée
        WebForm_CallbackComplete = WebForm_CallbackComplete_SyncFixed;
    }
    
    ResizeMap();

    InitMaps("map");
    
    /*initialiser la surveillance par l'Explorer Internet MS*/
    if(!window.largeur && document.body && document.body.offsetWidth)
    {
       window.onresize = reconstruction;
       largeur = largeur_fenetre();
       hauteur = hauteur_fenetre();
    }

    window.onResize = ResizeMap;
    var params = {"kind":"GETLIST","ident":["vide"]};
    if (isReplay)
    {
        var maxx = document.body.parentElement.offsetWidth;
        var HmsControl = document.getElementById("HmsControl");
        HmsControl.style["left"] = maxx - 150;
        HmsControl.Innertext = "Replay time 00:00:00";

        SetupReplay();
    }
    else
    {
        RequestCompetsPosi(JSON.stringify(params),"fulllist");
        //   RequestTopPoints(JSON.stringify({"kind":"MANDATORY"}),"MAN");
        timer = window.setInterval("UpdatePositions()",timerdelay);
    }
    
    
}
//---------------------------------------------------------
function ToggleAutoZoom(cb)
{
    autozoom = cb.checked
}
//---------------------------------------------------------
function largeur_fenetre()
{
 if (window.innerWidth) return window.innerWidth;
 else if (document.body && document.body.offsetWidth) return document.body.offsetWidth;
 else return 0;
}
//---------------------------------------------------------
function hauteur_fenetre()
{
 if (window.innerHeight) return window.innerHeight  ;
 else if (document.body && document.body.offsetHeight) return document.body.offsetHeight;
 else return 0;
}
//---------------------------------------------------------
function reconstruction()
{
 if (largeur != largeur_fenetre() || hauteur != hauteur_fenetre())
    ResizeMap();
}
//---------------------------------------------------------
function ResizeMap()
{
    var maxx = document.body.parentElement.offsetWidth;
    var wdt = maxx - 200 - 20;

    var maxy = document.body.parentElement.offsetHeight;
    var hdt = maxy - 105 - 20;

    var map0 = document.getElementById("map");
    map0.style["width"] = wdt;
    map0.style["height"] = hdt;
    
    if (isReplay)
    {
        var HmsControl = document.getElementById("HmsControl");
        HmsControl.style["left"] = maxx - 150;
    }
}
//---------------------------------------------------------
function InitMaps(divname)
{
    if (map != null)
    {
        map.Clearmap();
    }
    
    if (kindmap == "VE")
        map = new MSMap(divname);
    else
        map = new GMap(divname);
    
    map.SetInitialPosition(startLat,startLong);
    map.loadMap(mapstyle);
    
    var cb = document.getElementById("dispParcours");
    if (cb.checked)
        map.dessineParcours(route);

    cb = document.getElementById("dispCheckpoints");
    if (cb.checked)
        map.displayCheckpoints(tps,'OPT');
}
//---------------------------------------------------------
function ResetDisplay()
{
    var boundsGM;
    
    map.ClearAll();

    if (isReplay)
    {
        var heure = document.getElementById("HmsControl");
        heure.innerText = "Replay time : " + getHMS(trackingPeriod * currentSeq);

        for(var alpha in replayPosList)
        {
            var datas = replayPosList[alpha];
            var compet = posis[alpha];
            var posi = datas[currentSeq];
            if (posi != undefined)
                map.DrawShape(isReplay,alpha,compet.nom,compet.nom2,compet.team,compet.kind,compet.numId,posi.latitude,posi.longitude,posi.speed,posi.time);
        }
    }
    else
    {
        for (alpha in posis)
        {
            var posi = posis[alpha];
            if (posi.posiflag)
            {
                map.DrawShape(isReplay,alpha,posi.nom,posi.nom2,posi.team,posi.kind,posi.numId,posi.lastposi.lat,posi.lastposi.lng,posi.vitesse,posi.lastdatetime);
            }
            
            if(posi.traceflag && (posi.points.length > 0))
                map.traceCompet(posi,autozoom);
        }
        if (selectedalpha != null)
            displayInfosFromPosis(posis[selectedalpha]);

        if (autozoom)
        { map.centermap(); }
    }
}
//---------------------------------------------------------
function toggleMap(btn)
{
    if(! onpause)
        window.clearInterval(replayTimer);
        
    kindmap = (btn.id == "googleMap") ? "GM" : "VE";
    writeCookie(kindmap,mapstyle);
    InitMaps("map");
    ResetDisplay();
    
    if(! onpause)
        replayTimer = window.setInterval("DoReplay()",(1000)/replaycoef);
}
//************************************************************
function SetReplayCoef(coef)
{
    periode = 1000/coef;
    if (! onpause)
    {
        window.clearInterval(replayTimer);
        replayTimer = window.setInterval("DoReplay()",periode);
    }
}
//------------------------------------------------------------
function ToggleStartPauseReplay()
{
    if (onpause)
    {
        if (replayFinished)
        {
            var reponse = confirm("Replay is complete\nDo you want to play it again ?");
            if (reponse)
            {
                rewindReplay();
            }
            else
                return;
        }
        
        if (maxSequences == 0) // il faut déterminer le nb max de séquences
        {
        
        }

        if (currentSeq ==0) // il faut lire la période choisie
        {
            var coef = document.getElementById("LabelCoef").innerText;
            period = 1000/ coef;
        }
        document.startPausebtn.src = "images/pause.gif";
        onpause = false;
        replayTimer = window.setInterval("DoReplay()",period);
    }
    else
    {
        window.clearInterval(replayTimer);
        document.startPausebtn.src = "images/play.gif";
        onpause = true;
    }
}
//-----------------------------------------------------------
function DoReplay()
{
     if (replayFinished)
    {
		window.clearInterval(replayTimer);
        document.startPausebtn.src = "images/play.gif";
        onpause = true;
        return;
    }
    else
    {
		currentSeq++;
		if (currentSeq == maxSequences)
		    replayFinished = true;
		    
       for(var alpha in replayPosList)
        {
            var datas = replayPosList[alpha];
            var compet = posis[alpha];
            var posi = datas[currentSeq];
            if (posi != undefined) // le nouveau point existe
            {
                map.remove(alpha);
                map.DrawShape(isReplay,alpha,compet.nom,compet.nom2,compet.team,compet.kind,compet.numId,posi.latitude,posi.longitude,posi.speed,posi.time);
            }
        }
        
        var heure = document.getElementById("HmsControl");
        heure.innerText = "Replay time : " + getHMS(trackingPeriod * currentSeq);
    }
}
//---------------------------------------------------------
function SetReplayButtons()
{
    startPausebtn.src = "image/play.gif";
    rewindbtn.src = "image/rewind.gif";
}
//---------------------------------------------------------
function SetupReplay()
{
    maxSequences = 0;
    var uniqueStageId = 1;
	var cb = document.getElementById("dispParcours");
	cb.checked="checked";
	document.body.style.cursor = "wait";
	RequestRoute(JSON.stringify({"kind":"ROUTE","ident":[uniqueStageId]}),"ROUTE");
	
	cb = document.getElementById("dispCheckpoints");
	cb.checked="checked";
	document.body.style.cursor = "wait";
	RequestTopPoints(JSON.stringify({"kind":"CHKPT","ident":[uniqueStageId]}),"OPT");
}
//----------------------------------------------------------
function rewindReplay()
{
	window.clearInterval(replayTimer);
	document.startPausebtn.src = "images/play.gif";
	onpause = true;
	currentSeq = 1;
    replayFinished = false;

    var heure = document.getElementById("HmsControl");
    heure.innerText = "Replay time : " + getHMS(0);

    for(var alpha in replayPosList)
    {
        map.remove(alpha);
        var datas = replayPosList[alpha];
        var compet = posis[alpha];
        currentSeq = 1;
        var posi = datas[currentSeq];
        if (posi != undefined)
            map.DrawShape(isReplay,alpha,compet.nom,compet.nom2,compet.team,compet.kind,compet.numId,posi.latitude,posi.longitude,posi.speed,posi.time);
    }
}
//************************************************************
// Gestion du colorpicker
function CloseColorPicker(id,ok)
{
    var cp = document.getElementById("colorpicker");
    cp.style.visibility = "hidden";
    
    if (ok && (selectedcolor != null))  // OK button
    {
        var posi = posis[selectedCompet];
        posi.color = selectedcolor;
        var cb = document.getElementById("T" + selectedCompet);
        cb.style.backgroundColor = selectedcolor;
        map.redrawtrace(selectedCompet)
    }
    
    selectedCompet = null;
}
//-----------------------------------------------------------
function SetSelection(id)
{
     // permet de savoir comment afficher la trace du concurrent
    var cp = document.getElementById("colorpicker");
    cp.style.visibility = "visible";
    var pos = id.indexOf("_");
    selectedCompet = id.slice(pos+1);
}
//************************************************************
function ErrorCallback() {
    // Appelée si il s'est produit une erreur lors du traitement de la fonction
    // sur le serveur
    alert("Erreur de lecture serveur");
}
//---------------------------------------------------

function ErrorCallbackCompets()
{
// Appelée si il s'est produit une erreur lors du traitement de la fonction
// sur le serveur
    alert("Erreur de lecture serveur COMPETS");
}
//---------------------------------------------------
function ErrorCallbackTrace()
{
// Appelée si il s'est produit une erreur lors du traitement de la fonction
// sur le serveur
    alert("Erreur de lecture serveur TRACE");
}
//---------------------------------------------------
function ErrorCallbackAlarm()
{
// Appelée si il s'est produit une erreur lors du traitement de la fonction
// sur le serveur
//    alert("Erreur de lecture serveur ALARM");
}
//---------------------------------------------------
function ErrorCallbackQuit() {
// Appelée si il s'est produit une erreur lors du traitement de la fonction
// sur le serveur
    alert("Erreur de lecture serveur QUIT");
}
//---------------------------------------------------
function ClearInfos()
{
    var node = document.getElementById("LabelID");
    node.innerText = "";
    node = document.getElementById("LabelPilot");
    node.innerText = "";
    node = document.getElementById("LabelCoPilot");
    node.innerText = "";
    node = document.getElementById("LabelCar");
    node.innerText = "";
    node = document.getElementById("LabelTeam");
    node.innerText = "";
    node = document.getElementById("LabelLat");
    node.innerText = "";
    node = document.getElementById("LabelLong");
    node.innerText = "";
    node = document.getElementById("LabelLastDate");
    node.innerText = "";
}
//---------------------------------------------------
function displayInfos(nom,nom2,id,team,kind,lat,lng,dat)
{
    for (var i=0;i<arguments.length;i++)
    {
        if (arguments[i] == null)
            arguments[i] = "not read yet";
    }
    
    var node = document.getElementById("LabelID");
    node.innerText = id;
    node = document.getElementById("LabelPilot");
    node.innerText = nom;
    node = document.getElementById("LabelCoPilot");
    node.innerText = nom2;
    node = document.getElementById("LabelCar");
    node.innerText = kind;
    node = document.getElementById("LabelTeam");
    node.innerText = team;
    node = document.getElementById("LabelLat");
    node.innerText = getPosiString(lat,true,id);
    node = document.getElementById("LabelLong");
    node.innerText = getPosiString(lng,true,id);
    node = document.getElementById("LabelLastDate");
    node.innerText = dat;
}
//---------------------------------------------------
function getPosiString(val,isLat,id)
{
    var cardi = "";
    var str = "";
    
    if (val < 0)
    {
        cardi = isLat ? " S" : " W";
        val = val * -1;
    }
    else
    {
        cardi = isLat ? " N" : " E";
    }
    if(id==9999)
        str = "????";
    else
        str = val.toString().substr(0,9) + cardi;
    return str;
}
//---------------------------------------------------
function displayInfosFromCompet(compet)
{
    displayInfos(compet.nom,compet.nom2,compet.numId,compet.team,compet.vehi,compet.lat,compet.longi,compet.date);
}
//---------------------------------------------------
function displayInfosFromPosis(posi)
{
    var lat = null;
    var lng = null;
    
    if (posi.lastposi != null)
    {
        lat = posi.lastposi.lat;
        lng = posi.lastposi.lng;
    }
    
    displayInfos(posi.nom,posi.nom2,posi.numId,posi.team,posi.kind,lat,lng,posi.lastdatetime);
}
//---------------------------------------------------------
function storeTopPoints(tplist,context)
{
    // Callback qui transmet la liste des CPs
    document.body.style.cursor = "default";

    var temp = eval('(' + tplist + ')');
    if (context == 'OPT')
    {
        tps = temp;
        map.displayCheckpoints(tps,context);
    }
    else
    {
        manpts = temp;
        map.displayCheckpoints(manpts,context);
    }    
}
//---------------------------------------------------------
function storeRoute(ptlist,context)
{
    // Callback qui transmet le parcours (liste de points)
    document.body.style.cursor = "default";
    route = eval('(' + ptlist + ')');
    map.dessineParcours(route);
}
//------------------------------------------------------
function selectOnereplay(retVal,alpha)
{
    if(! onpause) // si replay en cours on ne fait rien
        return;
    
   var positions = eval('(' + retVal + ')');
   var posis = new Array();
   for (var i=0;i<positions.length;i++)
        {
            var temp = new ReplayPosis();
            temp.setReplayposis(positions[i].Latitude,positions[i].Longitude,positions[i].Speed,positions[i].Time,positions[i].Seq);
            posis[positions[i].Seq] = temp;
        }
   replayPosList[alpha] = posis;

    // On ajuste le nb max de séquences
    if (positions.length > maxSequences)
        maxSequences = positions.length;

    // On a les points on recherche l'info concurrent
    var params = {"kind":"COMPETS","ident":[alpha]};
    RequestCompetsPosi(JSON.stringify(params),"replay");
}
//---------------------------------------------------
function StoreCompets(retVal,context)
{
    // Fonction appelée par le callback
    var compets = eval('(' + retVal + ')');
    
    if (context=="replay")
    {
        var startPosition;
        var compet = compets[0]
        var cdatas = new cmpDatas();
        cdatas.setposis(compet); // Uniquement pour passer les identifiants du concurrent
        var datas = replayPosList[compet.alpha];
        if(datas.length == 0)
        {
            alert("No replay records for this competitor");
            return;
        }

        // La séquence 1 existe-t-elle ?
        var exists = false;
        if (datas[1] != undefined)
        {
            startPosition = datas[1];
            exists = true;
        }
        else // on recherche la 1ère séquence existante
        {
            for(var index = 2;index < 1000;index++) // 1000 pour éviter les boucles sans fin au cas où !
            {
                if (datas[index] != undefined)
                {
                    startPosition = datas[index];
                    exists = true;
                    break;
                }
            }
        }
        if (exists)
        {
            cdatas.updateReplayPosi(startPosition.latitude,startPosition.longitude,startPosition.speed,startPosition.time,1);
            posis[compet.alpha] = cdatas;
            map.DrawShape(isReplay,compet.alpha,compet.nom,compet.nom2,compet.team,compet.kind,compet.numId,startPosition.latitude,startPosition.longitude,startPosition.speed,startPosition.time);
        }
        return;
    }
    
    if (context == "fulllist")
    {
        for (var i=0;i<compets.length;i++)
        {
            var cdatas = new cmpDatas();
            cdatas.setposis(compets[i]);
            posis[compets[i].alpha] = cdatas;
        }
        return;
    }
    
    if (context != 'update' && compets.length == 1) // on efface plus loin
    {
        selectedalpha = compets[0].alpha;
        displayInfosFromCompet(compets[0]);
    }
    
    // on met à jour le tableau des positions
    for ( i=0;i<compets.length;i++)
    {
        var compet = compets[i];
        if(posis != null)
        {
            var cdatas = posis[compet.alpha];
            if (cdatas != null)
                cdatas.updateposis(compet);
        }
    }
  
    if (context == "checkall")
    {
    for (var i=0;i<compets.length;i++)
        {
            var alpha = compets[i].alpha
            var posi = posis[alpha];
            if (posi.posiflag && (posi.lastposi.lat !=0 || posi.lastposi.lng != 0))
                map.DrawShape(isReplay,alpha,posi.nom,posi.nom2,posi.team,posi.kind,posi.numId,posi.lastposi.lat,posi.lastposi.lng,posi.vitesse,posi.lastdatetime);
        }
    }
    else if (context == 'update') // refresh
    {            
        map.ClearAll();

        for (alpha in posis)
        {
            var posi = posis[alpha];
            if (posi.posiflag && (posi.lastposi.lat !=0 || posi.lastposi.lng != 0))
                map.DrawShape(isReplay,alpha,posi.nom,posi.nom2,posi.team,posi.kind,posi.numId,posi.lastposi.lat,posi.lastposi.lng,posi.vitesse,posi.lastdatetime);
            if(posi.traceflag && (posi.points.length > 0))
                map.traceCompet(posi,autozoom);
        }
        if (selectedalpha != null)
            displayInfosFromPosis(posis[selectedalpha]);
    }
    else if (context != 'getPosi')
    {
        if (compet.lat != 0 || compet.longi != 0)
        {
            map.DrawShape(isReplay,compet.alpha,compet.nom,compet.nom2,compet.team,compet.kind,compet.numId,compet.lat,compet.longi,compet.vitesse,compet.date);
        }
    }
    
    if (context == "center" && autozoom)
        map.centermap();
}
//-----------------------------------------------------------
function storeTrace(retVal,id)
{
    // Fonction Callback - reçoit les points de la trace du concurrent sélectionné
    var datas = eval('(' + retVal + ')');
    if(typeof(datas) == 'undefined')
        datas = JSON.parse(retVal);
//    posis[id].settrace(datas.latlons);

    posis[id].settrace(datas.latlons);
    
    selectedalpha = id;
    displayInfosFromPosis(posis[id]);
    map.traceCompet(posis[id],autozoom);
}
//-----------------------------------------------------------
function DoCenterOneCompet(id)
{
    var pos = id.indexOf("_");
    var alpha = id.slice(pos+1);
    var cb = document.getElementById(alpha);
    

    if(!cb.checked)
    { // on veut juste les infos
        var params = {"kind":"COMPETS","ident":[alpha]};
        RequestCompetsPosi(JSON.stringify(params),'getPosi');
    }
    else
    {
        selectedalpha = alpha;
        displayInfosFromPosis(posis[alpha]);
        map.CenterOneCompet(alpha);
    }
}
//-----------------------------------------------------------
function ToggleOneCompetReplay(cb)
{
if (cb.checked)
    {
        if(selectedCompetsCnt ==5)
        {
            alert("You can select a maximum of 5 competitors");
            cb.checked = false;
            return;
        }
        else
        {
            selectedCompetsCnt++;
            // la liste des positions
            var params = {"kind":"REPLAY","ident":[cb.id]};
            RequestOneReplay(JSON.stringify(params),cb.id);
        }
    }
    else
    {
        selectedCompetsCnt--;
        if(posis[cb.id] == undefined)
            return;
        posis[cb.id].hideposi();
        map.remove(cb.id);
        var array = new Array();
        for (alpha in replayPosList)
        {
            if (alpha == cb.id)
                continue;
            array[alpha] = replayPosList[alpha];     
        }
        replayPosList = array;
        
        // On recalcule le nb max de séquences
        maxSequences = 0;
        
        for(var alpha in replayPosList)
        {
            var max = replayPosList[alpha].length;
            if (max > maxSequences)
                maxSequences = max;
        }
    }
}
//-----------------------------------------------------------
function ToggleOneCompet(cb,context,stopTimer)
{    
    if (!cb.checked)
    {
        if(stopTimer)
            window.clearInterval(timer);
        posis[cb.id].hideposi();
        if (stopTimer)
            timer = window.setInterval("UpdatePositions()",timerdelay);
       if (posis[cb.id].lastposi.lat != 0 || posis[cb.id].lastposi.lng != 0)
            map.remove(cb.id);
        // On efface les infos
        ClearInfos();
    }
    else
    {
        var params = {"kind":"COMPETS","ident":[cb.id]};
        RequestCompetsPosi(JSON.stringify(params),context);
    }
}
//-----------------------------------------------------------
function ToggleSelectAll(select)
{
    var cb;
    var panel = document.getElementById("competsList");
    var node = panel.firstChild;
    
 //   loadingCompets = select;
    var classId = document.getElementById("DropDownListClasses").value;
    
    selectedAllClassArray[classId] = select;
    
    if (select)
    {
        var ids = new Array();
         //   while((node != null) && loadingCompets)
            while((node != null))
            {
              if (node.tagName=="SPAN")
              {
                cb = node.firstChild;
                if (!cb.checked)
                {
                    cb.checked= true;
                    ids.push(cb.id);
                }
             }              
              node = node.nextSibling;
           }
        var params = {"kind":"COMPETS","ident":ids};
        RequestCompetsPosi(JSON.stringify(params),"checkall");
    }
    else
    {
        window.clearInterval(timer);
        while(node != null)
        {
          if (node.tagName=="SPAN")
          {
            cb = node.firstChild;
             if (cb.checked)
            {
                cb.checked= false;
                ToggleOneCompet(cb,"center",false);
            }
         }              
          node = node.nextSibling;
       }
       timer = window.setInterval("UpdatePositions()",timerdelay);
    }
}
//-----------------------------------------------------------
function tooglelist(link)
{
    var currentStage;
    
    var listposi = document.getElementById("listeposi");
    var listtraces = document.getElementById("listetraces");
    var linkposi = document.getElementById("linkposi");
    var linktrace = document.getElementById("linktrace");
    var activdiv = document.getElementById("activdiv");
    
    if (link == "posi")
    {
        if (listposi.style.visibility == "visible")
            return; // rien à faire
        activdiv.innerText = "Teams";
        listposi.style.visibility = "visible";
        listtraces.style.visibility = "hidden";
        linktrace.style.visibility = "visible";
        linkposi.style.visibility = "hidden";
        currentStage = dayStageId;
        activeList = 0;
   }
   else
   {
        if (listtraces.style.visibility == "visible")
            return; // rien à faire
         activdiv.innerText = "Tracks";
        listposi.style.visibility = "hidden";
        listtraces.style.visibility = "visible";
        linktrace.style.visibility = "hidden";
        linkposi.style.visibility = "visible";
        currentStage = traceStageId;
        activeList = 1;
   }
   
   if ((traceStageId != dayStageId) || traceStageId == 0)   // on efface, si il existe, le tracé du parcours et des CP
   {
        var cb = document.getElementById("dispParcours");
        if (cb.checked)
            eraseAndRedraw(cb);
            
        cb = document.getElementById("dispCheckpoints");
        if (cb.checked)
            eraseAndRedraw(cb);
   }
}
//-----------------------------------------------------------
function eraseAndRedraw(cb)
{
    if (cb.id == "dispParcours")
    {
        map.erasePoints('ROUTE');
        route = null;
    }
    else if (cb.id == "dispCheckpoints")
    {
        map.erasePoints('TOP');
        tps = null;
    }
    
    toggledisplay(cb)
}
//-----------------------------------------------------------
function TraceIdChange(idStage)
{
    traceStageId = idStage;
    
    // On efface le parcours et on le redessine
        var cb = document.getElementById("dispParcours");
        if (cb.checked)
        {
           eraseAndRedraw(cb)
        }
    // On efface les checkpoints et on les redessine
        cb = document.getElementById("dispCheckpoints");
        if (cb.checked)
        {
            eraseAndRedraw(cb)
        }
        
    for(var i =0;i < traceIds.length;i++)
    {
        var id = traceIds[i];
        var posi = posis[id];
        
        // on commence par effacer
        map.erasetrace(posi);
        Array.clear(posi.points);
        
        // puis on redessine
        var params = {"kind":"TRACE","ident":[id,traceStageId]};
		var txt = JSON.stringify(params);					
		RequestTrace(txt,id);
    }
}
//-----------------------------------------------------------
function TraceOneCompet(cb)
{
    var i;
    var id = cb.id.substr(1,cb.id.length-1);
    var posi = posis[id];
    
    if (cb.checked)
    {
        // Il faut choisir une couleur
        if (posi.color == null)
        {
           posi.color = colorarray[nextcolorindex];
           nextcolorindex = nextcolorindex + 1;
           if(nextcolorindex == 15)
                nextcolorindex = 0;
           cb.style.backgroundColor = posi.color;
        }
        
		if (posi.points.length == 0)
	    {					
			// On demande la trace au serveur
			var params = {"kind":"TRACE","ident":[id,traceStageId]};
			var txt = JSON.stringify(params);					
			RequestTrace(txt,id);
		}
		else
		{
			posis[id].traceflag = true;
			selectedalpha= id;
			displayInfosFromPosis(posis[id]);
			map.traceCompet(posis[id],autozoom);
		}
		Array.add(traceIds,id);
    }
    else
    {
        posis[id].traceflag = false;
        map.erasetrace(posis[id]);
        Array.remove(traceIds,id);
    }
}
//-----------------------------------------------------------
function toggledisplay(cb)
{
    var stageId = (activeList == 0) ? dayStageId : traceStageId; // activeList = 0; teams  1 = traces
    
    // Si ce n'est pas déjà fait, on charge les points demandés
    // l'affichage se fera à ce moment là
    
    if (cb.checked && cb.id == "dispCheckpoints" && tps == null)
    {
        document.body.style.cursor = "wait";
        RequestTopPoints(JSON.stringify({"kind":"CHKPT","ident":[stageId]}),"OPT");
    }
    else if (cb.checked && cb.id == "dispParcours" && route == null)
    {
        document.body.style.cursor = "wait";
        RequestRoute(JSON.stringify({"kind":"ROUTE","ident":[stageId]}),"ROUTE");
    }
    else
        map.dotoggledisplay(cb);
}
//-----------------------------------------------------------
function UpdatePositions()
{
    var cb;
    var ids = new Array();

    for ( id in posis)
    {
        if (posis[id].posiflag)
            ids.push(id);
    }
    
    if (ids.length > 0)
    {
        var params = {"kind":"UPDATE","ident":ids};
        RequestCompetsPosi(JSON.stringify(params),"update");
    }

    var params2 = { "kind": "ALARM" };
    //GetAlarms(JSON.stringify(params2), "ALARM");
}
//-----------------------------------------------------------
function StoreAlarms(retVal, id) {
    var datas = eval('(' + retVal + ')');
    if (typeof (datas) == 'undefined')
    { datas = JSON.parse(retVal); }
    if (datas != null)
    { CreateOpenAlert(datas); }
}
var alarmWin;
//-------------------------------------------------------
function CreateOpenAlert(datas) {
    var options = "height=220,width=220,top=150,left=300,resizable=no,toolbar=no,menubar=no,scrollbars=no,status=no,dependent=yes,location=no"
    alarmWin = window.open("Alerte.aspx", "alarm", options);
}
//*******************************************************
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
