// *****************
// OBJET GEOCODAGE
// *****************

// -> Création de l'objet
// .validated (quand GEO.stop) -> après on créer la carte
// .isruning (pour voir si on continue le geocodage)
// .clsoutput : output html en format identique à Source
// .kmloutput : output html en format kml google earth
// .reset : MAZ validated, outuput cls/kml, maz output textarea
// .start : demarrage geocodage
// .stop : arrêt geocodage
// .geocodeone : geocode une seule adresse (et ajoute le resultat au html)
// .geocodeall : lance le geocodage batch


// -> config IE / Mozilla / Netscape
nb = 0;
bro = navigator.appName;
if (bro == "Netscape") nb =0;
if (bro == "Microsoft Internet Explorer") nb = 1;

function GEO(isrunning) {
         // propriétés
         this.validated = false;
         this.isrunning = isrunning;
         this.clsoutput = "";
         this.kmloutput = "";
         this.mrkoutput = "";
         // méthodes
         this.setheader = GEO_setDOheader;
         this.setfeeter = GEO_setDOfeeter;
         this.reset = GEO_reset;
         this.start = GEO_start;
         this.stop = GEO_stop;
         this.geocodeall = GEO_geocodeall;
}
function GEO_reset() {
  this.validated = false;
  this.kmloutput = "";
  this.clsoutput = "";
  this.mrkoutput = "";
  Output.setcontenu("");
  map.clearOverlays();
}
function GEO_start() {
  Did("btngeocode").value = "ARRETER";
  this.reset();
  this.isrunning = true;
  Did("classique").checked = true;
}
function GEO_stop() {
  Did("btngeocode").value = "GEOCODAGE";
  this.isrunning = false;
  this.validated = true;
  Did("step4_process").style.color='green';
  var numtrt = 0;
  if (addr_num == Source.numlignes()) numtrt = addr_num-1;
  if (addr_num < Source.numlignes()-1) numtrt = addr_num;
  Did("step4_process").innerHTML = ".    Traitees : "+numtrt+" / "+(Source.numlignes()-1);
}
function GEO_setDOheader() {
         // -> cls
         var contenucls = Source.getline(0).substring(0,Source.getline(0).length-nb) + Source.separateur + "Lat"  + Source.separateur + "Lng" + Source.separateur + "Accuracy" + Source.separateur + "NbAdrReturned" + Source.separateur + "Error/Address" + Source.separateur + "Code" + "\n" ;
         this.clsoutput += contenucls ;
         Output.setcontenu(contenucls);
         // -> kml
         var contenukml = "<\?xml version=\"1.0\"\ encoding=\"UTF-8\"?>"+"\n"+"<kml xmlns=\"http://earth.google.com/kml/2.0\">" + "\n" + "<Document>" + "\n" + "<name>Adresses geocodees</name>" + "\n" + "<description>Adresses</description>" + "\n";
         this.kmloutput += contenukml ;
}
function GEO_setDOfeeter() {
         this.kmloutput += "</Document>"+"\n"+"</kml>";
         getnumgeocode(addr_succ); // -> insertion nb adresses trouvees
}
function GEO_geocodeall() {
         addrs = Source.getcontenu().split("\n");
         res   = document.getElementById(Output.nom);
         addr_num = 0;
         addr_succ= 0;
         geocodeone();
}
// -> Instanciation objet GEO
GEOcoder = new GEO(false);

// -> geocode one
function geocodeone() {

         // -> fonction auto-appelé
         if (addr_num+1 < Source.numlignes()) var laddr = Adressage.getadresse(addr_num+1);
         var lnum = addr_num;

         geo.getLocations(laddr, function (result) {
           innerHTML = '';
           if (GEOcoder.isrunning == true) {

             innerHTML += Source.getline(addr_num).substring(0,Source.getline(addr_num).length-nb) ;
             GEOcoder.clsoutput += Source.getline(addr_num).substring(0,Source.getline(addr_num).length-nb) ;

           }
           // -> resultat OK
           if (result.Status.code == G_GEO_SUCCESS) {
              nb_res = result.Placemark.length;
              i = 0;
              lat = result.Placemark[i].Point.coordinates[1];
              lng = result.Placemark[i].Point.coordinates[0];
              addr = result.Placemark[i].address;
              acry = result.Placemark[i].AddressDetails.Accuracy

              if (GEOcoder.isrunning == true) {
                var contcls = Source.separateur + lat + Source.separateur + lng + Source.separateur + acry + Source.separateur + nb_res + Source.separateur + addr + Source.separateur + result.Status.code + "\n";
                innerHTML += contcls;
                GEOcoder.clsoutput += contcls;

                var mrkname = (Source.getcontenu().split("\n")[addr_num]).split(Source.separateur)[Adressage.idx_mrkname];
                var mrkdesc = (Source.getcontenu().split("\n")[addr_num]).split(Source.separateur)[Adressage.idx_mrkdesc];
                var mrkaddr = addr;
                var contkml = "<Placemark>"+"\n"+"<name>"+mrkname+"</name>"+"\n"+"<description>"+mrkdesc+"</description>"+"\n"+"<Point><coordinates>"+lng+","+lat+"</coordinates></Point>"+"\n"+"</Placemark>"+"\n";
                GEOcoder.kmloutput += contkml;
                addr_succ++;
                if (addr_succ < maxmarkers) GEOcoder.mrkoutput += lat+"\t"+lng+"\t"+mrkname+"\t"+mrkdesc+"\t"+mrkaddr+"\n";
              }
           }
           else {
              var reason="Code "+result.Status.code;
              if (reasons[result.Status.code]) {
                 reason = reasons[result.Status.code];

                 if (GEOcoder.isrunning == true) {
                    var conttcls = Source.separateur + "0" + Source.separateur + "0" + Source.separateur + "0" + Source.separateur + "0" + Source.separateur + reasons[result.Status.code] + Source.separateur + result.Status.code + "\n";
                    innerHTML += conttcls;
                    GEOcoder.clsoutput += conttcls;
                 }
              }
           }
           var dat = Output.getcontenu() + innerHTML ;
           Output.setcontenu(dat);

           if (GEOcoder.isrunning == true) {
              Did("step4_process").style.color='red';
              Did("step4_process").innerHTML = ".    Traitement : "+addr_num+"/"+(Source.getcontenu().split("\n").length-1);
           }

         }
         );

         // -> verif si relance de la fonction ou fin geocodage
         if (GEOcoder.isrunning == true) addr_num++;
         if (addr_num < Source.getcontenu().split("\n").length && GEOcoder.isrunning == true) {
          window.setTimeout('this.geocodeone()', 1800);
         }
         else {
          GEOcoder.setfeeter();
          GEOcoder.stop();
          Domap();
         }
}

// -> btngeocode onclick
function btngeocode_onclick(isrunning) {
         // -> adressage valide
         if (Adressage.validated == true) {
            if (GEOcoder.isrunning == false) {
               GEOcoder.start();
               GEOcoder.setheader();
               GEOcoder.geocodeall();
            }
            else {
               GEOcoder.stop();
            }
         }
         // -> adressage non valide
         else {
              alert("Adressage non valide !"+"\n"+"Valider les precedentes etapes !");
         }
}

// -> maj contenu output cls/kml
function update_output(outputtype) {
         var outputhtml = "";
         switch (outputtype) {
           case "cls":
           outputhtml = GEOcoder.clsoutput;
           break
           case "kml":
           outputhtml = GEOcoder.kmloutput;
           break
           default:
         }
         if (GEOcoder.validated == true) Output.setcontenu(outputhtml);
}
