/******************************************************************************
 * 通学・通勤時間から探す
 ******************************************************************************/

//「すべて」用コード　7桁
var code_all = '0000000';
//// 路線一覧取得にpref_codeを使う:true / 使わない:false
//use_pref = false;

var selectedListHash = new Object();
//都道府県プルダウン　一時保存用
var todofukenVal = "";

var max_length = 10; //選択最大件数

var station_err_msg0 = "エラー";
var station_err_msg1 = "検索対象を設定して下さい。";            //検索対象リスト0件 この条件で検索
var station_err_msg2 = "設定できる検索対象は" + max_length + "件までです。";    //検索対象リスト＋「追加」リスト>10
var station_err_msg3 = "沿線・駅を選択して下さい。";           //未選択での「追加」ボタン押下
var station_err_msg4 = "除外対象を選択して下さい。";           //未選択での「除外」ボタン押下
var station_err_msg5 = "該当する駅が見つかりませんでした。";    //目的駅検索　0件時エラー
var station_err_msg6 = "該当する路線が見つかりませんでした。";  //沿線0件
var station_err_msg7 = "目的駅を入力して下さい。";             //目的駅未入力エラー

var station_cnf_msg1 = "現在選択されている検索対象はクリアされますがよろしいですか？";

//var gsubmit = false;  //二度押し防止
var gnext = false;    //画面遷移フラグ

/***************************************
 * ハッシュから「現在選択している条件」を表示
 ***************************************/
function showSelectedListHash(){
    //現在設定している条件の駅名を一度クリア
    $("#dspStation").children().remove();
     
    //駅を表示
    for ( trafficCode in selectedListHash ){
        var trafficData = selectedListHash[trafficCode];
        //沿線別データ
        for ( routeCode in trafficData.routeHash ){
            var routeData = trafficData.routeHash[routeCode];
            var li_text = "【" + routeData.name + "】　";
            var hidden = "";
            for ( stationCode in routeData.stationHash ){
                // 沿線コード、駅コードのハイフン連結データを hidden で生成
                hidden += '<input type="hidden" name="data[search_station][selectedList][]" value="' + stationCode + '" />';
                //alert( stationCode );
                // 表示用データ
                li_text += routeData.stationHash[stationCode] + " / ";
            }
            //alert(hidden);
            $("#dspStation").append('<li>' + li_text.replace(/ \/ $/, "") + hidden + '</li>');
        }
    }
}

/***************************************
 * ハッシュを初期化
 ***************************************/
function initSelectedListHash(){
    selectedListHash = new Object();
}

/***************************************
 * データ復元処理
 ***************************************/
function initBody(){
    //各プルダウン初期化
    $("#targetTimeList").attr('disabled', 'disabled'); //所要時間
    $("#targetRouteList_s").attr('disabled', 'disabled'); //出発駅
    
    // 再検索イベントのバインド
    $("#tblOneStationName a>img[name='stationResearch']").bind('click', evStationResearchClick);    //1件の場合
    $("#tblMultiStationName a>img[name='stationResearch']").bind('click', evStationResearchClick);  //複数の場合
    
    //AJAX時の処理制限設定
    initAjaxEvent();
    
    //地域が選択されているとき
    if ( $("#todofuken").val() != "" ){
        todofukenVal = $("#SearchTodofuken>option:selected").val(); //初期選択時の県を一時保存        
    } else {
        $("#ekiname2").attr("disabled", "disabled");
    }
    
    //選択データ復元処理
    restoreSelectedList(strHashJson);
    //目的駅の初期化
    restoreMokutekiStation(strHashJson);
    
    // 2008/12/01 changeイベントへのバンドに変更した
    /***************************************
     * 所要時間プルダウンを選択した場合
     ***************************************/
    $("#targetTimeList").bind('change', evTargetTimeListChange);
    
}

/***************************************
 * 選択データ復元処理
 ***************************************/
function restoreSelectedList(strHash){
    //復元データがあるとき
    if ( strHash.length > 0 ){
        selectedListHash = eval("(" + strHash + ")" );
        showSelectedListHash();
        
        //選択条件プルダウンの復元処理
        for ( trafficCode in selectedListHash ){
            var routeData = selectedListHash[trafficCode].routeHash;
            for ( routeCode in routeData ){
                var routeName = routeData[routeCode].name;
                var stationData = routeData[routeCode].stationHash;
                for ( code in stationData ){
                    var opt = document.createElement('option');
                    opt.innerHTML = routeName + "　" + stationData[code];
                    opt.value = code;
                    document.getElementById("selectedList").appendChild(opt);
                }
            }
        }
    }
}

/***************************************
 * ajaxイベント時ロック処理
 ***************************************/
function initAjaxEvent(){
    //駅名
    $('#ekiname2').ajaxStart( function(){
        $(this).attr('disabled', 'disabled');
        //TODO 検索ボタンの無効化
        $("a>img[name='stationResearch']").unbind('click');
    });
    $('#ekiname2').ajaxComplete( function(){
        //$(this).removeAttr('disabled');
        //TODO 検索ボタンの無効化解除
        $("a>img[name='stationResearch']").bind('click', evStationResearchClick);
    });
    //所要時間プルダウンのAJAX処理時
    $("#targetTimeList").ajaxStart( function(){
        $(this).attr('disabled', 'disabled');
        $("#targetRouteList_s").attr('disabled', 'disabled').children().remove();
        $("a>img[name='stationResearch']").unbind('click');
    });
    $("#targetTimeList").ajaxComplete(function(){
        $("#targetRouteList_s").removeAttr('disabled');
        $("a>img[name='stationResearch']").bind('click', evStationResearchClick);
    });
}

/***************************************
 * 目的駅の初期化
 ***************************************/
function restoreMokutekiStation(strHash){
    if ( strHash.length > 0 ) {
        //目的駅の初期表示
        showResearchBtn();
        $("#ekiname2").val( $("#hdEkiname").val() ).attr('disabled', 'disabled').addClass("disabled");
        $("#targetTimeList").removeAttr('disabled');


        //所要時間を選択状態にする
        $("#targetTimeList option[value='" + gSelectedMinute + "']").attr('selected', 'selected');
        //一時的にデータクリアのない検索処理をバインドし、呼出す。呼出し後はバインドを解除する。
        $("#targetTimeList").bind('change', evInTargetTimeListChange);
        $("#targetTimeList").change();
        $("#targetTimeList").unbind('change', evInTargetTimeListChange);
    }
}

/***************************************
 * 目的駅1件表示
 ***************************************/
function showOneStationName(){
    $("#tblMultiStationName").hide();
    $("#multiStationName").hide();
    $("#tblOneStationName").show();
}

/***************************************
 * 目的駅候補選択表示
 ***************************************/
function showMultiStationName(){
    $("#tblMultiStationName").show();
    $("#multiStationName").show();
    $("#tblOneStationName").hide();
}

/***************************************
 * 目的駅・所要時間表示
 * 現在指定している条件に表示、hiddenタグに値をセット
 ***************************************/
function showTouchakuStation(){
    //TODO表示する
    var strDisp = $("#hdEkiname").val() + "駅まで" + $("#targetTimeList").children(':selected[value!=""]').text();
    $("#endStation").html(strDisp);
    $("#hdTime").val(strDisp);
    $("#hdMinutes").val( $("#targetTimeList").children(':selected').val() );
}

/***************************************
 * 再検索ボタンの表示
 ***************************************/
function showResearchBtn(){
    $("#tblOneStationName a>img[name='stationSubmit']").hide();   //決定ボタン非表示
    $("#tblOneStationName a>img[name='stationResearch']").show();  //再検索ボタン表示
}

/***************************************
 * 所要時間、沿線、検索対象を初期化
 ***************************************/
function initAllSelect(){
    //所要時間プルダウンを初期化
    $("#targetTimeList").attr('disabled', 'disabled');
    $("#targetTimeList>option[value='']").attr('selected', 'selected');
    $("#targetRouteList_s").children().remove();
    $("#selectedList").children().remove();
    
    //選択している条件　通学・通勤時間　初期化
    initHiddenData();
    
    initSelectedListHash();
    showSelectedListHash();
}

/***************************************
 * 選択している条件　通学・通勤時間　初期化
 ***************************************/
function initHiddenData(){
    $("#hdEkicode").val("");
    $("#hdEkiname").val("");
    $("#hdTime").val("");
    $("#hdMinutes").val("");
    
    $("#endStation").text("");
    $("#targetTimeList").val(""); //所要時間プルダウンを未選択にする。
}

/***************************************
 * 表示クリア処理
 ***************************************/
function evAllClear(){
    $("a>img[name='stationSubmit']").show();                      //検索ボタンを表示
    $("#tblOneStationName a>img[name='stationResearch']").hide();  //再検索ボタンを非表示
    $("#ekiname2").val("").removeAttr('disabled');   //駅名クリア、入力可

    //所要時間プルダウンを初期化
    initAllSelect();
    
    showOneStationName();
    
    //表示用クラスを追加
    $("#ekiname2").removeClass("disabled");
}

/***************************************
 * 所要時間プルダウンを選択した場合の内部処理
 * 確認アラート、選択駅クリアはしない。
 ***************************************/
function evInTargetTimeListChange(event){
    //選択した内容を表示
    showTouchakuStation();
    var pref_code = $("#pref_code").val();
    
    if ( pref_code == "" ){
        pref_code = "01";
    }
    var jsonUrl = gJsonShupatsuStationtUrl + '/' + pref_code + '/';  //JSONを取得する為のURL
    var params = { "ekicode":[$("#hdEkicode").val()], "minute":[$(event.target).children(':selected').val()] };      //POSTするパラメータ
    $.post( jsonUrl, params, function(data, status){
        if ( status == 'success' ){
            $("#targetRouteList_s").children().remove();
            //$.dump(data);

            if ( data.length == 0 ) {
                alert(station_err_msg6);
            } else {
                var prev_route_kanji = "";
                
                //プルダウン生成
                for ( var i = 0; i<data.length; i++ ) {
                    //グループ名
                    if ( prev_route_kanji != data[i].itemRouteName ) {
                        prev_route_kanji = data[i].itemRouteName;
                        selSepOpt = document.createElement('optgroup');
                        selSepOpt.setAttribute("label", "---" + prev_route_kanji + "---");
                        document.getElementById("targetRouteList_s").appendChild(selSepOpt);
                    }
                    //駅名
                    var selOpt = document.createElement('option');
                    var code = data[i].itemTrafficCode + "-" + data[i].itemTrafficCompanyCode + "-" + data[i].itemRouteCode + "-" + data[i].itemStationCode + "-" + data[i].itemTimeMinute;
                    selOpt.value = code;
                    selOpt.innerHTML = data[i].itemStationName + "(" + data[i].itemTime + ")" + "【" + data[i].itemBukkenCount + "件】";
                    selSepOpt.appendChild(selOpt);
                }
            }
            $("#targetTimeList").removeAttr('disabled');
        } else {
            alert(station_err_msg0);
        }
    }, 'json');
}

/***************************************
 * 所要時間プルダウンを選択した場合の実処理
 ***************************************/
function evTargetTimeListChange(event){
    //駅名を入力していない場合
    if ( $("#ekiname2").val() == "" ) {
        alert(station_err_msg7);
        return false;
    }
    
    //選択してください　を選択の場合は処理抜け
    if ( $(event.target).children(":selected").val() == "" ) {
        return false;
    }
    
    //検索対象リストのクリアの確認メッセージ
    if ( $("#selectedList").children().length > 0 && confirm(station_cnf_msg1) == false ) {
        return false;
    }
    
    //検索対象をクリア
    $("#selectedList").children().remove();
    initSelectedListHash();
    showSelectedListHash();
    
    //検索処理
    evInTargetTimeListChange(event);
}

/***************************************
 * 再検索
 * 1件の場合、複数の場合
 ***************************************/
 function evStationResearchClick(event){
    //検索対象リストのクリアの確認メッセージ
    if ( $("#selectedList").children().length > 0 && confirm(station_cnf_msg1) == false ) {
        return false;
    }
    evAllClear();
    return false;
}

/***************************************
 * ヒストリバック対応　画面ロード処理
 ***************************************/
function pageload(hash){
    //戻る対策
    if ( hash && gnext ) {
        //画面遷移する直前 何もしない
        //alert("forward");
    } else if ( hash && !gnext ) {
        //戻るで戻ってきた場合
        //alert("back");
        var strDt = "?"+(new Date).getTime();
        //ストレージから復元用データを取得
        $.get(ajaxCtrlUrl + "getBackHtml/search_station"+strDt, null, function(data, status){
            if ( status == 'success' ) {
                if ( data.length > 0 ){
                    var targetRouteList_s = $(data).find("#targetRouteList_s");
                    if ( ($(targetRouteList_s).html().replace(/(^\s+|\s+$)/, "")).length > 0 ) {
                        $("#targetRouteList_s").replaceWith( $(targetRouteList_s) );
                    }
                    $("#ekiname2").val( $(data).find('#hdEkname').val() );
                    $("#ekiname2").addClass("disabled");

                    $("#hdEkicode").val( $(data).find('#hdEkicode').val()  );
                    $("#hdEkname").val( $(data).find('#hdEkname').val()  );
                    $("#hdTime").val( $(data).find('#hdTime').val() );
                    $("#hdMinutes").val( $(data).find('#hdMinutes').val() );
                    $("#pref_code").val( $(data).find('#pref_code').val() );
                    $("#hdArea").val( $(data).find('#hdArea').val() );

                    //所要時間プルダウン選択状態
                    $("#targetTimeList").children('option[value="' + $("#hdMinutes").val() + '"]').attr('selected', 'selected');
                    $("#targetTimeList").bind('change', evTargetTimeListChange);

                    //「指定している条件」部分を表示
                    showTouchakuStation();

                    //再検索ボタンを表示
                    showResearchBtn();

                    //ajax　start,completeイベント
                    initAjaxEvent();
                }
            } else { alert(station_err_msg0); }
        }, "html");
        
        $.get(ajaxCtrlUrl + "getBackSelectedList/search_station"+strDt, null, function(data, status){
            if ( status == 'success' ) {
                restoreSelectedList(data);

                //目的駅の初期化
                restoreMokutekiStation(strHashJson);
            } else { alert(station_err_msg0); }
        }, 'text');
    } else {
        //通常の遷移の場合
        initBody();
    }
}

$(document).ready( function(){
    //safariの場合だけ特殊対応
    if ( $.browser.safari ){ $(window).unbind('unload'); $("#commuting-btn").click(function(){ location.href = $(this).children('a').attr('href'); }); }
    
    //gsubmit = false;         //二度押し防止　初期化
    gnext = false;           //画面遷移フラグ　初期化
    
    //ヒストリバック対応
    $.historyInit(pageload);
    
    /***************************************
     * 地域プルダウン変更処理
     ***************************************/
    $("#todofuken").change(function(){
        if ( $("#selectedList").children().length > 0 && confirm(station_cnf_msg1) == false ) {
            $(this).val(todofukenVal); //前回選択していた県に戻す
            return false;
        } else {
            evAllClear();
        }
        // 入力の disable 
        if ( $(this).val() == "" ) {
            $("#ekiname2").attr("disabled", "disabled");
        } else {
            $("#ekiname2").removeAttr("disabled");
        }
        todofukenVal = $(this).val();
    });
    
    /***************************************
     * 決定
     ***************************************/
    $("#tblMultiStationName a>img[name='stationFix']").click( function(){
        showOneStationName();
        $("#hdEkicode").val( $("#multiStationName").children(':selected').val() );
        //$("#ekiname2").val( $("#multiStationName").children(':selected').children(':hidden').val() );
        $("#ekiname2").val( $("#multiStationName").children(':selected').text() );
        $("#hdEkiname").val( $("#multiStationName").children(':selected').text() );
        
        //所要時間を選択可能にする
        $("#targetTimeList").removeAttr('disabled');
        
        //再検索ボタン表示
        showResearchBtn();
        
        //現在選択している条件を表示しなおす
        showTouchakuStation();
        
        //表示用クラスを追加
        $("#ekiname2").addClass("disabled");
        
        return false;
    });
        
    /***************************************
     * 駅検索を押した場合
     ***************************************/
    $("a>img[name='stationSubmit']").click( function(){
        //駅名を入力していない場合
        if ( $("#ekiname2").val() == "" || $("#ekiname2").val() == gExampleName ) {
            alert(station_err_msg7);
            return false;
        }
        
        //所要時間プルダウンを初期化
        initAllSelect();
        
        var jsonUrl = gJsonStationUrl + '/' + $("#pref_code").val() + '/';  //JSONを取得する為のURL
        var params = { "station_kanji":[$("#ekiname2").val()] };      //POSTするパラメータ
        $.post(jsonUrl, params, function(data, status){
            if ( status == 'success' ){
                //データ1件の場合
                if ( data.length == 1 ){
                    var code = data[0].itemTrafficCode + "-" + data[0].itemTrafficCompanyCode + "-" + data[0].itemRouteCode + "-" + data[0].itemStationCode;
                    //そのままデータ1件を裏にもたせる
                    showOneStationName();
                    
                    //コード、名称をセット
                    $("#hdEkicode").val(code);
                    $("#ekiname2").val( data[0].itemRouteName + " " + data[0].itemStationName );
                    $("#hdEkiname").val( data[0].itemRouteName + " " + data[0].itemStationName );
                    
                    //所要時間を選択可能にする
                    $("#targetTimeList").removeAttr('disabled');
                    
                    //再検索ボタン表示
                    showResearchBtn();
                    
                    //現在選択している条件を表示しなおす
                    showTouchakuStation();
                    
                } else if ( data.length > 1 ) {
                    //プルダウンを表示し、選ばせる
                    showMultiStationName();
                    $("#multiStationName").children().remove();
                    
                    for ( var i = 0; i<data.length; i++ ){
                        var selOpt = document.createElement('option');
                        selOpt.value = data[i].itemTrafficCode + "-" + data[i].itemTrafficCompanyCode + "-" + data[i].itemRouteCode + "-" + data[i].itemStationCode;
                        selOpt.innerHTML = data[i].itemRouteName + " " + data[i].itemStationName;
                        
                        //駅名
                        var hidden = document.createElement('input');
                        hidden.setAttribute('type', 'hidden');
                        hidden.value = data[i].itemStationName;
                        selOpt.appendChild(hidden);
                        
                        document.getElementById("multiStationName").appendChild(selOpt);
                    }
                } else {
                    //該当なし(0件)
                    alert(station_err_msg5);
                    $("#ekiname2").removeAttr("disabled");
                }
            } else {
                alert(station_err_msg0);
            }
        }, 'json');
        return false;
    });
    
    /***************************************
     *  div.btn-submit>a, #search-submit の aタグをクリックした場合
     ***************************************/
    $("div.btn-submit>a, #search-submit2>a").click( function(){
        //二度押し防止
        //if ( gsubmit == true && !$.browser.safari ){ return false; } else { gsubmit = true; } //safariの場合だけ特殊対応
        
        var data = $("#selectedList>option");
        //1件も選択していない場合。
        if ( data.length == 0 ){
            alert(station_err_msg1);
            return false;
        }
        if ( data.length > max_length ){
            alert(station_err_msg2);
            return false;
        }
        
        //戻る処理を実行する為の措置 start
        var hash = "search";
        gnext = true;
        $.historyLoad(hash);
        //html
        var step3 = ($("#second_cul_step_3").html()).replace(/(\r|\n\|\r\n)/g, "").replace(/\>\s+\</g, "><").replace(/(^\s+)|(\s+$)/g, "");
        var frm = ( $("#hdParam").html() ).replace(/(\r|\n\|\r\n)/g, "").replace(/\>\s+\</g, "><").replace(/(^\s+)|(\s+$)/g, "");
        var content = "<div>" + step3 + frm + "</div>";
        var elem = document.createElement('input');
        elem.setAttribute('type', 'hidden');
        elem.setAttribute('value', content);
        elem.setAttribute('name', "data[search_station][history][content]");
        document.frmSearchStation.appendChild(elem);
        //戻る処理を実行する為の措置 end
        
        // 沿線ハッシュをJSON文字列にしてセッションに渡す
        var jsondata = $.toJSON(selectedListHash);
        var inData = document.createElement('input');
        inData.setAttribute("type", "hidden");
        inData.setAttribute("value", jsondata);
        inData.setAttribute("name", "data[search_station][selectedListHash]");
        document.frmSearchStation.appendChild(inData);
        
        document.frmSearchStation.action = frmActionUrl;
        document.frmSearchStation.submit();
        
        return false;
    });
    
    /***************************************
     *「追加」ボタンを押した場合
     ***************************************/
    $("#btnAddList").click( function(){
        var data = $("#targetRouteList_s option[selected]");
        
        // 駅を選択していない場合
        if ( data.length == 0 ){
            alert(station_err_msg3);
            return false;
        }
        
        // 検索対対象が11件以上になる場合
        if ( $("#selectedList>option").length + $(data).length > max_length ) {
            alert(station_err_msg2);
            return false;
        }
        
        //選択データに対してイテレート
        jQuery.each( data, function(){
            var stationCode = $(this).val();    //沿線種別コード、路線会社コード、路線コード、駅コード、分、のハイフン連結
            var code = stationCode.split('-');
            var trafficCode = code[0];
            var trafficCompanyCode = code[1];
            var routeCode = code[2];
            var routeName = ($(this).parent('optgroup').attr('label')).replace(/\-/g, "");
            var stationName = ($(this).text()).replace(/【.*$/, "");
            
            routeCode = trafficCode + "-" + trafficCompanyCode + "-" + routeCode; //沿線から探すと同様の処理にのせる為、ハイフン連結にしておく
            
            if ( !selectedListHash[trafficCode] ) {
                selectedListHash[trafficCode] = { 'routeHash' : new Object() };
            }
            var ensenData = selectedListHash[trafficCode];
            
            //データが無ければ追加
            if ( !ensenData.routeHash[routeCode] ){
                ensenData.routeHash[routeCode] = { 'name' : routeName, 'stationHash' : new Object(), 'count' : 0 };
            }
            var routeData = ensenData.routeHash[routeCode];
            
            //駅ハッシュにない値の場合は値を追加。プルダウンに要素を追加。
            if ( !routeData.stationHash[stationCode] ) {
                routeData.count++;
                routeData.stationHash[stationCode] = stationName;
                
                //　IEのバグの為、 createElementでoptionタグを生成する
                var selOpts = document.createElement('option');
                selOpts.value = stationCode;
                
                //駅プルダウンで「XXすべて」を選択したときは検索対象プルダウンのリストを生成する際に、沿線名を補完しない。
                if ( stationName != $("#targetRouteList_s").children(':first').text() ){
                    selOpts.innerHTML = routeName + ' ' + stationName;
                }else{
                    selOpts.innerHTML = stationName;
                }
                document.getElementById('selectedList').appendChild(selOpts);
            }
        });
        //$.dump(selectedListHash);
        
        //TODO ハッシュから　「現在選択している条件」の表示を再描画
        showSelectedListHash();
        
        return false;
    });
    
    /***************************************
     *「除外」ボタンを押した場合
     ***************************************/
    $("#btnDelList").click( function(){
        var selectedItem = $("#selectedList>option[selected]");
        
        //除外対象を選択していない場合
        if ( selectedItem.length == 0 ){
            alert(station_err_msg4);
            return false;
        }
        
        //選択したデータをハッシュから削除
        jQuery.each(selectedItem, function(){
            var stationCode = $(this).val();     //沿線種別コード、路線会社コード、路線コード、駅コード、分、のハイフン連結
            var code = stationCode.split('-');
            var ensenCode = code[0];             //沿線種別
            var routeCode = code[0] + "-" + code[1] + "-" + code[2]; //沿線種別コード、路線会社コード、路線コードのハイフン連結
            
            // 選択された駅を削除する
            delete selectedListHash[ensenCode].routeHash[routeCode].stationHash[stationCode];
            selectedListHash[ensenCode].routeHash[routeCode].count--;
            
            // 沿線に対する駅が0になったらその沿線オブジェクトを削除する
            if ( selectedListHash[ensenCode].routeHash[routeCode].count == 0 ){
                delete selectedListHash[ensenCode].routeHash[routeCode];
            }
            
            // 沿線オブジェクトが無くなったら、沿線種別を削除する
            var i=0;
            for ( key in selectedListHash[ensenCode].routeHash ) {
                i++;
                break; //1つでもキーが見つかったら処理抜け
            }
            if ( i == 0 ){
                delete selectedListHash[ensenCode];
            }
        });
        //$.dump(selectedListHash);
        
        //対象プルダウンから選択要素を削除
        $("#selectedList>option[selected]").remove();
        
        //TODO ハッシュから　「現在選択している条件」の表示を再描画
        showSelectedListHash();
        
        return false;
    });
    
});

