// JavaScript Document
function Opening() {
  this.kentekenGevonden = true;    // autoGevonden was een betere naam geweest
  this.locatieGevonden  = false;
  this.locatie          = Object();
  this.merk             = '';
  this.auto             = Object();
  this.divs             = Object();
  this.geo              = null;
  this.adressen         = Object();

  this.load = function(){
    this.geo = new GClientGeocoder();
    var zw = new GLatLng(50 , 0);
    var no = new GLatLng(55, 10); 
    var bounds = new GLatLngBounds(zw, no);
    this.geo.setViewport(bounds);
  }
  
  this.zoekGegevens = function(){
    this.locatieGevonden = false;
    this.kentekenGevonden = true;
//    this.merk = parseInt(document.getElementById(this.divs.automerk).value);
    this.showAddress();
    if(this.divs.kenteken){
      var kenteken = this.stripKenteken(document.getElementById(this.divs.kenteken).value);
      if(this.auto.kenteken && this.auto.kenteken==kenteken){
        // kenteken was al eerder gevonden
        this.kentekenGevonden = true;
      } else if(kenteken) {
        this.haalAutoGegevens(kenteken);
      } else if(this.merk) {
        document.getElementById(this.divs.kenteken_msg).innerHTML ="";
        this.kentekenGevonden = true;
      } else {
        var obj = document.getElementById(this.divs.kenteken_msg);
        obj.innerHTML ="Geef a.u.b. een kenteken of automerk op.";
        obj.style.backgroundColor = 'red';
        obj.style.color           = 'white';
        obj.style.fontWeight      = 'bold';
      }
    }
    this.forwardOrNot();
  }
// converteert het kenteken naar de standaardvorm (enkel cijfers en letters)  
  this.stripKenteken = function(kenteken){
    var kenteken2 = kenteken.replace(/\W/g, '');
    return kenteken2;
  }
  
  this.showAddress = function() {
    var search     = document.getElementById(this.divs.locatie).value.strip();
// bepaal eerst of het een postcode is
    var pcReg = /^[1-9][0-9]{3} *[a-zA-Z]{0,2}$/    
    var filterOptions = {isPostcode: pcReg.test(search)};
    var specialPlaces = ['malden', 'almere', 'soest', 'best', 'zeeland'];
    if(filterOptions.isPostcode || specialPlaces.indexOf(search.toLowerCase())>-1){
        // dirty workaround for zeeland, noord-brabant
    	if(search.toLowerCase() == 'zeeland') {
      	  search = search + ", noord-brabant";
        }

      // toevoegen van de landscode blijkt te werken (?)
      search = search + ", NL";
    }
    var messagediv = document.getElementById(this.divs.message);
    // ====== Perform the Geocoding ======
    this.geo.setBaseCountryCode("nl");
    this.geo.getLocations(search, function (result) {
      if (result.Status.code == G_GEO_SUCCESS) {
      // ===== If there was more than one result, "ask did you mean" on them all =====
        result.Placemark = filterPlacemarks(result.Placemark, filterOptions);
        if (result.Placemark.length > 1) { 
          openObj.locatieGevonden = false;
          openObj.adressen = Object();
          messagediv.innerHTML = "Er zijn meerdere mogelijkheden gevonden:";
          messagediv.style.backgroundColor = '#FFD700';
          messagediv.style.color           = 'black';
          messagediv.style.fontWeight      = 'normal';
          messagediv.style.textAlign       = 'left';
          // Loop through the results
          for (var i=0; i<result.Placemark.length; i++) {
//            console.log(result.Placemark[i]);
            var p = result.Placemark[i].Point.coordinates;
            if(result.Placemark[i].AddressDetails.Country.AdministrativeArea){
              var provincie  = result.Placemark[i].AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
              var plaatsnaam = '';
              if(result.Placemark[i].AddressDetails.Country.AdministrativeArea.Locality){
                plaatsnaam = result.Placemark[i].AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
                if(result.Placemark[i].AddressDetails.Country.AdministrativeArea.Locality.DependentLocality){
                  plaatsnaam = result.Placemark[i].AddressDetails.Country.AdministrativeArea.Locality.DependentLocality.DependentLocalityName+", "+plaatsnaam;
                  if(result.Placemark[i].AddressDetails.Country.AdministrativeArea.Locality.DependentLocality.Thoroughfare){
                    plaatsnaam = result.Placemark[i].AddressDetails.Country.AdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName+", "+plaatsnaam;
                  }
                }
              }
              if(result.Placemark[i].AddressDetails.Country.AdministrativeArea.Thoroughfare){
                plaatsnaam = result.Placemark[i].AddressDetails.Country.AdministrativeArea.Thoroughfare.ThoroughfareName+", "+plaatsnaam;
              }
              var locatie =plaatsnaam+" ("+provincie+")"; 
//              console.warn(locatie);
              messagediv.innerHTML += "<br>"+(i+1)+": <a href='javascript:openObj.selecteerLocatie(" +i+")'>"+ locatie+"</a>";
              openObj.adressen[i] = {coordinaten: p, adres: result.Placemark[i].address, schermnaam: locatie};
            }
          }
        } else if(result.Placemark.length==1){
          messagediv.innerHTML = "Een ogenblik geduld a.u.b.<br />De gegevens van de garages worden opgehaald.";
          messagediv.style.backgroundColor = '#3E88CF';
          messagediv.style.color           = 'white';
          messagediv.style.fontWeight      = 'bold';
          messagediv.style.textAlign       = 'left';
          openObj.locatie.coordinates = result.Placemark[0].Point.coordinates;
          openObj.locatieGevonden = true;
        } else {
          // wel iets gevonden, maar dat is verwijderd door het filter
          messagediv.innerHTML = "Deze locatie is niet gevonden.";
          messagediv.style.backgroundColor = 'red';
          messagediv.style.color           = 'white';
          messagediv.style.fontWeight      = 'bold';
          messagediv.style.textAlign       = 'left';
          openObj.locatieGevonden = false;
        }
      } else {
      // fout(?) bij het geocoden, inclusief niet gevonden adressen
          messagediv.innerHTML = "Deze locatie is niet gevonden.";
          messagediv.style.backgroundColor = 'red';
          messagediv.style.color           = 'white';
          messagediv.style.fontWeight      = 'bold';
          messagediv.style.textAlign       = 'left';
          //alert('De locatie kon niet worden gevonden. (' + search + ') ');
          openObj.locatieGevonden = false;
      }
      openObj.forwardOrNot();
    }
    );
    return 1;
  }
  
  this.selecteerLocatie = function(nummer){
     if(this.adressen[nummer]){
       var p = this.adressen[nummer].coordinaten;
       var a = this.adressen[nummer].schermnaam;
       this.locatie.coordinates = p;
       document.openingsform.latlng.value = p[1]+","+p[0];
       document.openingsform.locatie.value = a;
       
       var messagediv = document.getElementById(this.divs.message);
       messagediv.innerHTML="";
       this.locatieGevonden = true;
       this.forwardOrNot();
     }
  }
  
  
  this.haalAutoGegevens= function(kenteken){
    var obj = document.getElementById(this.divs.kenteken_msg);
    obj.innerHTML ="Het kenteken wordt opgezocht";
    obj.style.backgroundColor = '#FFD700';
    obj.style.color           = 'black';
    obj.style.fontWeight      = 'bold';
    
    GDownloadUrl("data_auto.php?kenteken="+kenteken, function(data, responseCode) {
      var resultaat = eval('(' + data + ')');
      if(resultaat.status>0){
        openObj.kentekenGevonden = true;
        openObj.auto.kenteken    = openObj.stripKenteken(resultaat.auto);
        var obj= document.getElementById(openObj.divs.kenteken_msg);
        obj.innerHTML = 'Kenteken is gevonden.';
        obj.style.backgroundColor = '#3e88cf';
        obj.style.color           = 'white';
        obj.style.fontWeight      = 'bold';
        
      } else {
        var obj= document.getElementById(openObj.divs.kenteken_msg);
        if(resultaat.message){
          // foumelding vanaf de server : deze overnemen en niet doorgaan obv merk
          obj.innerHTML = resultaat.message;
          obj.style.backgroundColor = 'red';
          obj.style.color           = 'white';
          obj.style.fontWeight      = 'bold';
        } else {
          obj.innerHTML = 'Kenteken is niet gevonden.';
          if(openObj.merk){
            obj.innerHTML+= ' Het geselecteerde automerk wordt gebruikt.';
          } else {
            obj.innerHTML+= ' Geef een juist kenteken op of kies een merk.';
            obj.style.backgroundColor = 'red';
            obj.style.color           = 'white';
            obj.style.fontWeight      = 'bold';
          }
        }
        openObj.kentekenGevonden = openObj.merk;
        openObj.auto.kenteken    = null;
      }
      openObj.forwardOrNot();
      return;
    }
    );
  }

  this.forwardOrNot = function(){
    if(this.locatieGevonden && this.kentekenGevonden){
      // forward
      var p= this.locatie.coordinates;
      document.openingsform.latlng.value = p[1]+','+p[0];
      document.openingsform.kenteken.value = this.auto.kenteken? this.auto.kenteken:'';
//      console.info('OK -->', document.openingsform.latlng.value);
//      console.info(this.merk," --> ",this.merk?"true":"false");
        document.openingsform.submit();
    } else {
      // do not forward, maar focus eventueel op een nog niet ingevuld veld
      if(!this.kentekenGevonden){
        //document.getElementById(this.divs.kenteken).focus();
      } else {
        document.getElementById(this.divs.locatie).focus();
      }
      
//      console.error("Nog niet OK");
    }
  }
  
}

  function filterPlacemarks(lijst, options){
    if(!lijst.length){
      return lijst;
    }
    var lijst2 =[];
    for (var i=0; i<lijst.length; i++){
      var aantal2= lijst2.length;
      var gevonden = false;
      var plaats = '';
      if(lijst[i].AddressDetails.Country){
        if(lijst[i].AddressDetails.Country.AdministrativeArea && lijst[i].AddressDetails.Country.AdministrativeArea.Locality){
          plaats= lijst[i].AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
        }
        if(!plaats && !options.isPostcode){
          continue;
        }
        var land = lijst[i].AddressDetails.Country.CountryNameCode;
        if(land !='NL'){
          continue;
        }
        if(!lijst[i].AddressDetails.Country.AdministrativeArea){
          if(!options.isPostcode || !lijst[i].AddressDetails.Country.PostalCode ){
            continue;
          }
        }
      } else {
        // geen land-informatie
        continue;
      }
      var punt= lijst[i].Point.coordinates;
      for(var j=0; j<aantal2;j++){
        var punt2 =lijst2[j].Point.coordinates;
        if (punt[0]==punt2[0] && punt[1]==punt2[1]){
          gevonden = true;
          break;
        }
      }
      if(!gevonden){
        lijst2.push(lijst[i]);
      }
    }
    return lijst2;
  }

