// postalcodes is filled by the JSON callback and used by the mouse event handlers of the suggest box
var postalcodes;

// this function will be called by our JSON callback
// the parameter jData will contain an array with postalcode objects
function getLocation(jData) {
  if (jData == null) {
    // There was a problem parsing search results
    //Element.show('no_results');
    //alert("BAD")
    return;
  }

  // save place array in 'postalcodes' to make it accessible from mouse event handlers
  postalcodes = jData.postalcodes;
    	
  if (postalcodes.length > 1) {
    // we got several places for the postalcode
    // make suggest box visible
    document.getElementById('suggestBoxElement').style.visibility = 'visible';
    var suggestBoxHTML  = '';
    // iterate over places and build suggest box content
    for (i=0;i< jData.postalcodes.length;i++) {
      // for every postalcode record we create a html div 
      // each div gets an id using the array index for later retrieval 
      // define mouse event handlers to highlight places on mouseover
      // and to select a place on click
      // all events receive the postalcode array index as input parameter
      suggestBoxHTML += "<li class='suggestions' id=pcId" + (i+1) + " onmousedown='suggestBoxMouseDown(" + i +")' onmouseover='suggestBoxMouseOver(" +  i +")' onmouseout='suggestBoxMouseOut(" + i +")'> " + postalcodes[i].countryCode + ' ' + postalcodes[i].postalcode + ' &nbsp;&nbsp; ' + postalcodes[i].placeName  +'</li>' ;
    }
    
    suggestBoxHTML = "<ul><li class='intro'>Selectionnez la ville correspondante</li>" + suggestBoxHTML + "</ul>"
    // display suggest box
    document.getElementById('suggestBoxElement').innerHTML = suggestBoxHTML;
  } else {
    if (postalcodes.length == 1) {
      // exactly one place for postalcode
      // directly fill the form, no suggest box required 
      var placeInput = document.getElementById("placeInput");
      var latitude = document.getElementById("latitude");
      var longitude = document.getElementById("longitude");
      var geo_id = document.getElementById("geo_id");
      placeInput.value = postalcodes[0].placeName;
      latitude.value = postalcodes[0].lat;
      longitude.value = postalcodes[0].lng;
      if(postalcodes[0].geo_id){
        geo_id.value = postalcodes[0].geo_id;
      }
      

      $('placeInput').hide();
      $('span_placeInput').update("<b>"+$('placeInput').value+"</b>");


      closeSuggestBox();
    } else{
      closeSuggestBox();
      Element.show('no_results');
      Element.hide('frm_to_hide_ville')
      Element.show('launch_lookup')
    }
    
  }
}

function hide_placeInput(){
  var country = document.getElementById("countrySelect").value;

  if (geonamesPostalCodeCountries.toString().search(country) == -1) {
    $('placeInput').show();
    $('span_placeInput').update("");
  }else{
    if($('placeInput').value){
      $('placeInput').hide();
      $('span_placeInput').update("<b>"+$('placeInput').value+"</b>");
    }
  }
  
}




function closeSuggestBox() {
  document.getElementById('suggestBoxElement').innerHTML = '';
  document.getElementById('suggestBoxElement').style.visibility = 'hidden';
  Element.hide('spinner_ville');
  Element.show('frm_to_hide_ville');
  Element.hide('launch_lookup');
  Element.hide('no_results');
}


// remove highlight on mouse out event
function suggestBoxMouseOut(obj) {
  document.getElementById('pcId'+ obj).className = 'suggestions';
}

// the user has selected a place name from the suggest box
function suggestBoxMouseDown(obj) {
  closeSuggestBox();
  var placeInput = document.getElementById("placeInput");
  var latitude = document.getElementById("latitude");
  var longitude = document.getElementById("longitude");
  var geo_id = document.getElementById("geo_id");
  placeInput.value = postalcodes[obj].placeName;
  latitude.value = postalcodes[obj].lat;
  longitude.value = postalcodes[obj].lng;
  if(postalcodes[obj].geo_id){
    geo_id.value = postalcodes[obj].geo_id;
  }
  
  $('placeInput').hide();
  $('span_placeInput').update("<b>"+$('placeInput').value+"</b>");
}

// function to highlight places on mouse over event
function suggestBoxMouseOver(obj) {
  document.getElementById('pcId'+ obj).className = 'suggestionMouseOver';
}


// this function is called when the user leaves the postal code input field
// it call the geonames.org JSON webservice to fetch an array of places 
// for the given postal code 
function postalCodeLookup() {

  Element.hide('frm_to_hide_ville'); 
  Element.show('spinner_ville');
  $('placeInput').value="";
  $('latitude').value="";
  $('longitude').value="";
  $('no_geo_country').value=0;
  var country = document.getElementById("countrySelect").value;
  if (geonamesPostalCodeCountries.toString().search(country) == -1) {
    $('no_geo_country').value=1;
    Element.show('frm_to_hide_ville'); 
    Element.hide('spinner_ville');
    return; // selected country not supported by geonames
  }else{
    // selected country IS supported by geonames
    $('placeInput').hide();
  }
  
  
  // display loading in suggest box
  document.getElementById('suggestBoxElement').style.visibility = 'visible';
  document.getElementById('suggestBoxElement').innerHTML = '<small><i>loading ...</i></small>';
  
  var postalcode = document.getElementById("postalcodeInput").value;
  if(country == "FR" || country == "BE" || country == "CH" || country == "CA"){
    //www.spectable.com
    request = 'http://www.spectable.com/geo/zip_search?zip=' + postalcode  + '&country=' + country;
  }else{
    request = 'http://ws.geonames.net/postalCodeLookupJSON?postalcode=' + postalcode  + '&country=' + country  + '&callback=getLocation' + '&username=spectable&style=long';
  }
  // Create a new script object
  aObj = new JSONscriptRequest(request);
  // Build the script tag
  aObj.buildScriptTag();
  // Execute (add) the script tag
  aObj.addScriptTag();
}

// set the country of the user's ip (included in geonamesData.js) as selected country 
// in the country select box of the address form
function setDefaultCountry() {
  var countrySelect = document.getElementById("countrySelect");
  for (i=0;i< countrySelect.length;i++) {
    // the javascript geonamesData.js contains the countrycode
    // of the userIp in the variable 'geonamesUserIpCountryCode'
    if (countrySelect[i].value == geonamesUserIpCountryCode) {
      // set the country selectionfield
      countrySelect.selectedIndex = i;
    }
  }
}
