//////////////////////////////////////////////////
// 変数初期化
//////////////////////////////////////////////////
var map, marker, debug;
var aryMarkers = new Array();
var objMarkers = new Array();
//////////////////////////////////////////////////
// 変数定義
//////////////////////////////////////////////////
var ctgList = [
	"歴史",
	"町並み",
	"自然",
	"芸術",
	"食",
	"技",
	"温泉",
	"お店・施設",
	"体験"
];
//////////////////////////////////////////////////
// F U N C T I O N S
//////////////////////////////////////////////////
//--------------------------------------------------
// 関数 : 初期化
//--------------------------------------------------
function init() {
	// !! debug !!
//	debug = document.getElementById('debug');
//	debug.innerHTML = "";
	// !! debug !!
	mapAreaInit();
	GMapInit();
}
//--------------------------------------------------
// 関数 : マップ描画エリア初期化
//--------------------------------------------------
function mapAreaInit() {
		var map_area = document.getElementById(map_id);
		map_area.style.width = map_area_size[0];
		map_area.style.height = map_area_size[1];
}
//--------------------------------------------------
// 関数 : Google MAP 初期化
//--------------------------------------------------
function GMapInit() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById(map_id));
		map.setCenter(new GLatLng(def_point[0], def_point[1]), def_zoom);
		
		// 3Dの大きいサイズのズームと移動の矢印を表示する
		map.addControl(new GLargeMapControl3D());
//		map.addControl(new GSmallZoomControl3D());
		// 地図タイプ切り換えボタンを表示する
		map.addControl(new GMenuMapTypeControl());
		// 右下に、折りたたみ可能な広域表示の小さい地図を表示する
//		map.addControl(new GOverviewMapControl());
		// 左下に、地図スケール(縮尺定規)を表示する
//		map.addControl(new GScaleControl());
		// [地形図]ボタンを追加する
//		map.addMapType(G_PHYSICAL_MAP);
		// [Earth]ボタンを追加する
//		map.addMapType(G_SATELLITE_3D_MAP);
		// マウスホイールでズームする
//		map.enableScrollWheelZoom();
		// マップ初期化
//		map.setMapType(G_NORMAL_MAP);
		map.setMapType();
		// グーグルマップ用XML読み込み
		GMapMarkerXmlLd();
		// ? クリックイベント追加
//		GEvent.addListener(map, "click", clickAction);
	}
}
//--------------------------------------------------
// 関数 : Google MAP マーカー用XML取得→配列化
//--------------------------------------------------
function GMapMarkerXmlLd(){
	// XML読み込み処理
	GDownloadUrl(marker_xml, function dispData(data, statusCode){
		//
		// XML読み込み完了処理
		//
		// マップ上のマーカーを全て削除
		map.clearOverlays();
		// 読み込んだXMLをパース(構文解析)
		var xml = GXml.parse(data);
		// XMLオブジェクトから"marker"タグを抜き出し配列化
		var items = xml.documentElement.getElementsByTagName("marker");
		// XMLの整形データ生成
		for (var i = 0; i < items.length; i++) {
			var row = items[i];
			aryMarkers.push({
				id     : GXml.value(row.getElementsByTagName('id')[0]),
				title  : GXml.value(row.getElementsByTagName('name')[0]),
				lat    : (GXml.value(row.getElementsByTagName('lat')[0]) ? parseFloat(GXml.value(row.getElementsByTagName('lat')[0])) : ''),
				lng    : (GXml.value(row.getElementsByTagName('lng')[0]) ? parseFloat(GXml.value(row.getElementsByTagName('lng')[0])) : ''),
				tags   : explode(',', GXml.value(row.getElementsByTagName("tagging")[0])),
				url    : (GXml.value(row.getElementsByTagName('url')[0]) ? GXml.value(row.getElementsByTagName('url')[0]) : GXml.value(row.getElementsByTagName('parent')[0])+'#'+GXml.value(row.getElementsByTagName('id')[0])),
				thumb  : GXml.value( row.getElementsByTagName("img")[0].getAttributeNode("src") ),
				tpl    : GXml.value(row.getElementsByTagName('template')[0]),
				detail : GXml.value(row.getElementsByTagName('detail')[0]),
				ctgid  : GXml.value(row.getElementsByTagName('ctgid')[0]),
				pglink : GXml.value(row.getElementsByTagName('parent')[0])+'#'+GXml.value(row.getElementsByTagName('id')[0])
			});
			//
			if(aryMarkers[i].title!='' && aryMarkers[i].lat!='' && aryMarkers[i].lng!='') {
				//!! debug !!
//				debug.innerHTML += i+" : "+aryMarkers[i].title+" : "+aryMarkers[i].tags+"<br />";
				//!! debug !!
				objMarkers.push({
					id   : aryMarkers[i].id,
					mark : createMarker(
								aryMarkers[i].lat, 
								aryMarkers[i].lng, 
								mkBalloonHtml(aryMarkers[i]),
								mkIcon(aryMarkers[i].thumb),
//								selectIcon(aryMarkers[i].tags)
								aryMarkers[i].pglink
							),
					tag : aryMarkers[i].tags
				});
			}
		}
		// マーカーを配置
		for(var i=0; i<objMarkers.length; i++) {
			map.addOverlay(objMarkers[i].mark);
		}
	});
}
function mkIcon(thumb) {
	var icon = new GIcon();
	icon.image = thumb;
	icon.iconSize = new GSize(53,32);
/*
	icon.shadow = 'http://okayama-japan.jp/img2/gmaplistshadow.png';
	icon.shadowSize = new GSize(53,39);
	icon.iconAnchor = new GPoint(27,39);
	icon.infoWindowAnchor = new GPoint(0,0);
*/
	icon.shadow = 'http://okayama-japan.jp/img2/gmaplistshadow2.png';
	icon.shadowSize = new GSize(60,45);
	icon.iconAnchor = new GPoint(0,45);
	icon.infoWindowAnchor = new GPoint(0,0);

	return icon;
}
//--------------------------------------------------
// 関数 : Google MAP マーカー用設定
//--------------------------------------------------
function selectIcon(tags) {
	var tag = "";
	for(var i=0; i<tags.length; i++){
		if(ctgList.contains(tags[i])) {
			tag = tags[i];
		}
	}

	switch(tag) {
		case "歴史" :
			var icon = new GIcon();
			icon.image="http://maps.google.co.jp/mapfiles/ms/icons/blue-pushpin.png";	// 画像のURL
			icon.iconSize = new GSize( 32, 32 );	// 画像の大きさ
			icon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/pushpin_shadow.png';
			icon.shadowSize = new GSize( 59, 32 );	// 影画像の大きさ
			icon.iconAnchor = new GPoint( 16, 32 );	// 画像の「基準点」
			icon.infoWindowAnchor = new GPoint( 16, 0 );	// 情報ウィンドウの基準点
			break;

		case "町並み" :
			var icon = new GIcon();
			icon.image="http://maps.google.co.jp/mapfiles/ms/icons/red-pushpin.png";	// 画像のURL
			icon.iconSize = new GSize( 32, 32 );	// 画像の大きさ
			icon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/pushpin_shadow.png';
			icon.shadowSize = new GSize( 59, 32 );	// 影画像の大きさ
			icon.iconAnchor = new GPoint( 16, 32 );	// 画像の「基準点」
			icon.infoWindowAnchor = new GPoint( 16, 0 );	// 情報ウィンドウの基準点
			break;
			
		case "自然" :
			var icon = new GIcon();
			icon.image="http://maps.google.co.jp/mapfiles/ms/icons/grn-pushpin.png";	// 画像のURL
			icon.iconSize = new GSize( 32, 32 );	// 画像の大きさ
			icon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/pushpin_shadow.png';
			icon.shadowSize = new GSize( 59, 32 );	// 影画像の大きさ
			icon.iconAnchor = new GPoint( 16, 32 );	// 画像の「基準点」
			icon.infoWindowAnchor = new GPoint( 16, 0 );	// 情報ウィンドウの基準点
			break;
			
		case "芸術" :
			var icon = new GIcon();
			icon.image="http://maps.google.co.jp/mapfiles/ms/icons/ltblu-pushpin.png";	// 画像のURL
			icon.iconSize = new GSize( 32, 32 );	// 画像の大きさ
			icon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/pushpin_shadow.png';
			icon.shadowSize = new GSize( 59, 32 );	// 影画像の大きさ
			icon.iconAnchor = new GPoint( 16, 32 );	// 画像の「基準点」
			icon.infoWindowAnchor = new GPoint( 16, 0 );	// 情報ウィンドウの基準点
			break;
			
		case "食" :
			var icon = new GIcon();
			icon.image="http://maps.google.co.jp/mapfiles/ms/icons/ylw-pushpin.png";	// 画像のURL
			icon.iconSize = new GSize( 32, 32 );	// 画像の大きさ
			icon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/pushpin_shadow.png';
			icon.shadowSize = new GSize( 59, 32 );	// 影画像の大きさ
			icon.iconAnchor = new GPoint( 16, 32 );	// 画像の「基準点」
			icon.infoWindowAnchor = new GPoint( 16, 0 );	// 情報ウィンドウの基準点
			break;
			
		case "技" :
			var icon = new GIcon();	
			icon.image="http://maps.google.co.jp/mapfiles/ms/icons/purple-pushpin.png";	// 画像のURL
			icon.iconSize = new GSize( 32, 32 );	// 画像の大きさ
			icon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/pushpin_shadow.png';
			icon.shadowSize = new GSize( 59, 32 );	// 影画像の大きさ
			icon.iconAnchor = new GPoint( 16, 32 );	// 画像の「基準点」
			icon.infoWindowAnchor = new GPoint( 16, 0 );	// 情報ウィンドウの基準点
			break;
			
		case "温泉" :
			var icon = new GIcon();
			icon.image="http://maps.google.co.jp/mapfiles/ms/icons/pink-pushpin.png";	// 画像のURL
			icon.iconSize = new GSize( 32, 32 );	// 画像の大きさ
			icon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/pushpin_shadow.png';
			icon.shadowSize = new GSize( 59, 32 );	// 影画像の大きさ
			icon.iconAnchor = new GPoint( 16, 32 );	// 画像の「基準点」
			icon.infoWindowAnchor = new GPoint( 16, 0 );	// 情報ウィンドウの基準点
			break;
		
		case "体験" :
			var icon = new GIcon();
			icon.image="http://maps.google.co.jp/mapfiles/ms/icons/orange-dot.png";	// 画像のURL
			icon.iconSize = new GSize( 32, 32 );	// 画像の大きさ
			icon.shadow = 'http://maps.google.co.jp/mapfiles/ms/icons/msmarker.shadow.png';
			icon.shadowSize = new GSize( 59, 32 );	// 影画像の大きさ
			icon.iconAnchor = new GPoint( 16, 32 );	// 画像の「基準点」
			icon.infoWindowAnchor = new GPoint( 16, 0 );	// 情報ウィンドウの基準点
			break;
			
		default : 
			var icon = "";
			break;
	}
	return icon;
}

//--------------------------------------------------
// 関数 : Google MAP用 マーカーオブジェクト作成
//--------------------------------------------------
function createMarker(lat, lng, html, icon, pglink) {
	if(icon) {
		var marker = new GMarker(new GLatLng(lat, lng), icon);
	} else {
		var marker = new GMarker(new GLatLng(lat, lng));
	}
	GEvent.addListener(marker, "click", function(){
//		marker.openInfoWindowHtml(html,{"maxWidth":212});
		location.href = 'http://okayama-japan.jp/'+pglink;
	});
	return marker;
}

//--------------------------------------------------
// 関数 : Google MAP　バルーン用HTML生成
//--------------------------------------------------
function mkBalloonHtml(data) {
	var buff = '';
	var link = data.pglink;
	buff += '<div class="info">';
	buff += '<h4><a href="' + link + '">' + data.title + '</a></h4>';
	buff += '<a href="' + link + '"><img src="' + data.thumb + '" width="212" height="128" /><br />';
	buff += '<br class="clearn" /></div>';
	return buff;
}
//--------------------------------------------------
// 関数 : 検索用
//--------------------------------------------------
function mapSpotSearch($tgs) {
	var chkboxs = document.gmapSearch.tag;
	var loopStart = 0;
	var loopEnd = chkboxs.length;
	var chkWords = new Array();

	for(var i=loopStart; i<loopEnd; i++) {
		if(chkboxs[i].checked) {
			chkWords.push(chkboxs[i].value);
		}
	}

	// マップ上のマーカーを全て削除
	map.clearOverlays();
	if(chkWords.length) {
		//
		// 検索の選択肢が選ばれていた場合
		//
		var hits = new Array();
		for(var i=0; i<chkWords.length; i++) {
			for(var j=0; j<objMarkers.length; j++) {
				if(objMarkers[j].tag.contains(chkWords[i])) {
					hits.push(objMarkers[j].id);
				}
			}
		}
		hits = unique(hits);
		// 検索にヒットしたもののみを表示
		for(var i=0; i<objMarkers.length; i++) {
			if(hits.contains(objMarkers[i].id)) { map.addOverlay(objMarkers[i].mark); }
		}
	} else {
		//
		// 検索の選択肢が選ばれていいない時
		//
		for(var i=0; i<objMarkers.length; i++) {
			map.addOverlay(objMarkers[i].mark);
		}
	}
}

//==================================================
// 関数 : PHPのexplodeと同等の処理を行う
//==================================================
function explode( delimiter, string, limit ) {
	// Splits a string on string separator and return array of components. If limit is positive only limit number of components is returned. If limit is negative all components except the last abs(limit) are returned.
	//
	// version: 810.114
	// discuss at: http://phpjs.org/functions/explode
	// +     original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +     improved by: kenneth
	// +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +     improved by: d3x
	// +     bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// *     example 1: explode(' ', 'Kevin van Zonneveld');
	// *     returns 1: {0: 'Kevin', 1: 'van', 2: 'Zonneveld'}
	// *     example 2: explode('=', 'a=bc=d', 2);
	// *     returns 2: ['a', 'bc=d']
	var emptyArray = { 0: '' };
	// third argument is not required
	if ( arguments.length < 2 || typeof arguments[0] == 'undefined' || typeof arguments[1] == 'undefined' ) {  return null;  }
	if ( delimiter === '' || delimiter === false  || delimiter === null ) { return false; }
	if ( typeof delimiter == 'function' || typeof delimiter == 'object' || typeof string == 'function' || typeof string == 'object' ) { return emptyArray; }
	if ( delimiter === true ) { delimiter = '1'; }
	if (!limit) {
		return string.toString().split(delimiter.toString());
	} else { 
		// support for limit argument
		var splitted = string.toString().split(delimiter.toString());
		var partA = splitted.splice(0, limit - 1);
		var partB = splitted.join(delimiter.toString());
		partA.push(partB);
		return partA;
	}
}

//==================================================
// 関数 : 配列の重複を削除
//==================================================
function unique(array) {
	var storage = {};
	var uniqueArray = [];
	var i, value;
	for (i = 0; i < array.length; i++) {
		value = array[i];
		if (!(value in storage)) {
			storage[value] = true;
			uniqueArray.push(value);
		}
	}
	return uniqueArray;
}

//==================================================
// クラス拡張 : 配列の中を検索
//==================================================
if( ! Array.prototype.contains ){
	/**
	* @access public
	* @param value mixed 検索するオブジェクト
	* @return boolean 対象配列に既にオブジェクトが存在していれば true, そうでなければ false
	* 配列の値の重複チェックなどに使用。
	*/
	Array.prototype.contains = function( value ){
		for(var i in this){
		if( this.hasOwnProperty(i) && this[i] === value){
			return true;
		}
		}
		return false;
	}
}


//////////////////////////////////////////////////
// M A I N	L O G I C
//////////////////////////////////////////////////
window.onload = function() { init(); }
window.onunload = function() { GUnload(); }
