
var AddressSearcher = Class.create();

AddressSearcher.prototype = {
	lat_: null,
	lng_: null,
	deftimer_: null,
	found_help_: null,
	opts_: null,
    initialize: function(elm_oc, elm_disp, frequency, opts) {
        var eo = $(elm_oc);
        var ed = $(elm_disp);
		this.opts_ = opts;
		this.deftimer_ = new DeferrableTimer(this.execute_geocoding.bind(this), frequency * 1000 + 500);
        new Form.Element.Observer(eo, frequency, this.check_onchange.bind(this));
        this.elm_oc_ = eo;
        this.elm_disp_ = ed;
		this.geocoder_ = new GClientGeocoder();
		this.geocoder_.setBaseCountryCode('JP');
    },
	
	check_onchange: function(element, value) {
		this.deftimer_.start(element, value);
	},

    execute_geocoding: function(element, value) {
        this.elm_disp_.innerHTML = '';
        if (value == '') return;
		this.geocoder_.getLocations(value, this.event_onlocalsearch.bind(this));
    }
	,
    event_onlocalsearch: function(results) {
		var fh = this.opts_.found_help;
        var telm = this.elm_disp_;
        telm.innerHTML = '';
		var tmppm = null;
		if (results.Status.code != 200) return;
        results.Placemark.each(function(pm) {
			if (pm.AddressDetails.Country.CountryNameCode == 'JP') {
				var imgname = 's_place.png';
                                var address = pm.address.replace(/^(日本|Japan)/, '');
                                address = address.replace(/^, /, '');
				telm.innerHTML += "<span style='margin-left: 5px'><a href='#' id='latlngs'><img border='0' src='/images/" + imgname + "'/>" + address + "</a>";
				if (fh) {
					telm.innerHTML += fh;
				}
				tmppm = pm;
				throw $break;
			}
		});
		var aelm = $('latlngs');
		if (aelm) {
			this.lat_ = tmppm.Point.coordinates[1];
			this.lng_ = tmppm.Point.coordinates[0];
                        var address = tmppm.address.replace(/^(日本|Japan), /, '');
                        address = address.replace(/^, /, ''); 
			this.label_ = address;
			aelm.onclick = this.execute_click.bind(this);
        }
    }
	,
	execute_click: function() {
		if ($('latlngs')) {
			if (!$('desc_space')) {
		        var telm = this.elm_disp_;
			}
			this.dispatcher.send('locate', this.lat_, this.lng_, this.label_);
			this.dispatcher.send('location_click');
			return true;
		} else {
			return false;
		}
	}
};
