/**
 * map.html map_viewのJS処理スクリプト
 *
 * @著作者 Copyright (c)HARUTA Ltd., ALL Rights Reserved <shimada@webharuta.com>
 * @version  
 * Googleマップは、Google Inc. の米国およびその他の国における登録商標または商標です。
 * The following scripts & document are mentioned in Japanese (UTF-8)
 */


/* グローバル変数の確保 */
var bicon;
var map;
var objects 				= new Array;
var categoryList 			= new Array;
var tmpl_category			= "";
var tmpl_categoryHead		= "";
var tmpl_categoryTail		= "";
var tmpl_dataList			= "";
var tmpl_dataListHead		= "";
var tmpl_dataListTail		= "";
var tmpl_layerHead			= "";
var tmpl_layerTail			= "";
var tmpl_layer				= "";
var tmpl_selLayer			= "";
var tmpl_popupDlog			= "";
var originLayer	;



/* 基本MAPの生成 */
function createMap (yy, xx, zoom) {
	map = new GMap2($("map"));
	
	var lMCtl = new GLargeMapControl();
	var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(20, 70));
	map.addControl(lMCtl, pos);
	
	var MTCtl = new GMapTypeControl();
	var pos2 = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(20, 40));
	map.addControl(MTCtl, pos2);
	
	/*OverviewMap*/
	map.addControl(new GOverviewMapControl());
	/* 中心座標　13は地図の拡大縮小率 */
	map.setCenter(new GLatLng(yy, xx), zoom);
	map.addControl(new GScaleControl());
	
	/* Zoom */
	map.enableScrollWheelZoom();
	
	return;
}

/* プロトタイプオブジェクトを生成する*/
function viewPoint (id, yy, xx, tName, htmls, bitmap, category, layer, iconX, iconY) {
	var point 		= new GLatLng(yy, xx);
	var vmarker 	= new markerObj();
	vmarker.id		= id;
	vmarker.point 	= point;
	vmarker.name 	= tName;
	vmarker.html 	= htmls;
	vmarker.category = category;
	vmarker.bitmap 	= bitmap;
	vmarker.layer	=layer;
	vmarker.iconX	= iconX;
	vmarker.iconY	= iconY;
	
	objects.push(vmarker);
	return;
}

/* プロトタイプオブジェクト中に希望IDは存在するか？ */
function findViewPoint (id) {
	for (i = 0; i < objects.length; i++) {
		if (objects[i].id == id) { 
			return true; 
		}
	}
	return false;
}

/* 地図にオーバーレイコントロール */
function buildMarks (category, checked, layer) {
	for (var i = 0; i < objects.length; i++) {
		var point 	= objects[i].point;
		var bitmap 	= objects[i].bitmap;
		var html 	= objects[i].html;
		var tCat	= objects[i].category;
		var visible = objects[i].visible;
		var oLayer	= objects[i].layer;
		
		if (checked === true && oLayer == layer) {
			if (!visible){
				if ( tCat == category || category == "") {
					objects[i].visible = true;	
				}
			}
		}else{
			/* 1オブジェクト消去 */
			if ( tCat == category && oLayer == layer) {
				objects[i].visible = false;
			}
			if ( category == "__all" && oLayer == layer) {
				objects[i].visible = false;
			}
		}
	}
	/* チェックボックスの状態を記憶 */
	writeCatCheck(category, checked, layer);
	
	drawDataList(i, layer);
	addOverlayer();
	setTileOpacity(50);
	return;
}

/* チェックボックスの状態記憶 */
function writeCatCheck(category, checked, layer){
	for (var i = 0; i < categoryList.length; i++){
		if (categoryList[i].layer == layer && categoryList[i].name == category) {
			categoryList[i].checked = checked;	break;
		}
	}
	return;
}

/* オーバーレイ本体 */
function addOverlayer () {
	map.clearOverlays();
	for (var i = 0; i < objects.length; i++) {
		var point 	= objects[i].point;
		var bitmap 	= objects[i].bitmap;
		var html 	= objects[i].html;
		var visible = objects[i].visible;
		var iconX	= objects[i].iconX;
		var iconY	= objects[i].iconY;
		if (visible) {
			var tmk 	= createMarker(point, bitmap, html, iconX, iconY);
			objects[i].maker = tmk;
			map.addOverlay(tmk);
		}
	}
//	ii = 0;
//	addOverlayer2();
	return;
}

var ii;
function addOverlayer2(){
	if (ii < objects.length) {
		timerID = 10;
		clearTimeout(timerID);
		var point 	= objects[ii].point;
		var bitmap 	= objects[ii].bitmap;
		var html 	= objects[ii].html;
		var visible = objects[ii].visible;
		var iconX	= objects[i].iconX;
		var iconY	= objects[i].iconY;
		if (visible) {
			var tmk 	= createMarker(point, bitmap, html, iconX, iconY);
			objects[ii].maker = tmk;
			timerID = setTimeout("addOverlayer2()",100);
			ii++;
			map.addOverlay(tmk);
		}
	}
}

/* MySQLからデータを読み込む */
function readLayer (layer) {
var a = new Ajax.Request(  
    "./ajax/getPoint.php", { 
    	"method": "post", 
		"parameters": "layer=" + layer,
    	asynchronous    : false,
        onSuccess: 		function(request) {
        	loadTemplates();
        	if (request.responseText != ""){
	        	var jsonDec;
	        	eval("jsonDec=" + request.responseText);
	        	for (var i = 0; i < jsonDec.length; i++){
	        		var id			= jsonDec[i][0];
	        		var yy 			= jsonDec[i][1];
	        		var xx 			= jsonDec[i][2];
	        		var tName		= jsonDec[i][3];
	        		var url 		= jsonDec[i][4];
	        		var bitmap 		= jsonDec[i][5];
	        		var category 	= jsonDec[i][6];
	        		var indexImage	= jsonDec[i][7];
	        		
	        		var iconX		= Math.round(jsonDec[i][8]);
	        		var iconY		= Math.round(jsonDec[i][9]);
	        		
	        		/* popup表示のテンプレート処理 */
	        		var htmls = makeHTML(tName, url, indexImage);
	        		/* 重複チェック */
	        		if (!findViewPoint(id)){
		        		//makeCategoryList(category);
		        		viewPoint(id, yy, xx, tName, htmls, bitmap, category, layer, iconX, iconY);
	        		}
	        	}
        	}
        }, 
        onFailure: 		function(request) { alert("読み込みに失敗しました。200"); }, 
        onException: 	function(request) { alert("読み込み中にエラーが発生しました。201"); } 
    } 
); 
}

/* POPUP用テンプレートの処理 */
function makeHTML (tName, url, indexImage) {
	var tmpHtml = tmpl_popupDlog;
	var rgeUrl 		= new RegExp("{##URL##}", "g");
	var rgeName 	= new RegExp("{##NAME##}", "g");
	var rgeSrc	 	= new RegExp("{##SRC##}", "g");
	/* Replace */
	tmpHtml = tmpHtml.replace(rgeUrl, url);
	tmpHtml = tmpHtml.replace(rgeName, tName);
	tmpHtml = tmpHtml.replace(rgeSrc, indexImage);
	
	/* url無い場合 */
	if (url == "" || url == null) {
		rgeUrl 	= new RegExp("onclick(.*)\"", "i");
		tmpHtml = tmpHtml.replace(rgeUrl, "");
	}
	
	/* イメージ無い場合 */
	if (indexImage == "" || indexImage == null) {
		rgeSrc 	= new RegExp("<img(.*)>", "i");
		tmpHtml = tmpHtml.replace(rgeSrc, "");
	}
	
	return tmpHtml;
}

/* テンプレート群を読み込む */
function loadTemplates () {
	/* テンプレートを読み込む */
	readTemplate("categoryHead_kodomo.tpl");
	readTemplate("categoryList.tpl");
	readTemplate("categoryTail.tpl");
	readTemplate("dataHead_kodomo.tpl");
	readTemplate("dataList.tpl");
	readTemplate("dataTail_kodomo.tpl");
	readTemplate("popupDlog_kodomo.tpl");
	return;
}


/* カテゴリ一覧を生成 */
function makeCategoryList (tCategory, layer) {
	var look = false;
	for (i = 0; i < categoryList.length ; i++){
		if (categoryList[i].name == tCategory && categoryList[i].layer == layer){
			look = true;
			break;
		}
	}
	if (!look){ 
		var cObj 	= new categoryObj();
		cObj.name 	= tCategory;
		cObj.layer 	= layer;
		categoryList.push(cObj); 
	}
	return;
}

/* カテゴリリストの描画 (チェックボックス) */
function drawCategoryList (layer) {
	//categoryList 	= new Array;
	/* カテゴリ一覧 */
	for (var ii = 0; ii < objects.length; ii++){
		if (objects[ii].layer == layer) {
			makeCategoryList(objects[ii].category, layer);
		}
	}
	
	var tDiv = $('categolyList');
	var mStr = tmpl_categoryHead;
	//mStr = "";
	var rgexp 		= new RegExp("{##CATEGORY_LIST##}", "g");
	var rgeCat 		= new RegExp("{##LAYER##}", "g");
	var rgeCheck 	= new RegExp("{##CHECKED##}", "g");
	for (var i = 0; i < categoryList.length ; i++){
		if (categoryList[i].layer == layer) {
			var tmpStr = tmpl_category.replace(rgexp, categoryList[i].name);
			tmpStr = tmpStr.replace(rgeCat, layer);
			if (categoryList[i].checked) {
				tmpStr = tmpStr.replace(rgeCheck, 'checked="checked"');
			}else{
				tmpStr = tmpStr.replace(rgeCheck, '');
			}
			mStr += tmpStr;
		}
	}
	mStr += tmpl_categoryTail;
	tDiv.innerHTML = mStr;
	return;
}

/* ポイントデータリストを書き出す. */
function drawDataList (i, layer) {
	var mStr = "";
	var tDiv = $('dataList');
	
	if (tDiv != null) {
		mStr = tmpl_dataListHead;
//		tDiv.innerHTML = "表示されているポイント一覧<br />";
		var rgexp1 = new RegExp("{##ID##}", "g");
		var rgexp2 = new RegExp("{##NAME##}", "g");
		var rgexp3 = new RegExp("{##LAYER##}", "g");
		for (i = 0; i < objects.length ; i++){
			var visible = objects[i].visible;
			if (visible) {
				var tmpData = tmpl_dataList.replace(rgexp1, objects[i].id);
				tmpData = tmpData.replace(rgexp2, objects[i].name);
				mStr += tmpData.replace(rgexp3, layer);
			}
		}
		mStr += tmpl_dataListTail;
		tDiv.innerHTML = mStr;
	}
	return;
}

/* テンプレートを読み込む */
function readTemplate(tplFile) {
var a = new Ajax.Request(  
    "template/" + tplFile, { 
    	asynchronous    : false,
        onSuccess: 		function(request) {
        	switch (tplFile) {
        		case "categoryHead_kodomo.tpl": 	tmpl_categoryHead 	= request.responseText; break;		
        		case "categoryList.tpl": 	tmpl_category 		= request.responseText; break;		
        		case "ccategoryTail.tpl": 	tmpl_categoryTail 	= request.responseText; break;		
        		case "dataHead_kodomo.tpl" : 		tmpl_dataListHead 	= request.responseText; break;		
        		case "dataList.tpl" : 		tmpl_dataList 		= request.responseText; break;		
        		case "dataTail_kodomo.tpl" : 		tmpl_dataListTail 	= request.responseText; break;		
				case "layerList.tpl": 		tmpl_layer 			= request.responseText; break;
				case "layerHead.tpl": 		tmpl_layerHead 		= request.responseText; break;
				case "layerTail.tpl": 		tmpl_layerTail 		= request.responseText; break;
				case "selectLayer.tpl": 	tmpl_selLayer 		= request.responseText; break;
				case "popupDlog_kodomo.tpl": 		tmpl_popupDlog 		= request.responseText; break;
        			
        		default: break;
        	}
        }, 
        onFailure: 		function(request) { alert("読み込みに失敗しました。344"); }, 
        onException: 	function(request) { alert("読み込み中にエラーが発生しました。345"); } 
    } 
);
}

/* Layer一覧を読み込む */
function loadLayerList (layer) {
var a = new Ajax.Request(  
    "./ajax/readLayerList.php", {
    	"method": "post", 
		"parameters": "layer=" + layer,
    	asynchronous    : false,
        onSuccess: 		function(request) {
        	if (request.responseText != ""){
	        	eval("originLayer=" + request.responseText);
	        	drawLayerList(originLayer);
				
        	}
        }, 
        onFailure: 		function(request) { alert("読み込みに失敗しました。364"); }, 
        onException: 	function(request) { alert("読み込み中にエラーが発生しました。365"); } 
    } 
);
}

var timerID;
function changeLayer(layer, checked) {
	if (checked) {
		getCenterZoom(layer);
		readLayer(layer);
		drawCategoryList(layer);
		allCheckCategory(layer, true);
		drawCategoryList(layer);
		buildMarks ("", checked, layer);
		waitDivHide();
		
		/* 上田境界線 */
		GEvent.addListener(map, 'zoomend', function(oldZoomLevel,newZoomLevel ){
			viewUedaLine(); 
		});
		
		viewUedaLine();	
	}else{
		allCheckCategory(layer, false);
		drawCategoryList(layer);
		buildMarks ("__all", false, layer);
	}
	return;
}

/* 大量データ時に待機DIV表示 */
function waitDivShow(layer, checked) {
	if (checked){
		var sizes = Element.getDimensions($('waitDiv'));
		var windowWidth = sizes.width;
		var windowHeight = sizes.height;
		
		var tmpWidth = Math.round((document.documentElement.clientWidth - windowWidth) / 2);
		var tmpHeight = Math.round((document.documentElement.clientHeight - windowHeight) / 2);
		$('waitDiv').style.left = tmpWidth + "px";
		$('waitDiv').style.top = tmpHeight + "px";
		$('waitDiv').style.display = 'block';
	}	
		setTimeout("changeLayer(" + layer + ", " + checked + ")", 0);
}

function waitDivHide () {
	$('waitDiv').style.display = 'none';
}

/* Get Map Center and Map Zoom from MySql. */
function getCenterZoom (layer) {
	//asynchronous    : false,
	var a = new Ajax.Request(  
	    "./ajax/getCenterZoom.php", {
	    	"method": "post", 
			"parameters": "layer=" + layer,
	    	asynchronous    : false,
	        onSuccess: 		function(request) {
	        	if (request.responseText != ""){
		        	var jsonDec;
		        	eval("jsonDec=" + request.responseText);
		        	map.setCenter(new GLatLng(jsonDec[0], jsonDec[1]), eval(jsonDec[2]));
		        	opacityVal = jsonDec[3];
//		        	map.setZoom(eval(jsonDec[2]));
	        	}
	        }, 
	        onFailure: 		function(request) { alert("読み込みに失敗しました。432"); }, 
	        onException: 	function(request) { alert("読み込み中にエラーが発生しました。433"); } 
	    } 
	);
}

/* レイヤー全ON OFF */
function allCheckCategory (layer, val) {
	for (var i = 0; i < categoryList.length; i++){
		if (categoryList[i].layer == layer) {
			categoryList[i].checked = val; 
		}
	}
	return;
}

/**
 * コンテンツ表示関連を以下に記載
 */
function drawIfrm(src){
	var sSuffix = /msie/.test( navigator.userAgent.toLowerCase() ) ? 'ie' : 'gecko' ;

	/* バックグラウンド　透過度の設定 */
	$('contents').src = src;
	if (sSuffix == "ie"){ $('tbackGround').style.filter = "alpha(opacity=60)"; }else{ $('tbackGround').style.opacity = "0.6" ; }
	
	showEff('contentHandle');
	$('tbackGround').style.display = "block";
//	$('contentHandle').style.display = "block";
	
	
	return;
}

function hideBg(){
	$('contentHandle').style.display = "none";
	$('tbackGround').style.display = "none";
	return;
}


/**
 * POPUP
 */
function goPoint(id, tName, layer){
	for (var i = 0; i < objects.length; i++) {
		if (objects[i].id == id){
			map.setCenter(objects[i].point);
			objects[i].maker.openInfoWindowHtml(objects[i].html);
//			objects[i].maker.openInfoWindowHtml("");
		}
	}
	return;
}


/**
 * Effect
 */
function showLeftCtrl(){
	showEff('categolyList');
	showEff('dataList');
}


function hideleftCrtl(){
	hideEff('categolyList');
	hideEff('dataList');
}

function showEff (objName) {
	if ($(objName).style.display == "none") {
		new Effect.Appear(objName, {
			from:0.1, // 開始時透明度
			to:1.0, // 終了時透明度
			delay:0, // 開始までの秒数
			fps:60, // フレームレート
			duration: 0.5, // アニメーションする時間(秒)
			beforeStartInternal: function(effect) {
			},
			afterFinishInternal: function(effect) {
				$(objName).style.display = "block";
			}
		});
	}
}

function hideEff (objName) {
	if ($(objName).style.display == "block") {
		new Effect.Fade(objName, {
			from:1.0, // 開始時透明度
			to:0.0, // 終了時透明度
			// delay:2, // 開始までの秒数
			fps:60, // フレームレート
			duration: 0.5, // アニメーションする時間(秒)
			beforeStartInternal: function(effect) {
			},
			afterFinishInternal: function(effect) {
				 $(objName).style.display = "none";
			}
		});
	}
}

/* 1ポイントの削除 */
function removeOnePoint (point) {
	map.removeOverlay(point);
	return;
}


var tile = 0;
function setTileOpacity (val) {
	if (tile != 0) {
		removeTile();
	}
	var opVal = 1 - (val / 100);
	
	var tilelayer = new GTileLayer(new GCopyrightCollection(), 0, 17);
    tilelayer.getTileUrl = function() {return "./white.png";}
    tilelayer.getOpacity = function() {return opVal;}
    tile = new GTileLayerOverlay(tilelayer);
    map.addOverlay(tile);

}

/* Remove Tile Layer. */
function removeTile() {
	map.removeOverlay(tile);	
}



/* 全削除 */
function allRemoves () {
	map.clearOverlays();
	objects 		= new Array;
	categoryList 	= new Array;
	$('categolyList').innerHTML = "";
	return;
}
