/**
 * 学びノート GMapスクリプト
 * @author	uju
 * @version	0.2; 2007/03/22
 */

var PHP_DIRECTORY="/gmap/";	// map関連PHPへのパス

var map;			// GMap
var targetIcon;		// icon

targetIcon = new GIcon();
targetIcon.image  = "/gmap/images/arw.png";
targetIcon.shadow = "/gmap/images/arw_shade.png";
targetIcon.iconSize = new GSize(34, 21);
targetIcon.iconAnchor = new GPoint(11, 17);
targetIcon.shadowSize = new GSize(32, 21);
targetIcon.infoWindowAnchor = new GPoint(11, 2);
targetIcon.infoShadowAnchor = new GPoint(34, 21);


/*==================================================================
GMap初期化
==================================================================*/
function MapManager(mapdiv, x, y, zm, smallctrl) 
{
	this.mapholder = mapdiv;
	this.map = new GMap(mapdiv);
	this.ctrl_s = (smallctrl)? new GSmallMapControl() : new GLargeMapControl();
	this.ctrl_t = new GMapTypeControl();
	this.defaultLatLng = new GPoint(x, y);
	this.defaultZoom = zm;
	this.resetPosition();
	
	this.mapholder.gmapObject = this.map;
	this.landmarks = new Array();
	this.initialize();
}

MapManager.prototype = {
	
	initialize : function() {
	},
	
	showControl : function(b) {
		this.setControl_s(b);this.setControl_t(b);
	},
	setControl_s : function(b) {
		if (this.ctrlon_s == b) return;this.ctrlon_s=b;
		if (b) this.map.addControl(this.ctrl_s);
		else this.map.removeControl(this.ctrl_s);
	},
	setControl_t : function(b) {
		if (this.ctrlon_t == b) return;this.ctrlon_t=b;
		if (b) this.map.addControl(this.ctrl_t);
		else this.map.removeControl(this.ctrl_t);
	},
	setWheelScale : function(b) {
		var m=this.mapholder;
		if (m.attachEvent) m.attachEvent("onmousewheel", wheelScale);
		else if (m.addEventListener) m.addEventListener('DOMMouseScroll', wheelScale ,false);
	},
	
	resetPosition : function() {
		this.map.centerAndZoom(this.defaultLatLng, this.defaultZoom);
	},
	
	getLandmark : function(id) {
		for (var i=0; i<this.landmarks.length; i++) {
			if (this.landmarks[i].id == id) return this.landmarks[i];
		}
		return false;
	},
	
	createLandmark : function(iniObj, noClickEvent) {
		return new Landmark(this, iniObj, noClickEvent);
	},
	
	addLandmark : function(lm) {
		for (var i=0; i<this.landmarks.length; i++) {
			if (this.landmarks[i].id == lm.id) {
				this.removeLandmark(lm.id);
				break;
			}
		}
		this.landmarks.push(lm);
		return lm;
	},
	
	removeLandmark : function(delID) {
		if (typeof(delID) == "object") delID = delID.id;
		for (var i=0; i<this.landmarks.length; i++) {
			if (this.landmarks[i].id != delID) continue;
			this.landmarks[i].kill();
			this.landmarks.splice(i, 1);
			break;
		}
	},
	
	toString : function() {
		return "[object MapManager]";
	}
}

/*==================================================================
ランドマークオブジェクト
==================================================================*/
function Landmark(mapMgr, iniObj, noClickEvent)
{
	this.mapMgr = mapMgr; this.map = mapMgr.map;
	this.noClickEvent = noClickEvent;
	this.marker   = 0;
	this.edited   = false;
	this.saveData = new Object();
	if (!iniObj) iniObj = {};
	var defObj = {id:0, mark_type:101, name:"", link:"", image:"", point:new GPoint(0,0), zoom_min:0, zoom_max:7, selected:false};
	var trueIniObj = new Object();
	for (var i in defObj) {
		trueIniObj[i] = (typeof(iniObj[i]) != "undefined")? iniObj[i] : defObj[i];
	}
	this.setup(trueIniObj);
}

Landmark.prototype = {
	setup : function(iniObj) {
		for (var i in iniObj) this[i] = iniObj[i];
		this.save();
		this.createMessage();
	},
	
	readXml : function(xml) {
		var iniObj = new Object();
		iniObj.id = parseInt(xml.getAttribute("id"));
		iniObj.mark_type = parseInt(xml.getElementsByTagName("mark_type")[0].firstChild.nodeValue);
		iniObj.name = xml.getElementsByTagName("name")[0].firstChild.nodeValue;
		var lnk = xml.getElementsByTagName("link");
		if (lnk.length) iniObj.link = lnk[0].firstChild.nodeValue;
		var pt = xml.getElementsByTagName("point")[0];
		iniObj.point = new GPoint(parseFloat(pt.getAttribute("x")), parseFloat(pt.getAttribute("y")));
		var zm = xml.getElementsByTagName("zoom")[0];
		iniObj.zoom_min = parseInt(zm.getAttribute("min"));
		iniObj.zoom_max = parseInt(zm.getAttribute("max"));
		this.setup(iniObj);
	},
	
	// マーカーを描画するべきなら描画する（画面外のときfalseを返す)
	draw : function(redrawflag) {
		if (!this.map) return false;
		if (!this.selected && !this.isInZoom()) {
			if (this.marker != 0) this.removeMarker();
			return this.isInArea();
		} else {
			if (this.selected || this.isInArea()) {
				if (this.marker == 0 || redrawflag) this.createMarker();
				return true;
			} else {
				this.removeMarker();
				return false;
			}
		}
	},
	
	setSelect : function(b) {
		this.selected = b;
		this.icon = (b)? targetIcon : null;
		this.draw(true);
	},
	
	createMarker : function()
	{
		if (this.marker != 0) this.removeMarker();
		if (!this.selected && !this.isInZoom()) return;
		var ico;
		if (this.icon) ico = new GIcon(this.icon);
		this.marker = new GMarker(this.point, ico);
		this.marker['ownerLandmark'] = this;
		this.map.addOverlay(this.marker);
		var me = this;
		if (!this.noClickEvent) this.eventID = GEvent.addListener(this.marker, "click", function() {me.openInfo()});
		return this.marker;
	},
	
	removeMarker : function() {
		if (this.marker == 0) return;
		this.map.removeOverlay(this.marker);
		if (this.eventID != -1) GEvent.removeListener(this.eventID);
		this.map.closeInfoWindow();
		this.eventID = -1;
		this.marker = 0;
	},
	
	isInArea : function(bnd) {
		var bnd = this.map.getBoundsLatLng();
		var p = this.point;
		if (p.x < bnd.minX*2-bnd.maxX) return false;
		if (p.x > bnd.maxX*2-bnd.minX) return false;
		if (p.y < bnd.minY*2-bnd.maxY) return false;
		if (p.y > bnd.maxY*2-bnd.minY) return false;
		return true;
		return (bnd.minX<=p.x && p.x<=bnd.maxX && bnd.minY<=p.y && p.y<=bnd.maxY);
	},
	
	isInZoom : function(zoom) {
		if (typeof(zoom) != "number") zoom = this.map.getZoomLevel();
		return (this.zoom_min <= zoom && zoom > this.zoom_max);
	},

	createMessage : function(discription)
	{
		this.messageHtml = this.name;
		if (this.link != "") this.messageHtml = '<a href="'+ this.link +'" target="_blank">' + this.messageHtml + '</a>';
		this.messageHtml = '<p class="infotitle">'+ this.messageHtml +'</p>';
		if (!!discription) this.messageHtml += discription;
		this.messageHtml = '<div class="infobody">' + this.messageHtml + '</div>';
	},
	
	openInfo : function() {
		this.marker.openInfoWindowHtml(this.messageHtml);
	},
	
	setAttribute : function(name, val) {
		this.setEdited(true);
		this[name] = val
		if (name == "name" || name == "link") {
			this.createMessage();
		}
	},
	
	setEdited : function(b) {
		this.edited = b;
	},
	
	save : function() {
		this.edited = false;
		this.saveData.id = this.id;
		this.saveData.mark_type = this.mark_type;
		this.saveData.name = this.name;
		this.saveData.link = this.link;
		this.saveData.image = this.image;
		this.saveData.point = new GPoint(this.point.x, this.point.y);
		this.saveData.zoom_min = this.zoom_min;
		this.saveData.zoom_max = this.zoom_max;
		this.setEdited(false);
	},
	
	revert : function() {
		this.id = this.saveData.id;
		this.mark_type = this.saveData.mark_type;
		this.name = this.saveData.name;
		this.link = this.saveData.link;
		this.image = this.saveData.image;
		this.point = new GPoint(this.saveData.point.x, this.saveData.point.y);
		this.zoom_min = this.saveData.zoom_min;
		this.zoom_max = this.saveData.zoom_max;
		this.createMessage();
		this.draw();
		this.setEdited(false);
	},
	
	kill : function() {
		this.removeMarker();
	},
	
	toString : function() {
		return "Landmark("+ this.id +")";
	}
}

function wheelScale(e)
{
	var t=e.srcElement || e.target;
	while(t) {
		if (t.gmapObject) {
			var a=(e.wheelDelta || (e.preventDefault(),-e.detail))<0? -1:1;
			t.gmapObject.zoomTo(t.gmapObject.getZoomLevel() + a);
			return false
		}
		t = t.parentNode;
	}
	return true;
}

/*==================================================================
Utility
==================================================================*/
function xRound(n, dig) {
	var pow = Math.pow(10, dig);
	return Math.round(n*pow) / pow;
}


