﻿// JScript File
// Fonctions VigeoDream pour afficher la carte d'une course


var booPlayerPause = false;
var iLayerPrec = 0;

function afficheLayer(pNumLayer) {

        // Si on essaye d'afficher une layer superieure a la layer actuelle
        if( parseInt(pNumLayer) > parseInt(numLayerActuelle) ) {
            // On affiche la layer actuelle en modifiant le slider
            // La modification du slider directement ici ne fonctionne pas, peut-etre parce que le slider est deja en train d'etre modifie
            // On planifie la modif du slider quand il aura fini cette modif...
            setTimeout('$find("tbLayerAffichee").set_Value(parseInt("'+numLayerActuelle+'"))', 500);
            
            // on sort de cet appel
            return;
        }

        DoHideLayer(iLayerPrec);
        DoShowLayer(pNumLayer);
        
        // On stocke la nvelle layer affichee pour le prochain changement
        iLayerPrec = pNumLayer;
}


function playerStart(pTbName, booInit) {

    // Obtention du controle slider
    var sliderBehavior = $find(pTbName);
    var lLayerAffichee = sliderBehavior.get_Value();
    
    // Par defaut, on affiche la layer suivante
    var lLayerAAfficher = lLayerAffichee + 1;

    // Si on vient de cliquer sur le bouton
    if( booInit ) {
        // Reinit du boolean de pause
        booPlayerPause = false;

        // Si on est a la fin quand on clic sur le bouton
        if( lLayerAffichee >= parseInt(numLayerActuelle) ) {
            // on commence au debut
            lLayerAAfficher = 0;
        }
    }
    
    // Si on est avant la fin et pas de pause
    if( (lLayerAAfficher <= parseInt(numLayerActuelle) ) && (!booPlayerPause) )
    {
        // on se positionne sur la layer a afficher
        sliderBehavior.set_Value(lLayerAAfficher);

        setTimeout('playerStart("'+pTbName+'", false)', 500);
    }
}


function playerPause(pTbName) {
    booPlayerPause = true;
}



// Fonction VE



function CreateLayer(i)
{         
    myLayers[i] = new VEShapeLayer();         
    myVEMap.AddShapeLayer(myLayers[i]);
}

function CreateAllLayer(n)
{         
    for (var i = 0 ; i < n ; i++ ) {
        CreateLayer(i);
    }
}

function DoShowLayer(i)
{
    myLayers[i].Show();
}

function DoHideLayer(i)
{
    myLayers[i].Hide();
}

function DoHideAllLayer(n)
{
    for (var i = 0 ; i < n ; i++ ) {
        myLayers[i].Hide();
    }
}



//////////////////////////////////////////////////////////



// Variables globales de la page
var myLayers = new Array();           // tableau de layers VE pour affichage du deroulement d'une course
var periodeLayerMinutes = 0;                 // en minutes
var nbLayerMax = 0;
var numLayerActuelle = null;             // no de la layer actuelle (la derniere layer envoyee pendant la course)
var dateDebutCourse = "";
var numLocMax = 0;
var dateLocMax = null;
var aPorteurs = new Array();          // tableau des porteurs
var aPorteursLastLoc = new Array();   // tableau de la derniere loc de chaque porteur (affichee sur la layer actuelle)
var cdir = null;

// Log avec add-on firebug installé sous firefox. Ignore la log sinon.
function log(s)
{
    //window.console ? window.console.log(s) : alert(s);
    
    if( window.console ) window.console.log(s);
}


function current_directory(){
    if( ! cdir )
    {
        var dirs=window.location.href.split('/');
        cdir=dirs.slice(0,dirs.length-1).join('/') + '/';
    }
    return cdir;
}


function importXML(strXML, strRoot)
{
    var xmlDoc = null;

	//alert(strXML);

    // code for Mozilla, Firefox, Opera, etc.
	if (document.implementation && document.implementation.createDocument)
	{
		/*xmlDoc = document.implementation.createDocument("", "", null);
		xmlDoc.onload = createTable;
		xmlDoc.load(strCheminFichier)*/

        //Pas de fonction loadXML(chaine) pour firefox
        //Parsing en synchrone (contrairement à IE)
        var oParser = new DOMParser();
        xmlDoc = oParser.parseFromString( strXML, "text/xml" );

        if (xmlDoc.parseError) {
        //if (xmlDoc.parseError.errorCode != 0) {
            var myErr = xmlDoc.parseError;
            alert("Echec de l'initialisation de la carte : " + myErr.reason);
        } else {
            traiterXML(xmlDoc, strRoot);
        }
	}
	// code for IE
	else if (window.ActiveXObject)
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		
        //Parsing en Asynchrone
		xmlDoc.onreadystatechange = function () {
			if (xmlDoc.readyState == 4) traiterXML(xmlDoc, strRoot)
		};

    	xmlDoc.loadXML(strXML);
 	}
	else
	{
		alert('Votre navigateur ne permet pas le rafraichissement automatique de cette page.');
		return;
	}
}

function traiterXML(xmlDoc)
{
    //var root = xmlDoc.getElementsByTagName(strRoot)[0];
    var root = xmlDoc.documentElement;
    
    initCourse(root);

    
    // Stockage de la layer actuelle
    var numLayerActuellePrec = numLayerActuelle;
    numLayerActuelle = parseInt( root.getAttribute('numLayerActuelle') );


    // Lecture des locs
    readLocs(root);


    // Obtention de la layer actuelle

    // Obtention du controle slider
    var sliderBehavior = $find("tbLayerAffichee");

    // Si la layer actuelle a changee
    if( numLayerActuellePrec && numLayerActuellePrec != numLayerActuelle ) {

        //&&&la shape n'est pas redessinee sur la layer suivante...
        // Un rechargement complet de la page est force
        window.location='Map.aspx';

        // On copie les dernieres locs des porteurs dans la nouvelle layer actuelle
        // pour que la nouvelle layer n'apparaisse pas quasiment vide
        /*for (var i=0; i<aPorteursLastLoc.length; i++) {

            // Si last loc existe
            if( aPorteursLastLoc[i] ) {
            
                // Suppression de la last loc de l'ancienne layer actuelle pour la recreer dans la nouvelle
                var shape = aPorteursLastLoc[i];
                myLayers[numLayerActuellePrec].DeleteShape(shape);
                myLayers[numLayerActuelle].AddShape(shape);

            }
        }
    
        // Si carte positionnee sur la derniere layer connue
        if( sliderBehavior && sliderBehavior.get_Value() == numLayerActuellePrec ) {
        
            // on se positionne sur la nouvelle layer actuelle en modifiant la valeur du slider
            sliderBehavior.set_Value(numLayerActuelle);
        }*/
    }
    
    return(true);
}

    
function initCourse(root)
{
    // Si initialisation de la page
    if( periodeLayerMinutes == 0 ) {
    
        // Stockage des paramètres de la course    
        periodeLayerMinutes = root.getAttribute('periodeLayer');
        nbLayerMax = root.getAttribute('nbLayerMax');
        
        // creation des layers (une pour chaque periode de temps de la course)
        CreateAllLayer(nbLayerMax);
        
        // on cache toutes les layers
        DoHideAllLayer(nbLayerMax);


        // on se positionne sur la layer actuelle en modifiant la valeur du slider
        // on le fait un peu plus tard car le slider n'est pas encore trouve a ce moment-la
        setTimeout('$find("tbLayerAffichee").set_Value(parseInt("'+root.getAttribute('numLayerActuelle')+'"))', 500);
    }
    else {
        // Controle que les paramètres ont pas été changés sur le serveur depuis le dernier appel
        if( (periodeLayerMinutes != root.getAttribute('periodeLayer'))
                || (nbLayerMax != root.getAttribute('nbLayerMax')) ) {
            
            // Un rechargement complet de la page est necessaire
            window.location='Map.aspx';
        }
    }

    // Si date de début modifiée depuis le dernier appel
    if( ( dateDebutCourse != "" ) && (dateDebutCourse != root.getAttribute('dateDebutCourse')) ) {
            // Un rechargement complet de la page est necessaire
            window.location='Map.aspx';
    }
    
    // Si date de debut pas encore initialisee (si la course était pas encore commencée)
    if( ! dateDebutCourse ) dateDebutCourse = root.getAttribute('dateDebutCourse');
    
    return(true);
}


function readLocs(root)
{
    var lLayer = 0;
    var noPorteur = 0;
    
    //log(root);//&&&

    // Pour chaque loc
    objNodeList = root.getElementsByTagName("Loc");
    for (var i=0; i<objNodeList.length; i++) {

        lLayer = parseInt(objNodeList.item(i).getAttribute('lay'));
        noPorteur = parseInt(objNodeList.item(i).getAttribute('p'));
      

        // Si existe pas, initialisation du tableau de layers du porteur
        if( ! aPorteurs[noPorteur] ) aPorteurs[noPorteur] = new Array();

        // Si une shape existait deja sur ce layer pour ce porteur
        if( aPorteurs[noPorteur][lLayer] ) {
            // On la supprime
            // (pour avoir au plus une seule position du porteur sur chaque layer)
            myLayers[lLayer].DeleteShape( aPorteurs[noPorteur][lLayer] );
        }
        
        // On dessine la loc sur sa layer
        // et on stocke la shape sur ce layer de ce porteur
        // Il faut donner le chemin absolu vers l'image pour la voir en 3D : voir http://msdn.microsoft.com/en-us/library/bb545007.aspx
        aPorteurs[noPorteur][lLayer] = 
            DrawLoc(true, 
                    parseFloat(objNodeList.item(i).getAttribute('lat')),
                    parseFloat(objNodeList.item(i).getAttribute('long')),
                    0,
                    objNodeList.item(i).getAttribute('t'),
                    objNodeList.item(i).getAttribute('i'),
                    current_directory() + 'images/'+ objNodeList.item(i).getAttribute('p') + '.gif', // no porteur au format texte ('01' et non '1')
                    myLayers[lLayer]);


        // On redessine la loc sur la layer actuelle
        // La layer actuelle peut donc avoir 2 fois la meme loc (1 dans le tableau des layers, 1 dans le tableau des dernieres loc)
        // mais la loc dans le tableau des derniere loc sera trasnferee a la layer suivante si on change de layer actuelle
        
        // Si une shape last loc existait deja pour ce porteur
        if( aPorteursLastLoc[noPorteur] ) {
            // On la supprime
            // (pour avoir au plus une seule position du porteur sur chaque layer)
            myLayers[numLayerActuelle].DeleteShape( aPorteursLastLoc[noPorteur] );
        }
        
        // On dessine la loc sur la layer actuelle
        // et on stocke la shape sur ce layer de ce porteur
        aPorteursLastLoc[noPorteur] = 
            DrawLoc(true, 
                    parseFloat(objNodeList.item(i).getAttribute('lat')),
                    parseFloat(objNodeList.item(i).getAttribute('long')),
                    0,
                    objNodeList.item(i).getAttribute('t'),
                    objNodeList.item(i).getAttribute('i'),
                    current_directory() + 'images/'+ objNodeList.item(i).getAttribute('p') + '.gif', // no porteur au format texte ('01' et non '1')
                    myLayers[numLayerActuelle]);

    }

    // Si loc recues, on stocke le num max des loc recues
    // (dans le cas d'un refresh periodique ou si course non commencee, il se peut qu'aucune nouvelle loc ne soit recue)
    if( objNodeList.length ) {
        // Stockage du num max des loc recues
        numLocMax = root.getElementsByTagName('NumLocMax')[0].text;
        dateLocMax = root.getElementsByTagName('DateLocMax')[0].text;
    }

    return(true);
}


