
google.load('maps', '2.x',{'language':'ja'});
var map;

function setCookie() {

	if (!$.cookie('lat')) {
		$.cookie('lat','35.68112',{ expires: 7 });
	}
	if (!$.cookie('lng')) {
		$.cookie('lng','139.76703',{ expires: 7 });
	}
	if (!$.cookie('zoom')) {
		$.cookie('zoom','14',{ expires: 7 });
	}
	if (!$.cookie('maptype')) {
		$.cookie('maptype','normal',{ expires: 7 });
	}
}

function setDefaultData() {

	var lat = $.cookie('lat');
	var lng = $.cookie('lng');
	var zoom = $.cookie('zoom');
	var maptype = $.cookie('maptype');
	// center and zoom to the lat/long in the form
	map.setCenter(new GLatLng(lat,lng), parseFloat(zoom));
	map.addControl(new GLargeMapControl3D());
	map.addControl(new GMenuMapTypeControl());
	switch(maptype){
	case 'satellite':
		map.setMapType(G_SATELLITE_MAP);
		break;
	case 'hybrid':
		map.setMapType(G_HYBRID_MAP);
		break;
	case 'physical':
		map.setMapType(G_PHYSICAL_MAP);
		break;
	}
}

function setChaseText() {
	GEvent.addListener(map, "mouseover", function() {
		if($('#mapmenu01').attr('src') == '/images/icn_area_over.png') {
			$("#chasetext").show();
		}
		$(document).bind('mousemove', function(e){
			X = document.body.scrollLeft + e.pageX;
			Y = document.body.scrollTop + e.pageY;
			$("#chasetext").css('left', X+20);
			$("#chasetext").css('top', Y-5);
		});
	});
	GEvent.addListener(map, "mouseout", function() {
		$("#chasetext").hide();
	});
	GEvent.addListener(map, "click", function() {
		$("#chasetext").html('シェイプを描き続けるポイントをクリックします<br>ダブルクリック、または始点をクリックするとシェイプを閉じます');
	});
}

function mapLoad() {

	if(GBrowserIsCompatible()){

		/*cookie取得*/
		setCookie();

		map = new google.maps.Map2(document.getElementById('map'));

		//デフォルト設定
		setDefaultData();

		//チェイスするテキストの設定
		setChaseText();

		//ドラッグ後再読み込み
		GEvent.addListener(map, "moveend", function() {
			var center = map.getCenter();
			$.cookie('lat', center.y);
			$.cookie('lng', center.x);
			parse_marker();
		});

		//縮小変更後再度読み込み
		GEvent.addListener(map, "zoomend", function(oldLevel, newLevel){
			var center = map.getCenter();
			$.cookie('lat', center.y);
			$.cookie('lng', center.x);
			$.cookie('zoom', newLevel);
			parse_marker();
		});

		//ポリゴン配置
		ply.setPolygon();


	}
}

var ply = {
poly:null,
doctorpage_flag:null,
makePostData: function() {
	var vnum = this.poly.getVertexCount();
	var post = "";
	var total_distance = null;
	for(i = 0; i < vnum; i++){

		vertex = this.poly.getVertex(i);
		if (i != 0) {
			vertex_old = this.poly.getVertex(i-1);
			total_distance += calcDist(vertex_old.lat(), vertex_old.lng(), vertex.lat(), vertex.lng());
		}
		post += '&point_x[]=' + vertex.lng() + '&point_y[]=' + vertex.lat();
	}
	bounds = this.poly.getBounds();
	center = bounds.getCenter();
	post += '&center_x=' + center.x;
	post += '&center_y=' + center.y;
	post += '&zoomlevel=' + map.getZoom();
	post += '&total_dimension=' + (this.poly.getArea()/1000).toFixed(2);
	post += '&total_distance=' + document.getElementById('total_distance').innerHTML;

	$('#total_dimension').html((this.poly.getArea()/1000).toFixed(2));
	$('#total_distance').html(total_distance.toFixed(2));

	return post;
},
getPolygonPoint: function() {
	return ply.poly.getVertexCount();
},
setPolygon: function() {

	//ボタンを変更
	$('#mapmenu01').attr('src', '/images/icn_area_over.png');

	var post = "";
	var myDate = new Date();
	var color = '#ff0000';
	var weight = 5;
	ply.poly = new GPolygon([], color, weight, 0.7, color, 0.2);
	map.addOverlay(this.poly);
	this.poly.enableDrawing({});
	this.poly.enableEditing({onEvent: 'mouseover'});
	this.poly.disableEditing({onEvent: 'mouseout'});

	//書き終わったら座標一覧とりたいな
	GEvent.addListener(ply.poly, 'endline', function() {

		//ボタンを変更
		$('#mapmenu01').attr('src', '/images/icn_area.png');
		$('#mapmenu02').attr('src', '/images/icn_move_over.png');

		post = ply.makePostData();

		//編集時も座標取りたいな
		GEvent.addListener(ply.poly, 'lineupdated', function(){
			post = ply.makePostData();
		});

		//HTMLを取得
		if (ply.doctorpage_flag) {
			//doctorpage
			var file ='remote/getcommentform?t=' + myDate.getTime();
		} else {
			//toppage
			var file ='/remote/getloginstatus?t=' + myDate.getTime();
		}
		
		GDownloadUrl(file, function(data) {
			//iwを表示
			map.openInfoWindowHtml(ply.poly.getVertex(0), data);
		},'postbody=1' + post);

		//クリック時の動作
		GEvent.addListener(ply.poly, 'click', function(latlng,index) {
			if(typeof index == 'number') {
				ply.poly.deleteVertex(index);
			}else{
				
				GDownloadUrl(file, function(data) {
					//iwを表示
					post = ply.makePostData();
					map.openInfoWindowHtml(ply.poly.getVertex(0), data);
				},'postbody=1' + post);
			}
		});

		//マウス追従を削除
		$("#chasetext").hide();

	});
},
//MOVEのステータスを変更
moveChange:function () {
	if($('#mapmenu02').attr('src') == '/images/icn_move.png') {
		this.poly.disableEditing();
		$("#chasetext").hide();
		$('#mapmenu02').attr('src', '/images/icn_move_over.png');
		$('#mapmenu01').attr('src', '/images/icn_area.png');
		$('#mapmenu03').attr('src', '/images/icn_reset.png');
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
		$('#mapmenu05').attr('src', '/images/icn_view.png');
		bs.toggleSv(false);
	} else {
		this.poly.disableEditing();
		$('#mapmenu02').attr('src', '/images/icn_move.png');
		$('#mapmenu01').attr('src', '/images/icn_area.png');
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
	}
},
//AREAのステータスを変更
areaChange:function() {
	if($('#mapmenu01').attr('src') == '/images/icn_area.png') {
		this.resetMap();
		$('#mapmenu01').attr('src', '/images/icn_area_over.png');
		$('#mapmenu02').attr('src', '/images/icn_move.png');
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
		$('#mapmenu05').attr('src', '/images/icn_view.png');
		bs.toggleSv(false);
	} else {
		$("chasetext").hide();
		this.poly.disableEditing();
		$('#mapmenu01').attr('src', '/images/icn_area.png');
		$('#mapmenu02').attr('src', '/images/icn_move_over.png');
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
	}
},
//AREAのステータスを変更
areaChangeForDoctor:function() {
	if($('#mapmenu01').attr('src') == '/images/icn_area.png') {
		this.resetMapForDoctor();
		$('#mapmenu01').attr('src', '/images/icn_area_over.png');
		$('#mapmenu02').attr('src', '/images/icn_move.png');
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
		$('#mapmenu05').attr('src', '/images/icn_view.png');
		bs.toggleSv(false);
	} else {
		$("chasetext").hide();
		this.poly.disableEditing();
		$('#mapmenu01').attr('src', '/images/icn_area.png');
		$('#mapmenu02').attr('src', '/images/icn_move_over.png');
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
	}
},
//病院表示
hospitalChange:function() {
	if($('#mapmenu04').attr('src') == '/images/icn_medical.png') {
		$.cookie('hospital_display','y',{ expires: 7 });
		this.resetMap();
		parse_marker();
		$('#mapmenu04').attr('src', '/images/ico_medical.png');
		if($('#mapmenu05').attr('src').match("icn_view_over\.png")) {
			bs.toggleSv(true);
		}
	} else {
		$.cookie('hospital_display','n',{ expires: 7 });
		map.clearOverlays();
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
	}
},
//ストリートビュー
streetViewChange:function() {
	if($('#mapmenu05').attr('src').match("icn_view\.png")) {
		//ストリートビュー見せる
		this.poly.disableEditing();
		$("#chasetext").hide();
		bs.toggleSv(true);
		$('#mapmenu01').attr('src', '/images/icn_area.png');
		$('#mapmenu02').attr('src', '/images/icn_move.png');
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
		$('#mapmenu03').attr('src', '/images/icn_reset.png');
		$('#mapmenu05').attr('src', '/images/icn_view_over.png');
	} else {
		//隠す
		bs.toggleSv(false);
		this.resetMap();
		$('#mapmenu01').attr('src', '/images/icn_area_over.png');
		$('#mapmenu02').attr('src', '/images/icn_move.png');
		$('#mapmenu03').attr('src', '/images/icn_reset.png');
		$('#mapmenu04').attr('src', '/images/icn_medical.png');
		$('#mapmenu05').attr('src', '/images/icn_view.png');
	}
},
//ストリートビュー
streetViewChange2:function() {
	if($('#mapmenu05').attr('src').match("icn_view\.png")) {
		//ストリートビュー見せる
		$("#chasetext").hide();
		bs.toggleSv(true);
		$('#mapmenu05').attr('src', '/images/icn_view_over.png');
	} else {
		//隠す
		map.clearOverlays();
		mapLoadForMessageDetail();
		bs.toggleSv(false);
		$('#mapmenu05').attr('src', '/images/icn_view.png');
	}
},
delPolygon:function () {
	if(window.confirm('マーカーを削除します')) {
		this.resetMap();
	}
},
resetMap:function () {
	map.clearOverlays();
	this.poly.hide();
	parse_marker();
	this.setPolygon();

	$('#mapmenu02').attr('src', '/images/icn_move.png');
	$('#mapmenu01').attr('src', '/images/icn_area_over.png');
},
resetMapForDoctor:function () {
	map.clearOverlays();
	this.poly.hide();
	parse_marker();
	this.setPolygonDoctorTop();

	$('#mapmenu02').attr('src', '/images/icn_move.png');
	$('#mapmenu01').attr('src', '/images/icn_area_over.png');
}
};

function updateList() {
	var myDate = new Date();
	//HTMLを取得
	var file ='remote/getSearchAreaList?t=' + myDate.getTime();
	GDownloadUrl(file, function(data) {
		$('#list_comment').html(data);
	});

}

function calcDist(lon1,lat1,lon2,lat2) {
	var r = 3963.0;
	// var MILESASKM = 1.609344;
	// var multiplier = currentUnit == "miles" ? 1 : MILESASKM;
	var multiplier = 1.609344;
	return multiplier * r * Math.acos(Math.sin(lat1/57.2958) * Math.sin(lat2/57.2958) +     Math.cos(lat1/57.2958) * Math.cos(lat2/57.2958) * Math.cos(lon2/57.2958 - lon1/57.2958));
}


function removeHidden() {

	var childlist = [];
	eles = document.getElementById("regist_form");
	// 子ノードの数だけ処理を繰り返す
	for (i=0;i<eles.childNodes.length;i++)
	{
		if (eles.childNodes.item(i).type == 'hidden') {
			childlist.push(eles.childNodes.item(i));
		}
	}
	for(i=0; i<childlist.length; i++) {
		if (childlist[i].name != 'doctor_id') {
			eles.removeChild(childlist[i]);
		}
	}
}

function displayComment(search_area_id, x, y, poly_x, poly_y, zoomlevel, comment, distance, dimension, msg_cnt) {
	var myDate = new Date();
	map.clearOverlays();
	map.setZoom(zoomlevel);
	var points = [];
	map.panTo(new GLatLng(y, x));
	//cookie設定
	$.cookie('lat', y);
	$.cookie('lng', x);
	$.cookie('zoom', zoomlevel);

	x_array = poly_x.split(",");
	y_array = poly_y.split(",");
	for(i = 0; i < x_array.length; i++) {
		var point = new GPoint(x_array[i], y_array[i]);
		points.push(point);
	}
	poly = new GPolygon(points, "#00B4AE", 3, 1, "#00B4AE", 0.5);
	map.addOverlay(poly);

	//HTMLを取得
	var file ='remote/geteditcomment?t=' + myDate.getTime();

	GDownloadUrl(file, function(data) {
		//iwを表示
		map.openInfoWindowHtml(new GLatLng(y, x), data);
	},'postbody=1&search_area_id=' + search_area_id);

	//map.openInfoWindowHtml(new GLatLng(y, x), "<div style=\"width:250px;\">" + comment + "</div>");
	document.getElementById('total_distance').innerHTML = distance;
	document.getElementById('total_dimension').innerHTML = dimension;
	parse_marker();
}

function moveCenter(x, y, poly_x, poly_y, zoomlevel, comment, distance, dimension, msg_cnt, search_area_id) {
	var myDate = new Date();
	map.clearOverlays();
	map.setZoom(zoomlevel);
	var points = [];
	map.panTo(new GLatLng(y, x));
	//cookie設定
	$.cookie('lat', y);
	$.cookie('lng', x);
	$.cookie('zoom', zoomlevel);

	x_array = poly_x.split(",");
	y_array = poly_y.split(",");
	for(i = 0; i < x_array.length; i++) {
		var point = new GPoint(x_array[i], y_array[i]);
		points.push(point);
	}
	poly = new GPolygon(points, "#00B4AE", 3, 1, "#00B4AE", 0.5);
	map.addOverlay(poly);
	map.openInfoWindowHtml(poly.getVertex(0), comment);

	map.openInfoWindowHtml(new GLatLng(y, x), "<div style=\"width:250px;\">" + comment + "</div>");
	document.getElementById('total_distance').innerHTML = distance;
	document.getElementById('total_dimension').innerHTML = dimension;
	parse_marker();
}

function panToAddress(address, y,x) {
	document.getElementById("search_address").value = address;
	map.panTo(new GLatLng(y, x));

	//cookie設定
	$.cookie('lat', y);
	$.cookie('lng', x);
	parse_marker();
}

function mapFullChg(){
	if($('#content_right').hasClass('hiddend')){
		$.cookie('map','');
		$('#content_right').css('display', 'block');
		$('#content_left').css('width', '680px');
		$('#pano object').css('width', '100%');
		$('#content_right').removeClass('hiddend');
		$("#expand").show();
		$("#narrow").hide();
	}else{
		$.cookie('map','full',{ expires: 7 });
		$('#content_right').css('display', 'none');
		$('#content_left').css('width', '100%');
		$('#pano').css('width', '100%');
		$('#pano object').css('width', '100%');
		$('#content_right').addClass('hiddend');
		$("#narrow").show();
		$("#expand").hide();
	}
}
//アイコンオブジェクト作成
function generateIcon(){

	var icon = new GIcon();
	icon.image = '/images/white-marker.png';
	icon.shadow = '/images/icon_shadow.png';
	icon.iconSize = new GSize( 20, 30 );
	icon.shadowSize = new GSize( 38, 33 );
	icon.iconAnchor = new GPoint( 30, 30 );
	icon.infoWindowAnchor = new GPoint( icon.iconSize.width / 3, 0 );
	return icon;

}

//地図の境界を取得
function mapBounds(){
	var bounds = map.getBounds();
	var center = map.getCenter();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var maxX = northEast.lng();
	var minX = southWest.lng();
	var maxY = northEast.lat();
	var minY = southWest.lat();
	var centerX = center.x;
	var centerY = center.y;
	return [maxX,minX,maxY,minY,centerX,centerY];
}

function parse_marker() {

	var hospital_display = $.cookie('hospital_display');
	if(hospital_display == 'y') {

		//地図の境界を取得
		var bounds = mapBounds();
		var maxX = bounds[0];
		var minX = bounds[1];
		var maxY = bounds[2];
		var minY = bounds[3];
		var centerX = bounds[4];
		var centerY = bounds[5];
		var myDate = new Date();
		var file ='/remote/gethospital?centerX='+ centerX + '&centerY=' + centerY + '&maxX=' + maxX + '&minX=' + minX + '&maxY=' + maxY + '&minY=' + minY + '&t=' + myDate.getTime();

		GDownloadUrl(file, function(data) {
			//XMLをDOM表現に変換
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName('marker');

			for (var i = 0; i < markers.length; i++) {
				var one = markers[i];
				var id = one.getAttribute('id');
				var lat =  parseFloat(one.getAttribute('lat'));
				var lng =  parseFloat(one.getAttribute('lng'));
				var point = new GLatLng(lat,lng);
				//iconオブジェクト作成
				var icon = generateIcon();

				var marker = new GMarker(point,icon);
				marker.id = id;

				//マーカークリックしたら病院情報を取得表示
				GEvent.addListener(marker, "mouseover", function(){
					console.log('marker.id=' + this.id);
				});

				GEvent.addListener(marker, "click", function(){
					var myDate = new Date();
					var file = '/remote/gethospitalinfo?id=' + this.id + '&t=' + myDate.getTime();

					var marker_holder = this;
					GDownloadUrl(file, function(data) {
						marker_holder.openInfoWindowHtml(data);
					});
				});
				map.addOverlay(marker);
			}

		});
	}
}

function emailReset(self) {
	self.style.color='#3198D3';
	if(self.value == 'メールアドレス'){
		self.value = '';
	}else if(self.value == '' || self.value == 'メールアドレス'){
		self.style.color='#3198D3';
		self.value = 'メールアドレス';
	}
}
function passwordReset(self) {
	self.style.color='#3198D3';
	if(self.value == 'パスワード'){
		self.value = '';
	}else if(self.value == '' || self.value == 'パスワード'){
		self.style.color='#3198D3';
		self.value = 'パスワード';
	}
}


var bs = {};
bs.sv = {};
bs.sv.marker;
bs.sv.currentLatLng;
bs.sv.currentYaw = 0;
bs.sv.myPano;
bs.panoClient;

bs.toggleSv = function(isChecked){
	if (isChecked) {

		bs.mapSvFit();

		bs.panoClient = new GStreetviewClient();
		var svOverlay = new GStreetviewOverlay();
		map.addOverlay(svOverlay);

		bs.sv.myPano = new GStreetviewPanorama(document.getElementById("pano"));
		GEvent.addListener(bs.sv.myPano, 'yawchanged', bs.handleYawChange);
		GEvent.addListener(bs.sv.myPano, 'initialized', bs.handleInitialized);

		GEvent.addListener(map, 'click', function(overlay, latlng) {
			if($('#mapmenu05').attr('src').match("icn_view_over\.png")) {
				bs.sv.currentLatLng = latlng;
				bs.panoClient.getNearestPanorama(latlng, bs.updateStreetView);
			}
		});
		$("#pano_message").show();

	} else {
		$("#pano").fadeOut(300, function() {
			bs.sv.myPano = null;
		});
		$("#pano_message").hide();
	}
}

bs.handleYawChange = function(yaw){
	bs.sv.currentYaw = Math.round(yaw);
	bs.svMarker();
	return;
}

bs.handleInitialized = function(location) {
	if(location.latlng != bs.sv.currentLatLng){
		bs.sv.currentLatLng = location.latlng;
		bs.svMarker();
	}
	return;
}

bs.svMarker = function(){
	if(bs.sv.marker) map.removeOverlay(bs.sv.marker);

	var sv_icon = new GIcon();
	sv_icon.image = bs.getStreetViewImageByYaw(bs.sv.currentYaw);
	sv_icon.iconSize      = new GSize(49, 52);
	sv_icon.iconAnchor    = new GPoint(25, 35);
	sv_icon.shadow = null;
	bs.sv.marker = new GMarker(bs.sv.currentLatLng, {icon:sv_icon,draggable:true, bouncy:true});

	GEvent.addListener(bs.sv.marker, "dragstart", function(latlng) {

		bs.marker_drag_start = latlng;
		bs.marker_before_lng = latlng.lng();

	});

	GEvent.addListener(bs.sv.marker, "drag", function(latlng){
		var image;

		if(bs.marker_before_lng < latlng.lng()) {
			image = "http://www.clmap.jp/images/icon/man_fly_right.png";
		} else {
			image = "http://www.clmap.jp/images/icon/man_fly_left.png";
		}
		if (image) {
			bs.sv.marker.setImage(image);
		}
		bs.marker_before_lng = latlng.lng();
	});

	GEvent.addListener(bs.sv.marker, "dragend", function(latlng) {
		// ストリートビューを更新
		bs.panoClient.getNearestPanorama(latlng, bs.updateStreetView);
	});
	map.addOverlay(bs.sv.marker);
}

bs.mapSvFit = function(){

	$('#pano').fadeIn();
	map.checkResize();
}


bs.getStreetViewImageByYaw = function(yaw)
{
	var no;

	if (!yaw) {
		yaw = 0;
	}

	no = Math.floor((yaw + 11.25) / 22.5);
	if (16 <= no) {
		no = 0;
	}

	var image = "http://www.clmap.jp/images/icon/man_arrow-" + no + ".png";

	return image;
}


bs.updateStreetView = function(data)
{
	switch (data.code) {

	case 200: // SUCCESS
		if (!bs.sv.myPano) {

			// ストリートビューが生成されていない場合は初期化
			bs.handleInitialized(data.location);

		} else {
			// ストリートビューを再表示
			if (bs.sv.myPano.isHidden()) {
				bs.sv.myPano.show();
			}

			// 表示位置を更新
			bs.sv.myPano.setLocationAndPOV(data.location.latlng);

			// マップ上のマーカーを移動
			//bs.sv.marker.setLatLng(data.location.latlng);

		}
		break;

	case 500: // SERVER_ERROR
	case 600: // NO_NEARBY_PANO
	default:
		// ストリートビューが初期化されていないときのみ表示を切り替える
		if (!bs.sv.myPano) {

			var msg = "この地域はストリートビューがサポートされていません";
			document.getElementById("pano").innerHTML = msg;

		} else {

			if (bs.marker_drag_start) {
				bs.sv.marker.setLatLng(bs.marker_drag_start);
				bs.marker_drag_start = null;
				bs.marker_before_lng = null;
			}

		}
		break;
	}
}
