Me2Map = {
	map: null,
	
	create: function(container) {
		if( Me2Map.map ) {
			return;
		}

		Me2Map.map = new NMap(container);		
		Me2Map.zoom = new NZoomControl();
		Me2Map.addControl(Me2Map.zoom);
	},	

	distancePerPixel: function() {
		return Me2Map.map.spec.distancePerPixel(2-Me2Map.getZoom());
	},

	point2pixel: function(point) {
		var d_px = Me2Map.distancePerPixel();
		var x = Me2Map.map.getBound()[0];
		var y = Me2Map.map.getBound()[1];
		
		return new NPoint((point.x - x) * d_px, (y - point.y) * d_px);
	},

	pixel2point: function(pixel) {
		var d_px = Me2Map.distancePerPixel();
		var x = Me2Map.map.getBound()[0];
		var y = Me2Map.map.getBound()[1];

		return new NPoint(x + pixel.x / d_px, y - pixel.y / d_px);
	},

	// coord
	getBound: function() { return Me2Map.map.getBound(); },
	setBound: function(l, t, r, b) { return Me2Map.map.setBound(l, t, r, b); },
	getCenter: function() { return Me2Map.map.getCenter(); },
	setCenter: function(pos) { Me2Map.map.setCenter(pos); },
	setCenterAndZoom: function(pos, zoom) { Me2Map.map.setCenterAndZoom(pos, zoom); },

	// zoom
	getZoom: function() { return Me2Map.map.getZoom(); },
	setZoom: function(zoom) { Me2Map.map.setZoom(zoom); },
	zoomIn: function() { Me2Map.map.zoomIn(); return Me2Map.map.getZoom(); },
	zoomOut: function() { Me2Map.map.zoomOut(); return Me2Map.map.getZoom(); },

	// overlay - NMark, NPolyline, NInfoWindow
	addOverlay: function(overlay, key) { Me2Map.map.addOverlay(overlay, key); },
	clearOverlays: function(key) { Me2Map.map.clearOverlays(key); Balloon.hide(); },
	removeOverlay: function(overlay) { Me2Map.map.removeOverlay(overlay); },

	// control - zoom, index map, save button
	addControl: function(control) { Me2Map.map.addControl(control); },
	removeControl: function(control) { Me2Map.map.removeControl(control); }
};

Me2MapListener = {
	create: function(map, container) {
		NEvent.addListener(Me2Map.map, "dblclick", function(pos) {
			if( YAHOO.ME2MAP.mode.match("WRITE") ) {
				Me2MapListener.onWrite(pos);
				YAHOO.ME2MAP.x = pos.x;
				YAHOO.ME2MAP.y = pos.y;
			}
			else {
				Balloon.hide();
			}
		});
		NEvent.addListener(Me2Map.map, "startDrag", function(left, top, right, bottom) {
			Balloon.hide();
		});
		NEvent.addListener(Me2Map.map, "endDrag", function(left, top, right, bottom) {
			Me2MapListener.onRedrawXY();
		});
		NEvent.addListener(Me2Map.map, "redraw", function() {
			if( YAHOO.ME2MAP.zoom == Me2Map.getZoom() ) {
				Me2MapListener.onRedrawXY();
			}
			else {
				Me2MapListener.onRedrawZoom();
			}
		});
	},

	onWrite: function(pos) {
		switch( YAHOO.ME2MAP.mode ) {
		case "WRITE_POST":
			var image = "image/icon_post.gif";
			break;
		case "WRITE_COMMENT":
			var image = "image/icon_comment.gif";
			break;
		case "WRITE_SHADOW":
			var image = "image/icon_shadow.gif";
			break;
		}

		Me2Map.clearOverlays();
		var icon = new NIcon(image, new NSize(24, 24));
		var mark = new NMark(pos, icon);
		mark.setOverAmt(0, 0);
		Me2Map.addOverlay(mark);
	},

	onRedrawXY: function() {
		var zoom = Me2Map.getZoom();
		var x = Me2Map.getCenter().x;
		var y = Me2Map.getCenter().y;
		var divide = 1;

		switch( zoom ) {
		case 1:
		case 2:
			divide = 2000;
			break;
		case 3:
		case 4:
			divide = 10000;
			break;
		case 5:
		case 6:
		case 7:
			divide = 30000;
			break;
		default:
			return;
			break;
		}

		var x1 = Math.floor(YAHOO.ME2MAP.redrawX / divide);
		var x2 = Math.floor(x / divide);
		var y1 = Math.floor(YAHOO.ME2MAP.redrawY / divide);
		var y2 = Math.floor(y / divide);
		if( Math.abs(x1 - x2) > 1 || Math.abs(y1 - y2) > 1 ) {
			YAHOO.ME2MAP.redrawX = x;
			YAHOO.ME2MAP.redrawY = y;

			Balloon.hide();
			Me2Map.clearOverlays();
			Me2MapListener.onLoad();
		}
	},

	onRedrawZoom: function() {
		YAHOO.ME2MAP.zoom = Me2Map.getZoom();
		YAHOO.ME2MAP.redrawX = Me2Map.getCenter().x;
		YAHOO.ME2MAP.redrawY = Me2Map.getCenter().y;

		Balloon.hide();
		Me2Map.clearOverlays();
		Me2MapListener.onLoad();
	},

	onLoad: function() {
		if( !YAHOO.ME2MAP.mode || !YAHOO.ME2MAP.mode.match("READ") ) {
			return;
		}

		ReadDB.afterRead = function(json) {
			for( var i = 0; i < json.length; i++ ) {
				if( json[i].r != "" ) {
					var image = "image/icon_comment.gif";
				}
				else if( json[i].id == "shadow" || json[i].id == "me2map" ) {
					var image = "image/icon_shadow.gif";
				}
				else {
					var image = "image/icon_post.gif";
				}

				var is_comment = (json[i].r != "") ? 1 : 0;
				var icon = new NIcon(image, new NSize(24, 24));
				if( Me2Map.getZoom() > 7 ) {
					var mark = new NMark(new NPoint(json[i]._x, json[i]._y), icon);
					mark.real_x = json[i].x;
					mark.real_y = json[i].y;
				}
				else {
					var mark = new NMark(new NPoint(json[i].x, json[i].y), icon);
				}
				mark.owner = json[i].id;
				mark.refer = json[i].r;
				mark.reg_time = json[i].t;
				mark.is_comment = is_comment;
				mark.setOverAmt(0, 0);
				Me2Map.addOverlay(mark);

				NEvent.addListener(mark, "click", function(pos) {
					if( Me2Map.getZoom() <= 7 ) {
						ReadPosts.afterRead = function(json) {
							var pixel = Me2Map.point2pixel(pos);
							fillMe2DAY(json, pos.x, pos.y, ReadPosts.refer);
							Balloon.show(pixel.x, pixel.y, json[0].body, json[0].author.nickname, json[0].icon); //, ReadPosts.refer);
						}
						ReadPosts.read(this.owner, this.reg_time, this.refer);
					}
					else {
						Me2Map.setCenterAndZoom(new NPoint(this.real_x, this.real_y), 5);
					}
				});
				NEvent.addListener(mark, "mouseover", function(pos) {
					var pixel = Me2Map.point2pixel(pos);
					var text = (Me2Map.getZoom() <= 7) ? this.owner : this.reg_time + ' posts';;
					var r = YAHOO.util.Dom.getRegion("window_container");
					Balloon.showID(pixel.x, pixel.y, text);
				});
				NEvent.addListener(mark, "dblclick", function(pos) {
					Balloon.hide();
				});
			}
		}

		switch( YAHOO.ME2MAP.mode ) {
		case "READ_DATE":
			var read = ReadDB.readDate();
			break;
		case "READ_ID":
			var read = ReadDB.readID();
			break;
		case "READ_TAG":
			var read = ReadDB.readTag();
			break;
		}

		if( read ) {
			Balloon.hide();
			Me2Map.clearOverlays();
		}
	}
};
