//*******************************************************************
// View管理スクリプト
//-------------------------------------------------------------------
// 初版  2009/05/26  asa
//*******************************************************************

var CmnView ={};

CmnView = function(){
    /**
     * 名称を設定する
     * @param  nameDef：画面番号に対応する名称定義
     */
    this.setName = function( nameDef){
        
        try{
            //トップ画面以外は画面情報に該当する定義を取得する
//090826.kamino 浦滝用に変更
//            if (CmnVar.GmnNo != "top") {
            if  (!(CmnVar.GmnNo == "G1000000")) {
                //ダム番号
                nameDef = nameDef["dam" + CmnVar.QueryParam["damno"]];
                
                //データ収集間隔
                var span = (CmnVar.QueryParam["span"] != undefined) ? CmnVar.QueryParam["span"] : 1;
                if (nameDef != undefined){
                    nameDef = nameDef["d" + span];
                }
                
                //ページ番号
                var page = (CmnVar.QueryParam["page"] != undefined) ? CmnVar.QueryParam["page"] : 1;
                if (nameDef != undefined){
                    nameDef = nameDef["p" + page];
                }
                
                if (nameDef == undefined) return;
            }
            
            //名前情報数ループ
            for (var id in nameDef){
                  
                //プロパティ定義数ループ
                for (var property in nameDef[ id]){
                    
                    var elm = property;
                    //"name"の場合は属性の判定を行う
                    if (elm == "name") {
                        elm = CmnLib.Elm.chkElement(CmnLib.Elm.ID(id));
                    }
                    
                    //"class"の場合は属性の判定を行う
                    if (elm == "class"){
                        elm = CmnVar.Cls;
                    }

                    //プロパティを設定する
                    CmnLib.Elm.ID(id)[elm] = nameDef[ id][ property];
                }
            }  

            /**
             * デモモード
             */
            if(CmnVar.DEMO_MODE){
//090827.kamino 浦滝用削除 start.
//                //各画面のタイトル設定
//                if(CmnLib.Elm.ID("damName")){
//                    CmnLib.Elm.ID("damName").innerHTML = "○○ダム";
//                }
//                //トップ画面
//                if (CmnVar.GmnNo == "top") {
//        	        CmnLib.Elm.ID("hrimg").className = "hide";
//        	        CmnLib.Elm.ID("damBtn0").value = "○○ダム";
//                }
//                if (CmnVar.GmnNo == "G1005000") {
//        	        CmnLib.Elm.ID("bgImg").className = "ryuikiDIV mapArea_demo";
//                }
//                if (CmnVar.GmnNo == "G2203000") {
//        	        CmnLib.Elm.ID("kyoku0").value = "○○○水位局";
//                }
//                if (CmnVar.GmnNo == "G2303000") {
//        	        CmnLib.Elm.ID("kyokBtn").value = "○○○水位局";
//                }
//                if (CmnVar.GmnNo == "G2304000") {
//        	        CmnLib.Elm.ID("graphTitle").innerHTML = "○○ダム";
//                }
////090827.kamino 浦滝用削除 end.
            }
////090901.kamino 浦滝用追加 start.→527行目にもあり
            if (CmnVar.GmnNo == "G2201000"){
                var tblHeight = "";
		        if(navigator.userAgent.indexOf("MSIE") == -1){
			        tblHeight = "38px"; //Ff3
                    CmnLib.Elm.ID("timeTop").style.height = tblHeight;
		        }
            }
            
            //IE6のズレ修正
            if (CmnVar.GmnNo != "G1100000"){
                if(navigator.userAgent.indexOf("MSIE 6") != -1 && CmnLib.Elm.ID("backupFmt")){
                    CmnLib.Elm.ID("backupFmt").style.left = "-46px";
                }
            }
////090901.kamino 浦滝用追加 end.
        }
        catch (e){
            alert("NameMaster定義不具合（id:" + id + "）の可能性があります");
        }
    }
    
    /**
     * 観測時刻を設定する
     * @param  dt：表示時刻
     */
    this.setNewTime = function(dt){
   
        //JSONより最新観測日時を取得する
        var jsonDate = new Date(dt);
        
        //桁数の調整を行う
        var dtParam = CmnLib.Time.getFormatedDate(jsonDate);
        var setTm = "観測時刻　" +  dtParam["year"] + "年" + dtParam["month"] + "月" + dtParam["day"] + "日" + 
                    dtParam["hour"] + "時" + dtParam["min"] + "分";
        
        //共通変数に格納する
        CmnVar.QueryParam["reqtime"] = dtParam["year"] + "," + dtParam["month"] + "," + dtParam["day"] + "," + 
                                       dtParam["hour"] + "," + dtParam["min"];
        
        //観測時刻の表示
        var elm = CmnLib.Elm.chkElement(CmnLib.Elm.ID("newTime"));
	    CmnLib.Elm.ID("newTime")[elm] = setTm;
    }

    /**
     * NormalAllデータの表示
     *
     */ 
    this.dispNormalData = function(){

        //ID数ループ
        for (var idCnt = 0; idCnt < JsonData.NormalAll.length; idCnt++){
            //ID取得
            var id = CmnLib.Elm.ID(JsonData.NormalAll[idCnt].Id);
            //IDオブジェクト取得
            var idObj = JsonData.NormalAll[idCnt].PropertyList;

            //降雨開始時刻表示用に追加
            var idName = JsonData.NormalAll[idCnt].Id;
            if(idName == "stTime"){
                this.makeStTime(idObj);
            }

            //プロパティ数ループ
            for (var propCnt = 0; propCnt < idObj.length; propCnt++){

//090902.kamino 浦滝用 不要なため削除
//                //090828.kamino 浦滝用 リアルタイムダム情報個別        
//				if((idName == "dam_01_4" || idName == "dam_02_3") && idObj[propCnt].Name == "innerHTML"){
//                    idObj[propCnt].Value = this.CalcData(idName, idObj[propCnt].Value);
//                }

                //データ変換
                this.chgDisplay(id, idObj[propCnt].Name, idObj[propCnt].Value);
            }
        }

//090826.kamino 浦滝用 不要なため削除        
//         //概況図の場合は、水位を変更する
//        if (CmnLib.UrlParam.getThisPageName(true, 5) == "G1000"){
//            var waterChange = new WaterChange();
//            waterChange.changeWater();
//        }
    }

    /**
     * グラフデータの表示（上下共通メソッド）
     *
     */
    this.dispGraphData = function(graphData){

        //ID数ループ
        for (var idCnt = 0; idCnt < graphData.length; idCnt++) {
//090911.kamino 浦滝用 グラフ画像は上書きされるため現在時刻をつける
            var nowDate = Date.parse(new Date());   

            //イメージ反映
//090911.kamino 浦滝用 グラフ画像は上書きされるため現在時刻をつける
//            this.chgDisplay(CmnLib.Elm.ID(graphData[idCnt].Id), "src", graphData[idCnt].Src);
            this.chgDisplay(CmnLib.Elm.ID(graphData[idCnt].Id), "src", graphData[idCnt].Src + "?time=" + nowDate);
            
            //ScaleListオブジェクト取得
            var scaleList = graphData[idCnt]["ScaleList"];
            
            if (scaleList != undefined){
                //スケールオブジェクト数ループ
                for (var scaleObj in scaleList){
                    //スケール値を設定する
                    CmnVar[scaleList[scaleObj]["Name"]] = scaleList[scaleObj]["Value"];
                }
            }
        }    
    }
        
    /**
     * HyoAllデータの表示
     *
     */ 
    this.dispHyoData = function(){
        //表の時刻テーブルID名取得
        var tblID = (CmnLib.Elm.ID("timeTBL")) ? "timeTBL" : "";   
        
        //表がある分だけループ
        for (var hyoCnt = 0; hyoCnt < JsonData.HyoAll.length; hyoCnt++){
            //var param = makeHyoParam[JsonData.HyoAll[hyoCnt].Id];
            //this.makeList(hyoCnt, param.posTR, param.posTD, param.tTBLid, param.tposTR, param.tposTD);
            this.makeList(hyoCnt, 0, 0, tblID, 0, 0);
        }
    }
            
    /**
     * 表を作成する
     * @param  hyoCnt : カウンタ
     * @param  posTR  : データ部TR開始位置(0～)
     * @param  posTD  : データ部TD開始位置(0～)
     * @param  tTBLid : 時刻部表示テーブルid
     * @param  tposTR : 時刻部TR開始位置(0～)
     * @param  tposTD : 時刻部TD開始位置(0～)
     */
    this.makeList = function(hyoCnt, posTR, posTD, tTBLid, tposTR, tposTD){
    
        var setDate = new Array();
        
        //時刻部表示テーブルid
        var timeTBL = CmnLib.Elm.ID(tTBLid);
        //データ部表示テーブルid
        var itemTBL = CmnLib.Elm.ID(JsonData.HyoAll[hyoCnt].Id);

        var hyo = JsonData.HyoAll[hyoCnt]

        //時刻テーブルの値取得
        setDate = this.makeTimeData(CmnVar.QueryParam["span"], JsonData.NewTime, hyo.ColumnList[0].CellList.length);
        
        //時刻テーブル
        if (timeTBL != null){
            for (var i = 0; i < setDate.length; i++) {
                CmnLib.Elm.TAGNAME("td", CmnLib.Elm.TAGNAME("tr", timeTBL)[tposTR + i])[tposTD + 0].innerHTML = setDate[i];
            }
        }
        
        //X軸ループ
        for (var x = 0; x < hyo.ColumnList[0].CellList.length; x++) {
            //Y軸ループ
            for (var y = 0; y < hyo.ColumnList.length; y++) {
                //セル位置
                var cell = CmnLib.Elm.TAGNAME("td", CmnLib.Elm.TAGNAME("tr", itemTBL)[posTR + x])[posTD + y];
                
                //プロパティ数ループ
                for (var z = 0; z < hyo.ColumnList[y].CellList[x].PropertyList.length; z++) {
                    //挿入するプロパティ
                    var key = hyo.ColumnList[y].CellList[x].PropertyList[z].Name;
                    var val = hyo.ColumnList[y].CellList[x].PropertyList[z].Value;
                        
                    //データ変換
                    this.chgDisplay(cell, key ,val);                    
                }
            }
        }
            
//090826.kamino 浦滝用削除
//        //スクロール位置設定
//        var scroll = CmnLib.Elm.ID("scrollDIV")
//        if (scroll != undefined){
//            scroll.scrollTop = scroll.offsetHeight;
//        } 
    }

    /**
     * 表用の時刻を作成する
     * @param  sp  : 時間間隔
     * @param  dt  : 最新観測時刻
     * @param  len : 時刻表示件数
     * @return     : 表用の時刻を返す[配列]
     */
    this.makeTimeData = function(sp, dt, len) {
    
        var setDate = new Array();
        var date = new Date(dt);
        var setTm;

        //時刻表示件数ループ
        for (var i = 0; i < len; i++) {
		    //時刻
//090828.kamino 最新観測時刻を上部に変更
//			setTm = new Date(date.getTime() - ( ((len - 1) - i) * sp * 60 * 1000) );		    
			setTm = new Date(date.getTime() - ( i * sp * 60 * 1000) );		    
    	       
	        //桁数の調整を行う
            var dtParam = CmnLib.Time.getFormatedDate(setTm);
	        setDate[i] = dtParam["month"] + "/" + dtParam["day"] + " " +  dtParam["hour"] + ":" + dtParam["min"];
        }    
        return setDate;
    }   
        
    /**
     * 降雨開始時刻形成
     * @param  idObj：降雨開始時刻ID
     */
    this.makeStTime = function(idObj){

        var dt = new Date(idObj[0].Value);
        var dtStr = "降雨開始時刻　";

        if(dt != "NaN"){
            //桁数の調整を行う
            var dtParam = CmnLib.Time.getFormatedDate(dt);
            dtStr += dtParam["year"] + "年" + dtParam["month"] + "月" + dtParam["day"] + "日" + dtParam["hour"] + "時";
        }
        idObj[0].Value = dtStr;
    }
    
    /**
     * 更新状態を画面に表示する
     * @param  state：画面更新状態(true：更新中／false:停止中)
     */
    this.dispReloadState = function(state){ 
        if (CmnLib.Elm.ID("state")){
            CmnLib.Elm.ID("state").innerHTML = (state) ? CmnVar.RELOAD_MSG : CmnVar.STOP_MSG;
        }
        if (CmnLib.Elm.ID("tab3Btn5")){
            CmnLib.Elm.ID("tab3Btn5").disabled = state;
        }
    }

    /**
     * 帳票出力テスト
     *
     */
    this.dispExcelData = function() {
        var src = JsonData.ExcelDisplayParts[0].Src;
        window.open(src);
    	
		//09.06.07 次のExcelを開くまでに間隔ｱｹﾀ
    	var timeStart = new Date().getTime();
		var timeNow = new Date().getTime();
		while( timeNow < (timeStart + 1000 ) )
		{
			timeNow = new Date().getTime();
		}
    }
    
    /**
     * 前頁／次頁用の画面を作成する
     * @param need {boolean} : 処理対象を判定 [ 前頁/次頁時:true | データ取得失敗時:false ] 
     *
     */
    this.makeNewPage = function( need){
        //第3タブメニューを切り替える
        if( need == true){
            if (CmnLib.Elm.ID("tab3")){
                CmnLib.Elm.ID("tab3").innerHTML = "";
                MenuBtn.setThirdMenu( MENU["tab2"][CmnLib.UrlParam.getThisPageName(true, 3)]["tab3"]);
            }
        }

        //項目名称テーブルの内容をクリアする
        if (CmnLib.Elm.ID("kyokuTBL")){
            var tdObj = CmnLib.Elm.TAGNAME("td", CmnLib.Elm.ID("kyokuTBL"));
            for (var i = 0; i < tdObj.length; i++){
                if( tdObj[i].childNodes[0].nodeName == "INPUT"){
                    CmnLib.Elm.TAGNAME("input", tdObj[i]).value = "&nbsp;";
                }
                else{
                    tdObj[i].innerHTML = "&nbsp;";
                }
            }
        }
        
        //データテーブルの内容をクリアする
        if (CmnLib.Elm.ID("itemTBL")){
            tdObj = CmnLib.Elm.TAGNAME("td", CmnLib.Elm.ID("itemTBL"));
            for (var i = 0; i < tdObj.length; i++){
//090912.kamino 浦滝用btm_dtTd
//                tdObj[i].innerHTML = "&nbsp;";
                if (tdObj[i].id == ""){
                    tdObj[i].innerHTML = "&nbsp;";
                }
            }
        }

        //時刻テーブルの内容をクリアする
        if( need == false){
            if (CmnLib.Elm.ID("timeTBL")){
                tdObj = CmnLib.Elm.TAGNAME("td", CmnLib.Elm.ID("timeTBL"));
                for (var i = 0; i < tdObj.length; i++){
//090912.kamino 浦滝用btm_dtTd
//                  tdObj[i].innerHTML = "&nbsp;";
                    if (tdObj[i].id == ""){
                        tdObj[i].innerHTML = "&nbsp;";
                    }
                }
            }
        }

        //名称を設定する
        this.setName( NAME[CmnVar.GmnNo]);	    
    }

    /**
     * HTMLデータを変換する（未使用）
     * @param  res：
     */
    this.chgHTMLData = function(res){
        try{
            //要素数ループ
            for (var i = 0; i < res.length; i++){
                //各要素取得
                var elm = res[i];
                
                //ID取得
                var id = elm.id;
                
                //プロパティ数ループ
                for (var j =0; j < elm.properties.length; j++){
                    //プロパティ情報取得
                    var prop = elm.properties[j];
                    
                    //表示内容の変更を行う
                    chgDisplay(document.getElementById(id), prop.name, prop.value);
                }
            }

        }catch(e){
            alert("chgHTMLData:" + e.description)
        }
    }

    /*
     * HTMLのプロパティを変更する
     * elmオブジェクトのkeyで与えられたプロパティをvalに変更する
     * param@ elm 変更対象オブジェクト
     * param@ key 変更プロパティ
     * param@ val 変更値
     */
    this.chgDisplay = function (elm, key ,val){

        if (elm == null) return;

	    if(key.indexOf('.')==-1){
		    elm[key]=val
	    }else{
		    var keyList = key.split('.');
		    elm[keyList[0]][keyList[1]]=val
	    }
    }
    
    /*
     * グラフのNormalAll表示欄初期化
     * param@ gmnNo 画面番号
     * 
     */
    this.delGraphNormal = function(){

        var gmnNo = Number(CmnLib.UrlParam.getThisPageName(false, 4));
        switch(gmnNo){
            case 2301: //雨量
                for ( var i = 1; i <= 4; i++){
                    CmnLib.Elm.ID("uData" + i).innerHTML = "&nbsp";
                    CmnLib.Elm.ID("uData" + (i + 4)).innerHTML = "&nbsp";
//090828.kamino 浦滝用 ★あとでダミー画像用意する？
//                    CmnLib.Elm.ID("ImgGraphG" + i).src = "./img/uryoGraph_dummy.png";
                CmnLib.Elm.ID("ImgGraph001").src = "./img/uryoG.png";
                }
                break;
            case 2303: //水位
                CmnLib.Elm.ID("sData1").innerHTML = "&nbsp";
//090828.kamino 浦滝用 流量・定数が不要のため削除★あとでダミー画像用意する？
//                CmnLib.Elm.ID("sData2").innerHTML = "&nbsp";
//                for ( var i = 1; i <= 5; i++){
//                    CmnLib.Elm.ID("jData" + i).innerHTML = "&nbsp";
//                }
//                CmnLib.Elm.ID("ImgGraphG" + 1).src = "./img/suiiGraph_dummy.png";
                CmnLib.Elm.ID("ImgGraph001").src = "./img/SuiiG.png";
                break;
            case 2304: //ダム

//090827.kamino 浦滝用 雨量不要のため削除
//                CmnLib.Elm.ID("uData1").innerHTML = "&nbsp";
//                CmnLib.Elm.ID("uData2").innerHTML = "&nbsp";
                for ( var i = 1; i <= 3; i++){
                    CmnLib.Elm.ID("dData" + i).innerHTML = "&nbsp";
                }
//090827.kamino 浦滝用 データ数変更
//                for ( var i = 1; i <= 4; i++){
                for ( var i = 1; i <= 2; i++){
                    CmnLib.Elm.ID("jData" + i).innerHTML = "&nbsp";
                }
//090827.kamino 浦滝用 雨量不要のため削除・変更 ★あとでダミー画像用意する？
//                CmnLib.Elm.ID("ImgGraphG" + 1).src = "./img/uryoGraph_dummy.png";
//                CmnLib.Elm.ID("ImgGraphG" + 2).src = "./img/damGraph_dummy.png";
                CmnLib.Elm.ID("ImgGraph001").src = "./img/DamG.png";
               break;
        }        
    }
    /**
     * 故障警報のメインテーブル初期化
     *
     */
    this.delSearchTbl = function(){

        //データテーブルの内容をクリアする
        if (CmnLib.Elm.ID("warTBL")){
            tdObj = CmnLib.Elm.TAGNAME("td", CmnLib.Elm.ID("warTBL"));
            for (var i = 0; i < tdObj.length ; i++){
                tdObj[i].innerHTML = "&nbsp;";
            }
        }
        Search.HoldNewId = 0;
    }
    
    /*
     *090827.kamino 浦滝用個別処理
     *ダム諸量表用フォントサイズ変更
     *
     */
    this.SetFontSize = function(strSize){

        var oldSize = (strSize.property == "M") ? "L" : "M"; 
        
	    //ボタン状態を初期化
        CmnLib.Elm.ID("font_" + oldSize).style.backgroundColor = "#EEEEEE";
        CmnLib.Elm.ID("font_" + oldSize).disabled  = "";

        CmnLib.Elm.ID("font_" + oldSize).onmouseover  = "CmnControl.MouseAction.onElmMouseOver(CmnLib.Elm.ID('font_' + oldSize))";
        CmnLib.Elm.ID("font_" + oldSize).onmouseout  = "CmnControl.MouseAction.onElmMouseOut(CmnLib.Elm.ID('font_' + oldSize))";
        
	    //ボタン状態を設定
        CmnLib.Elm.ID("font_" + strSize.property).style.backgroundColor = "#FFE794";
        CmnLib.Elm.ID("font_" + strSize.property).disabled  = "disabled";

        //セーブする（しないとデフォルト色に戻ってしまうため）
        CmnControl.MouseAction.saveElem = CmnLib.Elm.ID("font_" + strSize.property);
        CmnControl.MouseAction.saveColor = "#FFE794";
        
        CmnLib.Elm.ID("font_" + strSize.property).onmouseover  = "";
        CmnLib.Elm.ID("font_" + strSize.property).onmouseout  = "";

        var gmnNo = Number(CmnLib.UrlParam.getThisPageName(false, 4));

	    //cssの設定
        CmnLib.Elm.ID("gmncss").href  = "css/C" + gmnNo + "_" + strSize.property + ".css";

        //個別（Ff3用）→89行目にもあり
	    if(gmnNo == 2201){
            var tblHeight;
	        if(navigator.userAgent.indexOf("MSIE") == -1 && strSize.property == "M"){
		        tblHeight = "38px"; //Ff3
	        }else if(strSize.property == "M"){
		        tblHeight = "36px"; //IE
	        }else if(navigator.userAgent.indexOf("MSIE") == -1 && strSize.property == "L"){
		        tblHeight = "48px"; //Ff3
	        }else if(strSize.property == "L"){
		        tblHeight = "44px"; //IE
	        }
            CmnLib.Elm.ID("timeTop").style.height = tblHeight;
	    }
        //個別（IE6用）
	    if(gmnNo == 2204 && navigator.userAgent.indexOf("MSIE 6") != -1){
	        if(strSize.property == "L"){
                CmnLib.Elm.ID("timeBottom").style.height = "23px";
                CmnLib.Elm.ID("timeBottom").style.fontSize = "0.9em";
	        }else if(strSize.property == "M"){
                CmnLib.Elm.ID("timeBottom").style.height = "";
                CmnLib.Elm.ID("timeBottom").style.fontSize = "";
	        }
	    }
	    
//alert(navigator.userAgent);
//if (navigator.userAgent.indexOf("MSIE")!=-1 && navigator.userAgent.indexOf("Trident/4.0")!=-1)
    }

    /*
     *090827.kamino 浦滝用個別処理
     *リアルタイムダム情報の貯水率算出
     *
     */
    this.CalcData = function(idName, value){

		//空白削除
		var s = value;
	    s = s.replace(/^\s+|\s+$/g, "");

		//数値なら計算
		if(s != "" && !(isNaN(s))){
			var num = (idName == "dam_02_3") ? 56000 : 25000;
			s = Number(s);
			if(s != 0){
				value = value  * 10000;
				value = Math.floor(value / num);
				var amari = value % 10;
				if (amari >= 5){ value = value + 10};
				value = Math.floor(value / 10);
				if (value == 0){
					value = "0.0";
				}else if(value < 10){
					value = "0." + value;
				}else{
					var arr = new Array;
					value = value + "";
					var len = value.length;
					arr[0] = value.slice(0, len - 1);
					arr[1] = value.slice(-1);
					value = arr[0] + "." + arr[1];
				}
			}else{
				value = "0.0";
			}
		}
		return value;
    }

    
}
