/**
 * @author washi
 */

/**
 * @author Toshihiro Hiraoka
 * 横浜っぷデータを取得する
 */

/*@cc_on _d=document;eval('var document=_d')@*/

var dHeader;
var dCont;
var dIcon;
var dPic1;
var dPic2;
var dDate;
var dGroup;
var dPOIURL;
var listWindow;
var listField;
var detailWindow;
var bigIconId;

var isTableOpened = true;
var iconOpen = "../icon/go-down.png";
var iconClose = "../icon/go-up.png";
var iconLink = "../icon/syosai.gif";

/* アイコン定義 */
var ymIconS = new Array();
var ymIconB = new Array();
var mapStatus = new Array();
var categoryStatus = new Array();
var layerStatus = new Array();
var pointsArr = new Array();
var pointsByGid = new Array();

var topcateName = new Array();
var cateName = new Array();

/* http request用 */
var hamapReq;
var simapReq;
var himapReq;
var categReq;
var resp;

// カテゴリーツリー
var xtree = new WebFXTree("地図リスト");
var xtreeMapNodes = new Array();
var mapArray = new Array();
var mappingArray = new Array();

var clickTimer;
var dblClickFlag = false;
var lightgray = "#D3D3D3";
var black = "#000000";

// 表示設定
var showFlag;

// 詳細ダイアログを消したときにiconPointedも消すかどうかフラグ
var deleteIconPointed = false;

/**
 * 初期化する
 * @param {Object} mapObj
 */
function setAllIcons(mapObj){
	_mapObj = mapObj;
	_mapObj.createBalloon(200);
	_mapObj._createMapSelector();
	getElementsOnPage();
	setElementsSize();

	_mapObj.addEventOnExtentsChanged(getDataAll);
	setAddressTable(_mapObj);
	window.onresize	= setElementsSize;
}

/**
 * ページの構成部品を変数に格納する
 */
function getElementsOnPage() {
	dHeader = document.getElementById("dHeader");
	dIcon = document.getElementById("dIcon");
	dCont = document.getElementById("dCont");
	dPic1 = document.getElementById("dPic1");
	dPic2 = document.getElementById("dPic2");
    dPOIURL = document.getElementById("dPOIURL");
	listWindow = document.getElementById("listWindow");
	listField = document.getElementById("listField");
	detailWindow = document.getElementById("detailWindow");
}

/**
 * ポイント情報の取得要求を出す
 * @param {Object} type
 */
function getDataAll() {

	var extents = _mapObj.getExtents();
	var statStr = getCategoryStatStr();
	var url = "getPoints.php?mapid=" + mid + "&x1=" + (extents[0] - dataAdjX) + "&y1=" + (extents[1] - dataAdjY) +
		"&x2=" + (extents[2] - dataAdjX) + "&y2=" + (extents[3] - dataAdjY) +"&mode=view";
    $.ajax({
        type: 'POST',
        url: url,
        data: {
            "stat": statStr
        },
        dataType: 'json',
        success: function(response){
                setResult(response);
        }
    });
}

/**
 * ポイント情報をpointAllに格納する
 */
function setResult(json) {
    pointAll = json;
    _mapObj.removeAllIcons();
    putIconOnMap();
    if(isListOpened){
        updateList();
    }
	if(document.getElementById("xbutton")){
		document.getElementById("xbutton").style.display = "none";
	}
}

/**
 * 地図上にアイコンを配置する
 */
function putIconOnMap() {
	var iconUri, x, y;
	var adjx = -8;
	var adjy = -8;

    // 選択状態だったポイントが取得したポイントの中にあるかどうかフラグ
    var pointed_exist = false;

    // 地図毎にポイントを処理
	for ( var i = 0; i < pointAll.length; i++) {

        var mapData = pointAll[i];
        var mapid = mapData.mapid;

        // 地図内のポイントを処理
        for( var pidx = 0; pidx < mapData.point.length; pidx++){
            //var mapidx = getMappingIndex(mapData.mapid);
            
            var pointData = mapData.point[pidx];
            
            var col = parseInt(pointData.themeid);
            var row = parseInt(pointData.factorid);
            iconUri = undefined;
            if(ymIconS[mapid].length > col){
                if(ymIconS[mapid][col].length > row){
                    iconUri = ymIconS[mapid][parseInt(pointData.themeid)][parseInt(pointData.factorid)];
                }
            }

            if ( typeof(iconUri) != 'undefined') {
                x = eval(pointData.x) + dataAdjX;
                y = eval(pointData.y) + dataAdjY;
                var icon = _mapObj.createIconOnMap(iconUri, x, y, adjx, adjy);
                icon.mapid = mapid;
                icon.themeid = eval(pointData.themeid);
                icon.factorid = eval(pointData.factorid);
                icon.lon = x;
                icon.lat = y;
                //icon.datafrom = (pointData.name) ? pointData.name : NONAME;
                icon.gid = pointData.gid;
                // 元データにスペルミスあり
                icon.name = ( pointData.name ) ? pointData.name : NOTITLE;
                icon.address = ( pointData.address ) ? pointData.address : NOCOMMENT;
                icon.address2 = ( pointData.address2 ) ? pointData.address2 : NOCOMMENT;
                icon.tel = ( pointData.tel ) ? pointData.tel : NOCOMMENT;
                icon.fax = ( pointData.fax ) ? pointData.fax : NOCOMMENT;
                icon.inputdate = ( pointData.inputdate ) ? pointData.inputdate : NOCOMMENT;
                icon.memo = ( pointData.memo ) ? pointData.memo : NOCOMMENT;
                icon.username = ( pointData.username ) ? pointData.username : NOCOMMENT;
                icon.image = ( pointData.image ) ? pointData.image : NOCOMMENT;
                icon.image2 = ( pointData.img2 ) ? pointData.img2 : NOCOMMENT;
                icon.url = ( pointData.url ) ? pointData.url : NOCOMMENT;
                // z-indexはカテゴリー番号が少ないものが上にくるように
                icon.style.zIndex = 10 - pointData.factorid;
                icon.style.cursor = "pointer";
                
                try {
                    //pointsArr[mapidx][icon.themeid][icon.factorid].push(icon);
                    pointsArr[mapid][icon.themeid][icon.factorid] = icon;
                    pointsByGid[mapid][pointData.gid] = icon;
                } catch (e) {
                    //alert(icon.themeid + " " + icon.factorid)
                }
                // ポップアップ
                //var popupHTML;
               // icon.popupHTML = "<span onclick='listClick(" + mapid + "," + pointData.gid + ")'>";
                icon.popupHTML = "<span>";
                icon.popupHTML += icon.name + "</span>";
                _mapObj.setPopupOnIcon(icon, icon.popupHTML, "mouseover", 50,50);
                if (layerStatus[mapid][icon.themeid][icon.factorid]) {
                    icon.style.display = "block";
                } else {
                    icon.style.display = "none";
                }

                if(iconPointed != null){
                    if(iconPointed.mapid == icon.mapid && iconPointed.themeid == icon.themeid
                       && iconPointed.factorid == icon.factorid && iconPointed.gid == icon.gid){
						_mapObj.shiftIcon(iconSelected, -1 * selectedIconShiftX, -1 * selectedIconShiftY);
                        makeIconBig(icon,false);
                        pointed_exist = true;
                    }
                }
                
                _addEvent(icon, "click", selectIcon);
                _addEvent(icon, "mouseout", closeBallon);
            }
        }
	}

    if(!pointed_exist){
        // iconPointedをnullにしつつ、詳細ダイアログを消す
        closeDetailDialog(true);
        //alert("putIconOnMap");
    }
	getFirstAction();
}

/**
 * マウスアウト時にバルーン消去
 * @param none
 */
function closeBallon(){
	_balloonOff();
}

var iconPointed = null;
/**
 * アイコンを大きくする
 * @param {Object} iconObj
 */
function makeIconBig(iconObj,flg) {
    //var mapidx = -1;
    makeIconSmall();
    if(bigIconId != iconObj.gid || flg == true){
		_mapObj.shiftIcon(iconObj, -1 * 4, -1 * 4);
	}

	//if ( iconPointed != null) {
    //    //mapidx = getMappingIndex(iconPointed.mapid);
	//	iconPointed.src = ymIconS[iconPointed.mapid][iconPointed.themeid][iconPointed.factorid];
	//	iconPointed.style.zIndex = 10 - iconPointed.factorid;
	//	iconPointed.width = 16;
	//	iconPointed.height = 16;
	//}
	// this means icon img
    //mapidx = getMappingIndex(iconObj.mapid);
	iconObj.src = ymIconB[iconObj.mapid][iconObj.themeid][iconObj.factorid];
	iconObj.style.zIndex = 19;
	iconObj.width = 32;
	iconObj.height = 32;
	iconPointed = iconObj;
	bigIconId = iconObj.gid;

	createDialog();
}

var iconSelected = null;
var selectedIconShiftX = -8;
var selectedIconShiftY = -8;

/**
 * アイコンが選択された場合の処理 （地図クリックから）
 */
function selectIcon() {
	var str = "";
	var strMoji = "";
	var cnt;

	if (iconSelected != null) {
		iconSelected.src = ymIconS[iconSelected.mapid][iconSelected.themeid][iconSelected.factorid];
		iconSelected.style.zIndex = 10 - iconSelected.factorid;
//		_mapObj.shiftIcon(iconSelected, -1 * selectedIconShiftX, -1 * selectedIconShiftY);
	}
	makeIconBig(this,true);
	// this means icon img

	str = this.name;
    
	dIcon.src = ymIconB[this.mapid][this.themeid][this.factorid];
	dHeader.innerHTML = "<span style='cursor: pointer;' onclick='clickOnDetailTitle(" + this.mapid + ", " + this.gid +
		")'>" + this.name + "</span>";

	dCont.innerHTML = "";
	strMoji = "";

	if( showFlag[this.mapid].hasAddress ) {
		dCont.innerHTML += "<b>住所（Address）</b><br>" + this.address + this.address2 + "<br>";
	}
	if( showFlag[this.mapid].hasTel )
		dCont.innerHTML += "<b>電話（Telephone number）</b><br>" + this.tel + "<br>";
	if( showFlag[this.mapid].hasFax )
		dCont.innerHTML += "<b>FAX</b><br>" + this.fax + "<br>";

	strMoji = "";

	if( showFlag[this.mapid].hasMemo ) {
		// メモ内の改行を処理
		var memoStr = this.memo.replace(/\n/g, "<br>");
		if(this.memo){
			dCont.innerHTML += "<div style=\"border:solid #7f9db9 1px;margin:1px;padding:3px;\">"+memoStr + "</div>";
		}
		//dCont.innerHTML += "<b>ﾒﾓ</b><br>" + memoStr + "<br>";
	}

	if ( showFlag[this.mapid].hasDate )
		dCont.innerHTML += "<b>入力日（Input date）</b><br>" + this.inputdate + "<br>";
	if( showFlag[this.mapid].hasLonlat ) {
		dCont.innerHTML += "<b>X座標（Coordinates X）</b><br>" + this.lon + "<br>";
		dCont.innerHTML += "<b>Y座標（Coordinates Y）</b><br>" + this.lat + "<br>";
	}
	if( showFlag[this.mapid].hasUser )
		dCont.innerHTML += "<b>登録者（Input user）</b><br>" + this.username + "<br>";

	if( showFlag[this.mapid].hasUrl ) {
		if(this.url != "" && this.url != null)
			dCont.innerHTML += "&nbsp;" + "<a href='" + this.url + "' target='_blank'>ウェブサイトへリンク</a><br>";
	}

	if( showFlag[this.mapid].hasImage ) {
		if(this.image != "" && this.image != "undefined")
			dPic1.src = "../images/" + this.mapid + "/small/" + this.image;
		else
			dPic1.src = "../img/a_pixel.gif";

		if(this.image2 != "" && this.image2 != "undefined")
			dPic2.src = "../images/" + this.mapid + "/small/" + this.image2;
		else
			dPic2.src = "../img/a_pixel.gif";
	}else{
		dPic1.src = "../img/a_pixel.gif";
		dPic2.src = "../img/a_pixel.gif";
	}

    if( showFlag[this.mapid].hasPOIURL ){
        //施設へのURLリンク1(2か所)
            var url_link = "http://yokohamap.city.yokohama.lg.jp/yokohamap2008/php/mapinfo.php" +
           // var url_link = "http://192.168.1.15/yokohamap2008/php/mapinfo.php" +
            "?mapid="+this.mapid+"&gid="+this.gid+"&x="+this.lon+"&y="+this.lat +
            "&zoomLevel="+_mapObj.getCurrentScale()+"&flg=2";
        dPOIURL.innerHTML =  "<b>位置情報（Location information）</b><br/><textarea onfocus='this.select()' style='font-size:x-small;color:#AAA;' rows='6' cols='33'>" + url_link + "</textarea>";
    }
    
	this.style.zIndex = 20;
	iconSelected = this;
//	_mapObj.shiftIcon(iconSelected, selectedIconShiftX, selectedIconShiftY);
}

/**
 * アイコンが選択された場合の処理 （IDから）
 */
function selectIconById(mapidx, gid) {
	var iconObj = pointsByGid[mapidx][gid];
	var str = "";
	var strMoji = "";
	var cnt;
    if(iconObj != null){
		if ( iconSelected != null) {
			iconSelected.src = ymIconS[iconSelected.mapid][iconSelected.themeid][ iconSelected.factorid];
			iconSelected.style.zIndex = 10 - iconSelected.factorid;
//			_mapObj.shiftIcon(iconSelected, -1 * selectedIconShiftX, -1 * selectedIconShiftY);
		}
		makeIconBig(iconObj,true);
		// this means icon img
		dIcon.src = ymIconB[iconObj.mapid][iconObj.themeid][iconObj.factorid];
	
		dHeader.innerHTML = "<span style='cursor: pointer;' onclick='clickOnDetailTitle(" + iconObj.mapid + ", " + iconObj.gid +
			")'>" + iconObj.name + "</span>";
	
		dCont.innerHTML = "";
		strMoji = "";
	
		if( showFlag[iconObj.mapid].hasAddress ) {
			dCont.innerHTML += "<b>住所（Address）</b><br>" + iconObj.address + iconObj.address2 + "<br>";
		}
		if( showFlag[iconObj.mapid].hasTel )
			dCont.innerHTML += "<b>電話（Telephone number）</b><br>" + iconObj.tel + "<br>";
		if( showFlag[iconObj.mapid].hasFax )
			dCont.innerHTML += "<b>FAX</b><br>" + iconObj.fax + "<br>";
	
		strMoji = "";
	
		if( showFlag[iconObj.mapid].hasMemo ) {
	
			// メモ内の改行を処理
			var memoStr = iconObj.memo.replace(/\n/g, "<br>");
			if(iconObj.memo){
				dCont.innerHTML += "<div style=\"border:solid #7f9db9 1px;margin:1px;padding:3px;\">"+memoStr + "</div>";
			}
		//	dCont.innerHTML += "<b>ﾒﾓ</b><br>" + memoStr + "<br>";
		}
	
		if( showFlag[iconObj.mapid].hasDate )
			dCont.innerHTML += "<b>入力日（Input date）</b><br>" + iconObj.inputdate + "<br>";
		if( showFlag[iconObj.mapid].hasLonlat ) {
			dCont.innerHTML += "<b>X座標（Coordinates X）</b><br>" + iconObj.lon + "<br>";
			dCont.innerHTML += "<b>Y座標（Coordinates Y）</b><br>" + iconObj.lat + "<br>";
		}
		if( showFlag[iconObj.mapid].hasUser )
			dCont.innerHTML += "<b>登録者（Input user）</b><br>" + iconObj.username + "<br>";
	
		if( showFlag[iconObj.mapid].hasUrl ) {
			if(iconObj.url != "" && iconObj.url != null)
				dCont.innerHTML += "&nbsp;" + "<a href='" + iconObj.url + "' target='_blank'>ウェブサイトへリンク</a><br>";
		}
	
		if( showFlag[iconObj.mapid].hasImage ) {
			if(iconObj.image != "" && iconObj.image != "undefined")
				dPic1.src = "../images/" + iconObj.mapid + "/small/" + iconObj.image;
			else
				dPic1.src = "../img/a_pixel.gif";
	
			if(iconObj.image2 != "" && iconObj.image2 != "undefined")
				dPic2.src = "../images/" + iconObj.mapid + "/small/" + iconObj.image2;
			else
				dPic2.src = "../img/a_pixel.gif";
		}else{
			dPic1.src = "../img/a_pixel.gif";
			dPic2.src = "../img/a_pixel.gif";
		}

        if( showFlag[iconObj.mapid].hasPOIURL ){
            //施設へのURLリンク2(2か所)
            var url_link = "http://yokohamap.city.yokohama.lg.jp/yokohamap2008/php/mapinfo.php" +
            //var url_link = "http://192.168.1.15/yokohamap2008/php/mapinfo.php" +
                "?mapid="+this.mapid+"&gid="+gid+"&x="+iconObj.lon+"&y="+iconObj.lat +
                "&zoomLevel="+_mapObj.getCurrentScale()+"&flg=2";
            dPOIURL.innerHTML = "<div><b>位置情報（Location information）</b><br/><textarea onfocus='this.select()' style='font-size:x-small;color:#AAA' rows='6' cols='33'>" + url_link + "</textarea></div>";
        }
        
		iconObj.style.zIndex = 20;
		iconSelected = iconObj;
//		_mapObj.shiftIcon(iconSelected, selectedIconShiftX, selectedIconShiftY);
    }
}

/**
 * イメージを大きくする
 * @param {Object} imgObj
 */
function showBigImage(imgObj) {
	// this means thumbnail image
	var thumbsrc = imgObj.src;
	var bigsrc = thumbsrc.replace("small/", "");
	//window.open(bigsrc, false, 'width=600, height=450');
    var win = window.open(bigsrc, false, 'width=600, height=450, scrollbars=yes, resizable=yes');
    win.focus();
	return false;
}

var elementMargin = 10;
var detailWidth = 250;
var categoryPadding = 24;
/**
 * ウィンドウサイズ変更時に各部品サイズを変更する
 */
function setElementsSize() {
	var browserWidth = getInsideWindowWidth();
    var browserHeight = getInsideWindowHeight();
	var titleHeight = document.getElementById("titleTd").offsetHeight;
	var rightSide = document.getElementById("rightSide");
	var categoryWindow = document.getElementById("detailWindow");
	var listWindow = document.getElementById("listWindow");
	var listField = document.getElementById("listField");
	if ( isListOpened ) {
		listWindow.style.height = listWindowHeight + "px";
		listField.style.visibility = "visible";
	} else {
		listWindow.style.height = "24px";
		listField.style.visibility = "hidden";
		listField.innerHTML = "";
	}

	var mapWidth = browserWidth - detailWidth - elementMargin;
    var mapHeight = browserHeight - titleHeight - elementMargin;
	var detailHeight = browserHeight - titleHeight - listWindow.offsetHeight - elementMargin -categoryPadding;
	var mapArea = document.getElementById("mapArea");
	var mapTableCol = document.getElementById("mapTableCol");

	if ( mapWidth > 0) {
		mapArea.style.width = mapWidth + "px";
		mapTableCol.style.width = mapWidth + "px";
	}
	if ( mapHeight > 0) {
		mapArea.style.height = mapHeight + "px";
	}
	categoryWindow.style.height = detailHeight + "px";
	categoryWindow.style.width = detailWidth + "px";
	listWindow.style.width = detailWidth + "px";

    /* 施設のURLでIE6だと処理タイミングの問題でうまくいかないので消さない */
    // 情報ダイアログの配置換えは面倒なので、消してしまう。
    // その際、iconPointedも消してしまう
    //closeDetailDialog(true);
    //alert("setElementsSize");
    //d_left = 0;
    //d_top = 0;
    d_left = 0;
    d_top = 0;
    
	if ( _mapObj )
		_mapObj.kaMap.resize();
}

var hamapListReq;
var listAll;
/*
 * リストを取得する
 */
function updateList() {
	var extents = _mapObj.getExtents();
	var statStr = getCategoryStatStr();

	if(statStr.length == 0)
		statStr = "*";

	var url = "getList.php?x1=" + (extents[0] - dataAdjX) + "&y1=" + (extents[1] - dataAdjY) +
		"&x2=" + (extents[2] - dataAdjX) + "&y2=" + (extents[3] - dataAdjY) +
		"&mapid=" + mid;
    
    $.ajax({
        type: 'POST',
        url: url,
        data: {
             "stat": statStr
        },
        dataType: 'json',
        success: function(response){
            listAll = response;
            setList();
        },
        failure: function(){
            alert("request failed");
        }
    });
}

/**
 * カテゴリー選択状態をサーバーに渡す文字列を作成
 * 1,1|1,3|2,1 のように
 * 2008/7/2修正
 * [mapid]:1,1|1,3|2,1;[mapid]:0,0|0,1|0,2...の仕様に変更
 */
function getCategoryStatStr() {
	var stat, statStr = "";

    for(var midx = 0; midx < mapArray.length; midx++){
        var mapid = mapArray[midx].mapid;
        statStr += mapid + ":";
        var isFirst = true;
        for(var cidx = 0; cidx < mapArray[midx].category.length; cidx++){
            for(var ridx = 0; ridx < mapArray[midx].category[cidx].length; ridx++){
                stat = layerStatus[mapid][cidx][ridx];
                if(stat){
                    if(isFirst){
                        isFirst = false;
                    }else{
                        statStr += "|";
                    }
                    statStr += cidx + "," + ridx;
                }
            }
        }
        statStr += ";";
    }

	return statStr;
}

var iconsAroundCenter = new Array();
/**
 * アイコンの赤枠をすべて削除
 */
function removeAllIconBorders() {
	for ( var i = 0; i < iconsAroundCenter.length; i++) {
		removeIconBorder(iconsAroundCenter[i]);
	}
}

/**
 * 「今表示されている場所」のリストを作成
 */
function setList() {
	var listHTML = "";
	var comm, icon, id;
	removeAllIconBorders();
	/*
	for ( var i = 0; i < iconsAroundCenter.length; i++) {
		removeIconBorder(iconsAroundCenter[i]);
	}
	*/
	iconsAroundCenter = [];

	for ( var i = 0; i < listAll.length; i++) {
        var mapid = parseInt(listAll[i].mapid);
		icon = ymIconS[mapid][parseInt(listAll[i].themeid)][parseInt(listAll[i].factorid)];
		comm = (listAll[i].name == null) ? NOTITLE : listAll[i].name;
		gid = listAll[i].gid;
		listHTML += "<img src='" + icon + "'/><a class='pointList'" +
			" onmouseover='listMouseover(" + mapid + ", " + gid + ")'" +
			" onmouseout='closeBallon()'" +
			" onclick='listClick(" + mapid + ", " + gid + ")'>" +
			comm + "</a><br/>";
		setIconBorder(mapid, gid);
		iconsAroundCenter.push(mapid + ":" + gid);
	}
	listField.innerHTML = listHTML;
}

/**
 * 「今表示されている場所」のリストをマウスオーバーしたときの処理
 *  アイコンマウスオーバーの時の処理
 * @param mapid
 * @param {Object} gid
 */
function listMouseover(mapid,gid){
	var icon = pointsByGid[mapid][gid];
	//alert(icon.style.top + " " + icon.style.left);
    if(icon != undefined){
        var x = parseInt(icon.style.top);
        var y = parseInt(icon.style.left);
        _mapObj.balloon(icon.lon, icon.lat, icon.popupHTML, x, y)
    }
}

/**
 * 「今表示されている場所」にリストされているポイントのマークを付加
 * @param mapid
 * @param {Object} gid
 */
function setIconBorder(mapid, gid) {
	var iconObj = pointsByGid[mapid][gid];
    if(iconObj != null){
		iconObj.style.border = "solid";
		iconObj.style.borderColor = "red";
		iconObj.style.borderWidth = "2px";
    }
}

/**
 * 「今表示されている場所」にリストされているポイントのマークを削除
 * @param mgid : [mapid]:[gid]の文字列
 * @param {Object} gid
 */
function removeIconBorder(mgid){
    if(mgid != undefined){
        var ids = mgid.split(":");
        var iconObj = pointsByGid[ids[0]][ids[1]];
        if(iconObj != null){
            iconObj.style.border = "none";
            iconObj.style.borderWidth = "0px";
        }
    }
}

/**
 * 「今表示されている場所」をクリックしたときの処理
 * @param mapid
 * @param {Object} gid
 */
function listClick(mapid, gid) {
	selectIconById(mapid, gid);
}

/**
 * ポイントのGIDに応じて指定点に移動する
 * @param mapid
 * @param {Object} gid
 */
function clickOnDetailTitle(mapid, gid) {
    if(pointsByGid[mapid][gid] != null){
        _mapObj.kaMap.zoomTo(pointsByGid[mapid][gid].lon, pointsByGid[mapid][gid].lat);
    }
}

var isListOpened = true;
/**
 * ポイントリストの表示、非表示
 */
function pointListControl() {
	var icon = document.getElementById("iconPointList");
	if ( isListOpened ) {
		icon.src = iconClose;
		removeAllIconBorders();
		isListOpened = false;
	} else {
		icon.src = iconOpen;
		isListOpened = true;
	}
	setElementsSize();
}

var NOCOMMENT = "";
var NOTITLE = "タイトルなし";
var NODATE = "";
var NONAME = "";
var NOPICTURE = "../cheetahMap/images/a_pixel.gif";

/**
 * 住所検索を設定
 */
function setAddressTable(_mapObj) {

	var addrTable = document.getElementById("gctable");
	addrTable.style.display = "block";
	_mapObj.aIconAreaBl.appendChild(addrTable);
	_mapObj.addAddressSearch("dGeocoder");
}

var isAddrTableOpened = false;
/**
 * 住所検索の表示・非表示を行う
 */
function addressTableControl() {
	var at = document.getElementById("dGeocoder");
	var icon = document.getElementById("iconAddrTable");
	if ( isAddrTableOpened ) {
		at.style.display = "none";
		icon.src = iconClose;
		isAddrTableOpened = false;
	} else {
		at.style.display = "block";
		at.width = "100%";
		icon.src = iconOpen;
		isAddrTableOpened = true;
	}
}

/**
 * ポイント情報取得
 */
function getCenterPoint() {

	var extents = _mapObj.getExtents();
	var centerX = parseInt((extents[2] + extents[0]) / 2);
	var centerY = parseInt((extents[3] + extents[1]) / 2);
	var scale = _mapObj.getCurrentScale();
	var cellSize = _mapObj.kaMap.cellSize;
	window.open("mapPrint.php?mapid=" + mid + "&flg=" + flg +"&x1=" + (extents[0] - dataAdjX) + "&y1=" + (extents[1] - dataAdjY) +
		"&x2=" + (extents[2] - dataAdjX) + "&y2=" + (extents[3] - dataAdjY) + "&centerx=" + centerX + "&centery=" + centerY + "&scale=" + scale + "&cellsize=" + cellSize, "", "toolbar=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,left=0,width=950,height=768");
}

/**
 * 編集ページ遷移
 */
function mapEdit(arg_kbn){
	//サイト管理者、地図管理者、地図ユーザやゲストで編集権限有
	if(arg_kbn == 1)
		location.href = "mapedit.php?mapid=" + mid + "&flg=" + flg;
	else
		location.href = "login.php?mapid=" + mid + "&flg=3";
}

/* ポイント情報をIDで格納する */
//pointsByGid = new Array();

/* 背景とデータが合わないので */
//var dataAdjX = 285;
//var dataAdjY = -354;
var dataAdjX = 0;
var dataAdjY = 0;
var menuSelectedColor = "blue";
var menuUnselectedColor = "#8888ff";

var listWindowHeight = 225;

/* http request用 */
var hamapReq;
/* ポイントデータを格納する */
var pointAll = new Array();
/* 地図オブジェクト */
var _mapObj;

/*
 * カテゴリーの取得
 */
function getCategory(){
    var url = "getCategory.php?mapid=" + mid;
    $.ajax({
        type: 'GET',
        url: url,
        dataType: 'json',
        success: function(response){
                mapArray = response;
                setTree();
        }
    });
}

/*
 * カテゴリーツリーの作成
 * mapArrayオブジェクトの構成
 * mapArray[] 配列の中に category[][]配列が入っている。
 * mapArray[地図ID].category[0][1].iconurlといった形でアクセスする
 */
function setTree(){

    //var start = new Date();
    
    // 地図の個数分ループ
    for(var midx = 0; midx < mapArray.length; midx++){

        var mapid = mapArray[midx].mapid;

        // 地図毎の表示設定
        mapStatus[mapid] = true;
        
        // 各グローバルな配列を初期化(地図毎)
        initGlobalArray(mapid);

        // 地図ノードを作成
        //var mapNode = new CategoryNode(mapArray[midx].name, "switchMapStatus("+mapid+")", 0);
        var mapNode = new CategoryNode(mapArray[midx].name, 0);
        mapNode.action = "javascript:switchMapStatus("+mapid+")";
        mapNode.icon = "../js/images/topicon.png";
        mapNode.openIcon = "../js/images/topicon.png";
        xtree.add(mapNode);
        xtreeMapNodes[mapid] = new Array();
        xtreeMapNodes[mapid].node = mapNode;

        // 大分類カテゴリーの個数分ループ
        for(var cidx = 0; cidx < mapArray[midx].category.length; cidx++){

            // 各グローバルな配列初期化(カテゴリー毎)
            initGlobalArray(mapid, cidx);
            
            // 地図-カテゴリー毎の表示設定
            categoryStatus[mapid][cidx] = true;
            
            // rownumの0番目は大分類カテゴリーの名称
            var colname = mapArray[midx].category[cidx][0].categoryname;

            // カテゴリーの情報をグローバル配列にセット
            setCategoryData(mapid, midx, cidx, 0);
                
            // 大分類カテゴリーのノードを作成
            var cateNode = new CategoryNode(colname, 0);
            cateNode.action = "javascript:switchDaiCategory("+mapid+","+cidx+")";
            cateNode.icon = webFXTreeConfig.folderIcon;
            cateNode = mapNode.add(cateNode);
            xtreeMapNodes[mapid][cidx] = new Array();
            xtreeMapNodes[mapid][cidx].node = cateNode;

            // 小分類カテゴリーのノードを作成する
            for(var ridx = 1; ridx < mapArray[midx].category[cidx].length; ridx++){
                var cid = midx * 1000000 + cidx;
                var catename = mapArray[midx].category[cidx][ridx].categoryname;

                // 小分類カテゴリーのノードを大分類カテゴリーに追加
                //var rowNode = new CategoryNode(catename, "switchCategory(" + mapid + "," + cidx + "," + ridx +")", 1);
                var rowNode = new CategoryNode(catename, 1);
                rowNode.action = "javascript:switchCategory("+mapid+","+cidx+","+ridx+")";
                xtreeMapNodes[mapid][cidx][ridx] = cateNode.add(rowNode);

                // カテゴリーの情報をグローバル配列にセット
                setCategoryData(mapid, midx, cidx, ridx);

                // アイコンを設定する
                xtreeMapNodes[mapid][cidx][ridx].icon = ymIconS[mapid][cidx][ridx];
            }
        }
    }
    // HTMLに作成したツリーを埋め込む
    document.getElementById("categoryListArea").innerHTML = xtree;

    //var end = new Date();
    //var starttime = start.getHours() * 3600 + start.getMinutes() * 60 + start.getSeconds() + start.getMilliseconds()/1000;
    //var endtime = end.getHours() * 3600 + end.getMinutes() * 60 + end.getSeconds() + end.getMilliseconds()/1000;
    //var treemaketime = endtime-starttime;
    //alert(treemaketime + "sec");

    // アイコンを配置する
    setAllIcons(mapObj);
    getDataAll();
}

/*
 * 各グローバル配列を初期化する
 * cidxが設定されていない場合は地図毎の配列を初期化し、
 * cidxが設定されている場合はカテゴリー毎の配列を初期化する。
 * @param mapid : 地図ID
 * @param cidx : カテゴリーテーブルにおけるcolnum
 */
function initGlobalArray(mapid, cidx){
    if(cidx == null){
        ymIconB[mapid] = new Array();
        ymIconS[mapid] = new Array();
        layerStatus[mapid] = new Array();
        pointsArr[mapid] = new Array();
        pointsByGid[mapid] = new Array();
        categoryStatus[mapid] = new Array();
    }else{
        ymIconB[mapid][cidx] = new Array();
        ymIconS[mapid][cidx] = new Array();
        layerStatus[mapid][cidx] = new Array();
        pointsArr[mapid][cidx] = new Array();
    }
}

/*
 * カテゴリーの情報を配列にセットする
 * @param mapid : 地図ID
 * @param midx : mapArrayにおける地図のインデックス
 * @param cidx : カテゴリーテーブルにおける、colnum
 * @param ridx : カテゴリーテーブルにおける、rownum
 */
function setCategoryData(mapid, midx, cidx, ridx){
    ymIconB[mapid][cidx][ridx] = mapArray[midx].category[cidx][ridx].iconurl;
    ymIconS[mapid][cidx][ridx] = mapArray[midx].category[cidx][ridx].iconurl_small;
    var initFlg = mapArray[midx].category[cidx][ridx].inittype;
    if(initFlg == "t")
        layerStatus[mapid][cidx][ridx] = true;
    if(initFlg == "f")
        layerStatus[mapid][cidx][ridx] = false;
}

/*
 * 地図の表示非表示切り替え
 * @param mapid: 地図ID
 */
function switchMapStatus(mapid){
    // 選択中の地図IDと押された地図IDが同じ場合
    if(!dblClickFlag){
        t_start();
        switchStatus(mapid, null, null, true);
        getDataAll();
    }
}

/*
 * 大分類カテゴリーの表示非表示切り替え
 * @param mapid: 地図ID
 * @param colid: 大分類カテゴリーのcolnum
 */
function switchDaiCategory(mapid, colid){
    if(!dblClickFlag){
        t_start();
        switchStatus(mapid, colid, null, true);
        var nowStatus = categoryStatus[mapid][colid];
        if(nowStatus){
            if(mapStatus[mapid] != true){
                switchStatus(mapid);
            }
        }
        getDataAll();
    }
}

/*
 * 小分類カテゴリーの表示非表示切り替え
 * @param mapid: 地図ID
 * @param colid: 大分類カテゴリーのcolnum
 * @param rowid: 小分類カテゴリーのrownum
 */
function switchCategory(mapid, colid, rowid){
    if(!dblClickFlag){
        t_start();
        switchStatus(mapid, colid, rowid, false);
        var nowStatus = layerStatus[mapid][colid][rowid];
        if(nowStatus){
            if(categoryStatus[mapid][colid] != true){
                switchStatus(mapid, colid, null, false);
            }
            if(mapStatus[mapid] != true){
                switchStatus(mapid);
            }
        }
        getDataAll();
    }
}

/*
 * 表示・非表示ステータスの切り替え
 * @param mapid: 地図ID
 * @param colid: colnum
 * @param rowid: rownum
 * @param loop: 下の階層も変更するかどうか
 */
function switchStatus(mapid, colid, rowid, loop){
    if(mapid != null && colid == null){
        var mapStat = mapStatus[mapid];
        var newStatus = mapStat ? false : true;
        var newColor = mapStat ? lightgray : black;
        var icon = mapStat ? "../js/images/topicon_dis.png" : "../js/images/topicon.png";
        
        mapStatus[mapid] = newStatus;
        var nodeid = xtreeMapNodes[mapid].node.id;
        $("#"+nodeid+" > a").css("color",newColor);
        $("#"+nodeid+"-icon").attr("src", icon);
        xtreeMapNodes[mapid].node.icon = icon;
        xtreeMapNodes[mapid].node.openIcon = icon;

        if(loop){
            for(var cidx = 0; cidx < categoryStatus[mapid].length; cidx++){
                categoryStatus[mapid][cidx] = newStatus;
                nodeid = xtreeMapNodes[mapid][cidx].node.id;
                $("#"+nodeid+" > a").css("color", newColor);
                
                // 大分類が0で小分類が1から始まる関係上、ループも1から始める
                for(var ridx = 1; ridx < layerStatus[mapid][cidx].length; ridx++){
                    layerStatus[mapid][cidx][ridx] = newStatus;
                    nodeid = xtreeMapNodes[mapid][cidx][ridx].id;
                    $("#"+nodeid+" > a").css("color", newColor);
                }
            }
        }
    }else if(colid != null && rowid == null && loop != null){
        var categoryStat = categoryStatus[mapid][colid];
        var newStatus = categoryStat ? false : true;
        var newColor = categoryStat ? lightgray : black;
        categoryStatus[mapid][colid] = newStatus;
        $("#" + xtreeMapNodes[mapid][colid].node.id + " > a").css("color", newColor);

        if(loop){
        // 大分類が0で小分類が1から始まる関係上、ループも1から始める
            for(var ridx = 1; ridx < layerStatus[mapid][colid].length; ridx++){
                layerStatus[mapid][colid][ridx] = newStatus;
                nodeid = xtreeMapNodes[mapid][colid][ridx].id;
                $("#"+nodeid+" > a").css("color", newColor);
            }
        }
    }else if (mapid != null && colid != null && rowid != null){
        var layerStat = layerStatus[mapid][colid][rowid];
        var newStatus = layerStat ? false : true;
        var newColor = layerStat ? lightgray : black;
        layerStatus[mapid][colid][rowid] = newStatus;
        $("#" + xtreeMapNodes[mapid][colid][rowid].id + " > a").css("color", newColor);
    }
}

function t_start(){
    clickTimer = setTimeout(initSelectedMaps, 500);
    dblClickFlag = true;
}

function t_cancel(){
    clearTimeout(clickTimer);
}

function initSelectedMaps(){
    dblClickFlag = false;
}

/*
 * WebFXTreeItemの拡張版
 * クリック時の動作を決められるようにするだけ
 * @param text: 表示するテキスト
 * @param type: ノードのタイプ 0:子持ちノード 1:リーフ
 */
function CategoryNode(text, type){
    this.type = type;
    this.base = WebFXTreeAbstractNode;
    this.base(text);
    if (webFXTreeConfig.usePersistence) {
		this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '1')?true:false;
	} else { this.open = false; }
    this.add = WebFXTreeItem.prototype.add;
    this.toggle = WebFXTreeItem.prototype.toggle;
    this.expand = WebFXTreeItem.prototype.expand;
    this.doExpand = WebFXTreeItem.prototype.doExpand;
    this.collapse = WebFXTreeItem.prototype.collapse;
    this.doCollapse = WebFXTreeItem.prototype.doCollapse;
    this.focus = function(){};
    this.blur = function(){};
    this.keydown = function(){};
}

CategoryNode.prototype.toString = function(nItem, nItemCount){
	var foo = this.parentNode;
	var indent = '';
	if (nItem + 1 == nItemCount) { this.parentNode._last = true; }
	var i = 0;
	while (foo.parentNode) {
		foo = foo.parentNode;
		indent = "<img id=\"" + this.id + "-indent-" + i + "\" src=\"" + ((foo._last)?webFXTreeConfig.blankIcon:webFXTreeConfig.iIcon) + "\">" + indent;
		i++;
	}
	this._level = i;
	if (this.childNodes.length) { this.folder = 1; }
	else { this.open = false; }
	if ((this.folder) || (webFXTreeHandler.behavior != 'classic')) {
		if (!this.icon) { this.icon = webFXTreeConfig.folderIcon; }
		if (!this.openIcon) { this.openIcon = webFXTreeConfig.openFolderIcon; }
	}
	else if (!this.icon) { this.icon = webFXTreeConfig.fileIcon; }
	var label = this.text.replace(/</g, '&lt;').replace(/>/g, '&gt;');
	var str = "<div id=\"" + this.id + "\" class=\"webfx-tree-item\" onkeydown=\"return webFXTreeHandler.keydown(this, event)\">" +
    indent +
    "<img id=\"" + this.id + "-plus\" src=\"" + ((this.folder)?((this.open)?((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon):((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon)):((this.parentNode._last)?webFXTreeConfig.lIcon:webFXTreeConfig.tIcon)) + "\" onclick=\"webFXTreeHandler.toggle(this);\">";

    // typeがリーフの場合はクリックしたらカテゴリーの表示/非表示を切り替える
    if(this.type == 0){
        str += "<img id=\"" + this.id + "-icon\" class=\"webfx-tree-icon\" src=\"" + ((webFXTreeHandler.behavior == 'classic' && this.open)?this.openIcon:this.icon) + "\"  ondblclick=\"webFXTreeHandler.all[this.id.replace('-icon','')].toggle();\">";
    }else if(this.type == 1){
        str += "<img id=\"" + this.id + "-icon\" class=\"webfx-tree-icon\" src=\"" + ((webFXTreeHandler.behavior == 'classic' && this.open)?this.openIcon:this.icon) + "\"  onclick=\""+this.action+"\" style=\"cursor:pointer;\">";
    }
    
    //str += "<a href=\"" + this.action + "\" id=\"" + this.id + "-anchor\" onfocus=\"" + this.focus + "\" onclick=\""+ this.click + "\" " +
    str += "<a href=\"" + this.action + "\" id=\"" + this.id + "-anchor\" onfocus=\"" + this.focus + "\" " +
    (this.target ? " target=\"" + this.target + "\"" : "") +
    ">" + label + "</a></div>" +
    "<div id=\"" + this.id + "-cont\" class=\"webfx-tree-container\" style=\"display: " + ((this.open)?'block':'none') + ";\">";
	var sb = [];
	for (var i = 0; i < this.childNodes.length; i++) {
		sb[i] = this.childNodes[i].toString(i,this.childNodes.length);
	}
	this.plusIcon = ((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon);
	this.minusIcon = ((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon);
	return str + sb.join("") + "</div>";
}

/*
 * カテゴリー一覧の使い方を表示(フローティングDIVで)
 */
function showHelpDiv(){
    var width = 200;
    var height = 180;
    var offset = $("#detailContent").offset();
    var top = offset.top - 5;
    var left = offset.left + 30;
    $("#helpObj").width(width+"px").height(height+"px").css("top", top+"px").css("left", left+"px").fadeIn();
}

/*
 * ヘルプDIVを閉じる
 */
function closeHelp(){
    $("#helpObj").hide();
}

var d_left = 0;
var d_top = 0;

/*
 * 詳細画面を開く
 */
function createDialog(){
    // containerの親の親のoffset
    var offset_2 = null;
    // dialogWindowのoffset
    var offset_org = null;

    // 開き直しなので、iconPointedは消さない
    closeDetailDialog(false);
    //$("#container").dialog("close");
    $("#container").dialog({
        width:250,
        height:300,
        close: function(){
            if(deleteIconPointed){
                makeIconSmall();
                iconPointed = null;
            }
        },
        dragStop: function(){
            var offset_org = $("#dialogWindow").offset();
            var offset_2 = $("#container").parent().parent().offset();
            
            // 次回はその差の分だけ移動した位置に表示させる
            d_left = offset_2.left - offset_org.left;
            d_top = offset_2.top - offset_org.top;
            
        }
    });

    $("#container").parent().parent().css("left", d_left).css("top", d_top);
    $("#container").attr("scrollTop", 0);
    deleteIconPointed = true;
}

/*
 * 表示設定を取得する
 */
function getDetailSetting(){
    var url = "getDetailSetting.php?mapid=" + mid;
    $.ajax({
        type: 'GET',
        url: url,
        dataType: 'json',
        success: function(response){
                showFlag = response;
        }
    });
}

/*
 * 詳細ダイアログを閉じる
 * @param flag: 選択中アイコンであるiconPointedをnullにするかどうか。trueならnullにする。
 */
function closeDetailDialog(flag){
    deleteIconPointed = flag;
    $("#container").dialog("close");
}

/*
 * iconPointedのアイコンを小さくする
 */
function makeIconSmall(){
    if(iconPointed != null){
        iconPointed.src = ymIconS[iconPointed.mapid][iconPointed.themeid][iconPointed.factorid];
        iconPointed.style.zIndex = 10 - iconPointed.factorid;
        iconPointed.width = 16;
        iconPointed.height = 16;
        //
		_mapObj.shiftIcon(iconPointed, -1 * -4, -1 * -4);
    }
}


