/*
Copyright (c) 2008, Informatix Inc. All rights reserved.
author  : Mari.Ohmiya
version : 1.0.0
*/

//■定数
//排出量単位
var UNIT_EMISSION = "[kg/年]";
//濃度単位
var UNIT_DENSITY = "[μg/m&#179;]";
//最小濃度
var NOUDO_MIN = 0.0000005;

//ソート項目マーク
var SORTABLE_MARK = "★";
//ソート項目周知文
var SORTABLE_TEXT = SORTABLE_MARK + "のついている表タイトルをクリックすると、ソートができます。";

//データ区分（発生源）
var DATA_CD_EMISSION = "1";
//データ区分（濃度）
var DATA_CD_DENSITY = "2";
//データ区分（資料）
var DATA_CD_DATA = "3";

//データ区分名称（発生源）
var DATA_CD_NAME_EMISSION = "（発生源）";
//データ区分名称（濃度）
var DATA_CD_NAME_DENSITY = "（濃度）";

//公開物質一覧（排出量公表フラグ名称）
var MATERIAL_PUBLIC_EMISSION_NAME = "emissionPublicFg";
//公開物質一覧（濃度公表フラグ名称）
var MATERIAL_PUBLIC_DENSITY_NAME = "densityPublicFg";

//CopyRight
var CP_RIGHT = "Copyright 2008 (C) National Institute of Technology and Evaluation All rights reserved.";

var	LICENSE_HTML =
			"<a style='position:absolute; left:3px; top:5px;'>" +
				"<img src='img/nite_logo_mini.gif' alt=''>" +
			"</a>" +
			"<a style='position:absolute; left:90px; top:5px; color:red'>※濃度や排出量は人や生態系に影響を及ぼしていることを示すものではありません。</a>" +
			"<a style='position:absolute; left:90px; top:22px'>" + CP_RIGHT + "</a>";
//画面定義
var WIN_PARAM ={
		OPTION			:"toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes",
		MAIN_MAP_WINDOW			: {
			WIDTH	:	990,
			HEIGHT	:	720
		},
		MATERIAL_OUT_SUM		: {
			WIDTH	:	830,
			HEIGHT	:	720,
			BLANK	:	true
		},
		RANKING_MATERIAL		: {
			WIDTH 	:	900,
			HEIGHT 	:	655
		},
		SEARCH_MATERIAL			: {
			WIDTH 	:	480,
			HEIGHT 	:	665
		},
		HISTOGRAM_POP_LIST		: {
			WIDTH	:	360,
			HEIGHT	:	600
		},
		HISTOGRAM_MESH_LIST		: {
			WIDTH	:	360,
			HEIGHT	:	600
		},
		HISTOGRAM_WINDOW		: {
			WIDTH	:	600,
			HEIGHT	:	460
		},
		MATERIAL_PUBLIC_LIST		: {
			WIDTH 	:	910,
			HEIGHT 	:	707
		},
		SHOW_NENDO_LIST			: {
			WIDTH 	:	310,
			HEIGHT 	:	300
		},
		SEARCH_AREA				: {
			WIDTH	:	450,
			HEIGHT	:	675
		},
		MOVE_MAP_MARKER			: {
			WIDTH	:	420,
			HEIGHT	:	370
		},
		SEARCH_ADDRESS			: {
			WIDTH	:	450,
			HEIGHT	:	665
		},
		MOVE_MAP_MESH			: {
			WIDTH	:	440,
			HEIGHT	:	680
		},
		MOVE_MAP_PREF			: {
			WIDTH	:	405,
			HEIGHT	:	625
		},
		MOVE_MAP_CITY			: {
			WIDTH	:	430,
			HEIGHT	:	690
		},
		LEGEND_EDIT_WINDOW		: {
			WIDTH	:	430,
			HEIGHT	:	420
		},
		LOAD_LEGEND_WINDOW		: {
			WIDTH	:	730,
			HEIGHT	:	450
		},
		LOAD_POSITION_WINDOW	: {
			WIDTH	:	920,
			HEIGHT	:	550
		},
		LOAD_MARKER_WINDOW		: {
			WIDTH	:	520,
			HEIGHT	:	500
		},
		SHOW_NENDO_DATA			: {
			WIDTH 	:	500,
			HEIGHT 	:	400
		},
		SHOW_CURRENT_MAP			: {
			WIDTH 	:	660,
			HEIGHT 	:	720
		},
		SHOW_STATIC_MAP			: {
			WIDTH 	:	660,
			HEIGHT 	:	720,
			BLANK	:	true
		}
}


//■関数

/**
 * 浮動小数点表記の文字列を返す
 * 小数点以下を四捨五入し、指定の桁数の浮動小数点表記とする
 * len=1の場合は、小数点以下第2位を四捨五入し、小数点以下第1位までを返す
 * 3桁ごとに,を挿入する
 */
function roundDouble(value, len) {

	//小数点以下を指定の位置で四捨五入する
	var kei = 10 * len;
	var kazu = (value * kei);
	kazu = Math.round(kazu);
	kazu = (kazu / kei);

	//浮動小数点表記を返す
	return parseString(kazu);
}

/**
 * 浮動小数点表記の文字列を返す
 * 整数部・小数部をあわせて14桁以内の場合、浮動小数点表記
 * 14桁を超える場合は指数表記(toString()が返す値)を返す
 * 3桁ごとに,を挿入する
 */
function parseString(value) {

	//浮動小数点にキャストする
	value = value * 1.0;

	//固定小数点表記に変換する
	var str = value.toFixed(14);

	//3桁ごとに,を挿入する
	var buf = insertComma(str);

	//小数の場合、末尾の0を削除する
	var ret = buf;
	for (i = buf.length-1; i>=0; i--){
		if (buf.substr(i,1) != "0"){
			if (buf.substr(i,1) == "."){
				ret = ret.substr(0, i);
			}
			else{
				ret = ret.substr(0, i + 1);
			}
			break;
		}
	}

	//浮動小数点表記を返す
	return chageExpString(ret);
}

/**
 * 浮動小数点表記の文字列を返す
 * 整数部・小数部をあわせて14桁以内の場合、浮動小数点表記
 * 14桁を超える場合は15桁目を四捨五入して丸めた値(toFixed(14)が返す値)を返す
 * 3桁ごとに,を挿入しない
 */
function parseDoubleString(value) {

	//浮動小数点にキャストする
	value = value * 1.0;

	//固定小数点表記に変換する
	var str = value.toFixed(14);

	//小数の場合、末尾の0を削除する
	var ret = str;
	for (i = str.length-1; i>=0; i--){
		if (str.substr(i,1) != "0"){
			if (str.substr(i,1) == "."){
				if (i < str.length-1) {
					ret = ret.substr(0, i + 2);
				}
			}
			else{
				ret = ret.substr(0, i + 1);
			}
			break;
		}
	}

	//固定小数点表記を返す
	return ret;
}

/**
 * 3桁ごとに,を挿入する
 */
function insertComma(str) {
	var ret = "";
	var pos = 0;
	var cnt = 0;
	for (i = str.length-1; i>=0; i--){
		if (str.substr(i,1) == "."){
			pos = i;
			cnt = 0;
			ret = str.substr(i,1) + ret;
		}
		else{
			if (pos > 0) {
				cnt++;
				if (cnt > 3) {
					ret = "," + ret;
					cnt = 1;
				}
				ret = str.substr(i,1) + ret;
			}
			else {
				ret = str.substr(i,1) + ret;
			}
		}
	}

	return ret;
}

/**
 * 文字列に3桁ごとに,を挿入する
 */
function insertCommaString(str) {

	//仮に少数表記にする
	str += ".0";

	//3桁ごとに,を挿入する
	var ret = "";
	var pos = 0;
	var cnt = 0;
	for (i = str.length-1; i>=0; i--){
		if (str.substr(i,1) == "."){
			pos = i;
			cnt = 0;
			ret = str.substr(i,1) + ret;
		}
		else{
			if (pos > 0) {
				cnt++;
				if (cnt > 3) {
					ret = "," + ret;
					cnt = 1;
				}
				ret = str.substr(i,1) + ret;
			}
			else {
				ret = str.substr(i,1) + ret;
			}
		}
	}

	//仮の少数表記を解除する
	ret = ret.substr(0, ret.length-2);

	return ret;
}

/**
 * 指数表記の文字列を返す
 */
function parseExpString(value) {

	//浮動小数点にキャストする
	value = value * 1.0;

	//指数表記に変換する
	var str = value.toExponential(2);

	//E(e)を ×10 に変換する
	return chageExpString(str);
}

/**
 * 指数表記の表記方法を変更する
 */
function chageExpString(str) {

	//指数表記でない場合はそのまま返す
	var pos = str.search("e");
	if (pos < 0){
		return str;
	}

	//E(e)を ×10 に変換する
	var left = str.substr(0, pos);
	var sign = str.substr(pos + 1, 1);
	var right = str.substr(pos + 2, str.length - (pos + 2));

	if (right == "0") {
		var ret = left;		//指数が0の場合は指数表記なし
	}
	else if (sign == "+") {
		if (right == "1") {
			var ret = left + "×10";	//指数が+1の場合は×10のみ
		}
		else {
			var ret = left + "×10" + "<sup>" + right + "</sup>";	//符号が+の場合は省略
		}
	}
	else {
		var ret = left + "×10" + "<sup>" + sign + right + "</sup>";	//通常の指数表記
	}

	return ret;
}

/**
 * サーバーへリクエストを投げウィンドウを開く
 * serverRequset	:呼出すURL
 * windowKey		:WIN_PARAMに定義したウィンドウのキー
 */
function openWindow(serverRequset, windowKey) {
	var option = "";
	var win;

	if (windowKey == undefined || windowKey == "") {
		win = window.open(serverRequset, "_blank");
	}
	else {
		if (WIN_PARAM[windowKey].WIDTH != undefined) option = "width=" +  WIN_PARAM[windowKey].WIDTH
		if (WIN_PARAM[windowKey].HEIGHT != undefined) {
			if (option != "") option += ",";
			option += "height=" + WIN_PARAM[windowKey].HEIGHT
		}
		if (option != "") option += ",";
		option += WIN_PARAM.OPTION;
		if (WIN_PARAM[windowKey].BLANK == null || !WIN_PARAM[windowKey].BLANK) {
			win = window.open(serverRequset, windowKey, option);
		}
		else {
			win = window.open(serverRequset, "_blank", option);
		}
	}
	win.focus();
}

/**
 * XY座標値に該当するメッシュの情報を取得し後続処理を行う
 * nendo_arg		:年度
 * material_no_arg	:物質番号
 * data_cd_arg		:データ区分
 * x_arg			:x座標
 * y_arg			:y座標
 * version_arg		:バージョン
 * resSuccess		:処理成功時のコールバックメソッド
 * resError			:処理失敗時およびデータ無し時のコールバックメソッド
 * 戻り値				:MeshInfoオブジェクト
 */
function getMeshInfo(nendo_arg, material_no_arg, data_cd_arg,
					x_arg, y_arg, version_arg, resSuccess, resError) {
    // 成功
    var responseSuccess = function (obj) {
        if(obj.status == 200) {
			try {
				var info = YAHOO.lang.JSON.parse(obj.responseText);
				// 返ったレコードが１件の場合のみ情報を取得する
				if (info.length == 1) {
					var meshInfo = new MeshInfo();
					meshInfo.meshNo = info[0].meshNo
					meshInfo.prefName = info[0].prefName;
					meshInfo.cityName = info[0].cityName;
					meshInfo.value = info[0].value;
					// 後続処理へ
					resSuccess(meshInfo);
	            }
				else {
					resError();
				}
			}
			catch (e) {
				resError();
			}
        }
		else {
			resError();
		}
    }

    // 失敗
    var responseFailure = function (obj) {
		resError();
    }

    // コールバックオブジェクト
    var getMeshInfoCallBack = {
        success: responseSuccess,
        failure: responseFailure
    }

    // リクエスト送信
    var server = "MapCenterInfo.do";
    var param = "nendo=" + nendo_arg;
    param += "&material_no=" + material_no_arg;
    param += "&data_cd=" + data_cd_arg;
    param += "&posX=" + x_arg;
    param += "&posY=" + y_arg;
	param += "&v=" + version_arg;
    var cObj = YAHOO.util.Connect.asyncRequest("GET", server + "?" + param, getMeshInfoCallBack, null);
}

/**
 * 物質の表示可否をチェックする（資料ページからの呼出）
 * nendo_arg		:年度
 * material_no_arg	:物質番号
 * materialPublicList_arg	:公表物質データリスト
 * 戻り値				:地図表示フラグ　true:地図を表示　false:地図を表示しない
 */
function checkMaterialViewDensity　(nendo_arg, material_no_arg, materialPublicList_arg){
	return(checkMaterialView(nendo_arg, material_no_arg, MATERIAL_PUBLIC_DENSITY_NAME,
			materialPublicList_arg));
}
/**
 * 物質の表示可否をチェックする
 * nendo_arg		:年度
 * material_no_arg	:物質番号
 * material_public_name_arg	:公開物質一覧（排出量／濃度公表フラグの名称）
 * materialPublicList_arg	:公表物質データリスト
 * 戻り値				:地図表示フラグ　true:地図を表示　false:地図を表示しない
 */
function checkMaterialView (nendo_arg, material_no_arg, material_public_name_arg, materialPublicList_arg) {
	for (var i=0;i<materialPublicList_arg.length;i++) {
		if (nendo_arg == materialPublicList_arg[i].nendo) {
			if (material_no_arg == materialPublicList_arg[i].materialNo) {
				if (materialPublicList_arg[i][material_public_name_arg] == 0) {
					return true;
				}
				else {
//					return(_alertMaterialView(material_public_name_arg,
//										 materialPublicList_arg[i][material_public_name_arg]));
					//戻り値は利用しないように変更 2008/7/25
					 _alertMaterialView(material_public_name_arg,
										 materialPublicList_arg[i][material_public_name_arg])
					return false;
				}
			}
		}
	}
	alert("表示できません");	//このケースはありえないはず。
	return false;
}
//物質の表示不可時のアラート表示（checkMaterialViewの内部関数）
function _alertMaterialView (material_public_name_arg, msg_value_arg){
	var msg = "分布図は表示されません。";
	var sts = false;
	if (material_public_name_arg == MATERIAL_PUBLIC_EMISSION_NAME) {
		if (msg_value_arg == "1") {
			msg = "この物質の発生源はありません 。";
			sts = true;
		}
		else if (msg_value_arg == "3") {
			msg = "この物質は情報不足のため地図に分布を表示していません 。";
			sts = true;
		}
	}
	else {
		if (msg_value_arg == "1") {
			msg = "この物質は発生源がないため、濃度推定していません。";
			sts = true;
		}
		else if (msg_value_arg == "2") {
			msg = "この物質は濃度計算パラメータ不足のため推定していません。 ";
			sts = true;
		}
		else if (msg_value_arg == "3") {
			msg = "この物質は発生源が不明なため濃度推定していません 。";
			sts = true;
		}
	}
	alert(msg);
	return sts;
}


/**
 * datatableの表示形式情報を取得する
 * containers		:ページング用DIVのID
 * pageLinks		:ページリンクの個数
 * rowsPerPage		:1ページ内の表示行数
 * 戻り値				:ページング設定JSON形式
 */
function getDataTableFormat(containers, pageLinks, rowsPerPage) {

	var myPaginatorConfig = {
    	containers				:containers,
    	alwaysVisible			:false,
    	template				:YAHOO.widget.Paginator.TEMPLATE_DEFAULT,
    	firstPageLinkLabel		:"最初へ",
    	previousPageLinkLabel	:"前へ",
    	nextPageLinkLabel		:"次へ",
    	lastPageLinkLabel		:"最後へ",
    	pageLinks				:pageLinks,
    	rowsPerPage				:rowsPerPage
    }

	return myPaginatorConfig;
}

/**
 * ソート可能項目の周知文を表示する
 * 周知文を表示する場所に、<div id="sort-title"></div>を記述する
 * window.onload で、この関数を実行する
 */
function SortableText() {
	var element = document.getElementById("sortable-text");
	element.innerHTML = "<b>" + SORTABLE_TEXT + "</b>";
}

