
var mogue_coverX = 300;
var mogue_footerY = 80;
var mogue_shadeY = 16;

var logo_offsetX = 0;
var logo_offsetY = -81;

var _default_zoom = 2;

var map = null;

window.map_elementid = "detailsmap";

function gmap_extension ()
{
	GMarker.prototype.alter_marker = function ()
	{
		var index = this.__icon_index;
		var image_array_name = null;
		for (i in this) {
			if ( this[i] && this[i].push && this[i].length > 1 ) {
				image_array_name = i;
				break;
			}
		}
		if ( ! image_array_name ) 
			return;

		if (index != null && index > 0) {
			(this[image_array_name])[0].src = "http://img.mogue.jp/img/marker/marker.png";
			this.__icon_index = 0;
		} else {
			(this[image_array_name])[0].src = "http://img.mogue.jp/img/marker/marker_.png";
			this.__icon_index = 1;
		}
	}

	GMarker.prototype.set_tooltip_text = function (text)
	{
		if ( this.__tooltip == null ) {
			var tooltip = document.createElement("div");
			map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip);
			tooltip.style.visibility = "hidden";
			tooltip.style.background = "#fff";
			tooltip.style.padding = "4px";
			tooltip.style.borderWidth = "1px";
			tooltip.style.borderStyle = "solid";

			tooltip.innerHTML = "<nobr>" + text + "</nobr>";

			this.__tooltip = tooltip;
		}
	}

	GMarker.prototype.show_tooltip = function (b)
	{
		var tooltip = this.__tooltip;

		if ( ! tooltip )
			return;

		var projection = map.getCurrentMapType().getProjection();
		var point = projection.fromLatLngToPixel(
				map.fromDivPixelToLatLng( new GPoint(0,0), true),
				map.getZoom()
				);
		var offset = projection.fromLatLngToPixel(
				this.getPoint(),
				map.getZoom()
				);
		var anchor = this.getIcon().iconAnchor;
		var width = this.getIcon().iconSize.width;
		var height = tooltip.clientHeight;
		var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + (1.2*width), offset.y - point.y - anchor.y)); 
		pos.apply(tooltip);

		this.__tooltip.style.visibility= ( b ? "visible" : "hidden" );
	}

	// copied from gmap.30a.js
	// to handling rbutton_down.
	function mb(a)
	{
		var b={x:0,y:0};while(a){b.x+=a.offsetLeft;b.y+=a.offsetTop;a=a.offsetParent}
		return b;
	}
	function La(a,b,c)
	{
		if(typeof a.offsetX!="undefined"){
			var d=c||a.target||a.srcElement;
			var e=Ld(d,b);
			return new GPoint(a.offsetX+e.x,a.offsetY+e.y);
		}else if(typeof a.pageX!="undefined"){
			var f=mb(b);
			return new GPoint(a.pageX-f.x,a.pageY-f.y);
		}else{
			P.incompatible("dblclick");
			return new GPoint();
		}
	}
	function Ld(a,b)
	{
		var c={x:0,y:0};while(a&&a!=b){c.x+=a.offsetLeft;c.y+=a.offsetTop;a=a.offsetParent}return c;
	}
	// copy end.

	/**
	 * GMap2.getAllControls()
	 * @param
	 * @return all controls includes google maps logo and maps data copyrights.
	 *         if returns null, it means script fails determine which one is controls array.
	 **/	
	var str = GMap2.prototype.addControl.toString();
	if ( str.match(/(\w+)\.push/) ) {
		var controls_obfscused_name = RegExp.$1;
		GMap2.prototype.getAllControls = function ()
		{
			return this[controls_obfscused_name];
		}
	} else {
		GMap2.prototype.getAllControls = function () {return null;}
	}

	GLatLng.prototype.is_valid = function ()
	{
		return ( this.lat() != 0 && this.lng() != 0);
	}
	
	GMap2.prototype.onMouseWheel = function (e)
	{
		if( navigator.userAgent.match( "MSIE" ) ) { var delta = e.wheelDelta; e.returnValue = false; } //IE

		if( navigator.userAgent.match( "Gecko" ) ){ var delta = e.detail * -1; e.preventDefault(); } //Gecko

		if( navigator.userAgent.match( "Safari" ) ){ var delta = e.wheelDelta; e.returnValue = false; } //Safari

	}

	GMap2.prototype.onContextMenu = function (a)
	{
		if (document.all)
			a = window.event;

		var b=null;

		if(a){
			var c=La(a,this.getContainer());
			//b=this.containerCoordToLatLng(c)
			b = this.fromContainerPixelToLatLng(c);
			//b=this.fromDivPixelToLatLng(c)
		}

		GEvent.trigger(this,"rclick",b);

		stop_propagation(a);

		return false;
	}

} gmap_extension();



function relocate_logos(map)
{
	for (var i = 0; i < map.controls.length; i++) {
		var t = map.controls[i].control;

		if ( typeof(t.enableTermsLink) != 'undefined' ) {
			// control is agreement.
			var e = map.controls[i].element;
			e.style.top = (e.offsetTop + logo_offsetY) + "px";
			//e.style.left = (e.offsetLeft + 80) + "px";
			
		} else if ( typeof(t.map) != 'undefined') {
			if ( typeof(t.buttons) != 'undefined') {
				// GMapTypeControl.
			} else if ( typeof(t.sliderTopImage) != 'undefined') {
				// G*MapControl.
			} else {
				// maybe google logo.
				var e = map.controls[i].element;
				e.style.top = (e.offsetTop + logo_offsetY) + "px";
			}
		}

	}

}

function __calc_centerX_covered (lat, lon, cover) 
{
	var coverX = cover.offsetWidth;
	var latlon = new GLatLng(lat, lon);
	var pixel = map.fromLatLngToDivPixel(latlon);

	var drawer = $("searchuiev");
	if (drawer != null) {
		coverX = drawer.offsetWidth;
	}

	//var pixel = map.spec.getBitmapCoordinate(lat, lon, zoom);
	//var x = pixel.x - (map.viewSize.width / 2) + coverX + (map.viewSize.width - coverX)
	//var r = map.spec.getLatLng(pixel.x - (coverX / 2), pixel.y , zoom);

	var intersect = cover.parentNode.offsetWidth - coverX;
	var container = map.getContainer();

	
	//pixel.x -= (intersect / 2);
	
	pixel.x -= (container.offsetWidth - intersect ) / 2 
//	pixel.x -= (container.offsetWidth - intersect) / 2;
//	pixel.y -= mogue_footerY;

	var r = map.fromDivPixelToLatLng(pixel);
	return r;
};


/**
 * @param points points to be visible in map.
 **/

function set_rclick_handlers()
{
	var outmost = map.getContainer();
	var imgs = outmost.getElementsByTagName('img');
	$A(imgs).each( function (i) {
		// mt is prefix of tile images.
		// for safer, use getTileLayers() and check its image names.
		if ( i.src.match( /\/mt\?/ ) ) {
			i.oncontextmenu = map.onContextMenu.bind(map);
			i.style.cursor = 'crosshair';
		}
	} );
}

function gmap_init_controls()
{
		// move copyrights and logo.
		var controls = map.getAllControls();
		if (controls) {
			controls.each( function (c) {
				var n = parseInt(c.element.style.bottom); 
				c.element.style.bottom = (n + mogue_footerY) + "px";
			} ); 
		}
		
		//map.removeMapType(G_HYBRID_MAP);
		map.addControl(new GMapTypeControl(1));

		var w = 16;
		var h = 96;
		var controller = new GLargeMapControl();
		
		map.addControl(controller, new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(w,h)));
}

function gmap_init_event_handlers(rclick_handler, zoom_handler)
{
	set_rclick_handlers(map);

	GEvent.clearListeners(map, "rclick");

	if ( rclick_handler == null ) {
		rclick_handler = function () {
			var p = map.getCenter();
			wc.toggle_mainwindow();
			//wc.make_point_visible();
		}
	}

	if ( zoom_handler == null ) {
		zoom_handler = function () {
			// need not recenter if main window is hidden and map is shown 100%.
			if ( wc.mainwindow && wc.visibility[wc.mainwindow] ) {
				var p = wc.default_latlng;
				//var p = map.getCenter();
				wc.make_point_visible ();
				//wc.make_point_visible();
			}
		}
	}
		
	GEvent.addListener(map, 'rclick', rclick_handler);
	GEvent.addListener(map, 'zoomend', zoom_handler);
	GEvent.addListener(map, 'resize', set_rclick_handlers);
	
	// add mouse wheel events.
	var onmousewheel = map.onMouseWheel.bindAsEventListener(map);
	if( navigator.userAgent.match( "MSIE" ) ) {
		// someone receives scroll event and prevents propagation...
		//Event.observe(map.getContainer(), "mousewheel" , onmousewheel );
	} else if( navigator.userAgent.match( "Gecko" ) ) {
		Event.observe(map.getContainer(), "DOMMouseScroll" , onmousewheel , false );
	} else if( navigator.userAgent.match( "Safari" ) ) {
		map.getContainer().onmousewheel = onmousewheel;
	}
}

function gmap_init_map(lat, lon)
{
	var map_element = document.getElementById(window.map_elementid);

	var mapX = map_element.offsetWidth ;//- mogue_coverX;
	var mapY = map_element.offsetHeight - mogue_footerY;
	
	map = new GMap2( map_element, null);
	window.map = map;

window.t_newgmap = (new Date()).getTime();

	var optional = 0;

}

function gmap_init_evloc()
{
	var is_ie = ( navigator.userAgent.indexOf('MSIE') >= 0 );

	if ( is_ie ) {
		// break gmap_init() apart to more smooth visual effect.
		// this code's result looks good on let's note.
		gmap_init_map(window.map_elementid, lat, lon);

		wc.ie_display_hack();
		wc.toggle("window", function() {

			gmap_init_mapcenter(lat, lon);
			wc.make_point_visible( new GLatLng(lat, lon) );
			wc.add_place_marker(lat, lon, 0, function() {
					wc.toggle_mainwindow();
			} );
			gmap_init_event_handlers(null, null);
			gmap_init_controls();
			map.savePosition();
		} );
	} else {
		gmap_init_map(window.map_elementid, lat, lon);
		gmap_init_mapcenter(lat, lon);

		wc.ie_display_hack();
		wc.toggle("window", function () {

			wc.add_place_marker(lat, lon, 0, function() {
				wc.toggle_mainwindow();
			} );

			gmap_init_event_handlers(null, null);
			gmap_init_controls();
			map.savePosition();
		} );

		wc.make_point_visible( new GLatLng(lat, lon) );

	}
	
}

/**
 *
 * @param zoom default zoom level. negative value means getMaximumResolution() + (zoom) .
 * @return
 **/
function gmap_init(lat, lon, zoom, marker_points, rclick_handler, zoom_handler)
{
	if ( window.location.hash.match(/nomap/) ) {
		return;
	}
	gmap_init_map(window.map_elementid, lat, lon);
	gmap_init_controls();
	gmap_init_mapcenter(lat, lon, zoom, marker_points);
	
	if ( navigator.userAgent.indexOf("Firefox") >= 0) {
		var monitoring_duration = 30; // for 15 sec.
		var set_rclick_handler_timerid = setInterval( function () {
			gmap_init_event_handlers(rclick_handler, zoom_handler);
			if ( monitoring_duration-- < 0 ) {
				clearInterval( set_rclick_handler_timerid );
			}
			trace("hi" + monitoring_duration);
		} , 500);
	} else {
		// need to wait rclick handler's image tile get ready to 
		// setup rclick handler properly.
		setTimeout( function () {
			gmap_init_event_handlers(rclick_handler, zoom_handler);
		} , 30);
	}

	return map;
}

function gmap_init_mapcenter(lat, lon, zoom, marker_points)
{
	//var pnt = new GPoint((b.minX + b.maxX) / 2, (b.minY + b.maxY) / 2);
	if (lat == null || lon == null)
		return;

	var map_center = new GLatLng(lat, lon);
	map.setCenter( map_center );
	
	{
		if (marker_points != null) {
			var b = get_spanning_bounds( marker_points );
			
			var lng = (b.getSouthWest().x + b.getNorthEast().x) / 2 ;
			var lat = (b.getSouthWest().y + b.getNorthEast().y) / 2 ;

			var maxzoom = map.getBoundsZoomLevel( b );
			//zoom--; // make room for footer.

			if (zoom != null)
				zoom += maxzoom;
			else
				zoom = maxzoom;

			map.setCenter( map_center, zoom );
			window.b = b;
		} else {
			var maptype = map.getCurrentMapType();
			var maxres = maptype.getMaximumResolution(map_center)
			if (zoom == null) {
				zoom = maxres;
			} else if (zoom < 0) {
				zoom = maxres + zoom;
			} else {
			}
			map.setCenter( map_center, zoom );
		}
		var e = $("menu_toggle_map");
		if (e)
			e.style.visibility = "visible";
	}
}
/**
 * make current (lat, lon) point visible in the right small window.
 * @param lat the point of latitude to make visible. 
 * @param lon the point of longitude to make visible. 
 **/
function make_point_visible(lat, lon, dont_pan)
{
	var map_center = new GLatLng(lat, lon);
	wc.make_point_visible(map_center, dont_pan);
	/*
	var zoom = map.getZoom();
	var overlay_window = document.getElementById('window');
	if  (overlay_window.style.visibility != 'hidden') {
		var map_center = __calc_centerX_covered(lat, lon, overlay_window);
		map.panTo(map_center);
	}
	*/
	return map_center;
}


function get_marker_icon(marker_index)
{
	var imgname;
	if (marker_index != null && marker_index > 0) {
		//var letter = String.fromCharCode("A".charCodeAt(0) + marker_index);
		var letter = "_";
		imgname = "http://img.mogue.jp/img/marker/marker" + letter + ".v1-0.png";
	} else {
		imgname = "http://img.mogue.jp/img/marker/marker.v1-0.png";
	}

	default_icon = new GIcon(G_DEFAULT_ICON,  imgname);

	if( navigator.userAgent.match( "MSIE" ) ) {
		//default_icon.shadow = null;
		default_icon.shadow = "http://img.mogue.jp/img/marker/shadow50.v1-0.png";
	} else {
		default_icon.shadow = "http://img.mogue.jp/img/marker/shadow50.v1-0.png";
	}
	default_icon.dragCrossImage = "http://img.mogue.jp/img/marker/drag_cross.png";
	//default_icon.iconSize = new GSize(20, 34); original marker size.
	default_icon.iconSize = new GSize(24, 38);

	default_icon.printImage = imgname;
	default_icon.mozPrintImage = imgname;

	default_icon.shadowSize = new GSize(37, 34);
	default_icon.iconAnchor = new GPoint(9, 34);
	default_icon.infoWindowAnchor = new GPoint(9, 2);
	default_icon.infoShadowAnchor = new GPoint(18, 25);

	return default_icon;
}

/**
 * place a marker on the map.
 * @param    p              point where place marker.
 * @param    html_callback  function returns html which is displayed in infowindow.
 * @return
 **/
function create_marker (p, html_callback, enable_open_info, marker_index, is_draggable, title)
{
	try{
		var marker;
		
		var icon = get_marker_icon(marker_index);
		var opts = {
			"icon": icon,
			draggable: is_draggable
		};
		if (title) {
			opts['title'] = title;
		}

		marker = new GMarker(p, opts);

		marker.__icon_index = marker_index;
		
		if (enable_open_info) {
			GEvent.addListener(marker, 'click',
				function() {
					marker.openInfoWindowHtml(
						html_callback(p)
					);
				}
			);
		}
		return marker;
	} catch(e) {
		trace(e);
	}
}


function get_spanning_bounds(marker_points)
{
	var points = $H(marker_points);

	if ( $A(marker_points).length == 0 )
		return null;

	var north   = points.max( function (a) { var y = a[1].lat || a[1].y; return y; } );
	var west    = points.min( function (a) { var x = a[1].lon || a[1].x; return x; } );
	var south   = points.min( function (a) { var y = a[1].lat || a[1].y; return y; } );
	var east    = points.max( function (a) { var x = a[1].lon || a[1].x; return x; } );

	var b = new GLatLngBounds( new GLatLng(north, west), new GLatLng(south, east));
	return b;
}


function draw_rect(points)
{
	var p = [];
	var left   = (points[0].x < points[1].x) ? points[0].x : points[1].x;
	var right  = (points[0].x > points[1].x) ? points[0].x : points[1].x;
	var top    = (points[0].y < points[1].y) ? points[0].y : points[1].y;
	var bottom = (points[0].y > points[1].y) ? points[0].y : points[1].y;

	p.push( new GPoint(left, top) );
	p.push( new GPoint(right, top) );
	p.push( new GPoint(right, bottom) );
	p.push( new GPoint(left, bottom) );
	p.push( new GPoint(left, top) );

	var poly = new GPolyline(p) ;
	
	map.addOverlay( poly );

	return {
		rect: new GBounds(left, top, right, bottom),
		poly: poly
	};
}

/**
 *
 *
 @param bounds points should be visible in the map.
 * @param fn     function that invoked afterFinish().
 * @param navid  id of small location navigation menu.
 * @return center latlon.
 */
