/**********************************************
 kml2gmap.js  ver. 0.9.9 beta 2006.9.27
 Google Earthで作成したkmlファイルをGoogle Maps
 に展開
 
 Copyright(c) 2006 Taketan Allright Reserved.
 License BSD style
**********************************************/

if (typeof(kml2Maps) == 'undefined') {
	// add vml namespace for MSIE
	var agent = navigator.userAgent.toLowerCase();
	if (agent.indexOf("msie") != -1 && agent.indexOf("opera") == -1) {
		try {
		document.namespaces.add('v', 'schemas-microsoft-com:vml');
		document.createStyleSheet().addRule('v\:*', 'behavior: url(#default#VML);');
		} catch(e) {}
	}
	var scriptVersion = "0.9.9";//変えないで下さい
	var defLat = 35;
	var defLng = 135;
	var defZoom = 11;
	var controlFlg = 1;
	var controlType = 1;// small = 0 ,Large = 1;
	var typeChangeFlg = 1;
	var overviewFlg = 0;
	var strLatLngFormat = "lng=%lng%, lat=%lat%";
	var markerObj = new Array();
	var mPoint = new Array();
	var kml2Maps = new Array();
	var addMyMarkers = new Array();
	var addMyMarker_ID = 0;
	var strListFormat = "<b>%subject%</b><br />";
	var strInfoFormat = "<div class=\"infoWindow\"><b>%subject%</b><br />%description%</div>";
	var mapType = 2 ;//G_NORMAL_MAP = 0, G_SATELLITE_MAP=1, G_HYBRID_MAP=2; 
	var autoZoomFlg = 0 ;// auto = 1; no_auto_zoom = 0;
	var defIconSize = "";
	var onloadfunc = new Array();
	var clientUa = getUa();
	var viewLogo = 0;
	var customIcon = 1;
	var mapConf = new Array();
}

function getIcons(obj){
	// icon URL取得関数
	var iconPng = new Array();
	var iStyles = obj.getElementsByTagName("Style");
	for (var i=0;i<iStyles.length;i++){
		if( iStyles.item(i).attributes.length > 0){
			var myId = iStyles.item(i).attributes.item(0).nodeValue;
			var iconUrl = iStyles.item(i).getElementsByTagName("href");
			if(iconUrl != null){
				iconPng[myId] = iconUrl.item(0).firstChild.nodeValue;
			}
		}
	}
	return iconPng;
}

function newIcon(url,mapName){
	//icon作成関数
	var icon = new GIcon();
	icon.image = url;
	if(mapConf[mapName].defIconSize == ""){
		icon.iconSize = new GSize(32, 32);
	}else{
		icon.iconSize = new GSize(mapConf[mapName].defIconSize[w], mapConf[mapName].defIconSize[h]);
	}
	icon.iconAnchor = new GPoint(6, 20);
	icon.infoWindowAnchor = new GPoint(5, 1);
	return icon;
}

function getPlacemark(obj,mapName){
	//位置情報取得
	var iconPng = getIcons(obj);
	var places = new Array();
	var pNodes = obj.getElementsByTagName("Placemark");
	var cnt = pNodes.length;
	var i=0;
	for (i=0;i<cnt;i++){
		var nowObj = new Object();
		nowObj.mapName = mapName;
		nowObj.name = pNodes.item(i).getElementsByTagName("name").item(0).firstChild.nodeValue;
		var myDescNode = pNodes.item(i).getElementsByTagName("description");
		if(myDescNode.length == 0 ){
			nowObj.description = "";
		}else{
			nowObj.description = pNodes.item(i).getElementsByTagName("description").item(0).firstChild.nodeValue;
		}
		var href = pNodes.item(i).getElementsByTagName("href");
		if(href.length == 1){
			nowObj.iconUrl = href.item(0).firstChild.nodeValue;
		}else{
			//0.9.9
			var styleUrlNode = pNodes.item(i).getElementsByTagName("styleUrl");
			if(styleUrlNode.length != 0){
				var styleId = styleUrlNode.item(0).firstChild.nodeValue;
				styleId = styleId.replace("#","");
				nowObj.iconUrl = iconPng[styleId];
			}
		}
		var coordinates = pNodes.item(i).getElementsByTagName("coordinates").item(0).firstChild.nodeValue;
		var cc = coordinates.split(",");
		nowObj.lat = parseFloat(cc[1]);
		nowObj.lng = parseFloat(cc[0]);
		places[i] = nowObj;
	}

	//addMyMarkersがあれば追加
	for(var ii=0;ii<addMyMarkers.length;ii++){
		if(addMyMarkers[ii].mapName = mapName){
			places[i] = addMyMarkers[ii];
			i++;
		}
	}
	return places
}

function setMyMap ( mapName ){
	if (GBrowserIsCompatible()) {
		//地図基本設置
		kml2Maps[mapName] = new GMap2(document.getElementById(mapName));
		if(mapConf[mapName].controlFlg == 1) {
			if(mapConf[mapName].controlType == 1) {
				kml2Maps[mapName].addControl(new GLargeMapControl());//コントロールボタン設置
			}else if(mapConf[mapName].controlType == 0){
				kml2Maps[mapName].addControl(new GSmallMapControl());// 小さいコントロール設置
			}
		}

		if(mapConf[mapName].typeChangeFlg == 1) kml2Maps[mapName].addControl(new GMapTypeControl());// 地図衛生切り替えボタン設置
		if(mapConf[mapName].overviewFlg == 1) kml2Maps[mapName].addControl(new GOverviewMapControl());
		kml2Maps[mapName].setCenter(new GLatLng(defLat, defLng), defZoom);// デフォルト値設定
		if(mapConf[mapName].mapType == 1) { 
			kml2Maps[mapName].setMapType(G_SATELLITE_MAP);
		}else if( mapConf[mapName].mapType == 2 ){ 
			kml2Maps[mapName].setMapType(G_HYBRID_MAP);
		}
		var centerLatLng = document.getElementById(mapName +"_centerLatLng");
		if(centerLatLng != null){
			//センターの緯度経度表示
			GEvent.addListener(kml2Maps[mapName], 'move',
				function() {
					var xy = kml2Maps[mapName].getCenter();
					var strLatLng = strLatLngFormat;
					strLatLng = strLatLng.replace( "%lat%" , xy.lat() );
					strLatLng = strLatLng.replace( "%lng%" , xy.lng() );
					var viewID = mapName + "_centerLatLng";
					document.getElementById(viewID).innerHTML = strLatLng ;
			});
		}
	}
}

function setMyMarker( mapName ,markID ,setLat, setLng, strInfo ,iconObj){
	//マーカー設置関数
	mPoint[markID] = new GLatLng( setLat, setLng );
	if(iconObj == ""){
		markerObj[markID] = new GMarker(mPoint[markID]);
	}else{
		markerObj[markID] = new GMarker(mPoint[markID],iconObj);
	}
	kml2Maps[mapName].addOverlay(markerObj[markID]);
	GEvent.addListener(markerObj[markID], 'click', function() {
		   markerObj[markID].openInfoWindowHtml(strInfo);
	});
	markerObj[markID].infoHtml = strInfo;
}

function markerWindowOpen(markID){
	strInfo = markerObj[markID].infoHtml;
	markerObj[markID].openInfoWindowHtml(strInfo);
}

function setkml2gmap( mapName, fname){
//sss
	if( mapConf[mapName] == null){ 
		// Config SET
		var confObj = new Object();
		confObj.defLat = defLat;
		confObj.defLng = defLng;
		confObj.defZoom = defZoom;
		confObj.controlFlg = controlFlg;
		confObj.controlType = controlType;
		confObj.typeChangeFlg = typeChangeFlg;
		confObj.overviewFlg = overviewFlg;
		confObj.strLatLngFormat = strLatLngFormat;
		confObj.strListFormat = strListFormat;
		confObj.strInfoFormat = strInfoFormat;
		confObj.mapType = mapType ;
		confObj.autoZoomFlg = autoZoomFlg;
		confObj.defIconSize = defIconSize;
		confObj.customIcon = customIcon;
		mapConf[mapName] = confObj;
	}

	if(viewLogo == 0) {
		setAddDiv();
		viewLogo = 1;
		setTimeout("hideLogo()",10000);
	}
	viewDesp("kml2gmap_NowLoading",1);
	//マップ初期化
	setMyMap(mapName);
	GDownloadUrl(fname, function(data, responseCode) {
		var xml = GXml.parse(data);
		//kml情報のセット
		var kmlTitle = document.getElementById(mapName + "_kmlTitle");
		if(kmlTitle != null ){
			var myNames = xml.documentElement.getElementsByTagName("name");
			var myName = myNames[0].firstChild.nodeValue.replace(".kml","");
			document.getElementById(mapName + "_kmlTitle").innerHTML = myName;
		}
		var kmlDescription = document.getElementById(mapName + "_kmlDescription");
		if(kmlDescription != null ){
			var myDesc = xml.documentElement.getElementsByTagName("description");
			if(myDesc.item(0).parentNode.nodeName == "Folder"){
				document.getElementById(mapName + "_kmlDescription").innerHTML = myDesc[0].firstChild.nodeValue;
			}
		}
		//list表示idがあればlistを表示
		var kmlList = document.getElementById(mapName + "_List");
		if(kmlList != null ){
			var viewListFlg = 1;
			var listStr = "<div id=\""+mapName+"_marker_title\"></div>";
		}
		var places = getPlacemark(xml,mapName);
		for (var i=0;i< places.length;i++){
			if(i==0){
				var maxlat = places[i].lat;
				var minlat = places[i].lat;
				var maxlng = places[i].lng;
				var minlng = places[i].lng;
			}else{
				if(places[i].lat > maxlat) maxlat = places[i].lat;
				if(places[i].lat < minlat) minlat = places[i].lat;
				if(places[i].lng > maxlng) maxlng = places[i].lng;
				if(places[i].lng < minlng) minlng = places[i].lng;
			}
			var mySubject = places[i].name;
			var myDescription = places[i].description;
			var myStr = strInfoFormat.replace("%subject%",mySubject);
			myStr = myStr.replace("%description%",myDescription);
			if(mapConf[mapName].customIcon == 1){
				if(places[i].iconUrl != null){
					var myIcon = newIcon(places[i].iconUrl,mapName); 
				}else{
					var myIcon = "";
				}
			}else{
				var myIcon = "";
			}
			pointId = mapName+"_"+i;
			setMyMarker( mapName, pointId, places[i].lat, places[i].lng, myStr, myIcon);
			if(kmlList != null ){
				var myListStr = strListFormat;
				var linkSubject = "<a href=\"JavaScript:;\" onclick=\" markerWindowOpen('"+pointId+"');\">" + mySubject + "</a>";
				myListStr = myListStr.replace("%subject%", linkSubject);
				myListStr = myListStr.replace("%description%", myDescription);
				listStr += "\n"+myListStr;
			}
	
		}
		if(kmlList != null ){
			document.getElementById(mapName+"_List").innerHTML = listStr;
		}
		centerLat = (maxlat+minlat)/2;
		centerLng = (maxlng+minlng)/2;
		if(mapConf[mapName].autoZoomFlg == 1){
			var rectObj = new GLatLngBounds(new GLatLng(minlng,minlat), new GLatLng(maxlng,maxlat));
			var newZoom = kml2Maps[mapName].getBoundsZoomLevel(rectObj);
//			newZoom --;//-1しないとはみ出す可能性がある
		}else{
			var newZoom = mapConf[mapName].defZoom;
		}
		kml2Maps[mapName].setCenter(new GLatLng(centerLat,centerLng),newZoom);

	});
	if (kml2Maps[mapName].isLoaded() ) setTimeout("hideLoading()",1500);
}

function hideLoading(){
	viewDesp("kml2gmap_NowLoading",0);
}

function hideLogo(){
	viewDesp("kml2gmap_Logo",0);
}

function addMyMarker(mapName, setLat, setLng, strSubject, strDescription, iconUrl){
	myMarker = new Object();
	myMarker.mapName = mapName;
	myMarker.lat = setLat;
	myMarker.lng = setLng;
	myMarker.name = strSubject;
	myMarker.description = strDescription;
	myMarker.iconurl = iconUrl;
	addMyMarkers[addMyMarker_ID] = myMarker ;
	addMyMarker_ID ++;
}

window.onload = function () {
	if (GBrowserIsCompatible()) {
		while (onloadfunc.length > 0) {
			onloadfunc.shift()();
		}
	}
}

window.onunload = function () {
	GUnload();
}

function setAddDiv(){
	var addStr = "<div id=\"kml2gmap_Logo\" style=\"background-color: #ffffff; text-align: center; width: 150px; position: fixed; right: 20px; bottom: 20px; z-index: 100; font-size: 9px; padding: 5px;filter: alpha(opacity=70); -moz-opacity:0.7; opacity:0.7; \"><a href=\"http://taketan.mydns.jp/?KML2GMAP\" target=\"_blank\"><img style=\"border:0;\" src=\"http://taketan.mydns.jp/kml2gmap_img.php?v=" + escape(scriptVersion) + "\" /></a><br />Copyright&copy 2006 <a href=\"http://taketan.mydns.jp/\" target=\"_blank\">Taketan</a> Allright Reserved.</div>\n";
	addStr += "<div id=\"kml2gmap_NowLoading\" style=\" width: 100%; padding: 6px; position: fixed; left: 0px; top: 0px; z-index: 99; font-size: 18px; color: orange; background-color: #555555;filter: alpha(opacity=50); -moz-opacity:0.5; opacity:0.5;\">Now Loading.............. Just wait................</div>";
	document.getElementsByTagName("body").item(0).innerHTML = document.getElementsByTagName("body").item(0).innerHTML + addStr;
}

function viewDesp(id,type){
	var obj = document.getElementById( id );
	if( !obj ){ return false; }
	if( !clientUa.Opera ){ 
		obj.style.display = ( type ? "block"   : "none"   ); 
	} else { 
		obj.style.visibility = ( type ? "visible" : "hidden" ); 
	}
	return true;
}

function getUa(){
	var clientUa = new Object();
	var ua = navigator.userAgent;
	if( ua.match( /Opera[\/\s]([0-9]\.[0-9]+)/ )){
	 	clientUa.Opera	= parseFloat( RegExp.$1 ); 
	} else { 
		clientUa.Opera	= 0; 
	}
	if( ua.match( /MSIE ([0-9]\.[0-9]+)/ ) && !clientUa.Opera ){ 
		clientUa.MSIE		= parseFloat( RegExp.$1 ); 
	} else { 
		clientUa.MSIE		= 0; 
	}
	if( ua.match( /Firefox[\/\s]([0-9]\.[0-9]+)/ )){ 
		clientUa.Firefox = parseFloat( RegExp.$1 ); 
	} else { 
		clientUa.Firefox	= 0; 
	}
	if( ua.match( /Netscape[0-9]?[\/\s]([0-9]\.[0-9]+)/ )){ 
		clientUa.Netscape = parseFloat( RegExp.$1 ); 
	} else { 
		clientUa.Netscape	= 0; 
	}
	if( ua.match( /Safari/ )){
		clientUa.Safari	= 1;
	} else { 
		clientUa.Safari	= 0; 
	}
	clientUa.Gecko = ( ua.match( /Netscape|Firefox/ ) ? true : false );

	return clientUa;
}

function afterSetMarker( mapName, PointId, Lat, Lng, strInfo, iconurl){
	if (iconurl != ""){
		var icon = newIcon( iconurl, mapName);
	}else{
		var icon = "";
	}
	setMyMarker( mapName , PointId, Lat, Lng, strInfo ,icon);
}
