var init;

var gmap_search = function(map, f, addr) {
	var gmaps;
	var setDefaultPoint = function() {
		gmaps.map.setCenter(new google.maps.LatLng(35.68574469022577, 139.75296020507812), 15);
	};
	if(typeof window['google-maps-support'] == 'undefined') {
		// 1回目
		gmaps = window['google-maps-support'] = {
			map: new google.maps.Map2(map),
			geo: new google.maps.ClientGeocoder(),
			marker: null,
			zoom: 17,
			update: function() {
				if(this.marker) {
					var p = this.marker.getPoint();
					var z = this.zoom;
					f.pos.value = [ p && p.lat(), p && p.lng(), z ].join(",");
				}
			},
			move: function(p, z) {
				if(z) {
					this.zoom = z;
				}
				if(p) {
					this.map.setCenter(p, this.zoom);
				}
			},
			mark: function(p) {
				if(!this.marker) {
					this.marker = new google.maps.Marker(p);
					this.map.addOverlay(this.marker);
				} else {
					this.marker.setPoint(p);
				}
				if(document.getElementById('clearMarker')) {
					document.getElementById('clearMarker').disabled = false;
				}
			}
		};
		gmaps.map.addControl(new google.maps.LargeMapControl());
		gmaps.map.addControl(new google.maps.MapTypeControl());
		GEvent.addListener(gmaps.map, "zoomend", function(prev, curr) {
			gmaps.move(null, curr);
			gmaps.update();
		});
		GEvent.addListener(gmaps.map, "click", function(o, p) {
			gmaps.mark(p);
			gmaps.update();
		});
		if(document.getElementById('clearMarker')) {
			document.getElementById('clearMarker').onclick = function() {
				gmaps.map.clearOverlays();
				gmaps.marker = null;
				f.pos.value = '';
				this.disabled = true;
			};
		}
		var pos;
		if(f.pos.value) {
			pos = f.pos.value.split(/,/);
		}
		if(pos && pos.length == 3) {
			var lat = pos[0];
			var lng = pos[1];
			var zoom = pos[2];
			var point = new google.maps.LatLng(lat*1, lng*1);
			gmaps.move(point, zoom*1);
			gmaps.mark(point);
			return;	// 住所検索は実行しない
		}
	} else {
		// 2回目以降
		gmaps = window['google-maps-support'];
		setDefaultPoint = function() { };
	}

	if(addr) {
		gmaps.geo.getLatLng(addr, function(point) {
			if(point) {
				gmaps.move(point, gmaps.zoom);
				gmaps.mark(point);
				gmaps.update();
			} else {
				alert('該当する地点が見つかりませんでした: ' + addr);
				setDefaultPoint();
			}
		});
		return;
	} else {
		setDefaultPoint();
	}
};

(function(saved) {
	window.onload = function() {
		saved && saved();
		var button = document.getElementById('search');
		var form = document.getElementById('map_result');
		var map = document.getElementById('map');
		var callback;
		if(form && button && map) {
			// for dev
			if(button) {
				button.onclick = (function(m, f, a) { return function() { gmap_search(m, f, a.value); }; })(map, form, button.form.addr);
			}
			callback = function() {
				button.onclick();
			};
		} else if(map) {
			// for user & dev-confirm
			var data = map.getElementsByTagName('SPAN').item(0).innerHTML;
			var lat = 35.66029031972134;
			var lng = 139.7634744644165;
			var zoom = 15;
			var pos = data.split(',');
			if(pos.length == 3) {
				lat = pos[0]*1;
				lng = pos[1]*1;
				zoom = pos[2]*1 || 15;
			}
			callback = function() {
				var gmap = new google.maps.Map2(map);
				gmap.addControl(new google.maps.LargeMapControl());
				gmap.addControl(new google.maps.MapTypeControl());
				var point = new google.maps.LatLng(lat, lng);
				gmap.setCenter(point, zoom);
				gmap.addOverlay(new google.maps.Marker(point));
			};
		}
		if(callback) {
			init = function() {
				// called from google ajax api
				google.load("maps", "2", { callback: function() {
					google.load("search", "1", { callback: callback });
				} });
			};
			var script = document.createElement('SCRIPT');
			script.src = '/common/api/googlemaps';
			script.type = 'text/javascript';
			document.getElementsByTagName('HEAD').item(0).appendChild(script);
		}
	};
})(window.onload);

