Source: LocationInput.js

/**
 * An input component for geo-location
 * @constructor
 */
hui.ui.LocationInput = function(options) {
  this.options = hui.override({value:null},options);
  this.name = options.name;
  this.element = hui.get(options.element);
  this.chooser = hui.get.firstByTag(this.element,'a');
  this.latField = new hui.ui.Input({element:hui.get.firstByTag(this.element,'input'),validator:new hui.ui.NumberValidator({min:-90,max:90,allowNull:true})});
  this.latField.listen(this);
  this.lngField = new hui.ui.Input({element:this.element.getElementsByTagName('input')[1],validator:new hui.ui.NumberValidator({min:-180,max:180,allowNull:true})});
  this.lngField.listen(this);
  this.value = this.options.value;
  hui.ui.extend(this);
  this.setValue(this.value);
  this._addBehavior();
};

hui.ui.LocationInput.create = function(options) {
  options = options || {};
  options.element = hui.build('span',{'class':'hui_locationinput', html:'<span class="hui_locationinput_latitude"><span><input autocomplete="off"></span></span><span class="hui_locationinput_longitude"><span><input autocomplete="off"></span></span><a class="hui_locationinput_picker" href="javascript://"></a>'});
  return new hui.ui.LocationInput(options);
};

hui.ui.LocationInput.prototype = {
  _addBehavior : function() {
    hui.listen(this.chooser,'click',this._showPicker.bind(this));
    hui.ui.addFocusClass({element:this.latField.element,classElement:this.element,'class':'hui_locationinput-focused'});
    hui.ui.addFocusClass({element:this.lngField.element,classElement:this.element,'class':'hui_locationinput-focused'});
  },
  reset : function() {
    this.setValue();
  },
  getValue : function() {
    return this.value;
  },
  /** Set the value
   *
   */
  setValue : function(loc) {
    if (loc) {
      this.latField.setValue(loc.latitude);
      this.lngField.setValue(loc.longitude);
      this.value = loc;
    } else {
      this.latField.setValue();
      this.lngField.setValue();
      this.value = null;
    }
    this._updatePicker();
  },
  _updatePicker : function() {
    if (this.picker) {
      this.picker.setLocation(this.value);
    }
  },
  _showPicker : function() {
    if (!this.picker) {
      this.picker = new hui.ui.LocationPicker();
      this.picker.listen(this);
    }
    this.picker.show({node:this.chooser,location:this.value});
  },
  /** @private */
  $locationChanged : function(loc) {
    this.setValue(loc);
    this.fire('valueChanged',this.value);
    hui.ui.callAncestors(this,'childValueChanged',this.value);
  },
  /** @private */
  $valueChanged : function() {
    var lat = this.latField.getValue();
    var lng = this.lngField.getValue();
    if (lat===null || lng===null) {
      this.value = null;
    } else {
      this.value = {latitude:lat,longitude:lng};
    }
    this._updatePicker();
    this.fire('valueChanged',this.value);
    hui.ui.callAncestors(this,'childValueChanged',this.value);
  }
};