var map = null;
var uname = "";
var geocoder = null;
var lastPosition = null;
var gmarkers = [];
var mapHtmls = [];
var markerUrls = [];
var editHtmls = [];
var index_url = "";
var isEditMode = false;
var isLoading = false;
var last_rr_name = "";
var last_line_name = "";
var last_r_type = 5;
var last_pref_cd = 0;
var prefs=  new Array("設定なし","北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県","栃木県","群馬県","埼玉県","千葉県"
		,"東京都","神奈川県","新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県","三重県"
		,"滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県","徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県");
var r_names = new Array("鉄道","鉄道","鉄道","鉄道","鉄道","路線バス","高速バス","フェリー","飛行機","その他");
var small_icon = new GIcon();
small_icon.image = "http://labs.google.com/ridefinder/images/mm_20_yellow.png";
small_icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
small_icon.iconSize = new GSize(12, 20);
small_icon.shadowSize = new GSize(22, 20);
small_icon.iconAnchor = new GPoint(6, 20);
small_icon.infoWindowAnchor = new GPoint(5, 1);


function createMarker (lat, lon, st_name, line_name , html, isSmall,url,idx) {
	var marker = null;
	if(isSmall==true){
		marker = new GMarker(new GLatLng(lat,lon),small_icon);//,{title:st_name+"\n"+line_name});
	}else{
		marker = new GMarker(new GLatLng(lat,lon),{title:st_name+"\n"+line_name});
	}

	GEvent.addListener(marker, "click", function(){
		fetchStationMarkerHtml(url,marker,idx);
		//marker.openInfoWindowHtml(html);
		lastPosition = marker.getLatLng();
		//document.form_re.spot_longitude.readOnly=true;
	});
	gmarkers.push(marker);
	mapHtmls.push(html);
	map.addOverlay(marker);
}

/**
 * 編集画面に切り替える
 */
function switchEditMode(num){
	gmarkers[num].openInfoWindowHtml(editHtmls[num]);
}

function showEditPosDialog(num,stgcd){
    var winWidth = "450px";
    var winHeight = "500px";
    var options = "dialogWidth=" + winWidth + ";dialogHeight="
    + winHeight + ";center=1;status=1;scroll=1;resizable=1;minimize=0;maximize=0;";

    // ボタンをグレーアウトする
    var url = index_url+"/site-data/editpos.html";
    var argAry = new Array();
    argAry[0] = window;
    argAry[1] = gmarkers[num].getLatLng();
    var newpos = showModalDialog(url, argAry, options);
    // 戻り値をアラート
    if(newpos==null) return;

    lastPosition=newpos;
	var url = index_url+"edit-station";
	var callback = myCallBack;
	var params = [];
	params['method'] = 'move_stg';
	params['lon'] = ""+newpos.lng();
	params['lat'] = ""+newpos.lat();
	params['station_g_cd'] = stgcd;
	GDownloadUrl(url, callback, buildSendParams(params));
	return false;
}

/**
 * 駅追加用のウィンドウを表示する
 */
function createAddMarker(latlng){
	var marker = new GMarker(latlng,{title:"編集中"});

	var onsubmit = "sendNewStationInfo(this,"+latlng.lat()+","+latlng.lng()+");";
	var html = editForm(onsubmit, last_r_type, "", "", last_pref_cd);

	GEvent.addListener(marker, "infowindowclose", function(){
		marker.hide();
		//map.removeOverlay(marker);
		//document.form_re.spot_longitude.readOnly=true;
	});
	map.addOverlay(marker);
	marker.openInfoWindowHtml(html);
}

/**
 * 新規駅作成リクエストの送信
 */
function sendNewStationInfo(FORM,lat,lng){
	var url = index_url+"/edit-station";
	var callback = myCallBack;
	var params = [];

	try{
		params['method'] = "create_stg";
		params['station_type'] = FORM.station_type.value;
		params['station_g_name'] = ""+FORM.station_g_name.value;
		params['station_g_ruby'] = ""+FORM.station_g_ruby.value;
		params['pref_cd'] = FORM.pref_cd.value;
		last_pref_cd = FORM.pref_cd.value;

	}catch(e){
		alert("POSTリクエストに失敗しました");
	}

	params['lon'] = lng;
	params['lat'] = lat;
	if(params['station_g_name']=='' || params['station_g_ruby']==''){
		alert("情報を全て入力してください");
		return false;
	}
	lastPosition = new GLatLng(lat,lng);
	GDownloadUrl(url, callback, buildSendParams(params));
	return false;
}

/**
 * 駅編集リクエストの送信
 * @param FROM
 * @param st_cd
 * @return
 */
function sendModifiedStationInfo(FORM,station_g_cd){
	var url = index_url+"edit-station";
	var callback = myCallBack;
	var params = [];
	params['method'] = 'edit_stg';
	params['station_type'] = FORM.station_type.value;
	//params['rr_name'] = FORM.rr_name.value;
	//params['line_name'] = FORM.line_name.value;
	params['pref_cd'] = FORM.pref_cd.value;
	params['station_g_name'] = ""+FORM.station_g_name.value;
	params['station_g_ruby'] = ""+FORM.station_g_ruby.value;
	params['station_g_cd'] = station_g_cd;
	if(params['station_g_name']=='' || params['station_g_ruby']==''){
		alert("情報を全て入力してください");
		return false;
	}
	GDownloadUrl(url, callback, buildSendParams(params));
	return false;
}


/**
 * 駅削除リクエストの送信
 */
function sendDeleteStationRequest(station_g_cd){

	if(window.confirm('駅を削除すると、それに関連付けられている時刻表やWiFi情報も削除されます。本当に削除しますか？')){
		var url = index_url+"edit-station";
		var callback = myCallBack;
		var params=[];
		params['method'] = 'delete_stg';
		params['station_g_cd'] = station_g_cd;
		GDownloadUrl(url, callback, buildSendParams(params));
	}else{
		return false;
	}
}

/**
 * 路線カラー編集リクエストの送信
 */
function sendSetColorRequest(line_cd,prev_color){
	var ans = prompt('路線カラーをHTMLカラー表記で入力してください\n(例:#FF00FF)',prev_color);
	if (ans == "" || ans == null){
	}else {
		var url = index_url+"edit-station";
		var callback = myCallBack;
		var params=[];
		params['method'] = 'color';
		params['line_cd'] = line_cd;
		params['color'] = ans;
		GDownloadUrl(url, callback, buildSendParams(params));
	}
}


function buildSendParams(params) {
	var sParam = "";
	if (params != null) {
		var arr = [];
		for (var key in params)  arr.push(key + "=" + encodeURIComponent(params[key]));
		sParam = arr.join("&");
	}
	return sParam;
}

function myCallBack(returnValue, returnCode) {
	if(returnCode==202){ //作成完了
		var pos = map.getCenter();
		if(lastPosition != null){
			pos = lastPosition;
		}
		showStations(pos);
	} else if(returnCode == -1) {
		alert("タイムアウトしました。再試行してください");
	} else {
		alert(returnValue);
	}
}

function showAddress(address) {
	geocoder.getLatLng(
			address,
			function(point) {
				if (!point) {
					alert(address + " not found");
				}
				else {
					map.setCenter(point, 13);
				}
			}
	);
}


function getPrefecture(latlng, response_action) {
	var pref_name="";
	geocoder.getLocations(latlng, function(response){
		var place = response.Placemark[0];
		try{
			pref_name = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
		}catch(exception){
			alert("住所が特定できません");
			return;
		}
		alert(pref_name);
	});
}

/** 十字線を描画する */
function drawCross(){
	var cross_px = 30;
	var cross_td = 3;
	var cross_cr = "red";

	//十字の縦線のエレメントを設定
	var cross_h_emt =  document.createElement("div");
	//IE用にfontSizeを最小値
	cross_h_emt.style.fontSize = "1px";
	cross_h_emt.style.margin = "0px";
	cross_h_emt.style.padding = "0px";
	cross_h_emt.style.width = cross_px + "px";
	cross_h_emt.style.height = cross_td + "px";
	cross_h_emt.style.backgroundColor = cross_cr;

	//十字の横線のエレメントを設定
	var cross_v_emt =  document.createElement("div");
	cross_v_emt.style.margin = "0px";
	cross_v_emt.style.padding = "0px";
	cross_v_emt.style.width = cross_td+"px";
	cross_v_emt.style.height = cross_px + "px";
	cross_v_emt.style.backgroundColor = cross_cr;

	//十字（縦・横線）の位置を計算
	var MapPX = map.getSize();
	var mycenterHX = MapPX.width  / 2 - cross_px / 2;
	var mycenterHY = MapPX.height / 2 - cross_td / 2;
	var mycenterVX = MapPX.width  / 2 - cross_td / 2;
	var mycenterVY = MapPX.height / 2 - cross_px / 2;

	var mycenter_H = new GSize(mycenterHX,mycenterHY);
	var myposH = new GControlPosition(G_ANCHOR_TOP_LEFT, mycenter_H);
	myposH.apply(cross_h_emt);
	map.getContainer().appendChild(cross_h_emt);

	var mycenter_V = new GSize(mycenterVX,mycenterVY);
	var myposV = new GControlPosition(G_ANCHOR_TOP_LEFT, mycenter_V);
	myposV.apply(cross_v_emt);
	map.getContainer().appendChild(cross_v_emt);

}

/** 円を描画する */
function pseudoGCircle(point, radius, color, weight, opacity) {
	var vertex = 360;
	var TMP = 1 - 0.00669437999014132 * Math.pow(Math.sin(point.latRadians()), 2);
	var arc_lat = 110574.2758215944444 / Math.pow(TMP, 3/2);
	var arc_lng = (111319.490793273333 * Math.cos(point.latRadians())) / Math.pow(TMP, 1/2);
	var R = radius * 1000;
	var points = new Array(vertex);
	for (i = 0; i <= vertex; i++) {
		var rad = (i / (vertex / 2)) * Math.PI;
		var lat = (R / arc_lat) * Math.sin(rad) + point.lat();
		var lng = (R / arc_lng) * Math.cos(rad) + point.lng();
		points[i] = new google.maps.LatLng(lat, lng);
	}
	return new google.maps.Polygon(points,"#0000FF",2,0.4,"0000FF",0.1, {clickable:false});//google.maps.Polyline(points, color, weight, opacity);
}

function markerClicked(markerNum){
	fetchStationMarkerHtml(markerUrls[markerNum],gmarkers[markerNum],markerNum);
	//gmarkers[markerNum].openInfoWindowHtml(mapHtmls[markerNum]);
	lastPosition = gmarkers[markerNum].getLatLng();
	//getPrefecture(gmarkers[markerNum].getLatLng(),null);
}

function lineClicked(line_cd){
	//eki.locky APIを呼び出して駅を検索
	map.clearOverlays();
	var url=index_url+"webapi/geotbl?line_cd="+line_cd;
	fetchStations(url,true,false,false);
}

function fetchStationMarkerHtml(url,marker,idx){
	GDownloadUrl(url, function(data, responseCode) {
		if(responseCode == 200) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("Row");
			for (var i = 0; i < 1; i++) {
				var station_type = parseInt(markers[i].getAttribute("station_type"));
				var station_g_cd = parseInt(markers[i].getAttribute("station_g_cd"));
				var pref_cd = parseInt(markers[i].getAttribute("pref_cd"));
				var lat = parseFloat(markers[i].getAttribute("lat"));
				var lng = parseFloat(markers[i].getAttribute("lon"));
				var pref_name = prefs[pref_cd];
				if(pref_cd==0)pref_name="都道府県設定なし";
				var st_g_name = markers[i].getAttribute("station_g_name");
				var st_g_ruby = markers[i].getAttribute("station_g_ruby");
				var lines = markers[i].getElementsByTagName("Line");

				var html_marker = "";

				for(var p=0;p<lines.length;p++){
					var line_name = lines[p].getAttribute("line_name");
					var line_cd = lines[p].getAttribute("line_cd");
					var color = lines[p].getAttribute("line_color");
					var company_name = lines[p].getAttribute("company_name");
					var company_cd = lines[p].getAttribute("company_cd");
					var comp_pref_cd = lines[p].getAttribute("pref_cd");
					if(comp_pref_cd==null || comp_pref_cd=="") comp_pref_cd="0";

					var tbls = lines[p].getElementsByTagName("TBL");

					if(isEditMode && line_cd != 0){
						html_marker +="<a title='路線カラー変更' href='' onclick=\"sendSetColorRequest("+line_cd+",'"+color+"');return false;\"><font color='#"+color+"'>■</font></a>" +
								"<a href='' onclick=\"selectedPrefCd="+comp_pref_cd+";selectedCompanyCd="+company_cd+";selectedLineCd="+line_cd+";showList('companies','"+comp_pref_cd+"','true');return false;\">";
					}else if(tbls.length==0) continue;
					else html_marker+="<a href='' onclick=\"lineClicked("+line_cd+");return false;\">";

					html_marker += "<b>"+line_name+"</b>";
					if(line_cd != 0) html_marker += "</a>";
					if(line_cd!=0) html_marker += "<span class='smaller low'>" + company_name + "</span>";
					if(isEditMode) html_marker += "<a href='"+index_url+"site/member/edit-tbl?station_g_cd="+station_g_cd+"&line_cd="+line_cd+"&tblid=0' title='時刻表を新しく追加'><img src='../../site-data/img/document.png'></a>";
					if(isEditMode&&line_cd!=0) html_marker += "<a href='' onclick=\"deleteRelation("+station_g_cd+","+line_cd+");return false;\" title='路線関係を削除'><img src='../../site-data/img/close.png'></a>";
					html_marker += "<br><ul class='ul-tbllist box'>";

					// 時刻表データ表示
					for(var j=0; j < tbls.length; j++) {
						var direction = tbls[j].getAttribute("direction");
						var stancename = tbls[j].getAttribute("stance_name");
						var tbl_id = tbls[j].getAttribute("id");
						var date = tbls[j].getAttribute("date");
						var uid = tbls[j].getAttribute("uid");
						var tbl_url = index_url + "site/list?pageid=tbl&code=" + tbl_id;

						//if(isEditMode)html_marker += " <img src='../../site-data/img/ico-list.gif'>";
						//else html_marker += " <img src='../site-data/img/ico-list.gif'>";
						html_marker += "<li>";
						html_marker += "<a href='"+ tbl_url +"' target='_blank'>";
						html_marker += direction + "</a>  <span class='smaller low'>";
						html_marker += stancename+" "+date;
						html_marker += "  by: "+uid+"</span>";
						if(isEditMode)html_marker += "<a title=\"路線を変更\" href=\"\" onclick=\"changeLine('"+tbl_id+"','"+station_g_cd+"');return false;\"><img src=\"../../site-data/img/switch.gif\"></a>　"
						html_marker += "   <br>";
					}
					html_marker += "</ul>";
				}



				var header = "<div align='left'><b><font size='4'>"+st_g_name+"</font></b>";

				if(isEditMode){
					header += "<font size='2'>" +
					"<a title='この駅情報を削除' href=\"\" onclick=\"sendDeleteStationRequest("+station_g_cd+");return false;\"><img src=\"../../site-data/img/trash.png\"></a>" +
					"<a title='駅情報を編集' href=\"\" onclick=\"switchEditMode("+idx+");return false;\"><img src=\"../../site-data/img/edit.png\"></a></font>"+
					"<a title='位置を変更' href=\"\" onclick=\"showEditPosDialog("+idx+","+station_g_cd+");return false;\"><img src=\"../../site-data/img/flag.png\"></a></font><br>";
				}
				header += "<span class='smaller low'>"+ st_g_ruby + "("+ pref_name +")<br></span><div class='hx-mapinfo'><span>路線リスト</span></div>";

				html_marker = header + "<div style='max-height:250px;overflow:auto;'>"+html_marker+"</div>";
				if(isEditMode) html_marker += "<a href=\"\" onclick=\"addStationGroupToLine('"+station_g_cd+"','"+station_g_cd+"','"+ st_g_name +"');return false;\"><img src='../../site-data/img/plus.gif'>路線を追加</a>";
				html_marker += "</div>";
			}

			marker.openInfoWindowHtml(html_marker);
		} else if(responseCode == -1) {
			alert("タイムアウトしました。再試行してください");
		} else {
			//alert("エラーです");
		}
	});

}


/**
 * 位置を送信して帰ってきた駅情報を解析し、マップ上へのマーカー設置と右側のリスト作成
 */
function fetchStations(url, zoom,notshowinfo,isSmall) {
	fetchStations(url.zoom,notshowinfo,isSmall,null);
}
function fetchStations(url, zoom,notshowinfo,isSmall, cLatLng) {
	showLoadingIcon();
	isLoading = true;
	GDownloadUrl(url, function(data, responseCode) {
		if(responseCode == 200) {
			var xml = GXml.parse(data);
			//var tablelist = xml.documentElement.getElementsByTagName("TableList");
			var markers = xml.documentElement.getElementsByTagName("Row");
			//map.getInfoWindow().hide();
			gmarkers = [];
			mapHtmls = [];
			editHtmls = [];
			markerUrls = [];
			//side_bar_html="";
			var bounds = new GLatLngBounds();
			var farDist = 0.0;
			var html = ""; //右側のリストに表示させるHTML
			html+="<div id='mapinfo'><table>";

			var show_index = -1; //r_typeが5以上のものだけ表示する
			for (var i = 0; i < markers.length; i++) {
				var station_type = parseInt(markers[i].getAttribute("station_type"));
				var station_g_cd = parseInt(markers[i].getAttribute("station_g_cd"));
				var pref_cd = parseInt(markers[i].getAttribute("pref_cd"));
				var lat = parseFloat(markers[i].getAttribute("lat"));
				var lng = parseFloat(markers[i].getAttribute("lon"));
				var pref_name = prefs[pref_cd];
				if(pref_cd==0)pref_name="都道府県設定なし";
				var st_g_name = markers[i].getAttribute("station_g_name");
				var st_g_ruby = markers[i].getAttribute("station_g_ruby");

				var html_marker = "";
				var rowtype = (i%2)==0?"even":"odd";

				html += "<tr class='"+rowtype+"' style='padding-left:5px;'>" +
				"<td><b><a href=\"\" onclick=\"markerClicked("+i+");return false;\">"+st_g_name+"</a></b></td>" +
				"<td style='width:27px;text-align:right;' >"+r_names[station_type]+"</td></tr>\n";


				if(show_index==-1) show_index=i;

				if(i==markers.length-1 && cLatLng!=null)
					farDist = cLatLng.distanceFrom(new GLatLng(lat,lng));

				var onsubmit = "sendModifiedStationInfo(this,"+station_g_cd+")";
				var html_edit = editForm(onsubmit, station_type, st_g_name, st_g_ruby, pref_cd);

				editHtmls.push(html_edit);
				var markerurl = index_url+"webapi/geotbl?station_cd="+station_g_cd;
				markerUrls.push(markerurl);

				var point = new GLatLng(lat,lng);
				//var n = markers[i].getAttribute("n");
				var marker;
				isSmall = (station_type<4)?true:false;

				marker = createMarker(point.lat(), point.lng(), st_g_name, "" , html_marker,isSmall,markerurl,i);

				//map.addOverlay(marker);
				bounds.extend(point);
			}

			html+="</table></div>";

			//小さいマーカーの場合は右側のリストに表示しない
			document.getElementById('station_list').innerHTML = html;

			//一番目のマーカーのInfoウィンドウを表示するかどうか
			if(notshowinfo!=true & show_index>=0){
				fetchStationMarkerHtml(markerUrls[show_index],gmarkers[show_index],show_index);
				lastPosition = gmarkers[show_index].getLatLng();
			}

			//ズームオプションが設定されていれば、マーカーの位置にあわせて倍率を変更する
			if(zoom && show_index>=0){
				map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
			}

			//中心座標が指定されていれば、円を描画する
			if(cLatLng!=null){
				var circle = pseudoGCircle(cLatLng, farDist/1000);
				map.addOverlay(circle);
			}

		} else if(responseCode == -1) {
			alert("タイムアウトしました。再試行してください");
		} else {
			//alert("エラーです");
		}
		isLoading = false;
	});
}

function showStations(latlng){
	if(isLoading){
		return;
	}

	//eki.locky APIを呼び出して駅を検索
	map.clearOverlays();
	var url=index_url+"webapi/geotbl";
	fetchStations(url+"?lat="+latlng.lat()+"&lon="+latlng.lng()+"&range=2",false,false,false,latlng);

	lastPosition = latlng;
}

/** 駅情報編集用のフォームを出力する */
function editForm(onsubmit, station_type, st_g_name, st_g_ruby, pref_cd){
	var ret =
		"<form name='add_st_form' method=\"post\" onsubmit=\"return "+onsubmit+"\"><table>" +
		"   <tr><td align='right'>都道府県：</td><td><select name='pref_cd'>";

	//都道府県
	for(i=0;i<prefs.length;i++){
		var selected = "";
		if(i==pref_cd) selected = "selected";
		ret += "<option value='"+i+"' "+ selected + ">"+ prefs[i] +"</option>";
	}
	ret += "</select></td></tr>";

	ret += "   <tr><td align='right'>乗り物タイプ：</td><td><select name='station_type'>";
	//駅タイプコード
	for(i=5;i<r_names.length;i++){
		var selected = "";
		if(i==station_type) selected = "selected";
		ret += "<option value='"+i+"' "+ selected + ">"+ r_names[i] +"</option>";
	}
	ret += "</select></td></tr>";

	ret +=
		"   <tr><td align='right'>停留所名：</td><td><input type='text' name='station_g_name' value='"+st_g_name+"' /></td></tr>" +
		"   <tr><td align='right'>ふりがな：</td><td><input type='text' name='station_g_ruby' value='"+st_g_ruby+"' /></td></tr>" +
		"   <tr><td colspan='2'><input type='submit'/></td></tr></table>" +
		"</form><br>";
	return ret;
}

function showLoadingIcon(){
	var html = "<table height='80%'><tr><td align='center'>";
	if(isEditMode)html+="<img src='../../site-data/img/loading.gif'/>";
	else html+="<img src='../site-data/img/loading.gif'/>";
	html+="</td></tr></table>"; //右側のリストに表示させるHTML
	document.getElementById('station_list').innerHTML = html;
}

