/*************************************************
* 群馬県土砂災害警戒情報：各画面共通処理
* 
* 更新履歴
* [01] 2007.06.01 M.Kudo      新規作成
* [02] 2008.06.12 M.Kudo      危険度判定メッシュ凡例表示関数追加
* [03] 2009.09.18 M.Kudo      各画面で共通して使用する処理追加
* [04] 2010.04.01 M.Kudo      指定要素にデータを表示する関数追加
* [05] 2010.04.06 M.Kudo      トップ画面の遷移先URL変更
*************************************************/

//一覧表画面の表示行数(県民局表示行＋市町村表示行)
var listMaxRow = 10;
//凡例情報XML
var LEGFILE = "../info/leg.xml";

//画面自動更新(3分ごとに自動更新)
var reloadTime = 1000 * 60 * 3;

//画面描画Perlファイルのパス
var CGINAME;
var sabouParam;
var gNo;
var kNo;
var userObj;
var CLASSNAME;
var COLSPAN;


/**
 * パラメータを取得する
 * @return {object} 取得成功：パラメータの連想配列 / 失敗：null
 */
function getParam(){
	//URLパラメータを取得する
	var queryStr = location.search;

	//URLパラメータがあった場合
	if(queryStr){
		//URLパラメータを&で分割
		var queryArr = queryStr.substring(1).split("&");
		//paramsオブジェクト生成
		var params = {};

		//分割されたURLパラメータ数分ループ
		for(var i = 0; i < queryArr.length; i++){
			//各パラメータを=で分割
			var pair = queryArr[i].split("=");
			//パラメータ名があった場合
			if(pair[0]){
				//パラメータ名をキーにして連想配列にパラメータ値を格納
				params[pair[0]] = decodeURIComponent(pair[1]);
			}
		}
		//パラメータの連想配列を返す
		return params;
	}

	//URLパラメータがなかった場合はnullを返す
	return null;
}

/**
 * グローバル変数を設定する
 * @return {void}
 */
function setConst(){
	var myParam = getParam();

	if(!gname){
		gname = "i";
	}

	//画面描画Perlファイルのパス
	if(gname == "i"){
		//一般向け
		CGINAME = "../cgi-bin/index.cgi";
	}
	else if(gname == "b"){
		//防災機関向け
		CGINAME = "../cgi-bin/bousaikikan.cgi";
	}
	else if(gname == "s"){
		//砂防課＆防災端末向け
		CGINAME = "../cgi-bin/sabou.cgi";
	}

	//砂防課特定パラメータ
	if(gname == "s"){
		//防災端末の場合
		if(!myParam || !myParam.usr){
			sabouParam = "";
		}
		//砂防課の場合
		else{
			sabouParam = "&usr=" + myParam.usr;
		}
	}
	else{
		sabouParam = "";
	}

	//画面番号
	if(!myParam || !myParam.gmNum){
		gNo = TOPLINK;
	}
	else{
		gNo = myParam.gmNum;
	}

	//区域番号
	if(!myParam || !myParam.kbNum){
		kNo = "01";
	}
	else{
		kNo = myParam.kbNum;
	}

	//コンテンツ表示区分(一般向け/防災機関＆砂防課向け)
	if(gname == "s"){
		//砂防課と防災機関は同じコンテンツ(メッシュ・グラフ等)表示
		userObj = "b";
	}
	else{
		userObj = gname;
	}
}

/**
 * ID名からオブジェクトを取得する
 * @param {String} id 取得したいオブジェクトのid名
 * @return {object} 取得成功：オブジェクト / 失敗：null
 */
function $(id){
	var element;
	if (typeof id == "string"){
		element = document.getElementById(id);
	}
	else{
		element = id;
	}
	return element;
}

/**
 * ブラウザ/バージョンによってCSSのプロパティ名を設定する
 * @raturn {void}
 */
function setStyleName(){
	var nav = navigator.userAgent;

	//classNameの場合
	CLASSNAME = (nav.indexOf("MSIE 6") != -1 || nav.indexOf("MSIE 7") != -1 || nav.indexOf("MSIE 8") != -1 ) ? "className" : "class";

	//colspanの場合
	COLSPAN = (nav.indexOf("MSIE 6") != -1 || nav.indexOf("MSIE 7") != -1 || nav.indexOf("MSIE 8") != -1 ) ? "colSpan" : "colspan";
}

/**
 * 指定された数値をゼロパディングして指定桁数で返す
 * @param {Number} num    ゼロパディングする数値
 * @param {Number} figure 桁数
 * @return {String} num ゼロパディング・桁合わせした数字文字列
 */
function zeroPadding(num,figure){
	//指定された数値の文字数が桁数より小さい場合
	if(String(num).length < figure){
		//指定された数値numに10のfigure乗の数値を足す
		//文字列の切り出しを行うため数値から文字列に変換しておく
		num = String(num + Math.pow(10,figure));
		//numの後ろからfigure個の文字列を切り出す
		num = num.substr(num.length-figure,figure);
	}
	//numを返す
	return num;
}

/**
 * 指定されたデータを取得して指定された関数に渡す
 * @param {String}  file    ファイルのパス
 * @param {String}  func    テキストを取得した時に実行する関数
 * @param {Boolean} syncVal 同期・非同期の判断
 * @param {String}  postStr postの時に送るデータ
 * @return {String} 取得成功：データ / 失敗：null
 */
function dataGet(file,func,syncVal,postStr){
	//引数チェック
	if(!file){
		alert("読み込むファイルが設定されていません");
		return;
	}
	if(!func){
		alert("データ読み込み後の処理が設定されていません");
		return;
	}

	var method = "get";
	var sync = true;

	//Firefox/3用対策
	if(navigator.userAgent.match(/Firefox\/3/)){
		sync = true;
	}
	else if(syncVal != undefined){
		sync = syncVal;
	}

	if(postStr){
		method = "post";
	}

	//キャッシュ対策のため、ファイル名に現在時刻を追加
	(file.match(/\?/))? file += "&": file += "?";
	file += "time=" + new Date().getTime();
	var tryAgain = function (){
		if(arguments[3]){
			clearTimeout(timer);
		}
		else if(arguments[2]){
			dataGet(file,func,arguments[2]);
		}
		else{
			dataGet(file,func);
		}
	}
	//XMLHttpRequestオブジェクト作成
	var httpObj = createXMLHttpRequest();
	var timer = setTimeout(
		function() {
			httpObj.abort();
			httpObj.onreadystatechange = null;
			setTimeout(tryAgain, 10000);
		},
	10000);

	//true :非同期 リクエストが返る前に処理が進む
	//false:同期   リクエストが返ってから処理が進む
	httpObj.open(method,file,sync);
	httpObj.onreadystatechange = function(){
		if(httpObj.readyState != 4){
			return null;
		}

		//読み込みが完了したらタイマーを停止する
		clearTimeout(timer);

		var response;

		//リクエスト成功の場合
		if(httpObj.status == 200){
			//XMLデータの場合
			if(file.indexOf("xml") != -1){
				response = httpObj.responseXML;
			}
			//テキストデータの場合
			else{
				response = httpObj.responseText;
			}
		}
		//リクエスト失敗の場合
		else{
			//XMLデータの場合
			if(file.indexOf("xml") != -1){
				response = null;
			}
			//テキストデータの場合
			else{
				//Not Foundの場合
				if(httpObj.status == 404){
					response = "Error404";
				}
				//その他のエラー
				else{
					response = null;
				}
			}
		}
		func(response);
	}
	if(method == "post"){
		httpObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		postStr = encodeURIComponent(postStr);
	}
	httpObj.send(postStr);
}

/**
 * ブラウザによって異なるxmlhttpオブジェクトを生成する
 * @class xmlhttpオブジェクト作成関数
 * @return {object} 作成成功：オブジェクト / 失敗：null
 */
function createXMLHttpRequest(){
	var XMLhttpObject;

	if(window.XMLHttpRequest){
		//IE7～, FireFox, safari, opera等
		XMLhttpObject = new window.XMLHttpRequest();
	}
	else if(window.ActiveXObject){
		try{
			//IE6
			XMLhttpObject = new window.ActiveXObject('Msxml2.XMLHTTP');
		}
		catch(e){
			//～IE5.5
			XMLhttpObject = new window.ActiveXObject('Microsoft.XMLHTTP');
		}
	}
	else{
		alert("ブラウザが対応していません");
	}
	return XMLhttpObject;
}

/**
 * イベントリスナーを登録する
 * @param {elm} 対象オブジェクト
 * @param {evt} イベントタイプ
 * @param {func} 呼び出し関数
 * @return {void}
 */
function addFunc(elm,evt,func){
	if(typeof(func) == "string"){
		if(elm.attachEvent){
			// IEの場合
			elm.attachEvent("on" + evt, function(){eval(func);});
		}
		else if(elm.addEventListener){
			// IE以外
			elm.addEventListener(evt, function(){eval(func);}, false);
		}
		else{
			// 上記のどちらにも対応していない場合
			elm["on" + evt] = function(){eval(func);};
		}
	}
	else{
		if(elm.attachEvent){
			elm.attachEvent("on" + evt, func);
		}
		else if(elm.addEventListener){
			elm.addEventListener(evt, func, false);
		}
		else{
			elm["on" + evt] = func;
		}
	}
}

/**
 * 自動更新処理を開始する
 * @return {void}
 */
function reloadStart(){
	//データ表示画面で自動更新処理を開始する
	if(MAPKIND != "non"){
		//reloadID = setTimeout("reload()",reloadTime);
	}
}

/**
 * 一定時間毎に画面を更新する
 * @return {void}
 */
function reload(){
	//危険度判定情報(時間切替あり)の場合
	if(gNo > 100000 && gNo < 200000){
		location.href = CGINAME + "?gmNum=" + gNo + "&kbNum=" + kNo + sabouParam;
	}
	//その他の場合
	else{
		window.location.reload(true);
	}
}

/**
 * トップ画面へ遷移する
 * @return {void}
 */
function goINDEX(){
	location.href = CGINAME + "?gmNum=" + TOPLINK + "&kbNum=01" + sabouParam;

	//新トップ画面導入後は下記遷移先に変更
	location.href = "top.cgi?gname=" + gname + sabouParam;
}

/**
 * 補足情報画面を表示する
 * @return {void}
 */
function openHosoku(){
	url = "./hosoku.pl";
	window.open(url,"現在発表区域補足情報","menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars=auto,width=700,height=420,resizable=no");
}

/**
 * 各ユーザ向けの操作方法PDFを表示する
 * @return {void}
 */
function openPDF(){
	var url="../html/help_"+userObj+".pdf";
	window.open(url,"ご利用について","menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars=auto,width=850,height=600,resizable=yes");
}

/**
 * 指定された画面へ遷移する
 * @param {String} hina 遷移する画面のHTML番号
 * @param {Number} num 
 * @return {void}
 */
function gamenLink(hina,num){
	location.href = CGINAME + "?gmNum=" + hina + "&kbNum=" + num + sabouParam;
}

/**
 * 指定された県民局または市町村の危険度判定情報画面へ遷移する
 * @param {String} fName フォーム名
 * @param {String} sName セレクトボックス名
 * @param {String} pNo 遷移先HTML番号
 * @return {void}
 */
function kubunChange(fName,sName,pNo){
	var kubunNo = document.forms[fName].elements[0].value;

	if(kubunNo == 0){
		return;
	}
	else{
		location.href = CGINAME + "?gmNum=" + pNo + "&kbNum=" + kubunNo + sabouParam;
	}
}

/**
 * 県民局および市町村セレクトボックスの選択状態を変更する
 * @return {void}
 */
function selKubun(){
	//県民局選択の場合
	if(gNo == "126041"){
		if(kNo != ""){
			document.sel1.fmPref.selectedIndex = eval(kNo);
		}
	}
	//市町村選択の場合
	if(gNo == "136041"){
		var selOpt = 0;
		if(kNo != ""){
			for(var i = 0; i < document.sel2.fmCity.options.length; i++){
				//選択された市町村のセレクトボックス内での項目番号を取得する
				if(document.sel2.fmCity.options[i].value == kNo){
					selOpt = i;
				}
				//選択された市町村を選択状態にする
				document.sel2.fmCity.selectedIndex = selOpt;
			}
		}
	}
}

/**
 * 危険度情報区域選択用のミニ地図を生成する
 * @return {void}
 */
function makeNavi(){
	var navInfo = [
		{alt:"中部県民局",coords:"69,99,131,121",href:"javascript:gamenLink('126041','01');"},
		{alt:"西部県民局",coords:"39,134,101,156",href:"javascript:gamenLink('126041','02');"},
		{alt:"吾妻県民局",coords:"4,79,66,101",href:"javascript:gamenLink('126041','03');"},
		{alt:"利根沼田県民局",coords:"69,34,151,56",href:"javascript:gamenLink('126041','04');"},
		{alt:"東部県民局",coords:"124,134,186,156",href:"javascript:gamenLink('126041','05');"},
		{alt:"全県",coords:"4,9,66,31",href:"javascript:gamenLink('116040','01');"}
	];

	//タイトルを生成する
	var h3 = document.createElement("h3");
	h3.appendChild(document.createTextNode("5km四方危険度情報"));

	$("linkNavi").appendChild(h3);

	//区域選択用ミニ地図を生成する
	var img = document.createElement("img");
	img.id = "naviMap";
	img.src = "../img/map/navi0.gif";
	img.useMap = "#navi";
	$("linkNavi").appendChild(img);

	//イメージマップを生成する
	var map = document.createElement("map");
	map.name = "navi";
	map.id ="navi";

	document.body.appendChild(map);

	//
	for(var i = 0; i < navInfo.length; i++){
		//イメージマップの領域を設定する
		var area = document.createElement("area");
		area.alt = navInfo[i]["alt"];
		area.shape = "rect";
		area.coords = navInfo[i]["coords"];
		area.href = navInfo[i]["href"];

		//マウスオーバー時の動作を設定する
		addFunc(area,"mouseover","swapNAVI(" + (i+1) + ")");
		//マウスアウト時の動作を設定する
		addFunc(area,"mouseout","swapNAVI(0)");

		map.appendChild(area);
	}
}

/**
 * 危険度情報区域選択用のミニ地図画像を切り替える
 * @return {void}
 */
function swapNAVI(no){
	$("naviMap").src = "../img/map/navi" + no + ".gif";
}


/** 
 * 指定要素にデータを表示する
 * @param {element} elm データを挿入する要素
 * @param {string/integer} 表示するデータ
 */
function setValue(elm, value){
	if(!elm){
		return;
	}

	if(elm.tagName == "input" || elm.tagName == "INPUT"){
		elm.value = value;
	}
	else{
		if(elm.hasChildNodes()){
			if(elm.firstChild.nodeType == 3){
				elm.firstChild.nodeValue = value;
			}
		}
		else{
			var inValue = document.createTextNode(value);
			elm.appendChild(inValue);
		}
	}
}

