/******************************************************************************
 * 沿線から探す(タウン)
 ******************************************************************************/

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

//地方・都道府県プルダウン用データ生成
//chihoData = eval( "(" + strJson + ")" );
var selectedListHash = new Object();
//都道府県プルダウン　一時保存用
var todofukenVal = "";

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

var route_err_msg0 = "エラー";
var route_err_msg1 = "検索対象を設定して下さい。";
var route_err_msg2 = "設定できる検索対象は" + max_length + "件までです。";
var route_err_msg3 = "沿線・駅を選択して下さい。";
var route_err_msg4 = "除外対象を選択して下さい。";
var route_err_msg5 = "該当する駅が見つかりませんでした。";
var route_err_msg6 = "該当する路線が見つかりませんでした。";

var route_cnf_msg1 = "「すべて」を検索対象から除外してもよろしいですか？";
var route_cnf_msg2 = "現在選択されている検索対象はクリアされますがよろしいですか？";

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

/***************************************
 * ハッシュから「現在選択している条件」を表示
 ***************************************/
function showSelectedListHash(){
    //現在設定している条件の駅名を一度クリア
    $("#dspStation").children().remove();
    
//    //選択している都道府県を表示
//    if ( $("#SearchTodofuken :selected").val() != "" ){
//        $("#todofuken").text( $("#SearchTodofuken :selected").text() );    
//    } else {
//        $("#todofuken").text("");
//    }
    
    //駅を表示
    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_town_route][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(){
    //各プルダウン初期化
    $('#targetRouteList').attr('disabled','disabled');
    $('#targeStationtList').attr('disabled','disabled');
    
    // ajaxStart, ajaxCompleteを設定
    initAjaxEvent();
    
    // 沿線種別選択イベント
    $("#targetRouteName").bind('change', evTargetRouteNameChange);

    // 路線名選択時イベント
    $("#targetRouteList").bind('change', evTargetRouteListChange);
    
//    // 都道府県プルダウンの初期化処理
//    if ( $("#SearchTodofuken>option:selected").val() != "" ){
//        //復元で選択されているとき
//        $("#targetRouteName").removeAttr('disabled');
//    }else{
//        //初期化
//        $("#targetRouteName").attr('disabled','disabled');
//    }
    
    //選択データ復元処理
    restoreSelectedList(strHashJson);
}

/***************************************
 * 選択データ復元処理
 ***************************************/
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(){
    $("#targetRouteName").ajaxStart( function(){ $(this).attr('disabled', 'disabled'); });
    $("#targetRouteName").ajaxComplete( function(){ $(this).removeAttr('disabled'); });
    $("#targetRouteList").ajaxStart( function(){ $(this).attr('disabled', 'disabled'); });
    $("#targetRouteList").ajaxComplete( function(){ $(this).removeAttr('disabled'); });
}

/***************************************
 * 沿線種別選択イベント
 ***************************************/
function evTargetRouteNameChange(event){
    //var pref_code = $("#SearchTodofuken").val();
    var pref_code = gPrefCode;
    var idx_traffic = $(event.target).val();
    if ( idx_traffic != '' ){
        //沿線プルダウンをクリア
        $('#targetRouteList').children().remove();
        //駅プルダウンをクリア
        $("#targeStationtList").children().remove();
        var code_traffic = $("#targetRouteName").val();
        var url = RouteListUrl + code_traffic + '/';
        // pref_code で絞込み
        if ( use_pref == true  ){
            url += pref_code + '/';
        }

        jQuery.post(url, null, function(data, status){
            if ( status == 'success' ){
                // データが無い場合はアラート
                if (  data.item.length == 0 ){
                    alert(route_err_msg6);
                    return false;
                }

                for ( var i=0; i<data.item.length; i++ ){
                    var selOpt = document.createElement('option');
                    selOpt.value = data.item[i].itemTrafficCode + "-" + data.item[i].itemCompanyCode + "-" + data.item[i].itemCode;
                    selOpt.innerHTML = data.item[i].itemName;
                    document.getElementById('targetRouteList').appendChild(selOpt);
                }
            } else {
                alert(route_err_msg0);
            }
        }, 'json');
        $("#targetRouteList").removeAttr('disabled');
    }else{
        //沿線プルダウンをクリア
        $('#targetRouteList').children().remove();
        //駅プルダウンをクリア
        $('#targeStationtList').children().remove();
    }
}

/***************************************
 * 路線名選択時イベント
 ***************************************/
function evTargetRouteListChange(event){
    var idx_route = $(event.target).val();

    if ( idx_route != '' ){
        $('#targeStationtList').children().remove();
        var pref_code = gPrefCode;
        var url = StationListUrl + pref_code + '/' + idx_route + '/';

        // Ajaxのpostで駅名一覧のJSONを取得する
        jQuery.post(url, null, function(data, status){
            if ( status == 'success' ){
                var routeNameAll = $("#targetRouteList").children(':selected').text() + 'すべて';
                var routeCodeAll = idx_route + '-' + code_all; //念のため、交通機関コード、路線コード、駅コードのハイフン連結にする
                var itemBukkenCount = 0;

                // データが無い場合はアラート
                if ( data.item.length == 0 ){
                    alert(route_err_msg5);
                    return false;
                }

                // 駅プルダウンの要素を生成する
                for ( var i=0; i<data.item.length; i++ ){
                    var dataName = "　" + data.item[i].itemName + "【" + data.item[i].itemBukkenCount + "件】";

                    //IE6 対応
                    var selOpt = document.createElement('option');
                    selOpt.value = idx_route + '-' + data.item[i].itemCode; //念のため、交通機関コード、路線コード、駅コードのハイフン連結にする
                    selOpt.innerHTML = dataName;
                    document.getElementById("targeStationtList").appendChild(selOpt);
                    itemBukkenCount += parseInt(data.item[i].itemBukkenCount);
                }
                var selOpt = document.createElement('option');
                selOpt.value = routeCodeAll;
                //selOpt.innerHTML = routeHiddenAll + "■" + routeNameAll + "【" + itemBukkenCount + "件】";
                selOpt.innerHTML = "■" + routeNameAll;  //すべての件数は表示しない
                $("#targeStationtList").prepend(selOpt);
            } else {
                alert(route_err_msg0);
            }
        }, 'json');
        $("#targeStationtList").removeAttr('disabled');
    } else {
        $('#targeStationtList').children().remove();
    }
}

/***************************************
 * ヒストリバック対応　画面ロード処理
 ***************************************/
function pageload(hash){
    //戻る対策
    if ( hash && gnext){
        //画面遷移する直前
    } else if ( hash && !gnext ) {
        //戻るで戻ってきた場合
        var strDt = "?"+(new Date).getTime();
        //ハッシュの文字列を取得・表示をリストア
        $.get( ajaxCtrlUrl + "getBackSelectedList/search_town_route"+strDt, null, function(data, status){
            if( status == 'success' ){
                if (data == '') { initBody(); return; }
                restoreSelectedList(data);
            } else { alert(route_err_msg0); }
        }, "text");
        
        $.ajaxSetup({async:false});
        //ストレージから復元用データを取得
        $.get(ajaxCtrlUrl + "getBackHtml/search_town_route"+strDt, null, function(data, status){
            if ( status == 'success' ){
                //alert("success");
                if ( $(data).length > 0 ){
                    var targetRouteList = $(data).find("#targetRouteList");
                    if ( ($(targetRouteList).html().replace(/(^\s+|\s+$)/, "")).length > 0 ) {
                        //プルダウンを書換
                        $("#targetRouteList").replaceWith( $(targetRouteList) );
                        //firefox3対応　明示的に最後に選択した値にフォーカスをあてる
                        $.getJSON(ajaxCtrlUrl + "getBackRoute/search_town_route"+strDt, null, function(data, status){
                            if ( status == "success" ){
                                $("#targetRouteList").children("option[value='" + data.route + "']").attr('selected', 'selected');
                            } else { alert(route_err_msg0); }
                            // 沿線種別選択イベント
                            $("#targetRouteName").bind('change', evTargetRouteNameChange);
                            // 路線名選択時イベント
                            $("#targetRouteList").bind('change', evTargetRouteListChange);
                        });
                    }
                    var targeStationtList = $(data).find("#targeStationtList");
                    if ( ($(targeStationtList).html().replace(/(^\s+|\s+$)/, "")).length > 0 ) {
                        $("#targeStationtList").replaceWith( $(targeStationtList) );
                    }
                    // ajaxStart, ajaxCompleteを設定
                    initAjaxEvent();
                }
            } else { alert(route_err_msg0); }
        }, "html");
        $.ajaxSetup({async:true});
    } else {
        //通常の遷移の場合
        initBody();
    }
}

$(document).ready( function(){
    //safariの場合だけ特殊対応
    if ( $.browser.safari ) { $(window).unbind('unload');  }
    
    //gsubmit = false;         //二度押し防止　初期化
    gnext = false;           //画面遷移フラグ　初期化

    //ヒストリバック対応
    $.historyInit(pageload);
    
//    /***************************************
//     * 地方プルダウンを選択した場合
//     ***************************************/
//    $("#SearchChiho").change(function(){
//        //ハッシュを初期化
//        initSelectedListHash();
//        showSelectedListHash();
//        
//        //検索対象プルダウンをクリア
//        $("#selectedList").children().remove();
//        
//        //都道府県プルダウンをクリア
//        $("#SearchTodofuken").attr('disabled', 'disabled').children("[:first]").attr('selected', 'selected');
//        $("#SearchTodofuken").children(':not(:first)').remove();
//        
//        //沿線種別プルダウン
//        $("#targetRouteName").attr('disabled','disabled').children("[value='']").attr('selected', 'selected');
//        
//        // 選択してください状態の場合
//        if ( $(this).val() == "" ){            
//            //沿線リスト、駅リストを使用不可、一覧をクリア
//            $('#targetRouteList').attr('disabled','disabled').children().remove();
//            $('#targeStationtList').attr('disabled','disabled').children().remove();            
//        } else {
//            //地方を選択した場合
//            var item = chihoData[ $(this).val() ].todofuken;
//            for ( key in item){
//                var selOpts = document.createElement('option'); //IEのプルダウンのバグのため、createElementを使う
//                selOpts.value = key;
//                selOpts.innerHTML = item[key];
//                document.getElementById("SearchTodofuken").appendChild(selOpts);
//            }
//            //地方を選択した場合、都道府県を選択可能にする
//            $("#SearchTodofuken").removeAttr('disabled');            
//        }
//    });
    
//    /***************************************
//     *  都道府県プルダウンを選択した場合
//     ***************************************/
//    $("#SearchTodofuken").change(function(){
//        //ハッシュを初期化
//        initSelectedListHash();
//        showSelectedListHash();
//        
//        //検索対象プルダウンをクリア
//        $("#selectedList").children().remove();
//        
//        //選択してください状態の場合
//        if ( $(this).val() == "" ) {
//            //沿線種別プルダウンを使用不可、選択してください状態にする
//            $("#targetRouteName").attr('disabled','disabled').children("[value='']").attr('selected', 'selected');
//            //沿線リスト、駅リストを使用不可、一覧をクリア
//            $('#targetRouteList').attr('disabled','disabled').children().remove();
//            $('#targeStationtList').attr('disabled','disabled').children().remove();
//        } else {
//            //都道府県を選択した場合、沿線種別を選択可能にする
//            $("#targetRouteName").removeAttr('disabled');
//            
//            //沿線選択状態で都道府県プルダウンが選びなおされた場合
//            if ( $("#targetRouteName :selected").val() != "" ) {
//                //沿線変更時イベントをロード
//                $("#targetRouteName").change();
//            } else {
//                //ここでは沿線は「選択してください」状態
//            }
//        }
//    });
    
    /***************************************
     * 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(route_err_msg1);
            return false;
        }
        if ( data.length > max_length ){
            alert(route_err_msg2);
            return false;
        }
        
        //戻る処理を実行する為の措置 start
        var hash = "search";
        gnext = true;
        $.historyLoad(hash);
        //html
        var step1 = ($("#cul_step1").html() ).replace(/(\r|\n\|\r\n)/g, "").replace(/\>\s+\</g, "><").replace(/(^\s+)|(\s+$)/g, "");
        var step2 = ($("#cul_step2").html() ).replace(/(\r|\n\|\r\n)/g, "").replace(/\>\s+\</g, "><").replace(/(^\s+)|(\s+$)/g, "");
        var route = "<div>" + step1 + step2 + "</div>";
        var current_route = document.createElement('input');
        current_route.setAttribute('type', 'hidden');
        current_route.setAttribute('value', route);
        current_route.setAttribute('name', "data[search_town_route][history][content]");
        document.frmSearchRoute.appendChild(current_route);
        
        //最後に選択した左のプルダウンの値
        var route = $("#targetRouteList").val();
        var current_route = document.createElement('input');
        current_route.setAttribute('type', 'hidden');
        current_route.setAttribute('value', route);
        current_route.setAttribute('name', "data[search_town_route][history][route]");
        document.frmSearchRoute.appendChild(current_route);
        //戻る処理を実行する為の措置 end
        
        // 沿線ハッシュをJSON文字列にしてセッションに渡す
        var jsondata = $.toJSON(selectedListHash);
        var inData = document.createElement('input');
        inData.setAttribute("type", "hidden");
        inData.setAttribute("value", jsondata);
        inData.setAttribute("name", "data[search_town_route][selectedListHash]");
        document.frmSearchRoute.appendChild(inData);
        
        document.frmSearchRoute.action = frmActionUrl;
        document.frmSearchRoute.submit();
        
        return false;
    });
    
    /***************************************
     *「追加」ボタンを押した場合
     ***************************************/
    $("#btnAddList").click( function(){
        var routeCode = $("#targetRouteList").children(':selected').val();
        var routeName = $("#targetRouteList").children(':selected').text();
        var data = $("#targeStationtList>option[selected]");
        var ensen = $("#targetRouteName");
        var trafficCode = ensen.val();
        
        // 駅を選択していない場合
        if ( data.length == 0 ){
            alert(route_err_msg3);
            return false;
        }
        
        // 検索対対象が11件以上になる場合
        if ( $("#selectedList>option").length + $(data).length > max_length ) {
            alert(route_err_msg2);
            return false;
        }
        
        //データが無ければ追加
        if ( !selectedListHash[trafficCode] ){
            selectedListHash[trafficCode] = { 'name' : ensen.children(':selected').text(), '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];
        var stationCodeAll = routeCode + '-' + code_all; //「XX沿線すべて」をあらわすコード, 交通機関コード、路線コード、駅コードのハイフン連結
        //var stationCodeAll = trafficCode + '-' + routeCode + '-' + code_all; //「XX沿線すべて」をあらわすコード, 交通機関コード、路線コード、駅コードのハイフン連結
         
        //「すべて」を含んでいたら「すべて」のみを登録
        if ( $(data).is("[value='" +  stationCodeAll + "']") ) {
            //「すべて」だけを抽出
            data = $(data).filter("[value='" +  stationCodeAll + "']");
            // 「すべて」以外の駅を削除
            for ( key in routeData.stationHash ){
                if ( key !=  stationCodeAll ) {
                    delete routeData.stationHash[key];
                    routeData.count--;
                    //リストから削除
                    $("#selectedList").children("[value='" + key + "']").remove();
                }
            }
        } else if ( $(data).is("[value='" + stationCodeAll + "']") == false && routeData.stationHash[stationCodeAll] ) {
            // 検索対象に「すべて」がある状態で, 選択した駅に「すべて」が無い場合
            if (  confirm(route_cnf_msg1) ) {
                delete routeData.stationHash[stationCodeAll];
                routeData.count--;
                $("#selectedList").children("[value='" + stationCodeAll + "']").remove();
            } else {
                return false;
            }
        }
        
        //選択データに対してイテレート
        jQuery.each( data, function(){
            var stationName = "";
            var optStationName = $(this).text();
            if ( optStationName.match(/すべて$/) ){
                stationName = 'すべて';  //沿線すべては「すべて」にする
            } else {
                stationName = optStationName.replace(/( |　)/, "").replace(/【.*/, ""); //半角スペース、全角スペースを取り除き、件数の「【」以降も取り除く。
            }
            var stationCode = $(this).val();
            
            //駅ハッシュにない値の場合は値を追加。プルダウンに要素を追加。
            if ( !routeData.stationHash[stationCode] ) {
                routeData.count++;
                routeData.stationHash[stationCode] = stationName;
                
                //　IEのバグの為、 createElementでoptionタグを生成する
                var selOpts = document.createElement('option');
                selOpts.value = stationCode;
                
                //駅プルダウンで「XXすべて」を選択したときは検索対象プルダウンのリストを生成する際に、沿線名を補完しない。
                if ( stationName != $("#targeStationtList").children(':first').text() ){
                    selOpts.innerHTML = routeName + ' ' + stationName;
                }else{
                    selOpts.innerHTML = stationName;
                }
                document.getElementById('selectedList').appendChild(selOpts);
            }
        });
        //$.dump(selectedListHash);
        
        //ハッシュから　「現在選択している条件」の表示を再描画
        showSelectedListHash();
        
        return false;
    });
    
    /***************************************
     *「除外」ボタンを押した場合
     ***************************************/
    $("#btnDelList").click( function(){
        var selectedItem = $("#selectedList>option[selected]");
        
        //除外対象を選択していない場合
        if ( selectedItem.length == 0 ){
            alert(route_err_msg4);
            return false;
        }
        
        //選択したデータをハッシュから削除
        jQuery.each(selectedItem, function(){
            var code = ($(this).val()).split('-');
            var ensenCode = code[0];
            var routeCode = code[0] + '-' + code[1] + '-' + code[2];
            var stationCode = $(this).val();
            
            // 選択された駅を削除する
            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();
        
        //ハッシュから　「現在選択している条件」の表示を再描画
        showSelectedListHash();
        
        return false;
    });
});
