
/**
 * @file
 * Address widget and GMap geocoder routines.
 */

/*global jQuery, Drupal, GClientGeocoder */

/**
 * Provide a shared geocoder.
 * Lazy initialize it so it's not resident until needed.
 */
Drupal.gmap.geocoder = function () {
  var theGeocoder;
  if (!theGeocoder) {
    theGeocoder = new google.maps.Geocoder();
  }
  return theGeocoder;
};

Drupal.gmap.addHandler('gmap', function (elem) {
  var obj = this;

  obj.bind('geocode_pan', function (addr) {
    Drupal.gmap.geocoder().geocode({'address': addr}, function (results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        obj.vars.latitude = results[0].geometry.location.lat();
        obj.vars.longitude = results[0].geometry.location.lng();
        obj.change("move", -1);
      }
      else {
        // Error condition?
      }
    });
  });

  obj.bind('geocode_panzoom', function (addr) {
    Drupal.gmap.geocoder().geocode({'address': addr}, function (results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var place = results[0];
        obj.vars.latitude = results[0].geometry.location.lat();
        obj.vars.longitude = results[0].geometry.location.lng();

        // This is, of course, temporary.

        switch (place.AddressDetails.Accuracy) {
          case 1: // Country level
            obj.vars.zoom = 4;
            break;
          case 2: // Region (state, province, prefecture, etc.) level
            obj.vars.zoom = 6;
            break;
          case 3: // Sub-region (county, municipality, etc.) level
            obj.vars.zoom = 8;
            break;
          case 4: // Town (city, village) level accuracy. (Since 2.59)
          case 5: // Post code (zip code) level accuracy. (Since 2.59)
          case 6: // Street level accuracy. (Since 2.59)
          case 7: // Intersection level accuracy. (Since 2.59)
          case 8: // Address level accuracy. (Since 2.59)
            obj.vars.zoom = 12;
        }
        obj.change('move', -1);
      }
    });
  });

  obj.bind('preparemarker', function (marker) {
    if (marker.address && (!marker.latitude || !marker.longitude)) {
      Drupal.gmap.geocoder().geocode({'address': marker.address}, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          marker.latitude = results[0].geometry.lat();
          marker.longitude = results[0].geometry.lng();
        }
      });
    }
  });

});

////////////////////////////////////////
//         Address widget             //
////////////////////////////////////////
Drupal.gmap.addHandler('address', function (elem) {
  var obj = this;

  // Respond to focus event.
  jQuery(elem).focus(function () {
    this.value = '';
  });

  // Respond to incoming movements.
  // Clear the box when the coords change...
  var binding = obj.bind("move", function () {
    elem.value = 'Enter an address';
  });
  // Send out outgoing movements.
  // This happens ASYNC!!!
  jQuery(elem).change(function () {
    if (elem.value.length > 0) {
      Drupal.gmap.geocoder().geocode({'address': elem.value}, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          obj.vars.latitude = results[0].geometry.location.lat();
          obj.vars.longitude = results[0].geometry.location.lng();
          obj.change("move", binding);
        }
        else {
          // Todo: Get translated value using settings.
          elem.value = 'Geocoder error: Address not found';
        }
      });
    }
    else {
      // Was empty. Ignore.
      elem.value = 'Enter an address';
    }
  });
});


////////////////////////////////////////
//  Locpick address handler (testing) //
////////////////////////////////////////
Drupal.gmap.addHandler('locpick_address', function (elem) {
  var obj = this;

  // Respond to focus event.
  jQuery(elem).focus(function () {
    this.value = '';
  });

  // Respond to incoming movements.
  // Clear the box when the coords change...
  var binding = obj.bind("locpickchange", function () {
    elem.value = 'Enter an address';
  });
  // Send out outgoing movements.
  // This happens ASYNC!!!
  jQuery(elem).change(function () {
    if (elem.value.length > 0) {
      Drupal.gmap.geocoder().geocode({'address': elem.value}, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          obj.locpick_coord = results[0];
          obj.change("locpickchange", binding);
        }
        else {
          // Todo: Get translated value using settings.
          elem.value = 'Geocoder error: Address not found';
        }
      });
    }
    else {
      // Was empty. Ignore.
      elem.value = 'Enter an address';
    }
  });
});
