function WPGMClosure(obj, method, argsArray) {
	return function() {
		return method.apply(obj, argsArray);
	}
}

function GMap2_WheelZoomEnabled(pane) {
	this.map = new GMap2(pane);
	this.MAX = 19;
	this.mp = 0;
	this.ic = 0;
	this.oc = 0;
	GEvent.bind(this.map, "mousemove", this, this.mousemove);
	GEvent.bind(this.map, "moveend", this, function() {
		this.getZoomInCenter();
		this.getZoomOutCenter();
	});
	if (pane.addEventListener) pane.addEventListener('DOMMouseScroll', function(e) {
		window.event = e;
	}, false);
	if (pane.addEventListener) pane.addEventListener('DOMMouseScroll', WPGMClosure(this, this.getWheelDelta, []), false);
	else 
		pane.onmousewheel = WPGMClosure(this, this.getWheelDelta, []);
	return this.map;
}

GMap2_WheelZoomEnabled.prototype.getWheelDelta = function() {
	var e = event;
	var d = 0;
	if (!e)
		e = (this.map.getPane()).event;
	if (e.wheelDelta) {
		d = e.wheelDelta/120;
		if (window.opera)
			d = -d;
	} else if (e.detail) {
		d = -e.detail/3;
	}
	if (d) {
		this.wheelZoom(d);
		if (e.preventDefault) {
			e.preventDefault();
		}
		e.returnValue = false;
	}
};

GMap2_WheelZoomEnabled.prototype.wheelZoom = function(d) {
	if (d < 0) {
		if (this.map.getZoom() > 0) {
			this.ic = this.map.getCenter();
			this.map.setCenter(this.oc);
			this.map.zoomOut();
			this.getZoomOutCenter();
		}
	} else {
		if (this.map.getZoom() < this.MAX) {
			this.oc = this.map.getCenter();
			this.map.setCenter(this.ic);
			this.map.zoomIn();
			this.getZoomInCenter();
		}
	}
};

GMap2_WheelZoomEnabled.prototype.mousemove = function(latlng) {
	this.mp = latlng;
	this.getZoomInCenter();
	this.getZoomOutCenter();
};

GMap2_WheelZoomEnabled.prototype.getZoomInCenter = function() {
	if (!this.mp) return null;
	var a = this.mp; var b = this.map.getCenter();
	if (Math.max(a.lng(), b.lng()) - Math.min(a.lng(), b.lng()) > Math.max(a.lng(), b.lng())) {
		if (a.lng() < 0) a = new GLatLng(a.lat(), a.lng() + 360, true);
		else b = new GLatLng(b.lat(), b.lng() + 360, true);
	}
	var ne = new GLatLng(Math.max(a.lat(),b.lat()), Math.max(a.lng(),b.lng()));
	var sw = new GLatLng(Math.min(a.lat(),b.lat()), Math.min(a.lng(),b.lng()));
	var nb = new GLatLngBounds(sw, ne);
	this.ic = nb.getCenter();
};

GMap2_WheelZoomEnabled.prototype.getZoomOutCenter = function() {
	if (!this.mp) return null;
	var cp = this.map.getCenter();
	this.oc = new GLatLng(2*cp.lat()-this.mp.lat(),2*cp.lng()-this.mp.lng());
};

function wp_googlemaps_geocoding(e) {
	var content = document.getElementById("content");
	var regex = /\<!--\s*googlemaps:({.*})\s*--\>/;
	var matches = content.value.match(regex);
	if (matches) {
		eval('var params = '+ matches[1]);
		if (!params.lat) {
			var geocoder = new GClientGeocoder();
			if (geocoder) {
				if (params.loc) {
					geocoder.getLatLng(
						params.loc,
						function(point) {
							if (!point) {
								alert("｡ﾖ"+params.loc+"｡ﾗ､ﾏｸｫ､ﾄ､ｫ､熙ﾞ､ｻ､｣");
							} else {
								var cat = (params.cat)? "cat:"+params.cat+", ": "";
								var newval = "<!-- googlemaps:{loc:\""+params.loc+"\", "+cat+"lat:"+parseFloat(point.lat)+", lng:"+parseFloat(point.lng)+"} -->";
								content.value = content.value.replace(regex, newval);
								wp_googlemaps_dispadminmap();
							}
						}
					);
				}
			}
		}
	}
}

function createMarker(target) {
	var icon = new GIcon();
	icon.image = "/wp-content/uploads/2007/02/ping.png";
	icon.shadow = "/wp-content/uploads/2007/02/ping_shadow.png";
	icon.iconSize = new GSize(31, 42);
	icon.shadowSize = new GSize(31, 42);
	icon.iconAnchor = new GPoint(0, 42);
	icon.infoWindowAnchor = new GPoint(15, 0);
	var marker = new GMarker(new GLatLng(parseFloat(target.lat), parseFloat(target.lng)), icon);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml("<h4><a href=\""+target.href+"\">"+target.title+"</a></h4>"+((target.thumb)? "<img src=\""+target.thumb+"\" style=\"float:left;\" />": "")+"<p>"+target.loc+"</p>"
		);
	});
	return marker;
}

function wp_googlemaps_dispmap() {
	var target = googlemaps_param;
	var option = googlemaps_option;
	var others = posts_params;
	if (GBrowserIsCompatible()) {
		if (option.zoomable == "on") {
			var map = new GMap2_WheelZoomEnabled(document.getElementById("googlemaps"));
		} else {
			var map = new GMap2(document.getElementById("googlemaps"));
		}
		var point = new GLatLng(parseFloat(target.lat), parseFloat(target.lng));
		if (option.ctltype == "ctllarge") map.addControl(new GLargeMapControl());
		if (option.ctltype == "ctlsmall") map.addControl(new GSmallMapControl());
		if (option.ctltype == "ctlzoom") map.addControl(new GSmallZoomControl());
		if (option.maptypectl == "on") map.addControl(new GMapTypeControl());
		if (option.overviewctl == "on") map.addControl(new GOverviewMapControl(new GSize(parseInt(option.overviewctl_width),parseInt(option.overviewctl_height))));
		if (option.scalectl == "on") map.addControl(new GScaleControl());
		if (option.zoomable == "on") {
			map.enableDoubleClickZoom();
			map.enableContinuousZoom();
		}
		var maptype = 0;
		switch(option.maptype) {
		case "typesatellite":
			maptype = G_SATELLITE_MAP;
			break;
		case "typehybrid":
			maptype = G_HYBRID_MAP;
			break;
		default:
			maptype = G_NORMAL_MAP;
		}
		var zoom = parseInt((target.loc)? option.zoomlevel: option.categorized_zoomlevel);
		map.setCenter(point, zoom, maptype);
		if (target.loc) map.addOverlay(createMarker(target));
		if (others.length > 0) {
			for (var i = 0; i < others.length; i++) {
				map.addOverlay(createMarker(others[i]));
			}
		}
	}
}

function wp_googlemaps_dispcategorymap() {
	var option = googlemaps_option;
	var others = posts_params;
	if (GBrowserIsCompatible()) {
		if (option.zoomable == "on") {
			var map = new GMap2_WheelZoomEnabled(document.getElementById("googlemaps"));
		} else {
			var map = new GMap2(document.getElementById("googlemaps"));
		}
		var point = new GLatLng(parseFloat(others[0].lat), parseFloat(others[0].lng));
		if (option.ctltype == "ctllarge") map.addControl(new GLargeMapControl());
		if (option.ctltype == "ctlsmall") map.addControl(new GSmallMapControl());
		if (option.ctltype == "ctlzoom") map.addControl(new GSmallZoomControl());
		if (option.maptypectl == "on") map.addControl(new GMapTypeControl());
		if (option.overviewctl == "on") map.addControl(new GOverviewMapControl(new GSize(parseInt(option.overviewctl_width),parseInt(option.overviewctl_height))));
		if (option.scalectl == "on") map.addControl(new GScaleControl());
		if (option.zoomable == "on") {
			map.enableDoubleClickZoom();
			map.enableContinuousZoom();
		}
		var maptype = 0;
		switch(option.maptype) {
		case "typesatellite":
			maptype = G_SATELLITE_MAP;
			break;
		case "typehybrid":
			maptype = G_HYBRID_MAP;
			break;
		default:
			maptype = G_NORMAL_MAP;
		}
		var zoom = parseInt(option.zoomlevel);
		map.setCenter(point, zoom, maptype);
		pointsBounds = map.getBounds();
		map.addOverlay(createMarker(others[0]));
		if (others.length > 0) {
			for (var i = 1; i < others.length; i++) {
				if (!pointsBounds.contains(new GLatLng(parseFloat(others[i].lat), parseFloat(others[i].lng)))) {
					pointsBounds.extend(new GLatLng(parseFloat(others[i].lat), parseFloat(others[i].lng)));
				}
				map.addOverlay(createMarker(others[i]));
				map.setCenter(pointsBounds.getCenter(), map.getBoundsZoomLevel(pointsBounds), maptype);
			}
		}
	}
}

function wp_googlemaps_dispadminmap() {
	var adminmap = document.getElementById('adminmap');
	var dispmap = document.createElement('a');
	dispmap.href = "javascript:void(0);";
	dispmap.appendChild(document.createTextNode('Display GoogleMap'));
	while (adminmap.childNodes.length > 0) {
		var childnode = adminmap.firstChild;
		adminmap.removeChild(childnode);
	}
	adminmap.style.bgcolor = "#FFFFFF";
	adminmap.style.height = "1em";
	adminmap.appendChild(dispmap);
	addListener(dispmap, "click", dispMap, false);
}

function checkMapDisplay() {
	var content = document.getElementById("content");
	var regex = /\<!--\s*googlemaps:({.*})\s*--\>/;
	var matches = content.value.match(regex);
	if (matches) {
		wp_googlemaps_dispadminmap();
	}
}

function dispMap() {
	var content = document.getElementById("content");
	var regex = /\<!--\s*googlemaps:({.*})\s*--\>/;
	var matches = content.value.match(regex);
	if (matches) {
		eval('var params = '+ matches[1]);
		if (GBrowserIsCompatible()) {
			var adminmap = document.getElementById('adminmap');
			adminmap.style.width = 'inherit';
			adminmap.style.height = '300px';
			var map = new GMap2_WheelZoomEnabled(adminmap);
			var point = new GLatLng(parseFloat(params.lat), parseFloat(params.lng));
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			map.setCenter(point, 15);
			var marker = new GMarker(point, {draggable: true});
			GEvent.addListener(marker, "dragend", function() {
				var newpoint = marker.getPoint();
				var regex = /\<!--\s*googlemaps:({.*})\s*--\>/;
				var content = document.getElementById('content');
				var matches = content.value.match(regex);
				if (matches) {
					eval('var params = '+ matches[1]);
					var cat = (params.cat)? "cat:"+params.cat+", ": "";
					var newval = "<!-- googlemaps:{loc:\""+params.loc+"\", "+cat+"lat:"+newpoint.lat()+", lng:"+newpoint.lng()+"} -->";
					content.value = content.value.replace(regex, newval);
				}
				map.panTo(newpoint, 15);
			});
			map.addOverlay(marker);
		}
	}
}

	
function addListener(target, eventType, func, cap) {
	if (target.addEventListener) {
		target.addEventListener(eventType, func, cap);
	}
	else {
		target.attachEvent('on'+eventType, func);
	}
}
var googlemaps_option = {content_id:"content",custom_icon:"/wp-content/uploads/2007/02/ping.png",custom_icon_width:"31",custom_icon_height:"42",custom_shadow:"/wp-content/uploads/2007/02/ping_shadow.png",custom_shadow_width:"31",custom_shadow_height:"42",custom_icon_anchor_left:"0",custom_icon_anchor_top:"42",custom_infowindow_anchor_left:"15",custom_infowindow_anchor_top:"0",width:"inherit",height:"300px",zoomlevel:"15",maptype:"typenormal",ctltype:"ctllarge",maptypectl:"on",overviewctl:"on",scalectl:"",zoomable:"on",overviewctl_width:"150",overviewctl_height:"100",show_categorized_map:"on"};
var posts_params = [
	{loc:"高田馬場駅", lat:35.712677, lng:139.703715, title:"プラグインテスト中", href:"http://decama.info/wordpress/63"},
	{loc:"新宿駅", lat:35.689729, lng:139.700464, title:"wp-googlemapsプラグインVer0.1テスト中", href:"http://decama.info/wordpress/62"},
	{loc:"池袋駅", lat:35.730256, lng:139.711086, title:"wp-googlemapsプラグインイメージ連動テスト", href:"http://decama.info/wordpress/65", thumb:"http://decama.info/wp-content/uploads/2006/10/se037_l.thumbnail.jpg"},
	{loc:"東京駅", lat:35.68107370561057, lng:139.76707935333252, title:"wp-googlemaps TODO その１", href:"http://decama.info/wordpress/70", thumb:"http://decama.info/wp-content/uploads/2006/10/post.thumbnail.gif"},
	{loc:"渋谷駅", lat:35.658871, lng:139.701238, title:"wp-googlemaps TODO その２", href:"http://decama.info/wordpress/72", thumb:"http://decama.info/wp-content/uploads/2006/10/config.thumbnail.gif"},
	{loc:"原宿駅", cat:18, lat:35.670646, lng:139.702592, title:"wp-googlemaps TODO その３", href:"http://decama.info/wordpress/74"},
	{loc:"品川駅", lat:35.62876, lng:139.738999, title:"wp-googlemaps TODO その４．５", href:"http://decama.info/wordpress/78"},
	{loc:"秋葉原駅", lat:35.698327101400224, lng:139.77313041687012, title:"javascript:function closure その２", href:"http://decama.info/javascript/80"}
];
addListener(window, "load", wp_googlemaps_dispcategorymap, false);
