function createMap(map_id, lat, lng, zoom, region) {
	if(lat == undefined) lat = 0;
	if(lng == undefined) lng = 0;
	if(zoom == undefined) {
		zoom = -1;
	}
	// Create map
	var gmap = new GMap2(document.getElementById(map_id));
	if(zoom == -1) {
		if( (region == undefined) || (region == -1) ) {
			zoom = 0;
		}
		else {
			zoom = gmap.getBoundsZoomLevel( region );
			gmap.setCenter(new GLatLng(lat, lng), zoom, G_NORMAL_MAP);
			msize = gmap.getSize();
			lnsw = region.getSouthWest();
			lnne = region.getNorthEast();
			sw = gmap.fromLatLngToDivPixel(lnsw);
			ne = gmap.fromLatLngToDivPixel(lnne);
			if( (sw.x < 16) || ((msize.height - sw.y) < 32) ||
				((msize.width - ne.x) < 16) || (ne.y < 32) ) {
				sw.x = sw.x + 32;
				sw.y = sw.y - 32;
				psw = gmap.fromDivPixelToLatLng( sw );
				div_y = Math.abs(psw.lat() - lnsw.lat());
				div_x = Math.abs(psw.lng() - lnsw.lng());
				lnsw = new GLatLng(lnsw.lat() - div_y, lnsw.lng() - div_x);
				lnne = new GLatLng(lnne.lat() + div_y, lnne.lng() + div_x);
				region=new GLatLngBounds(lnsw,lnne);
				zoom = gmap.getBoundsZoomLevel( region );
			}
		}
	}
	gmap.setCenter(new GLatLng(lat, lng), zoom, G_NORMAL_MAP);
	gmap.savePosition();
	gmap.addControl(new GLargeMapControl());
	gmap.addControl(new GMapTypeControl(true));
	//gmap.addControl(new GMenuMapTypeControl(true));
	gmap.addControl(new GScaleControl());
	gmap.addControl(new GOverviewMapControl());
    // enable mouse wheel zoom
	gmap = enableMouseWheelZoom( map_id, gmap );
	return gmap;
}

function createAdminMap(map_id, lat, lng, zoom) {
	if(lat == undefined) lat = 0;
	if(lng == undefined) lng = 0;
	// Create map
	var gmap = new GMap2(document.getElementById(map_id));
	gmap.setCenter(new GLatLng(lat, lng), zoom, G_NORMAL_MAP);
	gmap.addControl(new GLargeMapControl());
	gmap.addControl(new GMapTypeControl(true));
    // enable mouse wheel zoom
	gmap = enableMouseWheelZoom( map_id, gmap );
	return gmap;
}

function enableMouseWheelZoom( id, map ) {
	map.enableScrollWheelZoom();
	map.enableContinuousZoom();
	map_elem = document.getElementById(id);
	GEvent.addDomListener(map_elem, "DOMMouseScroll", CancelEvent); // Firefox
	GEvent.addDomListener(map_elem, "mousewheel",     CancelEvent); // IE
	return map;
}

// Create marker icon
var icon = new GIcon();
icon.image = "http://maps.google.co.jp/mapfiles/ms/icons/red.png";
icon.shadow = "http://maps.google.co.jp/mapfiles/ms/icons/msmarker.shadow.png";
icon.iconSize = new GSize(32, 32);
icon.shadowSize = new GSize(59, 32);
icon.iconAnchor = new GPoint(16, 32);
icon.infoWindowAnchor = new GPoint(16, 0);

var icon2 = new GIcon();
icon2.image = "http://maps.google.co.jp/mapfiles/ms/icons/blue.png";
icon2.shadow = "http://maps.google.co.jp/mapfiles/ms/icons/msmarker.shadow.png";
icon2.iconSize = new GSize(32, 32);
icon2.shadowSize = new GSize(59, 32);
icon2.iconAnchor = new GPoint(16, 32);
icon2.infoWindowAnchor = new GPoint(16, 0);

// Create center marker icon
var center_icon = new GIcon();
center_icon.image = "/search/img/map/centermarker.png";
center_icon.shadow = "/search/img/map/centermarker_shadow.png";
center_icon.iconSize = new GSize( 23 , 23 );
center_icon.shadowSize = new GSize( 29 , 29 );
center_icon.iconAnchor = new GPoint( 11 , 11 );

// Removable CenterMarker
var g_center_marker = 0;
var g_move_evt = 0;
var g_cnteronoff = 0;

// Create markers and events
function createCenterMarker(map, lat, lng) {
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, icon);
	map.addOverlay(marker);
	return marker;
}

function createMovingCenterMarker(map) {
	g_cnteronoff = 1;
	g_center_marker = new GMarker(map.getCenter(), center_icon);
	map.addOverlay(g_center_marker);

	g_move_evt = GEvent.addListener(map , "moveend" , function() {
		map.removeOverlay(g_center_marker);
		g_center_marker = new GMarker(map.getCenter(), center_icon);
		map.addOverlay(g_center_marker);
	});
}

function createTargetMarker(map, lat, lng) {
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, icon2);
	map.addOverlay(marker);
	return marker;
}

function CancelEvent(event) {
	e = event;
	if(typeof e.preventDefault  == 'function')
		e.preventDefault();
	if(typeof e.stopPropagation == 'function')
		e.stopPropagation();
	if(window.event) {
		window.event.cancelBubble = true; // for IE
		window.event.returnValue = false; // for IE
	}
}

function getCenterBounds( p, centerpos ) {
	
	var lng_max = -181;
	var lat_max = -91;
	for ( var i=0; i < p.length; i++ ){
		lat_abs = Math.abs(centerpos.lat() - p[i].lat());
		if (lat_max<lat_abs) lat_max=lat_abs;
		lng_abs = Math.abs(centerpos.lng() - p[i].lng());
		if (lng_max<lng_abs) lng_max=lng_abs;
	}
	sw = new GLatLng(centerpos.lat() - lat_max, centerpos.lng() - lng_max);
	ne = new GLatLng(centerpos.lat() + lat_max, centerpos.lng() + lng_max);

	region = new GLatLngBounds(sw, ne);
/*
	if(region.isEmpty()) alert("isEmpty()");
	if(region.isFullLat()) alert("isFullLat()");
	if(region.isFullLng()) alert("isFullLng()");
*/
	return region;
}

function getCenterPos( p ) {
	
	var xavg=0;
	var yavg=0;
	var xmin=181;
	var xmax=-181;
	var ymin=91;
	var ymax=-91;
	for ( var i=0; i < p.length; i++ ){
		if (xmin>p[i].x) xmin=p[i].x;
		if (xmax<p[i].x) xmax=p[i].x;
		if (ymin>p[i].y) ymin=p[i].y;
		if (ymax<p[i].y) ymax=p[i].y;
	}
	xavg=(xmax+xmin)/2;
	yavg=(ymax+ymin)/2;
	return new GLatLng( yavg, xavg );
}

function roundLatLng( value ) {
	return( Math.round(value * 1000000) / 1000000 );
}


function movehMapFromAddress(f){
	if( map && geocoder ) {
		address = f["address1"].value + f["address2"].value;
		geocoder.getLatLng(address, function(latlng) {
			if (latlng){
				map.setCenter(latlng, g_hit_scale);
			}else{
				alert("住所から位置が特定できません。情報を入力し直して下さい。");
			}
		});
	}
	return false;
}

function movehMapFromString(f){
	if( map && geocoder ) {
		address = f["search_tmp"].value;
		geocoder.getLatLng(address, function(latlng) {
			if (latlng){
				map.setCenter(latlng, g_hit_scale);
			}else{
				alert("入力されたキーワードから位置が特定できません。情報を入力し直して下さい。");
			}
		});
	}
	return false;
}

function moveMapFromLatLng(f) {
	err = "";
	if( map ) {
		lat = f["lat"].value;
		lng = f["lng"].value;
		m = lat.match(/^\d+\.?\d*$/);
		if (!m && lat ) {
			err += "緯度の値が不正です。\n";
			lat = '';
		}
		m = lng.match(/^\d+\.?\d*$/);
		if (!m && lng ) {
			err += "経度の値が不正です。\n";
			lng = '';
		}
		if( lat && lng ) {
			latlng = new GLatLng(lat,lng);
			map.setCenter(latlng);
		}
	}
	if(err) alert(err); 
	return false;
}

function searchTarget(f){
	if( map && geocoder ) {
		clearLandmark(f);
		if( f['landmark'].value || f['place'].value || f['radius'].value ) {
			if( !f['place'].value && !f['landmark'].value ) {
				alert("ランドマークを選択、または地名を入力して下さい。");
				return false;
			}
			if( !f['radius'].value ) {
				alert("半径を選択して下さい。");
				return false;
			}
		}
		if( f['landmark'].value && f['radius'].value ) {
			lms = f['landmark'].value.split("::");
			f['lat'].value = lms[0];
			f['lng'].value = lms[1];
			f.submit();
			return false;
		}
		else if( f['place'].value && f['radius'].value ) {
			geocoder.getLatLng(f["place"].value, function(latlng) {
				if (latlng){
					f['lat'].value = roundLatLng(latlng.lat());
					f['lng'].value = roundLatLng(latlng.lng());
					f.submit();
					return false;
				}else{
					alert("地名から位置が特定できません。地名を入力し直して下さい。");
				}
			});
		}
		else {
			f.submit();
			return false;
		}
	}
	return false;
}

function clearPlace(f) {
	if( f['place'].value == g_def_place ) {
		f['place'].value = "";
	}
}

function clearLandmark(f) {
	clearPlace(f);
	if( f['place'].value != "" ) {
		f['landmark'].value = "";
	}
}
