/******************************************************************************
 * 住所から探す
 ******************************************************************************/

//「すべて」用コード　9桁
var code_all = '000000000';

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

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

var address_err_msg0 = "エラー";
var address_err_msg1 = "検索対象を設定して下さい。";
var address_err_msg2 = "設定できる検索対象は" + max_length + "件までです。";
var address_err_msg3 = "町名を選択して下さい。";
var address_err_msg4 = "除外対象を選択して下さい。";
var address_err_msg5 = "該当する町名が見つかりませんでした。";
var address_err_msg6 = "該当する地域が見つかりませんでした。";

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

var evTargetJISListChange;  //地域を変更した時のイベント

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

/***************************************
 * ハッシュから「現在選択している条件」を表示
 ***************************************/
function showSelectedListHash(){
    //現在設定している条件の市区町村を一度クリア
    $("#dspChouaza").children().remove();
    
    //選択している都道府県を表示
    if ( $("#SearchTodofuken :selected").val() != "" ){
        $("#todofuken").text( $("#SearchTodofuken :selected").text().replace(/【.*$/, ""));
    } else {
        $("#todofuken").text("");
    }
    
    //市区町村を表示
    for ( prefCode in selectedListHash ){
        var prefData = selectedListHash[prefCode];
        //市区町村別データ
        for ( jisCode in prefData.jisHash ){
            var jisData = prefData.jisHash[jisCode];
            var li_text = "【" + jisData.name + "】　";
            var hidden = "";
            for ( choazaCode in jisData.choazaHash ){
                // 都道府県、市区町村、その下のコードのハイフン連結データを hidden で生成
                hidden += '<input type="hidden" name="data[search_address][selectedList][]" value="' + choazaCode + '" />';
                //alert( choazaCode );
                li_text += jisData.choazaHash[choazaCode] + " / ";
            }
            //alert(hidden);
            $("#dspChouaza").append('<li>' + li_text.replace(/ \/ $/, "") + hidden + '</li>');
        }
    }
}

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

/***************************************
 * データ復元処理
 ***************************************/
function initBody(){
    //各プルダウン初期化
    $("#targetJISList").attr('disabled','disabled');
    $('#targetChouazaList').attr('disabled','disabled');
    
    // ajaxStart, ajaxCompleteを設定
    initAjaxEvent();
    
    //市区選択イベント
    $("#targetJISList").bind('change', evTargetJISListChange);
    
    // 都道府県プルダウンの初期化処理
    if ( $("#SearchTodofuken>option:selected").val() != "" ){
        //復元で選択されているとき, 選択状態にしてajaxイベントを実行
        selectJISbyAjax( $("#SearchTodofuken>option:selected").val() );
        todofukenVal = $("#SearchTodofuken>option:selected").val(); //初期選択時の県を一時保存
    }
    
    //選択データ復元処理
    restoreSelectedList(strHashJson);
}

/***************************************
 * 選択状態にしてajaxイベントを実行
 ***************************************/
function selectJISbyAjax(pref_code){
    var url = JisListUrl + pref_code + "/";
    if ( pref_code != "" ) {
        
        $("#targetJISList").children().remove();
        $("#targetChouazaList").children().remove();
        
        jQuery.post( url, null, function(data, status){
            if ( status == 'success') {
                $("#targetJISList").children().remove();
                $("#targetChouazaList").children().remove();
                
                //データが無い場合はアラート
                if ( data.item.length == 0 ){
                    alert(address_err_msg6);
                    return false;
                }
                
                for ( var i=0; i<data.item.length; i++ ){                        
                    var dataName = data.item[i].itemName + "【" + data.item[i].itemBukkenCount + "件】";
                    var dataCode = data.item[i].itemCode;
                    
                    var selOpt = document.createElement('option');
                    selOpt.value = dataCode;
                    selOpt.innerHTML = dataName;
                    document.getElementById("targetJISList").appendChild(selOpt);
                }
            } else {
                alert(address_err_msg0);
            }
        }, 'json');
        $("#targetJISList").removeAttr('disabled');
        $("#todofuken").text( $("#SearchTodofuken option:selected").text().replace(/【.*$/, "") );
    } else {
        $("#targetJISList").children().remove();
        $("#targetChouazaList").children().remove();
    }
}

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

/***************************************
 * ajaxイベント時ロック処理
 ***************************************/
function initAjaxEvent(){
    $("#targetJISList").ajaxStart( function(){ $("#SearchTodofuken").attr('disabled', 'disabled'); $(this).attr('disabled', 'disabled'); });
    $("#targetJISList").ajaxComplete( function(){ $("#SearchTodofuken").removeAttr('disabled'); $(this).removeAttr('disabled'); });
}

/***************************************
 * 市区選択時イベント
 ***************************************/
function evTargetJISListChange(event){
    var code_jis = $(event.target).val();
    
    if ( code_jis != '' ){
        $("#targetChouazaList").children().remove();
        var pref_code = $("#SearchTodofuken").val();
        var url = ChouazaListUrl + pref_code + "/" + code_jis + "/";

        // Ajaxのpostで町字一覧のJSONを取得する
        jQuery.post( url, null, function(data, status){
            if ( status == 'success' ){
                var JISNameAll = ($("#targetJISList").children(":selected").text() ).replace(/【.*$/, "") + "すべて";
                var JIS_Prefix = pref_code + '-' + code_jis;  //町字までもつと面倒なので prefixとして変数を用意
                var JISCodeAll = JIS_Prefix + '-' + code_all; //JISコードまででOKのはず。
                var itemBukkenCount = 0;

                // データが無い場合はアラート
                if ( data.item.length == 0 ){
                    alert(address_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 = JIS_Prefix + '-' + data.item[i].itemCode; //「XXXすべて」を出せるようにする為、JISを先頭に連結しておく
                    selOpt.innerHTML = dataName;
                    document.getElementById("targetChouazaList").appendChild(selOpt);
                    itemBukkenCount += parseInt(data.item[i].itemBukkenCount);
                }
                var selOpt = document.createElement('option');
                selOpt.value = JISCodeAll;
                selOpt.innerHTML = "■" + JISNameAll + "【" + itemBukkenCount + "件】";
                $("#targetChouazaList").prepend(selOpt);
            } else {
                alert(address_err_msg0);
            }
        }, 'json');
        $("#targetChouazaList").removeAttr('disabled');
    } else {
        $("#targetChouazaList").children().remove();
    }
}

/***************************************
 * ヒストリバック対応　画面ロード処理
 ***************************************/
function pageload(hash){
    //戻る対策
    if ( hash && gnext){
        //画面遷移する直前
    } else if ( hash && !gnext ) {
        //戻るで戻ってきた場合
        var strDt = "?"+(new Date).getTime();
        //ハッシュの文字列を取得・表示をリストア
        $.get( ajaxCtrlUrl + "getBackSelectedList/search_address"+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_address"+strDt, null, function(data, status){
            if ( status == 'success' ){
                //alert("success");
                if ( $(data).length > 0 ){
                    var targetJISList = $(data).find("#targetJISList");
                    if ( ($(targetJISList).html().replace(/(^\s+|\s+$)/, "")).length > 0 ) {
                        //プルダウンを書換
                        $("#targetJISList").replaceWith( $(targetJISList) );
                        //firefox3対応　明示的に最後に選択した値にフォーカスをあてる
                        $.getJSON(ajaxCtrlUrl + "getBackJIS/search_address"+strDt, null, function(data, status){
                            if ( status == "success" ){
                                $("#targetJISList").children("option[value='" + data.jis + "']").attr('selected', 'selected');
                            } else { alert(address_err_msg0); }
                            // 地域プルダウン選択イベント
                            $("#targetJISList").bind('change', evTargetJISListChange);
                        });
                    }
                    var targetChouazaList = $(data).find("#targetChouazaList");
                    if ( ($(targetChouazaList).html().replace(/(^\s+|\s+$)/, "")).length > 0 ) {
                        $("#targetChouazaList").replaceWith( $(targetChouazaList) );
                    }
                    // ajaxStart, ajaxCompleteを設定
                    initAjaxEvent();
                }
            } else { alert(address_err_msg0); }
        }, "html");
        $.ajaxSetup({async:true});
    } else {
        //通常の遷移の場合
        initBody();
    }
}

$(document).ready( function(){
    //safariの場合だけ特殊対応
    if ( $.browser.safari ) { $(window).unbind('unload'); $("#address-btn").click( function(){  location.href = $(this).children('a').attr('href'); }); }
    
    //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();
//        
//        // 選択してください状態の場合
//        if ( $(this).val() == "" ){
//            //地域リスト、町名リストを使用不可、一覧をクリア
//            $('#targetJISList').attr('disabled','disabled').children().remove();
//            $('#targetChouazaList').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(){
        //検索対象がある場合はconfirmアラート
        if ( $("#selectedList").children().length > 0 ) {
            if ( !confirm(address_cnf_msg2) ) {
                $(this).val(todofukenVal); //前回選択していた県に戻す
                return false;
            }
        }
        //選択した県の値を一旦保存
        todofukenVal = $(this).val();
        
        //ハッシュを初期化
        initSelectedListHash();
        showSelectedListHash();
        
        //検索対象プルダウンをクリア
        $("#selectedList").children().remove();
        
        var pref_code = $(this).val();
        selectJISbyAjax(pref_code);
    });
        
    /***************************************
     * div.btn-submit, #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(address_err_msg1);
            return false;
        }
        if ( data.length > max_length ){
            alert(adddress_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 content = "<div>" + step1 + step2 + "</div>";
        var elem = document.createElement('input');
        elem.setAttribute('type', 'hidden');
        elem.setAttribute('value', content);
        elem.setAttribute('name', "data[search_address][history][content]");
        document.frmSearchAddr.appendChild(elem);
        
        //最後に選択した左のプルダウンの値
        var jis = $("#targetJISList").val();
        var current_jis = document.createElement('input');
        current_jis.setAttribute('type', 'hidden');
        current_jis.setAttribute('value',  jis);
        current_jis.setAttribute('name', "data[search_address][history][jis]");
        document.frmSearchAddr.appendChild(current_jis);
        //戻る処理を実行する為の措置 end
        
        // 市区町村別ハッシュをJSON文字列にしてセッションに渡す
        var jsondata = $.toJSON(selectedListHash);
        var inData = document.createElement('input');
        inData.setAttribute("type", "hidden");
        inData.setAttribute("value", jsondata);
        inData.setAttribute("name", "data[search_address][selectedListHash]");
        document.frmSearchAddr.appendChild(inData);
        
        document.frmSearchAddr.action = frmActionUrl;
        document.frmSearchAddr.submit();
        
        return false;
    });
    
    /***************************************
     *「追加」ボタンを押した場合
     ***************************************/
    $("#btnAddList").click( function(){
        var JISCode = $("#targetJISList").children("option:selected").val();
        var JISName = ( $("#targetJISList").children("option:selected").text() ).replace(/【.*$/, "");
        var data = $("#targetChouazaList>option[selected]");
        var tdf = $("#SearchTodofuken");
        var JIS_Prefix = tdf.val() + '-' + JISCode; //JISコードハイフン連結
        
        // 町名を選択していない場合
        if ( data.length == 0 ){
            alert(address_err_msg3);
            return false;
        }
        
        // 検索対対象が11件以上になる場合
        if ( $("#selectedList>option").length + $(data).length > max_length ) {
            alert(address_err_msg2);
            return false;
        }
        
        //データが無ければ追加
        if ( !selectedListHash[tdf.val()] ){
            selectedListHash[tdf.val()] = { 'name' : tdf.children(':selected').text(), 'jisHash' : new Object() };
        }
        var tdfData = selectedListHash[tdf.val()];
        
        //データが無ければ追加
        if ( !tdfData.jisHash[JISCode] ){
            tdfData.jisHash[JISCode] = { 'name' : JISName, 'choazaHash' : new Object(), 'count' : 0 };
        }
        var jisData = tdfData.jisHash[JISCode];
        var choazaCodeAll = JIS_Prefix + '-' + code_all; //「XXすべて」をあらわすコード
        
        //「すべて」を含んでいたら「すべて」のみを登録
        if ( $(data).is("[value='" + choazaCodeAll + "']") ) {
            //「すべて」だけを抽出
            data = $(data).filter("[value='" + choazaCodeAll +"']");
            // 「すべて」以外の駅を削除
            for ( key in jisData.choazaHash ){
                if ( key != choazaCodeAll ){
                    delete jisData.choazaHash[key];
                    jisData.count--;
                    //リストから削除
                    $("#selectedList").children("[value='" + key + "']").remove();
                }
            }
        } else if ( $(data).is("[value='" + choazaCodeAll + "']") == false && jisData.choazaHash[choazaCodeAll] ) {
            // 検索対象に「すべて」がある状態で町を追加しようとした場合
            if ( confirm(address_cnf_msg1) ) {
                delete jisData.choazaHash[choazaCodeAll];
                jisData.count--;
                $("#selectedList").children("[value='" + choazaCodeAll + "']").remove();
            } else {
                return false;
            }
        }
        
        //選択データに対してイテレート
        jQuery.each( data, function(){
            var choazaName = "";
            var optchoazaName = $(this).text();
            if ( optchoazaName.match(/すべて/) ){
                choazaName = 'すべて';  //XXXすべて【YYY件】は「すべて」にする
            } else {
                choazaName = optchoazaName.replace(/( |　)/, "").replace(/【.*/, ""); //半角スペース、全角スペースを取り除き、件数の「【」以降も取り除く。
            }
            var choazaCode = $(this).val();
            
            //町ハッシュにない値の場合は値を追加。プルダウンに要素を追加。
            if ( !jisData.choazaHash[choazaCode] ){
                jisData.count++;
                jisData.choazaHash[choazaCode] = choazaName;
                
                //　IE6のバグの為、 createElementでoptionタグを生成する
                var selOpts = document.createElement('option');
                selOpts.value = choazaCode;
                
                //町名プルダウンで「XXすべて」を選択したときは検索対象プルダウンのリストを生成する際に、地域名を補完しない。
                if ( choazaName != $("#targetChouazaList").children(':first').text() ) {
                    selOpts.innerHTML = JISName + ' ' + choazaName;
                } else {
                    selOpts.innerHTML = choazaName; //すべて　の場合
                }
                document.getElementById('selectedList').appendChild(selOpts);
            }
        });
        //$.dump(selectedListHash);
        
        //ハッシュから　「現在選択している条件」の表示を再描画
        showSelectedListHash();
        
        return false;
    });
    
    /***************************************
     *「除外」ボタンを押した場合
     ***************************************/
    $("#btnDelList").click( function(){
        var selectedItem = $("#selectedList>option[selected]");
        
        //除外対象を選択していない場合
        if ( selectedItem.length == 0 ){
            alert(address_err_msg4);
            return false;
        }
        
        //選択したデータをハッシュから削除
        jQuery.each(selectedItem, function(){
            var code = ( $(this).val() ).split('-');
            var prefCode = code[0];
            var jisCode = code[1];
            var choazaCode = $(this).val();
            
            // 選択された町字を削除する
            delete selectedListHash[prefCode].jisHash[jisCode].choazaHash[choazaCode];
            selectedListHash[prefCode].jisHash[jisCode].count--;
            
            // JISに対する町字が0になったらそのJISオブジェクトを削除する
            if ( selectedListHash[prefCode].jisHash[jisCode].count == 0 ){
                delete selectedListHash[prefCode].jisHash[jisCode];
            }
            
            // JISオブジェクトが無くなったら、都道府県オブジェクトを削除する
            var i=0;
            for ( key in selectedListHash[prefCode].jisHash ) {
                i++;
                break; //1つでもキーが見つかったら処理抜け
            }
            if ( i == 0 ){
                delete selectedListHash[prefCode];
            }
        });
        //$.dump(selectedListHash);
        
        //対象プルダウンから選択要素を削除
        $("#selectedList>option[selected]").remove();
        
        //ハッシュから　「現在選択している条件」の表示を再描画
        showSelectedListHash();
        
        return false;
    });
});
