function myCircle(point, radius, strokeColor, strokeWeight, strokeOpacity, fillColor, fillOpacity) {

	this.p = point;
	this.r = radius;
	this.sc = strokeColor;
	this.sw = strokeWeight;
	this.so = strokeOpacity;
	this.fc = fillColor;
	this.fo = fillOpacity;

	{
		var vertex = 360;
		var TMP = 1 - 0.00669437999014132 * Math.pow(Math.sin(this.p.latRadians()), 2);
		var arc_lat = 110574.27582159444444444444444444 / Math.pow(TMP, 3/2);
		var arc_lng = (111319.49079327333333333333333333 * Math.cos(this.p.latRadians())) / Math.pow(TMP, 1/2);
		var points = new Array(vertex);
		{
			var i = 0;
			for (; i <= vertex; i++) {
				var rad = (i / (vertex / 2)) * Math.PI;
				var lat = (this.r / arc_lat) * Math.sin(rad) + this.p.lat();
				var lng = (this.r / arc_lng) * Math.cos(rad) + this.p.lng();
				points[i] = new google.maps.LatLng(lat, lng);
			}
		}
		var c = new google.maps.Polygon(points, '#' + this.sc, this.sw, this.so, '#' + this.fc, this.fo);
		google.maps.Event.addListener(c, 'click', function(pp) {
			if (document.getElementById('mode_erase').checked == true) {
				removeCircle(c);
				buf = null;
			} else {
				buf = pp;
			}
		});
		this.circle = c;
	}

	this.toString = function() {
		return 'lat:' + this.p.lat() + ',lng:'+ this.p.lng() + ',r:' + this.r + ',sc:' + this.sc + ',sw:' + this.sw + ',so:' + this.so + ',fc:' + this.fc + ',fo:' + this.fo;
	}

	this.getCircle = function() {
		return this.circle;
	}
	this.destroy = function() {
		map.removeOverlay(this.circle);
		delete circles[this.p][this.r];
		this.circle = null;
	}
	this.show = function() {
		map.addOverlay(this.circle);
	}
}

function digitcheck(value) {
	var char1 = new Array("１","２","３","４","５","６","７","８","９","０","　"," ");
	var char2 = new Array(1,2,3,4,5,6,7,8,9,0,'','');
	var data = value;
	while (data.match(/[０-９]/)) {
		var i = 0;
		for(; i < char1.length; i++){
			data = data.replace(char1[i], char2[i]);
		}
	}
	return data;
}

var map;
var markers = new Array();
var circles = new Array();
var buf = null;

function init() {

	buf = null;

	var param = new Array();
	var x = window.location.search.substring(1);
	var xx = x.split('&');

	var items = new Array();

	for (i=0; i < xx.length; i++) {
		var vals  = new Array(2);
		vals = xx[i].split('=', 2);
		if ((vals[0] == 'c') || (vals[0] == 'm')){
			items[items.length] = new Array(vals[0], vals[1]);
		} else {
			param[vals[0]] = vals[1];
		}
	}
	delete xx;
	delete x;

	if (('lat' in param) && ('lng' in param)) {
		param['lat'] = parseFloat(param['lat']);
		if ((param['lat'] < -90) || (90 < param['lat'] )) {
			delete param['lat'];
		}
		param['lng'] = parseFloat(param['lng']);
		if ((param['lng'] < -180) || (180 < param['lng'] )) {
			delete param['lng'];
		}
	}
	if (!('lat' in param) || !('lng' in param)) {
		// Tokyo Station
		param['lat'] = 35.680933;
		param['lng'] = 139.767058;
	}
	if ('z' in param) {
		param['z'] = parseInt(param['z']);
		if ((param['z'] < 0)) {
			param['z'] = 1;
		}
	} else {
		param['z'] = 12;
	}
	map = new google.maps.Map2(document.getElementById("map"));
	map.setCenter(new google.maps.LatLng(param['lat'],param['lng']), param['z']);
	map.addControl(new google.maps.ScaleControl());
	map.addControl(new google.maps.LargeMapControl());
	map.addControl(new google.maps.MapTypeControl());
	map.addControl(new google.maps.OverviewMapControl());
	map.disableDoubleClickZoom()

	var i;
	for (i = 0; i < items.length; i++) {
		var xxx = items[i][1].split(',');

		var circle_param = new Array();
		var isvalid = true;
		for (j=0; j< xxx.length; j++) {
			var v = new Array(2);
			v = xxx[j].split(':', 2);
			circle_param[v[0]] = v[1];
		}
		if (('lat' in circle_param) && ('lng' in circle_param)) {
			circle_param['lat'] = parseFloat(circle_param['lat']);
			circle_param['lng'] = parseFloat(circle_param['lng']);
			if ((circle_param['lat'] < -90) || (90 < circle_param['lat']) || (circle_param['lng'] < -180) || (180 < circle_param['lng'] )) {
			isvalid = false;
			}
		} else {
			isvalid = false;
		}

		if (items[i][0] == 'm') {
			var cpoint = new google.maps.LatLng(circle_param['lat'], circle_param['lng']);
			markers[cpoint] = new myMarker(cpoint);
			markers[cpoint].show();
		} else {
			if (('r' in circle_param) && (parseFloat(circle_param['r']) > 0)) {
				circle_param['r'] = parseFloat(circle_param['r']);
			} else {
				isvalid = false;
			}

			if (!(('sc' in circle_param) && (circle_param['sc'].match(/^[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]$/i)))) {
			 	if (isvalid) {
					circle_param['sc'] = '000000';
				}
			}

			if (!(('fc' in circle_param) && (circle_param['fc'].match(/^[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]$/i)))) {
				if ('sc' in circle_param) {
					circle_param['fc'] = circle_param['sc'];
				}
			}

			if (('sw' in circle_param) && (parseInt(circle_param['sw']) > 0)) {
				circle_param['sw'] = parseInt(circle_param['sw']);
			} else if (circle_param.length > 0) {
				circle_param['sw'] = 1;
			}

			if (isvalid) {
				var str_r = circle_param['r'] + '';
				var cpoint = new google.maps.LatLng(circle_param['lat'], circle_param['lng']);
				if (cpoint in circles) {
					if (str_r in circles[cpoint]) {
						circles[cpoint][str_r].destroy();
					}
				} else {
					circles[cpoint] = new Array();
				}
				circles[cpoint][str_r] = new myCircle(cpoint, circle_param['r'], circle_param['sc'], circle_param['sw'], circle_param['so'], circle_param['fc'], circle_param['fo']);
				circles[cpoint][str_r].show();
			}
		}
	}

	google.maps.Event.addListener(map, 'click', function(overlay, point) {
		if ((overlay != null) && (buf != null)) {
			point = buf;
			buf = null;
		}
		if (point) {
			if (!(point in markers) && (document.getElementById("mode_put").checked)) {
				markers[point] = new myMarker(point);
				markers[point].show();
			}
		}
	});

	if (navigator.userAgent.indexOf("Gecko/") != -1) {
		document.getElementById("url").size = "80";
	}

	var am = new google.maps.AdsManager(map, 'ca-pub-7939613401472758', {
		maxAdsOnMap: 16, channel: 'circle-GAdsManager', minZoomLevel: 6
	} );
	am.enable();

}

function removeMarker(marker) {
	var p;
	for (p in markers) {
		if ((marker == null) || (markers[p].getMarker() == marker)) {
			markers[p].destroy();
		}
	}
}

function removeCircle(circle) {
	var p, r;
	for (p in circles) {
		for (r in circles[p]) {
			if ((circle == null) || circles[p][r].getCircle() == circle) {
				circles[p][r].destroy();
				if (circle != null) {
					return;
				}
			}
		}
		if (circle == null) {
			delete circles[p];
		}
	}
}

function myMarkerClicked(marker) {
	if (document.getElementById("mode_erase").checked) {
		removeMarker(marker);
	} else {
		var r = parseFloat(digitcheck(document.getElementById("radius").value)) * parseFloat(digitcheck(document.getElementById("r_Scale").options[document.getElementById("r_Scale").selectedIndex].value));
		var p = marker.getLatLng();
		var str_r = r + '';
		if (p in circles){
			if (str_r in circles[p]) {
				circles[p][str_r].destroy();
			}
		} else {
			circles[p] = new Array();
		}
		var color = '000000';
		var c = 0;
		for (; c < document.getElementsByName("color").length; c++) {
			if (document.getElementsByName("color")[c].checked) {
				color = document.getElementsByName("color")[c].value;
				break;
			}
		}
		circles[p][str_r] = new myCircle(p, r, color, 1, 1, color, document.getElementById("fo").options[document.getElementById("fo").selectedIndex].value);
		circles[p][str_r].show();
	}
}

function myMarker(p) {
	var marker = new google.maps.Marker(p);
	this.m = marker;
	google.maps.Event.addListener(marker, "click", function() {
		myMarkerClicked(marker);
	});

	this.getLatLng = function() {
		return this.marker.getLatLng();
	}

	this.toString = function() {
		return 'lat:' + this.m.getLatLng().lat() + ',lng:' + this.m.getLatLng().lng();
	}

	this.getMarker = function() {
		return this.m;
	}

	this.destroy = function() {
		map.removeOverlay(this.m);
		delete markers[p];
		this.m = null;
	}

	this.show = function() {
		map.addOverlay(this.m);
	}
}

function showURL() {
	var data = '?z=' + map.getZoom() + '&lat='  + map.getCenter().lat() + '&lng=' + map.getCenter().lng();
	var p;
	for (p in markers) {
		data += '&m=' + markers[p].toString();
	}
	for (p in circles) {
		for (var r in circles[p]) {
			data += '&c=' + circles[p][r].toString();
		}
	}
	document.getElementById("url").value = location.protocol + '//' + location.host + location.pathname + data;
}


function openURL() {
	if (document.getElementById("url").value.length > 0) {
		window.open(document.getElementById("url").value);
	}
}

function clickIcon(target) {
	document.getElementById(target).checked = true;
}


function mapMoveTo(place) {
	var geocoder = new GClientGeocoder();

	geocoder.getLatLng(place, function(point) {
		if (!point) {
			alert("見つかりません：" + place);
		} else {
			map.setCenter(point);
		}
	});
}
