/**
 * 地図共有インターフェース <br>
 * @author Toshihiro Hiraoka
 * @version 1.0
 */

/**
 * 地図コンストラクター 地図の初期化を行う
 * @author Toshihiro Hiraoka
 * @constructor
 * @param divid 地図を表示するDIVタグのID
 * @param dlon 初期表示経度 省略時はdefaultLon
 * @param dlat 初期表示緯度 省略時はdefaultLat
 * @param dscale 初期表示スケール 省略時はdefaultScale
 * @param isMovable 移動可能地図にするか [true|false]
 */ 
function cheetahMap(divname, dlon, dlat, dscale, isMovable) {
	_initDHTMLAPI();
	// 登録されているホストかをチェック
	if ( _checkHost() == false ) {
		alert("キーが正しくありません。\nこの地図を利用したい方は以下のメールアドレスにご連絡ください。\n" + adminAddress);
		return;
	}
	if ( typeof(dscale) == 'undefined')
		dscale = defaultScale;
	if ( typeof(dlon) == 'undefined')
		dlon = _dd2mercX(defaultLon);
	if ( typeof(dlat) == 'undefined')
		dlat = _dd2mercY(defaultLat);
	if ( typeof(isMovable) == 'undefined')
		isMovable = true;
        
	/**  DIVタグIDを追加 */
        this.id = divname;
	/** 初期表示位置経度 */
        //this.defaultlon = _dd2mercX(dlon);
        this.defaultlon = dlon;
	/** 初期表示位置緯度 */
        //this.defaultlat = _dd2mercY(dlat);
        this.defaultlat = dlat;
	/** 初期表示スケール */
        this.defaultscale = dscale;
	/** kaMapオブジェクト */
        this.kaMap = new _kaMap(divname);
	/** 移動履歴を格納 */
	this.kaMap.pointHistory = new Array();
	/** 地図移動の可否 */
	this.isMovable = isMovable;
	/** 矩形選択オブジェクト */
	this._zoomRect = new _kaRubberZoom( this.kaMap);
	/** ポイント表示レイヤ */
        this.pLayer = this.kaMap.createDrawingCanvas(9);
        this.pLayer.id = "canvas" + divname;

	var viewport = document.getElementById(divname);
        viewport.backgroundColor = "#f0f0f0";
        viewport.style.overflow = "hidden";
        viewport.style.position = "relative";
	viewport.cheetahMap = this;
	this.createMap();
	/** キーマップの状態 */
	this.hasKeymap = false;
	if ( this.isMovable ) {
		this.kaMap.isMovable = true;
	/** 地図ナビゲーションオブジェクト */
        	this.navi = new _kaNavigator( this.kaMap );
        	this.navi.activate();
	} else {
		this.kaMap.isMovable = false;
	}

}

/**
 * 地図レイヤの作成
 * @author Toshihiro Hiraoka
 */
cheetahMap.prototype.createMap = function() {
        var map = new _map({name:'cheetahmap',title:'cheetahmap',currentScale: 0,units:3,resolution:96,version:'',scales:aszScales});
        //var map = new _map({name:'cheetahmap',title:'cheetahmap',currentScale: 0,units:5,resolution:72,version:'',scales:aszScales});
        map.aZoomTo[0] = this.defaultlon;
        map.aZoomTo[1] = this.defaultlat;
        map.aZoomTo[2] = this.defaultscale;
	map.addLayer(new _layer( { name:'__base__',visible:true,opacity:100,imageformat:'png24',queryable:false,tileSource:'auto',redrawInterval:-1,refreshInterval:-1,scales: new Array('1','1','1','1','1','1')}));
        map.resolution = resolution;
        this.kaMap.addMap(map);
        this.kaMap.tileWidth = tilewidth;
        this.kaMap.tileHeight = tileheight;
        this.kaMap.server = serverPath;
        this.kaMap.tileURL = tileManager;
        this.kaMap.selectMap(defaultMap);
        this.kaMap.initializationState = 2;
}

var controlZindex = 5;
var sliderBarTop = 5;
var sliderBarLeft = 5;
/**
 * 地図コントロールの追加
 * @author Toshihiro Hiraoka
 k @param divid コントロールを追加するDIVタグのID 省略時は地図内に配置
 */
cheetahMap.prototype.addControl = function(divid) {
	if ( typeof(divid) == "undefined") {
		var controlDiv = document.createElement("div");
		controlDiv.style.zIndex = 2;
		controlDiv.style.position = "absolute";
		controlDiv.style.top = "5px";
		controlDiv.style.left = "5px";
		this.kaMap.domObj.appendChild(controlDiv);
	} else {
		try {
			var controlDiv = document.getElementById(divid);
		} catch(e) {
			// TODO
		}
	}
/*
	var imgZoomIn = document.createElement("img");
	var imgZoomOut = document.createElement("img");
	var imgZoomRect = document.createElement("img");
	imgZoomIn.src = serverPath + "/images/icon_set_nomad/tool_zoomin_1.png";
	imgZoomOut.src = serverPath + "/images/icon_set_nomad/tool_zoomout_1.png";
	imgZoomRect.src = serverPath + "/images/icon_set_nomad/tool_rubberzoom_1.png";
	imgZoomIn.kaMap = this.kaMap;
	imgZoomOut.kaMap = this.kaMap;
	imgZoomRect.zoomRect = this.zoomRect;
	_addEvent(imgZoomIn, "click", _zoomIn);
	_addEvent(imgZoomOut, "click", _zoomOut);
	_addEvent(imgZoomRect, "click", _zoomRect);
	controlDiv.appendChild(imgZoomIn);
	controlDiv.appendChild(imgZoomOut);
	controlDiv.appendChild(imgZoomRect);
	if ( this.kaMap.isMovable ) {
		var imgNavi = document.createElement("img");
		imgNavi.src = serverPath + "/images/icon_set_nomad/tool_pan_1.png";
		imgNavi.navi = this.navi;
		//imgNavi.addEvent("click", _dragMove, false);
		_addEvent(imgNavi, "click", _dragMove);
		controlDiv.appendChild(imgNavi);
		var imgBack = document.createElement("img");
		imgBack.src = serverPath + "/images/arrow_left.png";
		imgBack.kaMap = this.kaMap;
		_addEvent(imgBack, "click", _backToHistory);
		controlDiv.appendChild(imgBack);
	}
*/
        var sliderDiv = document.createElement("div");
        sliderDiv.style.zIndex = controlZindex;
        sliderDiv.style.position = "absolute";
        sliderDiv.style.top = "5px";
        sliderDiv.style.left = "5px";
        sliderDiv.id = "dSlider";
        var tSlider = document.createElement("table");
        tSlider.style.position = "absolute";
        tSlider.style.top = "5px";
        tSlider.style.left = "10px";
        tSlider.border = 0;
        tSlider.cellspacing = 0;
        tSlider.cellpadding = 0;
        sliderDiv.appendChild(tSlider);
        var tbSlider = document.createElement("tbody");
        tSlider.appendChild(tbSlider);

        // アイコン定義
        var imgZoomIn = document.createElement("img");
        var imgZoomOut = document.createElement("img");
        var imgZoomRect = document.createElement("img");
        imgZoomIn.src = serverPath + "/images/icon_set_nomad/tool_zoomin_1.png";
        imgZoomOut.src = serverPath + "/images/icon_set_nomad/tool_zoomout_1.png";
        imgZoomRect.src = serverPath + "/images/icon_set_nomad/tool_rubberzoom_1.png";
        imgZoomIn.kaMap = this.kaMap;
        imgZoomOut.kaMap = this.kaMap;
        imgZoomIn.cheetahMap = this;
        imgZoomOut.cheetahMap = this;
        imgZoomRect.zoomRect = this.zoomRect;
        _addEvent(imgZoomIn, "click", _zoomIn);
        _addEvent(imgZoomOut, "click", _zoomOut);
        _addEvent(imgZoomRect, "click", _zoomRect);

        // zoomin
        var trZoomIn = document.createElement("tr");
        var tdZoomIn = document.createElement("td");
        tdZoomIn.appendChild(imgZoomIn);
        trZoomIn.appendChild(tdZoomIn);
        tbSlider.appendChild(trZoomIn);
/* TODO: slider
        for ( var i = 0; i < this.kaMap.getCurrentMap().aScales.length; i++ ) {
                var trSlider = document.createElement("tr");
                tbSlider.appendChild(trSlider);
                var tdSlider = document.createElement("td");
                trSlider.appendChild(tdSlider);
                var imgSlider = document.createElement("img");
                imgSlider.src = serverPath + "/images/barbodys.png";
                imgSlider.cheetahMap = this;
                imgSlider.scalenum = i;
                imgSlider.style.cursor = "pointer";
                _addEvent(imgSlider, "click", _onSliderBarClick);
                tdSlider.appendChild(imgSlider);
        }
*/
        // zoomout
        var trZoomOut = document.createElement("tr");
        var tdZoomOut = document.createElement("td");
        tdZoomOut.appendChild(imgZoomOut);
        trZoomOut.appendChild(tdZoomOut);
        tbSlider.appendChild(trZoomOut);

        // zoomrect
        var trZoomRect = document.createElement("tr");
        var tdZoomRect = document.createElement("td");
        tdZoomRect.appendChild(imgZoomRect);
        trZoomRect.appendChild(tdZoomRect);
        tbSlider.appendChild(trZoomRect);

        if ( this.kaMap.isMovable ) {
                // 移動モード
                var imgNavi = document.createElement("img");
                imgNavi.src = serverPath + "/images/icon_set_nomad/tool_pan_1.png";
                imgNavi.navi = this.navi;
                _addEvent(imgNavi, "click", _dragMove);
                var trImgNavi = document.createElement("tr");
                var tdImgNavi = document.createElement("td");
                tdImgNavi.appendChild(imgNavi);
                trImgNavi.appendChild(tdImgNavi);
                tbSlider.appendChild(trImgNavi);
                //controlTlDiv.appendChild(imgNavi);
                var imgBack = document.createElement("img");
                imgBack.src = serverPath + "/images/arrow_left.png";
                imgBack.kaMap = this.kaMap;
                _addEvent(imgBack, "click", _backToHistory);
                var trImgBack = document.createElement("tr");
                var tdImgBack = document.createElement("td");
                tdImgBack.appendChild(imgBack);
                trImgBack.appendChild(tdImgBack);
                tbSlider.appendChild(trImgBack);
                //controlTlDiv.appendChild(imgBack);

        }

/*
        // つまみ
        var sliderPoint = document.createElement("img");
        sliderPoint.src = serverPath + "/images/soko.gif";
        sliderPoint.style.position = "absolute";
        sliderPoint.style.top = "2px";
        sliderPoint.style.left = "0px";
        sliderPoint.style.zIndex = 2;
        sliderPoint.cheetahMap = this;
        this.slider = sliderPoint;
        _addEvent(sliderPoint, "mousedown", _onSliderMousedown);
        _addEvent(sliderPoint, "mouseup", _onSliderMouseup);
        sliderDiv.appendChild(sliderPoint);
*/
        this.kaMap.domObj.appendChild(sliderDiv);

};

var isSliding = false;
/**
 * スライダつまみを移動させる
 * @author Toshihiro Hiraoka
 */
cheetahMap.prototype.moveSliderTab = function() {
        var yset = scalenum * 14 + sliderAdjY;
        this.slider.style.top = yset + "px";
};

/**
 *  マウスイベントY座標を地図範囲のピクセルY座標に変換する
 * @author Toshihiro Hiraoka
 * @param y 画面Y座標
 */
cheetahMap.prototype.adjustPixPositionY = function( y ) {
    var obj = this.kaMap.domObj;
    var offsetTop = 0;
    while (obj) {
        offsetTop += parseInt(obj.offsetTop);
        obj = obj.offsetParent;
    }
    var pY = y - offsetTop;
    return pY;
};

/**
 *  マウスイベントX座標を地図範囲のピクセルX座標に変換する
 * @author Toshihiro Hiraoka
 * @param x 画面x座標
 */
cheetahMap.prototype.adjustPixPositionX = function( x ) {
    var obj = this.kaMap.domObj;
    var offsetLeft = 0;
    while (obj) {
        offsetLeft += parseInt(obj.offsetLeft);
        obj = obj.offsetParent;
    }
    var pX = x - offsetLeft;
    return pX;
};

/**
 * キーマップを追加する
 * @author Toshihiro Hiraoka
 * @param divid キーマップを追加するDIVタグのID 省略時は地図内に配置する
 */
cheetahMap.prototype.addKeymap = function(divid) {
	if ( typeof(divid) == "undefined") {
		var keymapDiv = document.createElement("div");
		keymapDiv.style.zIndex = 2;
		keymapDiv.style.position = "absolute";
		keymapDiv.style.top = "5px";
		keymapDiv.style.right = "5px";
		keymapDiv.style.width = "150px";
		keymapDiv.style.height = "150px";
		keymapDiv.style.borderStyle = "solid";
		keymapDiv.style.borderColor = "#242424";
		keymapDiv.style.borderWidth = "1px";
		this.kaMap.domObj.appendChild(keymapDiv);
	} else {
		try {
			var keymapDiv = document.getElementById(divid);
		} catch(e) {
			// TODO
		}
	}
	this.keyMap = new _kaMap(keymapDiv);
	this.kaMap.hasKeymap = true;
        var map = new _map({name:'basemap',title:'basemap',currentScale: 0,units:3,resolution:96,version:'',scales:aszScales});
        map.aZoomTo[0] = this.defaultlon;
        map.aZoomTo[1] = this.defaultlat;
        map.aZoomTo[2] = this.defaultscale;
	map.addLayer(new _layer( { name:'__base__',visible:true,opacity:100,imageformat:'png24',queryable:false,tileSource:'auto',redrawInterval:-1,refreshInterval:-1,scales: new Array('1','1','1','1','1','1')}));
        map.resolution = resolution;
        this.keyMap.addMap(map);
        this.keyMap.tileWidth = tilewidth;
        this.keyMap.tileHeight = tileheight;
        this.keyMap.server = serverPath;
        this.keyMap.tileURL = tileManager;
        this.keyMap.selectMap(defaultMap);
        this.keyMap.initializationState = 2;
	this.kaMap.keyMap = this.keyMap;
};


/**
 * 指定位置に移動する
 * @author Toshihiro Hiraoka
 * @param lon 経度
 * @param lat 経度
 */
cheetahMap.prototype.moveTo = function(lon, lat) {
	currentMap = this.kaMap;
/*
	if ( typeof(lon) == 'undefined' || typeof(lat) == 'undefined' ) {
		alert("緯度経度がありません");
		return 1;
	}
	if ( lon > 180 || lon < -180 || lat > 90 || lat < -90 ) {
		alert("緯度経度が正しくありません");
		return 2;
	}
*/
//	var x = _dd2mercX(lon);
//	var y = _dd2mercY(lat);
	var x = lon;
	var y = lat;
	this.kaMap.zoomTo(x, y);
};

/**
 * 指定位置にアイコンを配置する
 * @author Toshihiro Hiraoka
 * @param iconuri 表示するアイコンのURI
 * @param lon 経度
 * @param lat 緯度
 * @param adjx X方向への移動量(pix)
 * @param adjy Y方向への移動量(pix)
 * @return 作成されたアイコンオブジェクト
 */ 
cheetahMap.prototype.createIconOnMap = function(iconuri, lon, lat, adjx, adjy) {
	if ( typeof(lon) == 'undefined' || typeof(lat) == 'undefined' ) {
		return;
		// TODO
	}
	var iconObj = document.createElement("img");
	try {
		iconObj.src = iconuri;
	} catch (e) {
		// TODO
	}
	if ( adjx ) 
		iconObj.xOffset = adjx;
	else
		iconObj.xOffset = 0;
	if ( adjy ) 
		iconObj.yOffset = adjy;
	else
		iconObj.yOffset = 0;
	iconObj.lon = lon;
	iconObj.lat = lat;
	iconObj.cheetahMap = this;
//	var x = _dd2mercX(lon);
//	var y = _dd2mercY(lat);
	var x = lon;
	var y = lat;
	this.kaMap.addObjectGeo(this.pLayer, x, y, iconObj);
	return iconObj;
	// TODO

}; 
/**
 * アイコンを削除する
 * @author Toshihiro Hiraoka
 * @param iconObj 削除するアイコンのオブジェクト
 */
cheetahMap.prototype.removeIconOnMap = function(iconObj) {
 	this.kaMap.removeObject( iconObj );  // << kobak

	// TODO:
}

/**
 * 地図のページ内の表示位置を返す
 * @author Toshihiro Hiraoka
 * @return [x, y] 配列で返す
 */
cheetahMap.prototype.getViewportPosition = function() {
	var obj = this.kaMap.domObj;
	var x = 0;
	var y = 0;
	while ( obj ) {
		x += parseInt(obj.offsetLeft);
		y += parseInt(obj.offsetTop);
		obj = obj.offsetParent;
	}
	return [x, y];
}

/**
 * 地図のページ内のスクロールを考慮した表示オフセットを返す
 * @author Toshihiro Hiraoka
 * @return [x, y] 配列で返す
 */
cheetahMap.prototype.getViewportOffset = function() {
	var x, y;
	if (isIE4) {
		if ( document.compatMode && document.compatMode != "BackCompat") {
			iebody = document.documentElement;
		} else {
			iebody = document.body;
		}
		//var iebody=(document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body
		if ( iebody.scrollLeft ) {
			x = iebody.scrollLeft;
		} else {
			if ( window.pageXOffset ) {
				x = window.pageXOffset;
			} else {
				x = 0;
			}
		}
		//x = iebody.scrollLeft?iebody.scrollLeft:(window.pageXOffset?window.pageXOffset:0);
		if ( iebody.scrollTop ) {
			y = iebody.scrollTop;
		} else {
			if ( window.pageYOffset ) {
				y = window.pageYOffset;
			} else {
				y = 0;
			}
		}
		//y = iebody.scrollTop?iebody.scrollTop:(window.pageYOffset?window.pageYOffset:0);
	} else  {
		x = window.pageXOffset;
		y = window.pageYOffset;
	}
	return [x , y];
}

/**
 * スケールを変更する
 * @author Toshihiro Hiraoka
 * @param scale 変更するスケールの分母
 */
cheetahMap.prototype.setScale = function(scale) {
}


/**
 * 地図をデフォルトの表示位置、スケールに戻す
 * @author Toshihiro Hiraoka
 */
cheetahMap.prototype.moveToDefault = function() {

}


/**
 * アイコンにポップアップを付加する
 * @author Toshihiro Hiraoka
 * @param iconObj ポップアップを付加するアイコンオブジェクト
 * @param htmlstr ポップアップ内で表示するHTML文字列
 * @param eventMove ポップアップを起こすイベント種別 [mouseover|click]
 * @param width ポップアップの幅 (pix) 省略時はデフォルト
 * @param height ポップアップの高さ (pix) 省略時はデフォルト
 */
cheetahMap.prototype.setPopupOnIcon = function(iconObj, htmlstr, eventMode, width, height) {
	if ( iconObj ) {
		if ( height )
			iconObj.popupHeight = height;
		if ( width )
			iconObj.popupWidth = width;
		if ( htmlstr )
			iconObj.htmlstr = htmlstr;
		if ( eventMode != "mouseover" && eventMode != "mousemove" ) {
			alert("イベントには'mouseover'と'click'だけ使えます");
		}
		_addEvent(iconObj, eventMode, _showBalloon);
	} else {
		alert("アイコンオブジェクトが正しく定義されていません");
	}
};

var imgdir = serverPath + "/images";
/**
 * ポップアップを表示する
 * @author Toshihiro Hiraoka
 * @param lon 経度
 * @param lat 緯度
 * @param htmlstr 表示するHTML文字列
 * @param rawx ポップアップ原点のウィンドウX座標
 * @param rawy ポップアップ原点のウィンドウY座標
 * @param width ポップアップの幅 (pix) 省略時はデフォルト
 * @param height ポップアップの高さ (pix) 省略時はデフォルト
 */
cheetahMap.prototype.balloon = function(lon, lat, htmlstr, rawx, rawy, width, height) {
    // TODO: width, height
    if (this.currentBalloon != null) {
        this.kaMap.removeObject(this.currentBalloon);
    }
    var bcontents = document.getElementById("balloonContents");
    var bltl = document.getElementById("balloontl");
    var bltr = document.getElementById("balloontr");
    var blbl = document.getElementById("balloonbl");
    var blbr = document.getElementById("balloonbr");
    var xbutton = document.getElementById("xbutton");
    var pos = "tl";
    var adjx = 0;
    var adjy = 0;
    var vOffsets = this.getViewportOffset();
    var vPosition = this.getViewportPosition();
    var centerx = this.kaMap.viewportWidth / 2 + vPosition[0];
    var centery = this.kaMap.viewportHeight / 2 + vPosition[1];
    if (rawx == 0 && rawy == 0) {
        rawx = centerx;
        rawy = centery;
    }
    if (rawx <= centerx && rawy <= centery) {
        pos = "tl";
        bltl.src = imgdir + "/com_ytl.gif";
        bltr.src = imgdir + "/com_tr.gif";
        blbl.src = imgdir + "/com_bl.gif";
        blbr.src = imgdir + "/com_br.gif";
    } else if (rawx > centerx && rawy <= centery) {
        pos = "tr";
        bltl.src = imgdir + "/com_tl.gif";
        bltr.src = imgdir + "/com_ytr.gif";
        blbl.src = imgdir + "/com_bl.gif";
        blbr.src = imgdir + "/com_br.gif";
    } else if (rawx <= centerx && rawy > centery) {
        pos = "bl";
        bltl.src = imgdir + "/com_tl.gif";
        bltr.src = imgdir + "/com_tr.gif";
        blbl.src = imgdir + "/com_ybl.gif";
        blbr.src = imgdir + "/com_br.gif";
    } else if (rawx > centerx && rawy > centery) {
        pos = "br";
        bltl.src = imgdir + "/com_tl.gif";
        bltr.src = imgdir + "/com_tr.gif";
        blbl.src = imgdir + "/com_bl.gif";
        blbr.src = imgdir + "/com_ybr.gif";
    }

    bcontents.innerHTML = htmlstr;
    this.currentBalloon = document.getElementById("balloon").cloneNode(true);
    this.currentBalloon.style.display = 'block';
    this.addObjectGeoAdjCorner(lon, lat, adjx, adjy, this.currentBalloon, pos);
};

/**
 * 角をあわせてオブジェクトを配置
 * @author Toshihiro Hiraoka
 * @param lon 配置経度
 * @param lat 配置緯度
 * @param adjx 角からX方向への補正移動値
 * @param adjy 角からY方向への補正移動値
 * @param obj 表示するオブジェクト
 * @param pos オブジェクトの配置方向 [tl|tr|bl|br] 省略時はtl
 */
cheetahMap.prototype.addObjectGeoAdjCorner = function(lon, lat, adjx, adjy, obj, pos) {
    var x, y;
    obj.lon = lon;
    obj.lat = lat;
    var aPix = this.kaMap.geoToPix(lon, lat);
    x = aPix[0] - adjx;
    y = aPix[1] - adjy;

    var top = (y - this.kaMap.yOrigin);
    var left = (x - this.kaMap.xOrigin);
    var bottom = this.pLayer.style.height.replace(/px/, "") - top;
    var right = this.pLayer.style.width.replace(/px/, "") - left;
    obj.style.posision = "absolute";
    var balloonadjx = 10;

    if (pos == "tl") {
        obj.style.top = top + "px";
        obj.style.bottom = "";
        obj.style.left = (left - balloonadjx) + "px";
        obj.style.right = "";
    } else if (pos == "tr") {
        obj.style.top = top + "px";
        obj.style.bottom = "";
        obj.style.left = "";
        obj.style.right = (right - balloonadjx) + "px";
    } else if (pos == "bl") {
        obj.style.top = "";
        obj.style.bottom = (bottom + 7) + "px";
        obj.style.left = (left - balloonadjx) + "px";
        obj.style.right = "";
    } else if (pos == "br") {
        obj.style.top = "";
        obj.style.bottom = (bottom + 7) + "px";
        obj.style.left = "";
        obj.style.right = (right - balloonadjx) + "px";
    } else {
        obj.style.top = top + "px";
        obj.style.bottom = "";
        obj.style.left = (left - balloonadjx) + "px";
        obj.style.right = "";
    }
    obj.canvas = this.pLayer;
    this.pLayer.appendChild(obj);
    this.kaMap.aObjects.push(obj);

    return true;
};

var imgDir = "images";
var balloonZindex = 8;
var balloonWidth = 200;
/**
 * ポップアップを作成する
 * @author Toshihiro Hiraoka
 * @param width ポップアップの幅 省略時はballoonWidth
 */
cheetahMap.prototype.createBalloon = function(width) {
	//width = ( width ) ? width : balloonWidth;

//var serverPath="http://www.geosense.co.jp/placexml1/cheetahMap";	
	if (! width ) {
		width = balloonWidth;
	}
	var d = document.createElement("div");
	d.id = "balloon";
	d.style.position = "absolute";
	d.style.width = width + "px";
	d.style.zIndex = balloonZindex;
	d.style.display = "none";
	// createElementでやっていくとcellspacingなどに問題おきる
	d.innerHTML = 
		"<table width='" + width + 
		"' border='0' cellspacing='0' cellpadding='0'>" +
		"<tr>" +
		//"<td align='right' valign='bottom'><img width='17' height='17' id='balloontl' src='" + serverPath + "/images/com_ytl.gif' ></td>" +
		"<td align='right' valign='bottom'><img width='17' height='17' id='balloontl' src='images/com_ytl.gif' ></td>" +
		"<td background='" + serverPath + "/images/com_yt.gif'><img width='17' height='17' src='" + serverPath + "/images/0.gif'></td>" +
		"<td align='left' valign='bottom'><img width='17' height='17' id='balloontr' src='" + serverPath + "/images/com_tr.gif'></td>" +
		"</tr>" +
		"<tr>" +
		"<td width='17' height='17' background='" + serverPath + "/images/com_yl.gif'><img width='17' height='17' src='" +serverPath + "/images/0.gif'></td>" +
		"<td bgcolor='#FFFFFF'>" +
		"<table width='100%'  border='0' cellspacing='0' cellpadding='0'>" +
		"<tr valign='middle' class='sml'>" +
		"<td align='right'><img src='" + serverPath + "/images/x.gif' id='xbutton' onclick='_balloonOff()' style='cursor: pointer;'/></td>" +
		"</tr>" +
		"<tr valign='middle' class='sml'>" +
		"<td>" +
		"<span id='balloonContents'></span>" +
		"</td>" +
		"</tr>" +
		"</table> </td>" +
		"<td width='17' height='17' background='" + serverPath + "/images/com_yr.gif'><img width='17' height='17' src='" + serverPath + "/images/0.gif'></td>" +
		"</tr>" +
		"<tr>" +
		"<td align='right' valign='top'><img width='17' height='17' id='balloonbl' src='" + serverPath + "/images/com_bl.gif'></td>" +
		"<td background='" + serverPath + "/images/com_yb.gif'><img width='17' height='17' src='" + serverPath + "/images/0.gif'></td>" +
		"<td align='left' valign='top'><img id='balloonbr' width='17' height='17' src='" + serverPath + "/images/com_br.gif'></td>" +
		"</tr>" +
		"</table>";
	document.body.appendChild(d);
	   
}

/**
 * 表示している領域を経度緯度の配列で返す
 * @author Toshihiro Hiraoka
 * @return [minx, miny, maxx, maxy] 配列で返す
 */
cheetahMap.prototype.getExtents = function() {
	return this.kaMap.getGeoExtents();  					// << kobak
	//TODO:

}


/**
 * 中心位置経度緯度を返す
 * @author Toshihiro Hiraoka
 * @return [centerx, centery] 配列で返す
 */
cheetahMap.prototype.getCenter = function() {

	// << kobak >>
	var extents = this.kaMap.getGeoExtents();
	var cxy = new Array(2);
	cxy[0] = ( extents[0] + extents[2] ) / 2;
	cxy[1] = ( extents[1] + extents[3] ) / 2;
	
	return cxy;
	// << kobak >>

	//TODO:
}

/**
 * 地図が移動できる状態かを返す
 * @author Toshihiro Hiraoka
 * @return [true|false]
 */
cheetahMap.prototype.getMoveMode = function() {
	//TODO:
}

/**
 * 地図の移動状態をセットする
 * @author Toshihiro Hiraoka
 * @param moble [true|false]
 */
cheetahMap.prototype.setMoveMode = function(movable) {
	//TODO:
}

/**
 * 現在表示しているスケールを返す
 * @author Toshihiro Hiraoka
 * @return 表示スケールの分母
cheetahMap.prototype.getScale = function() {
	//TODO:
}

/**
 * 表示可能スケールを返す
 * @author Toshihiro Hiraoka
 * @return 表示可能スケールの配列
 */
cheetahMap.prototype.getScales = function() {
	//TODO:
}

/**
 * 現在のコントロールモードを返す
 * @author Toshihiro Hiraoka
 * @return [move|rubberZoom]
 */
cheetahMap.prototype.getCurrentMode = function() {
}

/**
 * 表示位置変更イベントハンドラを追加する
 * @author Toshihiro Hiraoka
 * @param func 表示位置が変更されたときに呼び出されるイベントハンドラー
 */
cheetahMap.prototype.addEventOnExtentsChanged = function ( func ) {
	//TODO:
}

/**
 * スケール変更イベントハンドラを追加する
 * @author Toshihiro Hiraoka
 * @param func スケールが変更されたときに呼び出されるイベントハンドラー
 */
cheetahMap.prototype.addEventOnScaleChanged = function ( func ) {
	// TODO:
}

/**
 * 地図クリックイベントハンドラを追加する
 * @author Toshihiro Hiraoka
 * @param func 地図がクリックされたときに呼び出されるイベントハンドラー
 */
cheetahMap.prototype.addEventOnMapClicked = function ( onClickFunc ) {
	this.kaMap.registerForEvent( KAMAP_MAP_CLICKED, null, onClickFunc );  // << kobak

	// TODO:
}

/**
 * 地図クリックイベントハンドラを削除する
 * @author Toshihiro Hiraoka
 * @param func 地図がクリックされたときのイベントハンドラーを削除する。
 */
cheetahMap.prototype.removeEventOnMapClicked = function ( onClickFunc ) {
	this.kaMap.deregisterForEvent( KAMAP_MAP_CLICKED, null, onClickFunc );

	// TODO:
}
