	var map = null;
	var geocoder = null;
	var lastPosition = null;
	var gmarkers = [];
	var mapHtmls = [];
	var editHtmls = [];
	var index_url = "";

/*
	function addMarker () {
		var lat = document.form_re.spot_latitude.value;
		var lon = document.form_re.spot_longitude.value;
		var name = document.form_re.spot_spot_name.value;
		var address = document.form_re.spot_spot_address.value;

		createMarker(lat, lon, name, address);
	}
*/
	function createMarker (lat, lon, st_name, line_name , address, icon_id) {

		var marker = new GMarker(new GLatLng(lat,lon),{title:st_name+"\n"+line_name});
		var html = address;

		GEvent.addListener(marker, "click", function(){
    		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]);

	}

	/**
	 * 駅追加用のウィンドウを表示する
	 * @return
	 */
	function createAddMarker(){
		var marker = new GMarker(map.getCenter(),{title:"編集中"});
		var html = "<b>追加する駅の情報を入力し、「作成」ボタンを押してください</b> <br>" +
				"<form name='add_st_form' onsubmit='sendNewStationInfo(this); return false;'>" +
				"   会社名：<input type='text' name='rr_name' /><br>" +
				"   路線名：<input type='text' name='line_name' /><br>" +
				"   駅名：<input type='text' name='st_name' /><br>" +
				"   <input type='submit'>" +
				"</form>";

		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){
		var url = "../add-station";
		var callback = sendNewStationInfoCallBack;
		var params = [];
		params['method'] = "create";
		params['rr_name'] = FORM.rr_name.value;
		params['line_name'] = FORM.line_name.value;
		params['st_name'] = FORM.st_name.value;
		params['lon'] = map.getCenter().lng();
		params['lat'] = map.getCenter().lat();
		if(params['rr_name']=='' || params['line_name']=='' || params['st_name']==''){
			alert("情報を全て入力してください");
			return false;
		}
		lastPosition = null;
		GDownloadUrl(url, callback, buildSendParams(params));
		return false;
	}

	/**
	 * 駅編集リクエストの送信
	 * @param FROM
	 * @param st_cd
	 * @return
	 */
	function sendModifiedStationInfo(FORM,st_cd){
		alert("修正情報を送信します");
		var url = "../add-station";
		var callback = sendNewStationInfoCallBack;
		var params = [];
		params['method'] = 'edit';
		params['rr_name'] = FORM.rr_name.value;
		params['line_name'] = FORM.line_name.value;
		params['st_name'] = FORM.st_name.value;
		params['st_cd'] = st_cd;
		if(params['rr_name']=='' || params['line_name']=='' || params['st_name']==''){
			alert("情報を全て入力してください");
			return false;
		}
		GDownloadUrl(url, callback, buildSendParams(params));
	}



	/**
	 * 駅削除リクエストの送信
	 * @param st_cd
	 * @return
	 */
	function sendDeleteStationRequest(st_cd){

		if(window.confirm('本当に削除しますか？')){
			var url = "../add-station";
			var callback = sendNewStationInfoCallBack;
			var params=[];
			params['method'] = 'delete';
			params['st_cd'] = st_cd;
			GDownloadUrl(url, callback, buildSendParams(params));
		}
		return false;
	}

	/**
	 * 路線カラー編集リクエストの送信
	 * @param params
	 * @return
	 */
	function sendSetColorRequest(line_cd,prev_color){
		var ans = prompt('路線カラーをHTMLカラー表記で入力してください\n(例:#FF00FF)',prev_color);
		if (ans == "" || ans == null){
		}else {
			var url = "../add-station";
			var callback = sendNewStationInfoCallBack;
			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 sendNewStationInfoCallBack(returnValue, returnCode) {
		if(returnCode==202){ //作成完了
			//alert("作成に成功しました");
			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 drawCross(){
		var cross_px = 60;
		var cross_td = 2;
		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);

	}

	/**
	 * 円を描画する
	 * @param point
	 * @param radius
	 * @param color
	 * @param weight
	 * @param opacity
	 * @return
	 */
	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.5,"0000FF",0.1);//google.maps.Polyline(points, color, weight, opacity);
	}

	function markerClicked(markerNum){
	   gmarkers[markerNum].openInfoWindowHtml(mapHtmls[markerNum]);
	   lastPosition = gmarkers[markerNum].getLatLng();
	}

	function lineClicked(line_cd){
		//eki.locky APIを呼び出して駅を検索
		map.clearOverlays();
		var url=index_url+"webapi/geotbl?line_cd="+line_cd;
		readMap(url,true,true);
	}

	/**
	 * 位置を送信して帰ってきた駅情報を解析し、マップ上へのマーカー設置と右側のリスト作成
	 * @param url
	 * @param zoom
	 * @return
	 */
    function readMap(url,zoom,notshowinfo) {
        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 = [];
            //side_bar_html="";
            var bounds = new GLatLngBounds();
            var html = ""; //右側のリストに表示させるHTML
			html+="<table style='margin:0px;padding:0px'>";

            for (var i = 0; i < markers.length; i++) {
                var st_cd = parseInt(markers[i].getAttribute("station_cd"));
                var line_cd = parseInt(st_cd/100);
              	var lat = parseFloat(markers[i].getAttribute("lat"));
              	var lng = parseFloat(markers[i].getAttribute("lon"));
              	var rr_name = markers[i].getAttribute("rr_name");
	          	var st_name = markers[i].getAttribute("station_name");
              	var line_name = markers[i].getAttribute("line_name");
              	var has_tbl = markers[i].getAttribute("hasTBL");
              	var color = markers[i].getAttribute("color");
				var tbls = markers[i].getElementsByTagName("TBL");
				var html_marker = "";
				var line_url = "<a href='"+index_url + "site/browse-tbl?pageid=station&line_cd="+ line_cd+"' target='_blank'>"+line_name+"</a>";
				var line_url_list = "<a href='javascript:lineClicked("+line_cd+")'>"+line_name+"</a>";
				var rowtype = (i%2)==0?"even":"odd";
				html += "<tr class='"+rowtype+"' style='padding-left:5px;'><td style='width:7px;background:"+"#"+color+"'></td><td><b><a href='javascript:markerClicked("+i+")'>"+st_name+"</a></b><br>"
					+ line_url_list + "</td></tr>\n";
				for(var j=0; j < tbls.length; j++) {
					var direction = tbls[j].getAttribute("direction");
					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/browse-tbl?pageid=tbl&code=" + tbl_id;

					html_marker += "<a href='"+ tbl_url +"' target='_blank'>";
	    			html_marker += direction + "方面</a>  <span class='smaller low'>";
	    			html_marker += date + "  by: " + "<a href='http://eki.locky.jp/site/browse-tbl?pageid=user&uname="+uid+"' target='_blank'>"+uid+"</a></span><br>";
				}
				//html += html_marker;
				//html += "</td><td><a href='member/edit-tbl?station_cd="+st_cd+"&tblid=0' target='_blank'><font size='2'>追加</font></a></td></tr>\n";

				html_marker = "<div align='left'><b><font size='4'>"+st_name+"</font></b><br><font color='#"+color+"'>■</font>"+line_url+"<br><br>"+html_marker;
				html_marker += "<br></div><div align='right'><font size='2'>" +
						"<a href='javascript:sendSetColorRequest("+line_cd+",\""+color+"\")'>路線カラー編集</a> " +
				/*		"<a href='javascript:sendDeleteStationRequest("+st_cd+")'>削除</a> " +
						"<a href='javascript:switchEditMode("+i+")'>編集</a> " + */
						"  <a href='http://eki.locky.jp/site/member/edit-tbl?station_cd="+st_cd+"&tblid=0' target='_blank'>時刻表を追加</a></font></div>";

				var html_edit = "<b>駅の情報を編集した後、「送信」ボタンを押してください</b> <br>" +
					"<form name='edit_st_form' onsubmit='sendModifiedStationInfo(this,"+st_cd+"); return false;'>" +
					"   会社名：<input type='text' name='rr_name' value='"+ rr_name +"'/><br>" +
					"   路線名：<input type='text' name='line_name'  value='"+ line_name +"'/><br>" +
					"   駅名：<input type='text' name='st_name'  value='"+ st_name +"'/><br>" +
					"   <input type='submit'>" +
					"</form>";
				editHtmls.push(html_edit);

				var point = new GLatLng(lat,lng);
              	//var n = markers[i].getAttribute("n");
              	var marker;
              	if(has_tbl=="true"){
              		marker = createMarker(point.lat(), point.lng(), st_name, line_name , html_marker, 0);
              	}else{
              		marker = createMarker(point.lat(), point.lng(), st_name, line_name , html_marker, 1);
              	}


              	//map.addOverlay(marker);
              	bounds.extend(point);
            }

			html+="</table>";
            document.getElementById('station_list').innerHTML = html;

            if(notshowinfo!=true)gmarkers[0].openInfoWindowHtml(mapHtmls[0]);
            if(zoom)map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));

          } else if(responseCode == -1) {
            alert("タイムアウトしました。再試行してください");
          } else {
            alert("エラーです");
          }
        });
      }

    function showStations(latlng){
		//eki.locky APIを呼び出して駅を検索
		map.clearOverlays();
		var url=index_url+"webapi/geotbl";
		readMap(url+"?lat="+latlng.lat()+"&lon="+latlng.lng()+"&range=2");
		//円を描画
		lastPosition = latlng;
		var circle = pseudoGCircle(latlng, 2);
		map.addOverlay(circle);
    }