/**
 * gmap.js
 * @version	1.7 - 12:43 2009/06/25
 *
 * Google Maps API リファレンス - Google Maps API - Google Code
 * http://code.google.com/intl/ja/apis/maps/documentation/reference.html
 *
 */

Kaas.googlemaps = {
	
	init: function(c) {
		
		var gmaps = document.getElementById(this.containerID);
		gmaps.innerHTML = '<div id="gContainer"></div>';
		
		this.gmap = new GMap2(document.getElementById('gContainer'));
		
		var center;
		// 3. 複数ページで使用する際、bodyのクラス名によって中心位置を変えたいとき
		if (c == 'class')
			center = this.getCenter();
			
		// 2. 中心位置を直接入力
		else if (typeof c == 'number')
			center = [arguments[0], arguments[1]];
			
		// 1. 中心位置を mark の1つ目の位置にセット
		else
			center = this.mark[0].latlng;
		
		
		// 中心位置を設定
		this.gmap.setCenter(new GLatLng(center[0], center[1]), this.defaultZoom);
		
		// コントロール作成
		this.createControllers();
		
		// マップタイプ設定
		this.gmap.setMapType(this.mapType);
		
		// マーカー作成
		for (var i = 0, l = this.mark.length; i < l; i++) {
			
			var marker = this.createGMarker(i);
			this.gmap.addOverlay(marker);
			
			/**
			 * mark[i] に id がある場合、クリックするとセンターを移動するための制御要素を作成
			 * @see onSetCenter()
			 */
			if (this.mark[i].id != undefined) this.onSetCenter(i, marker);
			
		}
		
	},
	
	/**
	 * コントロール作成
	 * @return	{Void}
	 */
	createControllers: function() {
		
		for (var i = 0, l = this.controllers.length; i < l; i++) {
			this.gmap.addControl(this.controllers[i]);
		}
		
	},
	
	/**
	 * マーカー作成
	 * @param	i	:	mark のインデックス
	 * @return	{GMarker}
	 */
	createGMarker: function(i) {
		
		var m = this.mark[i];
		// Icon
		var iconsrc = (m.iconsrc != undefined)? m.iconsrc : this.iconsrc;
		var markerOpt = (iconsrc)? { icon: this.createGIcon(iconsrc) } : {};
		
		var marker = new GMarker(new GLatLng(m.latlng[0], m.latlng[1]), markerOpt);
		// infoWindow 幅の指定
		var infoWindowOpt = this.gmap.getInfoWindow();
		infoWindowOpt.maxWidth = this.infoWindowMaxWidth;
		
		if (m.html != undefined) GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml(m.html, infoWindowOpt); });
		
		return marker;
		
	},
	
	/**
	 * カスタムアイコン作成
	 * @todo	とりあえず影のパスやサイズ等は固定（変えたい場合はカスタマイズ）
	 * @param	src	:	アイコンのパス
	 * @return	{GIcon}
	 */
	createGIcon: function(src) {
		
		var icon = new GIcon(G_DEFAULT_ICON);
		icon.image = Kaas.root() + this.directory + src;
		icon.shadow = Kaas.root() + this.directory + 'img/gmap_shadow.png';
		icon.iconSize = new GSize(25, 32);
		icon.shadowSize = new GSize(25, 38);
		icon.iconAnchor = new GPoint(13, 32);
		
		return icon;
		
	},
	
	/**
	 * クリックイベント
	 * マップコントロールのハンドラとなる要素をクリックするとセンターを移動
	 * @param	i		:	mark のインデックス
	 * @param	marker	:	対応するマーカー
	 * @return	{Void}
	 */
	onSetCenter: function(i, marker) {
		
		var m = this.mark[i];
		if (!document.getElementById(m.id)) return;
		
		var g = this.gmap;
		
		var a = this.createCenterControlElement(i);
		a.i = i;
		
		anchor = this.anchorToGMap;
		
		a.onmouseover = function() {
			Kaas.addClass(this, 'mapControllerOver');
		};
		a.onmouseout = function() {
			Kaas.removeClass(this, 'mapControllerOver');
		};
		a.onclick = function() {
			
			g.panTo(new GLatLng(m.latlng[0], m.latlng[1]));
			
			
			if (m.html != undefined) {
				var w = this.infoWindowMaxWidth;
				var infoWindowOpt = g.getInfoWindow();
				infoWindowOpt.maxWidth = w;
				var timerId = setTimeout(function() {
					marker.openInfoWindowHtml(m.html, infoWindowOpt);
				}, 300);
			}
			// 
			if (anchor) {
				window.location.href = anchor;
				return false;
			}
			
		};
		
	},
	
	/**
	 * マップコントロールのハンドラとなる要素を作成
	 * @param	i	:	mark のインデックス
	 * @return	{Object}
	 */
	createCenterControlElement: function(i) {
		
		var m = this.mark[i];
		var div = document.createElement('div');
		div.id = m.id + 'mapController';
		div.className = 'mapController';
		div.innerHTML = this.mapControllerInnerHTML;
		
		return document.getElementById(m.id).appendChild(div);
		
	},
	
	/**
	 * body の class名と連動させて最初の表示位置を変える時
	 * @return	{Array}
	 */
	getCenter: function() {
		
		var bodyClassNames = document.getElementsByTagName('body')[0].className.split(' ');
		var bodyClassName = bodyClassNames[bodyClassNames.length - 1];
		var m = this.mark;
		
		for (var i = 0, l = m.length; i < l; i++) {
			if (m[i].page == bodyClassName) return m[i].latlng;
		}
		
	},
	
	/**
	 * 緯度・経度をユーザープロンプトで出力
	 * @param	address	:	緯度・経度を調べたい住所
	 * @return	{Void}
	 */
	getGeoCoder: function(address) {
		
		var geocoder = new GClientGeocoder();
		var g = this.gmap;
		
		geocoder.getLatLng(address, function(e) {
			if (e != null) {
				g.panTo(e);
				var str = e.toString().replace(/\(/, '');
				prompt(address, str.replace(/\)/, ''));
			} else {
				alert('指定した住所はありません\n' + address);
			}
		});
		
	},
	
	
	gmap: {}
	
};

