Subversion Repositories Sites.obs-saisons.fr

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

<?


if (!sizeof($erreurs)>0) {


  //Récupération des info de la station
  
  //FONCTIONNEMENT_TESTE_ET_OK
  
  $requete_station = mysql_query("select  STATION_ID, STATION_NOM, STATION_LATITUDE,  STATION_LONGITUDE, STATION_ALTITUDE, STATION_ENVIRONNEMENT_ID from STATION  where STATION.STATION_ID=".$_SESSION['observation']['station_id']);
    
                
    while ($station = mysql_fetch_assoc($requete_station)) {
                
          $stations [] = $station;
          
    }
                
  $init_lat=$stations[0]['STATION_LATITUDE'];
  $init_lon=$stations[0]['STATION_LONGITUDE'];
                
        
  
  
/***** Selection des stations *****/

//Affichage des éventuelles erreurs
afficherErreurs($erreurs);

echo "Modification de la station <b>".$stations[0]['STATION_NOM']."</b><br>";

?>




<div id="map" style="width:600px;height:400px;border:2px solid grey;margin:10px 0;clear:both;"></div>






<form id="form_coordonnee" action="<?= $url_page ?>" method="post" style="float:left;">
                                <input id="ll_latitude" name="ll_latitude"  type="hidden" value="" />
                                <input id="ll_latitude_dms" name="ll_latitude_dms"  type="hidden" value="" />
                                <input id="ll_longitude" name="ll_longitude"  type="hidden" value="" />
                                <input id="ll_longitude_dms" name="ll_longitude_dms"  type="hidden" value="" />
                                <input id="ll_altitude" name="ll_altitude"  type="hidden" value="" />
                                <input id="form_coordonnee_valider" name="annul_modif" class="submit" type="submit" value="Retour" />
                                <input type="hidden" name="etape" value="1">
                                <input type="hidden" name="provenance" value="<?= $provenance ?>">                              
                        </li>
                </ul>
        
</form>


<?php

include_once 'modules/configuration/car_config.inc.php' ;

if (PARTICIPANT_EST_ADULTE) {
?>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAnm2MSMmwsDuoh7THcVDnlBQH9AL26AfEfaraxwo1G6_adyVjPRRQE4Gx2u7MomK9DJWf9kMLJ9y-ZA" type="text/javascript"></script>
<?php
}
else {
?>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAFMANWib9GSm7T4W6AN9qzxRmHYqXwt_BUwczny2vFmnHz3sr3BTy_SMRJ-NzWXDUynHHSWQ7_aEZ6Q" type="text/javascript"></script>
<?php
}

// Centrage initial : premiere station ou ville d'inscription

   echo "<script type=\"text/javascript\">";
   echo "\n//<![CDATA[\n";
   echo "var init_lat = ".$init_lat.";\n";
   echo "var init_long = ".$init_lon.";\n";
   
?>


        var largeur_carte = 690;
        var haureur_retrait = 330;
        
        var init_zoom = 10;
        
// Contient la carte GoogleMap
var map;
// Contient l'utilitaire permettant de trouver une adresse.
var EfGeocoder;
// Point de l'adresse saisie et à passer au GeoCoder
var addrpnt;
// L'icône à afficher sur la carte
var icon;

function load() {
        // Vérification de la compatibilité du navigateur
        if (GBrowserIsCompatible()) {
                // Création de la carte
                map = new GMap2(document.getElementById("map"));
                // Positionnement de la carte
                map.setCenter(new GLatLng(init_lat, init_long), init_zoom);
                // Types de carte disponibles :
                map.addMapType(G_NORMAL_MAP);
                map.addMapType(G_SATELLITE_MAP);
                map.addMapType(G_PHYSICAL_MAP);
                // Bouton pour changer de type de carte (mixte, satellite, plan)
                map.addControl(new GMapTypeControl(1));
                // Définition du type de la carte par défaut
                map.setMapType(G_HYBRID_MAP);
                // Bouton large de déplancement et zoom apparaissant dans le coin haut gauche
                map.addControl(new GLargeMapControl());
                // Pour hierarchiser les types de carte --> pas encore dans la version stable...
                //var mapControl = new GHierarchicalMapTypeControl();
                // Définition des relations des types de menus
                //mapControl.clearRelationships();
                //mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, 'Labels', false);
                // Ajout du controle après avoir spécifié les relations
                //map.addControl(mapControl);
                // Vue d'ensemble apparaissant dans le coin bas droit
                var EfOverViewMap = new GOverviewMapControl();
                map.addControl(EfOverViewMap);
                var mini = EfOverViewMap.getOverviewMap();
                // ?
                map.enableContinuousZoom();
                // Zoom avec la molette de la souris
                map.enableScrollWheelZoom();
                // Zoom avec le double clic de la souris
                map.enableDoubleClickZoom();
                
                // Création du GéoCoder
                EfGeocoder = new GClientGeocoder() ;
                
                // Icone station enregistrees (vert)
                icon = new GIcon();
                icon.image = "http://www.google.com/mapfiles/ms/micons/green-dot.png";
                icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
        icon.iconSize = new GSize(34, 34);
        icon.shadowSize = new GSize(37, 34);
        icon.iconAnchor = new GPoint(16, 34);
        // Pour affichage infobulle
        icon.infoWindowAnchor = new GPoint(5,1);
        

                // Icone nouvelle  station (rouge) ou station en modification
                Nicon = new GIcon();
                Nicon.image = "http://www.google.com/mapfiles/ms/micons/red-dot.png";
                Nicon.shadow = "http://www.google.com/mapfiles/shadow50.png";
        Nicon.iconSize = new GSize(34, 34);
        Nicon.shadowSize = new GSize(37, 34);
        Nicon.iconAnchor = new GPoint(16, 34);
        // Pour affichage infobulle
        Nicon.infoWindowAnchor = new GPoint(5,1);


            

        // Creates a marker at the given point with the given number label

                function createMarker(point, text, altitude) {
                  var marker = new GMarker(point,icon);
                  var html = text;
                  GEvent.addListener(marker, "click", function() {
                        map.setCenter(marker.getPoint());
                        afficherInfo(marker.getPoint());
                    afficherMasque(marker,text,altitude);        
                        });
                  return marker;
                }

        // Affichage de la station a modifier
                
        <? foreach($stations as $station) { ?>
                
                var position = new GLatLng(<?= $station['STATION_LATITUDE'] ?>, <?= $station['STATION_LONGITUDE'] ?>);
                        placerMarkeur(position,"<?= $station['STATION_NOM'] ?>");
                        map.setCenter(position, 14);
        <? } ?>
        
        
        }
}




// Ajout d'un nouveau marqueur dragable , depuis le geocodage uniquement (blocage du clic depuis la carte)

function placerMarkeur(position,nom) {
        if (addrpnt) {
                map.removeOverlay(addrpnt);
        }
        addrpnt = new GMarker(position, {icon: Nicon, draggable: true,  title: 'Click sur la carte!'}) ;
        addrpnt.enableDragging() ;
        map.addOverlay(addrpnt) ;
        GEvent.addListener(addrpnt,'dragend',function() {
                        map.setCenter(addrpnt.getPoint());
                        afficherInfo(addrpnt.getPoint());
                    afficherMasque(addrpnt,nom);         
                         
                }) ;
                
        GEvent.addListener(addrpnt, "click", function() {
                        map.setCenter(addrpnt.getPoint());
                        afficherInfo(addrpnt.getPoint());
                    afficherMasque(addrpnt,nom);         
                        });
                        
        afficherInfo(position);
}

// Masque de mise a jour station :

function afficherMasque(position,nom,altitude) {
        
        // On recupere les données du formulaire (caché) , notamment pour traiter simplement l'appel asynchrone de recup altitude
        
                   var html = "<table>";
                                         
                                         html = html + "<tr><td>Station</td> <td><input type='text' id='nom_station' value='" + nom + "'/> </td> </tr>";
                                          
                                        <?
                                                $requete_environnement = mysql_query("select ENVIRONNEMENT_ID, ENVIRONNEMENT_NOM from ENVIRONNEMENT");
                                                ?>

                                                html = html + "<tr><td>Environnement :</td>";
                                                html = html + "<td><select id='environnement_id' name='environnement'>";
                                                
                                                
                                                <? while ($env = mysql_fetch_row($requete_environnement)) { ?>
                                                        html = html + "<option value='<?= $env[0] ?>'<? if ($env[0]==$stations[0]['STATION_ENVIRONNEMENT_ID']) {echo 'SELECTED';}?> ><?= $env[1] ?>";
                                                        
                                                <? } ?>
                                                
                                                html = html + "</select></td></tr>";
                                                
                         html = html + "<tr><td>Latitude :</td> <td>" +document.getElementById('ll_latitude').value + "</td> </tr>" ;
                         html = html + "<tr><td>Longitude :</td> <td>" + document.getElementById('ll_longitude').value + "</td> </tr>";
                         if (altitude) {
                                html = html + "<tr><td>Altitude :</td> <td>" + altitude + "</td> </tr>";
                         }
                         else {
                                html = html + "<tr><td>Altitude :</td> <td>" + document.getElementById('ll_altitude').value + "</td> </tr>";
                         }
                         
                                         html = html + "<tr><td></td><td><input type='button' value='Enregistrer' onclick='saveData(false)'/></td></tr>";
                                         
                                         html = html + "<tr><td></td><td><input type='button' value='Supprimer' onclick='saveData(true)'/></td></tr>";
                         
              position.openInfoWindow(html);
 
}


// Sauvegarde modification station 

// 


 function saveData(suppr) {
        
      var nom_station = escape(document.getElementById("nom_station").value);
      var lat_station = document.getElementById("ll_latitude").value;
      var lon_station = document.getElementById("ll_longitude").value;
      var alt_station = document.getElementById("ll_altitude").value;
      var environnement_id = document.getElementById("environnement_id").value;

          if (!suppr) {
          var url = "modules/observations/sauvegarde_station.php?nom_station=" + nom_station + "&action=U" + "&lat_station=" + lat_station +
               "&lon_station=" + lon_station +  "&environnement_id=" + environnement_id + "&alt_station=" + alt_station + "&participant_id=<?= $_SESSION['participant'] ?>" + "&station_id=<?= $_SESSION['observation']['station_id'] ?>";
          }
          else {
                var url = "modules/observations/sauvegarde_station.php?nom_station=" + nom_station + "&action=D" + "&lat_station=" + lat_station +
               "&lon_station=" + lon_station +  "&environnement_id=" + environnement_id + "&alt_station=" + alt_station + "&participant_id=<?= $_SESSION['participant'] ?>" + "&station_id=<?= $_SESSION['observation']['station_id'] ?>";              
          }
      
      GDownloadUrl(url, function(data, responseCode) {
        if (responseCode == 200 && data.length <= 1) {
                        window.location = "<?= $url_page ?>";
        }
      });
    }

function afficherInfo(position) {
        var form = document.getElementById('form_coordonnee');
        afficherCoordonnees(position.lat().toString(), position.lng().toString());
}

function afficherCoordonnees(lati, longi) {
        var ellipsoid = 21;// 21 = WGS-84 (voir geo_constants)
        var xtm = 0;// 0 = UTM et 1= MTM
        var Coordonnee = calculer_coordonnee(lati, longi, ellipsoid, xtm);
        
        // Nous affichons des informations.
        document.getElementById('ll_latitude').value =  Coordonnee.latitude.toFixed(4);
        document.getElementById('ll_longitude').value = Coordonnee.longitude.toFixed(4);
        document.getElementById('ll_latitude_dms').value = Coordonnee.latitude_dms;
        document.getElementById('ll_longitude_dms').value = Coordonnee.longitude_dms;

        // Calcul altitude
        var script = document.createElement('script');
    document.body.appendChild(script);
    script.src = 'http://ws.geonames.org/' + "srtm3" + 'JSON?lat=' + lati + '&lng=' + longi + '&callback=GetAltitude';
    
                
}

function GetAltitude(result ) {
                        document.getElementById('ll_altitude').value = result.srtm3;
} 

window.onload = load
window.onunload = GUnload


/* Source : Code provenant du site http://pages.globetrotter.net/roule/utmgoogle.htm 
*/

var deg2rad = Math.PI / 180;

/*
* Fonction de transformation de coordonnées géographiques entre ellipsoide.
* Source : http://home.hiwaay.net/~taylorc/bookshelf/math-science/geodesy/datum/transform/molodensky/
* Licence : "The source code in the listing below may be copied and reused without restriction, but it is offered AS-IS with NO WARRANTY."
*
* Parameters:
*     from:     The geodetic position to be translated. (objet : GeodeticPosition)
*     from_a:   The semi-major axis of the "from" ellipsoid. (double)
*     from_f:   Flattening of the "from" ellipsoid. (double)
*     from_esq: Eccentricity-squared of the "from" ellipsoid. (double)
*     da:       Change in semi-major axis length (meters); "to" minus "from"
*     df:       Change in flattening; "to" minus "from"  (double)
*     dx:       Change in x between "from" and "to" datum.  (double)
*     dy:       Change in y between "from" and "to" datum.  (double)
*     dz:       Change in z between "from" and "to" datum.  (double)
* 
* Paramêtres :
*       from :          l'objet GeodesiquePosition à transformer (contient latitute, longitude et hauteur)
*       from_a :        le demi grand axe (=a) de l'ellipsoïde utilisé pour la position géodésique contenu dans l'objet "from".
*       from_f :        l'applatissement (=f) = 1/valeur... de l'ellipsoïde de l'objet "from"
*       from_esq :      l'excentricité au carré de l'ellipsoïde de l'objet "from"
*       da :            différence de demi grand axe (en metres) entre l'ellipsoïde "to" et "from".
*       df :            différence d'applatissement entre l'ellipsoïde "to" et "from".
*       dx :            différence pour l'axe x entre l'ellipsoïde "to" et "from".
*       dy :            différence pour l'axe y entre l'ellipsoïde "to" et "from".
*       dz :            différence pour l'axe z entre l'ellipsoïde "to" et "from".
*/
function transform(from, from_a, from_f, from_esq, da, df, dx, dy, dz) {
        var slat = Math.sin (from.lat);
        var clat = Math.cos (from.lat);
        var slon = Math.sin (from.lon);
        var clon = Math.cos (from.lon);
        var ssqlat = slat * slat;
        // "a divided by b"
        var adb = 1.0 / (1.0 - from_f);
        var dlat, dlon, dh;
        
        var rn = from_a / Math.sqrt (1.0 - from_esq * ssqlat);
        var rm = from_a * (1. - from_esq) / Math.pow ((1.0 - from_esq * ssqlat), 1.5);
        
        dlat = (((((-dx * slat * clon - dy * slat * slon) + dz * clat) + (da * ((rn * from_esq * slat * clat) / from_a))) + (df * (rm * adb + rn / adb) * slat * clat))) / (rm + from.h);
        
        dlon = (-dx * slon + dy * clon) / ((rn + from.h) * clat);
        
        dh = (dx * clat * clon) + (dy * clat * slon) + (dz * slat) - (da * (from_a / rn)) + ((df * rn * ssqlat) / adb);
        
        // Retour des données sous forme d'objet
        var GeodeticPosition =  {       lon: from.lon + dlon,
                                                                lat: from.lat + dlat,
                                                                h: from.h + dh
                                                        };
        
        return GeodeticPosition;
}

function test_transform() {
        var PositionNtf = { lon: 7.7372, lat: 48.6, h: 0 };
        var PositionWGS84 =     transform(PositionNtf, 6378249.2, 0.00340755, 0.0068034881, -112.2, 0.00005474, -168, -60, 320);
        alert('Longitude : ' + PositionWGS84.lon + 'Latitude : ' + PositionWGS84.lat + 'Hauteur : ' + PositionWGS84.h);
}

// Indiquer l'ellipsoid par son index dans le table et pour le xtm mettre 0 pour l'UTM  et 1 pour le MTM (?)
function geo_constants(ellipsoid, xtm) {
        // returns ellipsoid values
        ellipsoid_axis = new Array(); // valeur du demi grand axe (a) de l'ellipsoïde
        ellipsoid_eccen = new Array(); // valeur de l'excentricité au carré (e²) de l'ellipsoïde
        ellipsoid_axis[0] = 6377563.396; ellipsoid_eccen[0] = 0.00667054;  //airy
        ellipsoid_axis[1] = 6377340.189; ellipsoid_eccen[1] = 0.00667054;  // mod airy
        ellipsoid_axis[2] = 6378160; ellipsoid_eccen[2] = 0.006694542;  //aust national
        ellipsoid_axis[3] = 6377397.155; ellipsoid_eccen[3] = 0.006674372;  //bessel 1841
        ellipsoid_axis[4] = 6378206.4; ellipsoid_eccen[4] = 0.006768658;  //clarke 1866 == NAD 27 (TBC)
        ellipsoid_axis[5] = 6378249.145; ellipsoid_eccen[5] = 0.006803511;  //clarke 1880
        ellipsoid_axis[6] = 6377276.345; ellipsoid_eccen[6] = 0.00637847;  //everest
        ellipsoid_axis[7] = 6377304.063; ellipsoid_eccen[7] = 0.006637847;  // mod everest
        ellipsoid_axis[8] = 6378166; ellipsoid_eccen[8] = 0.006693422;  //fischer 1960
        ellipsoid_axis[9] = 6378150; ellipsoid_eccen[9] = 0.006693422;  //fischer 1968
        ellipsoid_axis[10] = 6378155; ellipsoid_eccen[10] = 0.006693422;  // mod fischer
        ellipsoid_axis[11] = 6378160; ellipsoid_eccen[11] = 0.006694605;  //grs 1967
        ellipsoid_axis[12] = 6378137; ellipsoid_eccen[12] = 0.00669438;  //  grs 1980
        ellipsoid_axis[13] = 6378200; ellipsoid_eccen[13] = 0.006693422;  // helmert 1906
        ellipsoid_axis[14] = 6378270; ellipsoid_eccen[14] = 0.006693422;  // hough
        ellipsoid_axis[15] = 6378388; ellipsoid_eccen[15] = 0.00672267;  // int24
        ellipsoid_axis[16] = 6378245; ellipsoid_eccen[16] = 0.006693422;  // krassovsky
        ellipsoid_axis[17] = 6378160; ellipsoid_eccen[17] = 0.006694542;  // s america
        ellipsoid_axis[18] = 6378165; ellipsoid_eccen[18] = 0.006693422;  // wgs-60
        ellipsoid_axis[19] = 6378145; ellipsoid_eccen[19] = 0.006694542;  // wgs-66
        ellipsoid_axis[20] = 6378135; ellipsoid_eccen[20] = 0.006694318;  // wgs-72
        ellipsoid_axis[21] = 6378137; ellipsoid_eccen[21] = 0.00669438;  //wgs-84 (et NAD83 : pourquoi mis avec WGS84 ?)
        
        if (ellipsoid == 0) {
                ellipsoid = 22;
        }
        
        --ellipsoid; // table indexed differently
        
        if (xtm == 1) {
                // WAS: if (ellipsoid > 22)
                scaleTm = 0.9999;
                eastingOrg = 304800.;
        } else {
                scaleTm = 0.9996;
                eastingOrg = 500000.;
        }

        // Retour des données sous forme d'objet
        var ellipsoid = {       axis: ellipsoid_axis[ellipsoid],
                                                eccentricity: ellipsoid_eccen[ellipsoid],
                                                eastingOrg: eastingOrg,
                                                scaleTm: scaleTm
                                        };
        return ellipsoid;
}

/**This routine determines the correct UTM letter designator for the given latitude
* returns 'Z' if latitude is outside the UTM limits of 84N to 80S
*/
function get_zoneletter(lat) {
        var zoneletter;
        if ((84 >= lat) && (lat >= 72)) zoneletter = 'X';
        else if ((72 > lat) && (lat >= 64)) zoneletter = 'W';
        else if ((64 > lat) && (lat >= 56)) zoneletter = 'V';
        else if ((56 > lat) && (lat >= 48)) zoneletter = 'U';
        else if ((48 > lat) && (lat >= 40)) zoneletter = 'T';
        else if ((40 > lat) && (lat >= 32)) zoneletter = 'S';
        else if ((32 > lat) && (lat >= 24)) zoneletter = 'R';
        else if ((24 > lat) && (lat >= 16)) zoneletter = 'Q';
        else if ((16 > lat) && (lat >= 8)) zoneletter = 'P';
        else if (( 8 > lat) && (lat >= 0)) zoneletter = 'N';
        else if (( 0 > lat) && (lat >= -8)) zoneletter = 'M';
        else if ((-8> lat) && (lat >= -16)) zoneletter = 'L';
        else if ((-16 > lat) && (lat >= -24)) zoneletter = 'K';
        else if ((-24 > lat) && (lat >= -32)) zoneletter = 'J';
        else if ((-32 > lat) && (lat >= -40)) zoneletter = 'H';
        else if ((-40 > lat) && (lat >= -48)) zoneletter = 'G';
        else if ((-48 > lat) && (lat >= -56)) zoneletter = 'F';
        else if ((-56 > lat) && (lat >= -64)) zoneletter = 'E';
        else if ((-64 > lat) && (lat >= -72)) zoneletter = 'D';
        else if ((-72 > lat) && (lat >= -80)) zoneletter = 'C';
        else zoneletter = chr(32 + 66); //This is here as an error flag to show that the Latitude is outside the UTM limits
        return zoneletter;
}

function parseCoordinate(coordinate, type, format, spaced) {
        var coordd;
        var coordm;
        var coords;
        var coordh = 0;
        
        if (coordinate.search(/(^ *-|[WOS])/i) >= 0) {
                coordh = -1;
        }
        if (coordinate.search(/(^ *\+|[NE])/i) >= 0) {
                coordh = 1;
        }
        
        // if (coordinate.search(/[EW]/i) >= 0 && !type) { type = 'lon'; }
        // if (coordinate.search(/[NS]/i) >= 0 && !type) { type = 'lat'; }
        
        coordinate = coordinate.replace(/,/g, '.');  // french commas
        // not sure really needed.
        coordinate = coordinate.replace(/[NESWO+\-]/gi,' ');  // add also: °, ', "  --  or replace everything that is not a number or a dot
        
        // alert("coordinate = " + coordinate);
        if (coordinate.search(/[0-9]/i) < 0) {
                alert("Can't parse input field");
                coordd = "";
                return;
        }

        // http://www.gpsvisualizer.com/calculators
        // http://www.javascriptkit.com/javatutors/redev2.shtml
        var parts = coordinate.match(/([0-9\.\-]+)[^0-9\.]*([0-9\.]+)?[^0-9\.]*([0-9\.]+)?/);
        //                           /                          (one or more)             /
        //                            ([0-9\.\-]+)              digits, dot or -, one set
        //                                        [^0-9\.]*            separator
        //                                                 ([0-9\.]+)?       digits, dot, zero or one set
        //                                                            [^0-9\.]*     separator
        //                                                                     ([0-9\.]+)?  digits, dot, zero or one set

        // *: 0|more   +: 1|more   ?: 0|1        http://www.javascriptkit.com/javatutors/redev2.shtml
        if (!parts[1]) {
                alert("Can't parse input field");
                coordd = '';
                return;
        } else {
                coordd = parts[1];
                if (parts[2]) {
                        coordm = parts[2];
                } else {
                        coordm = 0;
                }
                if (parts[3]) {
                        coords = parts[3];
                } else {
                        coords = 0;
                }
                // n = parseFloat(parts[1]);
                // if (parts[2]) { n = n + parseFloat(parts[2])/60; }
                // if (parts[3]) { n = n + parseFloat(parts[3])/3600; }
        }
        
        // Retour des données sous forme d'objet
        var Coordonnee =        {       coordd: coordd,
                                                        coordm: coordm,
                                                        coords: coords,
                                                        coordh: coordh
                                                };
        return Coordonnee;
}

function validate_dms(latd, latm, lats, latb, lonm, lond, lons, lonb) {
        var valid = 1;
        if (Math.abs(Number(latd)) >= 90)
                valid = 0;
        if (Number(latm) >= 60)
                valid = 0;
        if (Number(lats) >= 60)
                valid = 0;
        if (Math.abs(Number(lond)) >= 180)
                valid = 0;
        if (Number(lonm) >= 60)
                valid = 0;
        if (Number(lons) >= 60)
                valid = 0;

        return(valid);
}

// convert decimal degrees to dms
function convertir_en_dms(lat, lon) {
        var latbrg = 1;
        var lonbrg = 2;
        if (lat < 0)
                latbrg = 2
        if (lon < 0)
                lonbrg = 1;
        // LEW: have to round here, else could end up with 60 seconds :-)
        var tlat = Math.abs(lat) + 0.5 / 360000;  // round up 0.005 seconds (1/100th)
        var tlon = Math.abs(lon) + 0.5 / 360000;
        
        var tlatdm = Math.abs(lat) + 0.5 / 60000;  // round up 0.0005 minutes (1/1000th)
        var tlondm = Math.abs(lon) + 0.5 / 60000;
        
        var deglat = Math.floor(tlat);
        var t = (tlat - deglat) * 60;
        var minlat = Math.floor(t);
        
        var minlatdm = Math.floor((tlatdm - Math.floor(tlatdm)) * 60 * 1000) / 1000;
        
        var seclat = (t - minlat) * 60;
        seclat = Math.floor(seclat * 100) / 100;  //  works in js 1.4
        // seclat = seclat.toFixed(2);  // 2 decimal places js 1.5 and later
        
        var deglon = Math.floor(tlon);
        
        t = (tlon - deglon) * 60;
        var minlon = Math.floor(t);
        
        var minlondm = Math.floor((tlondm - Math.floor(tlondm)) * 60 * 1000) / 1000;

        var seclon = (t - minlon) * 60;
        seclon = Math.floor(seclon * 100) / 100;  // js 1.4
        // seclon = seclon.toFixed(2);  // js 1.5 and later

        var latb = '';
        if (latbrg > 0) {
                latb = 'N';// 1 = N (nord)
        } else {
                latb = 'S';// 2 = S (sud)
        }
        var latdms = deglat + "° " + minlat + "' " + seclat + "\"";

        var lonb = '';
        if (lonbrg > 0) {
                lonb = 'E'; // 2 = E (est)
        } else {
                lonb = 'W';// 1 = W (west)
        }
        var londms = deglon + "° " + minlon + "' " + seclon + "\"";
        
        var chaine_latlon_dms = latdms + '  ' + latb + '  ' + londms + '  ' + lonb;
        
        // Retour des données sous forme d'objet
        var LatLongDms =        {       lat: lat,
                                                        lat_degre: Math.floor(tlatdm),
                                                        lat_min: minlatdm,
                                                        lat_s: seclat,
                                                        lat_direction:latb,
                                                        lat_dms:latdms,
                                                        lon: lon,
                                                        lon_degre: Math.floor(tlondm),
                                                        lon_min: minlondm,
                                                        lon_s: seclon,
                                                        lon_direction:lonb,
                                                        lon_dms:londms,
                                                        ll_dms:chaine_latlon_dms
                                                };
        return LatLongDms;
}

function calculer_coordonnee(lati, longi, ellips, xtm) {
        // Récupération de l'ellipsoide
        var ellipsoid = geo_constants(ellips, xtm);
        var axis = ellipsoid.axis;
        var eccent = ellipsoid.eccentricity;
        var scaleTm = ellipsoid.scaleTm;
        var eastingOrg = ellipsoid.eastingOrg;

        // Nous parsons la latitude saisie
        var CoordonneeLat = parseCoordinate(lati);
        var latb = '';// vide
        if (CoordonneeLat.coordh != 0) {
                if (CoordonneeLat.coordh > 0) {
                        latb = 'N';// 1 = N (nord)
                } else {
                        latb = 'S';// 2 = S (sud)
                }
        }
        var latd = CoordonneeLat.coordd;
        var latm = CoordonneeLat.coordm;
        var lats = CoordonneeLat.coords;

        // Nous parsons la longitude saisie
        var CoordonneeLon = parseCoordinate(longi);
        var lonb = '';// vide
        if (CoordonneeLon.coordh != 0) {
                if (CoordonneeLon.coordh > 0) {
                        lonb = 'E'; // 2 = E (est)
                } else {
                        lonb = 'W';// 1 = W (west)
                }
        }
        var lond = CoordonneeLon.coordd;
        var lonm = CoordonneeLon.coordm;
        var lons = CoordonneeLon.coords;

        // cope with blank fields
        if (latd == '' || lond == '')   {
                alert("Latitude and longitude degrees must be entered");
                return;
        }

        // Indication de la direction par défaut pour la latitude et la longitude en France
        if (latb == '') {
                latb = 'N';// 1 = N (Nord)
        }
        if (lonb == '') {
                lonb = 'E';// 2 = E (Est)
        }

        // Validation
        var valid = validate_dms(latd, latm, lats, latb, lonm, lond, lons, lonb);
        if (valid == 0) {
                alert("Invalid degrees, minutes or seconds");
                return;
        }
        
        var lat = Number(latd);
        lat = lat + Number(latm) / 60;
        lat = lat + Number(lats) / 3600;
        if (latb == 'S') {  // 2 = S
                lat = lat * -1;
        }
        var lon = Number(lond);
        lon = lon + Number(lonm) / 60;
        lon = lon + Number(lons) / 3600;
        if (lonb == 'W') { // 1 = W
                lon = lon * -1;
        }

        if (lat >= 84 || lat <= -80) {
                alert("UTM latitudes should be between 84N and 80S\nCalculation will proceed anyway as locator will be valid.");
        }

        var k0 = scaleTm;
        var latrad = lat * deg2rad;
        var longrad = lon * deg2rad;
        var zonenum = Math.floor((lon + 180) / 6) + 1;
        // @dc (180 - (-70.5))/3 - 76
        if (eastingOrg == 304800.) {
                zonenum = Math.floor((180 - lon) / 3) - 76;  // MTM, only in Quebec
                if (zonenum < 3 || zonenum > 10) {
                        alert("MTM zone numbers only confirmed for 3-10, province of Quebec\nContinuing anyway");
                }
        }

        if (lat >= 56.0 && lat < 64.0 && lon >= 3.0 && lon < 12.0 ) {
                zonenum = 32;
        }
        // Zones speciales pour Svalbard
        if( lat >= 72.0 && lat < 84.0 ) {
                if (lon >= 0.0  && lon <  9.0 ) zonenum = 31;
                else if ( lon >= 9.0  && lon < 21.0 ) zonenum = 33;
                else if ( lon >= 21.0 && lon < 33.0 ) zonenum = 35;
                else if ( lon >= 33.0 && lon < 42.0 ) zonenum = 37;
        }

        var lonorig = (zonenum - 1) * 6 - 180 + 3;  //+3 puts origin in middle of zone
        // @dc 180 - (7+76) * 3 - 1.5
        if (eastingOrg == 304800.) {
                lonorig = 180 - (zonenum + 76) * 3 - 1.5;
        }
        var lonorigrad = lonorig * deg2rad;

        //Récupération de la lettre du fuseau xTM
        var letter = get_zoneletter(lat);

        // Calcul xTM
        var eccPrimeSquared = (eccent) / (1 - eccent);
        var N = axis / Math.sqrt(1 - eccent * Math.sin(latrad) * Math.sin(latrad));
        var T = Math.tan(latrad) * Math.tan(latrad);
        var C = eccPrimeSquared * Math.cos(latrad) * Math.cos(latrad);
        var A = Math.cos(latrad) * (longrad - lonorigrad);
        var M = axis * ((1 - eccent / 4 - 3 * eccent * eccent / 64 - 5 * eccent * eccent * eccent / 256) * latrad - (3 * eccent / 8 + 3 * eccent * eccent / 32 + 45 * eccent * eccent *eccent / 1024) * Math.sin(2 * latrad) + (15 * eccent * eccent / 256 + 45 * eccent * eccent * eccent / 1024) * Math.sin(4 * latrad) - (35 * eccent * eccent * eccent / 3072) * Math.sin(6 * latrad));

        var easting = (k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) + eastingOrg);
        var northing = (k0 * (M + N * Math.tan(latrad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720)));
        if (lat < 0) {
                northing += 10000000.0; //10000000 meter offset for southern hemisphere
        }
        
        // xTM
        // Arrondi au nombre supérieur
        // alert("easting = " + easting);
        preciseEasting = easting;
        easting = Math.floor(easting + .5);
        // alert("easting = " + easting);
        // alert("northing = " + northing);
        preciseNorthing = northing;
        northing = Math.floor(northing + .5);
        // alert("northing = " + northing);
        var chaine_xtm = '';
        var x_tm = '';
        if (eastingOrg == 304800.) {
                chaine_xtm = zonenum + '  ' + easting + 'm E  ' + northing + 'm N';
                x_tm = 'MTM';
        } else {
                chaine_xtm = zonenum + letter + '  ' + easting + 'm E  ' + northing + 'm N';
                x_tm = 'UTM';
        }

        // Latitude/Longitude
        var chaine_latlon = lat + ' ' + latb + ' ' + lon + ' ' + lonb;
        var LatLongDms = convertir_en_dms(lat,lon);
        
        // Retour des données sous forme d'objet
        var Coordonnee = {      xtm: x_tm,
                                                nord: northing,
                                                est: easting,
                                                zone_numero: zonenum,
                                                zone_lettre: letter,
                                                xtm_chaine: chaine_xtm,
                                                latitude:lat,
                                                longitude:lon,
                                                ll_chaine: chaine_latlon,
                                                latitude_dms:LatLongDms.lat_dms,
                                                longitude_dms:LatLongDms.lon_dms,
                                                ll_chaine_dms: LatLongDms.ll_dms
                                        };
        return Coordonnee;
}
//]]>

</script>

<?
}
?>