var mf;
if( !mf ) mf = {};

/***************************
* 地図日記操作モジュール
* 
* @author		Yoshizaki Taiko
* @copyright	Copyright(c) 2009 Yoshizaki Taiko
* @version		0.0.1, Rev.2009-02-06
****************************/
/*****************************************************************************
* コンストラクタ
* 書式：  mf.MapLog( string tag_id );
*
* @param    tag_id		地図を作るタグのID名
*****************************************************************************/
mf.MapLog = function(tag_id) {
	if( !document.getElementById(tag_id) ){
		//有効なIDで無い時は終了
		return;
	}
	mf.MapLog.map_tag_id = tag_id;
	
	//データ無しのXMLファイル
	var str_url = "mfm_none.xml";
	//URLのクエリからユーザIDと日付を取得
	var user_id = mf.MapLog._getQueryUserID();
	if( user_id>0 ){
		mf.MapLog.user_id = user_id;
	}
	if( user_id>0 ){
		mf.MapLog.str_date = mf.MapLog._getQueryDate();
		if( mf.MapLog.str_date=="" ){
			mf.MapLog.str_date = mf.getNowStr("Ymd");
		}
		str_url = "mfm_"+mf.MapLog.user_id+"_"+mf.MapLog.str_date+".xml";
	}

	//マーカー情報のXMLデータを取得
	mf.Http.loadXML(str_url, mf.MapLog._getResponse);
}

mf.MapLog._getResponse = function(responseXML) {
	if( !responseXML ) return;
//			alert(request.responseXML.documentElement.tagName);
	//レスポンスのコンテントタイプ
//			switch(request.getResponseHeader("Content-Type")){
//			case "text/xml":
		mf.MapLog.map = new mf.XmlMap(responseXML);
//				break;
//			default:
//				alert(request.responseText);
//				break;
//			}
}

mf.MapLog._getQueryUserID = function() {
	var ary_q = document.URL.split("?");
	if( ary_q.length>1 ){
		ary_q = ary_q[ary_q.length-1].split("&");
		for(var i=0; i<ary_q.length; i++){
			var ary_e = ary_q[i].split("=");
			if( ary_e.length==2 && ary_e[0]=="id" ){
				return ary_e[1];
			}
		}
	}
	return 0;
}

mf.MapLog._getQueryDate = function() {
	var ary_q = document.URL.split("?");
	if( ary_q.length>1 ){
		ary_q = ary_q[ary_q.length-1].split("&");
		for(var i=0; i<ary_q.length; i++){
			var ary_e = ary_q[i].split("=");
			if( ary_e.length==2 && ary_e[0]=="dt" ){
				return ary_e[1];
			}
		}
	}
	return "";
}

mf.MapLog.getDateObj = function() {
	if( mf.MapLog.str_date!="" ){
		return new Date(parseInt(mf.MapLog.str_date.substr(0,4),10),
						parseInt(mf.MapLog.str_date.substr(4,2),10)-1,
						parseInt(mf.MapLog.str_date.substr(6,2),10));
	} else {
		return new Date();
	}
}

mf.MapLog.getUserID = function() {
	return mf.MapLog.user_id;
}

mf.MapLog.user_id = 0;
mf.MapLog.str_date = "";
mf.MapLog.map_tag_id = "";
mf.MapLog.map = null;

/***************************
* マップデータXML解析クラス
****************************/
/*****************************************************************************
* コンストラクタ
* 書式：  mf.XmlMap( object responseXML );
*
* @param    responseXML		XMLをパースしたDOM Documentオブジェクト
*****************************************************************************/
mf.XmlMap = function(responseXML) {
	//プロパティ
	this.map = {};	//地図
	this.icon = new Array();	//アイコン情報

//			var xml_datas = responseXML.documentElement.childNodes;
//			注）documentElementを使うとFireFoxでgetAttribute()が使えない
	var xml_datas = responseXML.getElementsByTagName("map_datas");

	//地図とドキュメント情報
	var xml_data = xml_datas[0].getElementsByTagName("map");
	//ドキュメント情報
	this.set_doc(xml_data[0]);
	//地図情報
	this.set_map(xml_data[0]);
	//マーカー生成設定
//	this.set_reg("reg");

	//アイコン情報
	xml_data = xml_datas[0].getElementsByTagName("icons");
	if( xml_data.length>0 ){
		this.ini_icon(xml_data[0].getElementsByTagName("icon"));
	}

	//位置情報
	xml_data = xml_datas[0].getElementsByTagName("markers");
	if( xml_data.length>0 ){
		this.set_marker(xml_data[0].getElementsByTagName("lines"));
	}
}

//地図オブジェクトを返す
mf.XmlMap.prototype.getMap = function() {
	return this.map;
}

//アイコン情報オブジェクトを返す
mf.XmlMap.prototype.getIcon = function(i) {
	return this.icon[i];
}

//Google Mapを作成する
mf.XmlMap.prototype.set_map = function(element) {
//			alert("set_map:");
	var obj_opt = {};
	if( element.getAttribute("width")!="" && element.getAttribute("height")!="" ){
		//地図のサイズ指定があればセット
		obj_opt = {size:new GSize(parseInt(element.getAttribute("width"),10),parseInt(element.getAttribute("height"),10))};
	}
	//マップタイプのグループ指定がある時は設定する
	if( element.getAttribute("mapgroup") ){
		var mapGroup = null;
		switch( element.getAttribute("mapgroup") ){
		case "default": //基本地図
			mapGroup = G_DEFAULT_MAP_TYPES;
			break;
		case "moon": //月
			mapGroup = G_MOON_MAP_TYPES;
			break;
		case "mars": //火星
			mapGroup = G_MARS_MAP_TYPES;
			break;
		case "sky": //星空
			mapGroup = G_SKY_MAP_TYPES;
			break;
		}
		if( mapGroup!=null ){
			obj_opt.mapTypes = mapGroup;
		}
	}
	//マップ作成
	this.map = new GMap2(document.getElementById(mf.MapLog.map_tag_id),obj_opt);
	this.map.setCenter(new GLatLng(element.getAttribute("lat"), element.getAttribute("lng")), parseInt(element.getAttribute("zoom"),10));
	//マップタイプの指定がある時は設定する
	if( element.getAttribute("maptype") ){
		var mapType = null;
		switch( element.getAttribute("maptype") ){
		case "normal": //地図
			mapType = G_NORMAL_MAP;
			break;
		case "satellite": //航空写真
			mapType = G_SATELLITE_MAP;
			break;
		case "hybrid": //地図＋航空写真
			mapType = G_HYBRID_MAP;
			break;
		case "physical": //地形的特徴を持つ地図
			mapType = G_PHYSICAL_MAP;
			break;
		}
		if( mapType!=null && mapType!=this.map.getCurrentMapType() ){
			var ary_mapTypes = this.map.getMapTypes();
			for(var i=0; i<ary_mapTypes.length; i++){
				if( mapType==ary_mapTypes[i] ){
					break;
				}
			}
			if( i>=ary_mapTypes.length ){
				this.map.addMapType(mapType);
			}
			this.map.setMapType(mapType);
		}
	}
	this.map.addControl(new GLargeMapControl());
	this.map.addControl(new GMapTypeControl());

}

//document情報の変更
mf.XmlMap.prototype.set_doc = function(element) {
	//地図のサイズ
	var node = document.getElementById(mf.MapLog.map_tag_id);
	if( element.getAttribute("width")!="" ){
		//ページの幅が地図より小さいなら地図に合わせる
		var obj_css = new mf.Css("base.css");
		var obj_style = obj_css.getStyles("div#base");
		if( parseInt(obj_style.width)<parseInt(element.getAttribute("width")) ){
			obj_style.width = element.getAttribute("width");
//			document.getElementById("base").style.width = element.getAttribute("width");
		}
//		//地図の幅
//		node.style.width = element.getAttribute("width");
	}
//	if( element.getAttribute("height")!="" ){
//		//地図の高さ
//		node.style.height = element.getAttribute("height");
//	}
//	alert(list_nodes(element));
	//注）ヘッダーの<title>タグを変更できなかった。無理なのか？
	//テキストの追加又は変更
	document.getElementById("title").innerHTML = element.getAttribute("name");
	mf.XmlMap.addText(document.getElementById("note_bottom"),"note1",mf.Http._getTextNodeData(element));

}

//アイコンオブジェクトを作成する
mf.XmlMap.prototype.ini_icon = function(element) {

	for(var i=0; i<element.length; i++){

		var id = element[i].getAttribute("id");
		var image = element[i].getElementsByTagName("image");
		image = image[0];
		var shadow = element[i].getElementsByTagName("shadow");
		shadow = shadow[0];
		
//			alert(id+" "+image.getAttribute("width")+" "+image.getAttribute("height")+" "+image.getAttribute("anchor_x")+" "+image.getAttribute("anchor_y")+" "+mf_HTTP._getTextNodeData(image)+"\n"+shadow.getAttribute("width")+" "+shadow.getAttribute("height")+" "+shadow.getAttribute("anchor_x")+" "+shadow.getAttribute("anchor_y")+" "+mf_HTTP._getTextNodeData(shadow));
		this.icon[id] = new GIcon();
		this.icon[id].image = mf.Http._getTextNodeData(image);
		this.icon[id].shadow = mf.Http._getTextNodeData(shadow);
		this.icon[id].iconSize = new GSize(parseInt(image.getAttribute("width")), parseInt(image.getAttribute("height")));
		this.icon[id].shadowSize = new GSize(parseInt(shadow.getAttribute("width")), parseInt(shadow.getAttribute("height")));
		this.icon[id].iconAnchor = new GPoint(parseInt(image.getAttribute("anchor_x")), parseInt(image.getAttribute("anchor_y")));
		this.icon[id].infoWindowAnchor = new GPoint(parseInt(image.getAttribute("win_anchor_x")), parseInt(image.getAttribute("win_anchor_y")));
//		this.icon[id].infoShadowAnchor = new GPoint(parseInt(shadow.getAttribute("anchor_x")), parseInt(shadow.getAttribute("anchor_y")));
	}
}

//地図にマーカーとポリラインを描く
mf.XmlMap.prototype.set_marker = function(element) {
//			alert("set_marker:"+obj_cntr.zoom);

	//マーカーとポリラインを描く
	for(var i=0; i<element.length; i++){
		var ary_ll = new Array();
		var xml_point = element[i].getElementsByTagName("point");
		for(var j=0; j<xml_point.length; j++){
			ary_ll[j] = new GLatLng(xml_point[j].getAttribute("lat"), xml_point[j].getAttribute("lng"));
			if( xml_point[j].getAttribute("icon")!="" ){
				//アイコンの指定があればマーカーを描く
				this.map.addOverlay(this.newMarker(xml_point[j]));
	
				//地図に登録したマーカーの表示順の最小値を記憶
				var obj_c = this.map.getPane(G_MAP_MARKER_PANE).childNodes;
				if( obj_c.length>0 ){
					if( obj_c[obj_c.length-1].style.zIndex ){
						var zIndex = parseInt(obj_c[obj_c.length-1].style.zIndex,10);
						if( mf.XmlMap.zIndexMin > zIndex ){
							mf.XmlMap.zIndexMin = zIndex;
						}
					}
				}

			}
		}
		//有効なポリラインの線の幅と色があれば描く
		if( element[i].getAttribute("polyline_width")>0 && element[i].getAttribute("polyline_color")!="" ){
//			alert("ary_ll "+ary_ll.length+" "+ary_data[i].polyline_color+" "+ary_data[i].polyline_width);
			var polyline = new GPolyline(ary_ll, element[i].getAttribute("polyline_color"),
										 parseInt(element[i].getAttribute("polyline_width")), 0.5, {clickable:false});
			this.map.addOverlay(polyline);
		}
	}
}

// Creates a marker whose info window displays the letter corresponding
// to the given index.
mf.XmlMap.prototype.newMarker = function(element) {
	// Set up our GMarkerOptions object

	//テキスト情報
	var str_text = mf.Http._getTextNodeData(element);
	if( str_text!="" ){
		var str_as = "";
		var str_ae = "";
		if( element.getAttribute("url")!="" ){
			str_as = "<a href=\""+element.getAttribute("url")+"\">";
			str_ae = "</a>";
		}
		str_text = str_as + "<b>" + element.getAttribute("name") + "</b>"+str_ae+"<br/>"+str_text;
	}
	var markerOptions = { icon:this.icon[element.getAttribute("icon")], title:element.getAttribute("name") };
	
	return mf.XmlMap.createMarker(this.map, new GLatLng(element.getAttribute("lat"), element.getAttribute("lng"))
								, markerOptions, str_text);
}

mf.XmlMap.createMarker = function(obj_map, obj_latlng, obj_markerOptions, str_infoWinHtml) {
	// Set up our GMarkerOptions object
	var seen_marker = new GMarker(obj_latlng, obj_markerOptions);

	//マーカーにテキスト情報を保存
	seen_marker.mf_infoWinHtml = str_infoWinHtml;

	//クリックイベントを登録
	GEvent.addListener(seen_marker, "click", function() {
//					alert("click:"+str_text);
		//マウスダウンからアップまでの時間
		var int_min = (new Date().getTime()) - (mf.XmlMap.mouseDownTime.getTime());
		if( int_min > 2000 ){
			//マウスダウンからアップまで2秒以上なら表示順を最下層に（マーカーの再作成）
			mf.XmlMap.mouseDownTime = new Date();

			GEvent.clearInstanceListeners(seen_marker);

			var markerOptions = { icon:seen_marker.getIcon(), title:seen_marker.getTitle()
								, zIndexProcess:mf.XmlMap.zIndexProcess};
			var new_marker = mf.XmlMap.createMarker(obj_map, seen_marker.getLatLng(), markerOptions, seen_marker.mf_infoWinHtml);
			//現在の表示順最小値を保存
			new_marker.mf_zIndex = (--mf.XmlMap.zIndexMin);

			obj_map.removeOverlay(seen_marker);
			obj_map.addOverlay(new_marker);
		} else if( str_infoWinHtml!="" ){
			//マーカーにテキスト情報がある時は
			//クリックされたら情報ウインドウにマーカー名、URL、テキストを表示
			seen_marker.openInfoWindowHtml(seen_marker.mf_infoWinHtml);
		}

	});
	//マウスダウンの時間を記録
	GEvent.addListener(seen_marker, "mousedown", function(e) {
//		alert("mousedown:"+mf.XmlMap.zIndexMin);
		
		mf.XmlMap.mouseDownTime = new Date();
	});

	return seen_marker;
}
//表示順最小値
mf.XmlMap.mouseDownTime = 0;

//表示順最小値
mf.XmlMap.zIndexMin = 0;

mf.XmlMap.zIndexProcess = function(marker) {
	return marker.mf_zIndex;
}

mf.XmlMap.prototype.set_reg = function(mode) {
//			alert("set_reg:"+obj_cntr.zoom);
	var reg = mode || "";
	if( reg=="reg" )
	{
		//イベントリスナー内で使う為、this.mapのクロージャを作っておく
		var c_map = this.map;

		var map_click_handle = GEvent.addListener(this.map, "click", function(overlay,point) {
//			alert("地図がクリックされました。"+overlay);
			if( !overlay ){
				//オーバーレイ(=マーカー)がクリックされたのでなければ、地図上のその位置にマーカーを作成
				var str_title = "ll"+document.getElementById("latlng").childNodes.length;
				var marker = new GMarker(point, {draggable: true, title:str_title});

				GEvent.addListener(marker, "dragend", function() {
					var obj_ll = marker.getLatLng();
					mf.XmlMap.addText(document.getElementById("latlng"),marker.getTitle(),"lat:\""+obj_ll.lat()+"\",lng:\""+obj_ll.lng()+"\"");
				});
				c_map.addOverlay(marker);
				if( marker.isHidden() ){
					marker.show();
				}
				mf.XmlMap.addText(document.getElementById("latlng"),str_title,"lat:\""+point.lat()+"\",lng:\""+point.lng()+"\"");
			}
		});
	}
}

// /* プレーンテキストをHTMLに変換 */
// mf.XmlMap.ht_str = function( str )
// {
//    if( str == null ) return '';
//    str = str.toString();
//    str = str.replace( /&/g,'&amp;' );
//    str = str.replace( /</g,'&lt;' );
//    str = str.replace( />/g,'&gt;' );
//    str = str.replace( / /g,'&nbsp;' );
//    str = str.replace( /\t/g,'&nbsp;&nbsp;&nbsp;&nbsp;' ); // 好みのスペース幅を..
//   str = str.replace( /\r?\n/g, "<br />\n");
//    return str;
// }

mf.XmlMap.addText = function(node,str_id,str_data) {
	var emt = document.getElementById(str_id);
	if( !emt ){
		//まだ指定IDのdivが無いなら作る
		emt = document.createElement("div");
		emt.id = str_id;
		emt.innerHTML = str_data;
		node.appendChild(emt);
		//alert(mf.list_nodes(node));
	} else {
		//divがある時はテキストの入れ替え
		//alert("addText id:"+str_id);
		emt.innerHTML = str_data;
	}
	return emt;
}

