var time = new Date();
var zip_1 = '';
var zip_2 = '';
var tagName = '';

/**
 * XML定義ファイルを読み、検索
 * 
 */
function execSearch (tagName) {

    // フォームのフィールド名を取得
    includeFiles('./ivy_zipsearch_setup.xml', tagName);

    // フォームの郵便番号を取得
    for (i = 0; i < fieldName.length; i++) {

        if (fieldName[i] == 'zip1') {
            zip_1 = document.getElementById(nodeList[i]).value;
            search_zip1 = zip_1;
        }

        if (fieldName[i] == 'zip2') {
            zip_2 = document.getElementById(nodeList[i]).value;
            search_zip2 = zip_2;
        }
        
    }
    
    // 検索開始
    zipSearch(zip_1, zip_2);
    
}

/**
 * 郵便番号１、郵便番号２から住所を検索し、XML形式で返す
 * 
 */
function zipSearch(zip_1, zip_2) {

    //var url = 'http://192.168.1.50/zip_search_api/htdocs/zipsearch/zip_search.php?zip1=' + zip_1 + '&zip2=' + zip_2 + '&time='+ time.getTime();
    var url = './js/xml.php?zip1=' + zip_1 + '&zip2=' + zip_2 + '&time='+ time.getTime();
    
    // バリデーション
    if (validation(zip_1, zip_2) == false) { return; }

    // Ajax通信開始
    new Ajax.Request(url, {asynchronous: false, method: 'get', onComplete: selectedFunction });

    function selectedFunction(responseHttpObj) {

        xmlObj = responseHttpObj.responseXML;

        var list = xmlObj.getElementsByTagName('item');
        
        // オブジェクトがなければメッセージを出して終了
        if (list.length < 1) {
            alert('指定された郵便番号に該当するデータはありませんでした。');
            return;
        }
        
        if (list.length == 1) {

            addressArr = new Object();
            for (i = 0; i < fieldName.length; i++) {
                // 連結出力の処理
                if (fieldName[i].match(/,/)) {
                    var columns = fieldName[i].split(',');
                    var addStr = '';
                    for (j = 0; j < columns.length; j++) {
                        addStr = addStr + getNodeValue(list[0], columns[j]);
                    }
                    
                    addressArr[nodeList[i]] = addStr;
                    
                } else {
                    
                    addressArr[nodeList[i]] = getNodeValue(list[0], fieldName[i]);
                    
                }
                
            }
            
            // 対象フィールドに値を入力
            getAddress(addressArr);

        } else if (list.length > 1) {
        
            var button = new Array;
            var zipList = '';
            zipList = zipList + "<table class='noticeTable'>";
            zipList = zipList + "<tr><td>" + list.length + "件の住所がヒットしました</td></tr>";
            zipList = zipList + "</table><br />";
            zipList = zipList + "<div style='overflow: auto; width: 98%; height: 85%;'>";
            zipList = zipList + "<table class='dataTable' style='margin-left: 10px;'>";
            zipList = zipList + "<tr><th>郵便番号</th><th>住所</th><th colspan='2'></th></tr>";

            addressArr = new Object();
            
            for (i = 0; i < list.length; i++) {
                narrowInfo = new Array();
                for (j = 0; j < fieldName.length; j++) {

                    if (fieldName[j].match(/,/)) {
                        var columns = fieldName[j].split(',');
                        var addStr = '';
                        for (k = 0; k < columns.length; k++) {
                            addStr = addStr + getNodeValue(list[i], columns[k]);
                        }
                        
                        addressArr[nodeList[j]] = addStr;
                        narrowInfo[j] = addStr;
                        
                    } else {
                        
                        addressArr[nodeList[j]] = getNodeValue(list[i], fieldName[j]);
                        narrowInfo[j] = getNodeValue(list[i], fieldName[j]);
                        
                    }
                    
                }

                var narrowStr = narrowInfo.join(',');
                // リスト表示用
                var zip1    = getNodeValue(list[i], 'zip1');
                var zip2    = getNodeValue(list[i], 'zip2');
                var state   = getNodeValue(list[i], 'state');
                var city    = getNodeValue(list[i], 'city');
                var street  = getNodeValue(list[i], 'list_street');

                // 「選択」ボタンと「絞り込み」ボタンのスタイル決定
                var narrowing_flg = getNodeValue(list[i], 'narrowing_flg');
                if (narrowing_flg == 1) {
                    selectButtonClass = 'disableButton';
                    selectButtonDisabled = 'disabled';
                    narrowButtonClass = 'button';
                    narrowButtonDisabled = '';
                } else {
                    selectButtonClass = 'button';
                    selectButtonDisabled = '';
                    narrowButtonClass = 'disableButton';
                    narrowButtonDisabled = 'disabled';
                }
                
                var trClass = (i % 2 != 0) ? " class='even'" : '';
                zipList = zipList + "<tr"+trClass+">";
                zipList = zipList + "<td style='width:  80px;'>〒" + zip1 + "-" + zip2 + "</td>";
                zipList = zipList + "<td style='width: 300px;'>" + state + city + street + "</td>";
                zipList = zipList + "<td><input type='button' value='選択' onClick='selectNarrow(\""+narrowStr+"\");' class='"+selectButtonClass+"' "+selectButtonDisabled+"></td>";
                zipList = zipList + "<td><input type='button' value='絞り込み' onClick='zipSearch(\""+zip1+"\", \""+zip2+"\");' class='"+narrowButtonClass+"' "+narrowButtonDisabled+"></td>";
                zipList = zipList + "</tr>";
            }
            zipList = zipList + "</table>";
            
            if (zip_1 == search_zip1 && zip_2 == search_zip2) {
            	
            } else {
            	
                zipList = zipList + "<div align='right'>";
                zipList = zipList + "<input type='button' value='戻る' onClick='zipSearch(\""+search_zip1+"\", \""+search_zip2+"\");' class='button'>";
                zipList = zipList + "</div>";
            	
            }
            
            zipList = zipList + "</div>";
            
            // 選択リストの表示
            sdlog.show(
                zipList,
                {opacity:'0.8', duration:'0', backgroundColor:'#000', noClickHide:'1'},
                {width:'550', height:'450', align:'center', padding:'10', border:'2px solid #666', backgroundColor:'#fff', noHideButton:'0', nameHideButton:'閉じる'}
            );
        }

    }

}

/**
 * 「選択」ボタンを押して住所を確定する
 * 
 */
function selectNarrow(narrowStr) {

    var addressArr = narrowStr.split(',');
    
    // 値が「state」のノードを検知
    for (i = 0; i < fieldName.length; i++) {
        if (fieldName[i] == 'state') {
            var stateElement = nodeList[i];
            break;
        }
    }
    
    // 都道府県IDを取得
    stateList = setStateList();
    for (i = 0; i < stateList.length; i++) {

        for (j = 0; j < addressArr.length; j++) {
              
            if (stateList[i] == addressArr[j]) {
                var state_id = i;
                break;
            }
                
        }

    }

    for (i = 0; i < nodeList.length; i++) {
        
        if (nodeList[i] == stateElement) {
            document.getElementById(nodeList[i]).value  = state_id;
        } else {
            document.getElementById(nodeList[i]).value  = addressArr[i];
        }
        
    }

    // リストを閉じる
    sdlog.hide();
        
}

/**
 * 7桁入力で結果が1件の場合、住所を確定する
 * 
 */
function getAddress(addressArr) {

    // 値が「state」のノードを検知
    for (i = 0; i < fieldName.length; i++) {
        
        if (fieldName[i] == 'state') {
            var stateElement = nodeList[i];
            break;
        }
        
    }
    
    // 都道府県IDを取得
    stateList = setStateList();
    for (i = 0; i < stateList.length; i++) {

        if (stateList[i] == addressArr[stateElement]) {
            var state_id = i;
            break;
        }

    }

    // 取得した値をノード名と同じフィールド名に転記
    for (i = 0; i < nodeList.length; i++) {
        
        if (nodeList[i] == stateElement) {
            document.getElementById(nodeList[i]).value  = state_id;
        } else {
            document.getElementById(nodeList[i]).value  = addressArr[nodeList[i]];
        }
        
    }

    // リストを閉じる
    sdlog.hide();
    
}

/**
 * サーバ上のXML定義ファイルを読み込む
 * 
 */
function includeFiles(fileName, tagName) {

    new Ajax.Request(fileName, {asynchronous: false, method: 'get', onComplete: displayData });

    function displayData(responseHttpObj){

        var num = 0;
        fieldName = new Array();
        nodeList = new Array();
        rowObj = responseHttpObj.responseXML.getElementsByTagName(tagName);
        
        for (i = 0; i < rowObj.length; i++) {
            
            colObj = rowObj[i].childNodes;
            
            for (j = 0; j < colObj.length; j++) {

                if (colObj[j].nodeName == '#text' && colObj[j].nodeType == 3) {
                    continue;
                }

                var val = colObj[j].childNodes[0].nodeValue;
                fieldName[num] = val;
                nodeList[num] = colObj[j].nodeName;
                num++;

            }
        }
    }
}

/**
 * 子ノードの値を取得する
 * 
 */
function getNodeValue(target, name) {

    var ret = '';
    do {
        var list = target.getElementsByTagName(name);
        if(list.length != 1)
        break;

        var children = list[0].childNodes;
        if(children.length <= 0)
        break;

        ret = children[0].nodeValue;

    } while (false);

    return ret;
}

/**
 * 郵便番号バリデーション
 * 
 */
function validation(zip1, zip2) {

    // 郵便番号上３桁の必須チェック
    if (zip1.length < 3) {
        alert('郵便番号の上３桁は必ず入力してください');
        return false;
    }

    // 郵便番号の文字数チェック
    if (zip1.length > 3 || zip2.length > 4) {
        alert('郵便番号は上３桁、下４桁の合計７桁で入力してください');
        return false;
    }

}

/**
 * 都道府県リストをセット
 * 
 */
function setStateList() {

    var stateList = new Array();
    
    stateList[1]  = "北海道";
    stateList[2]  = "青森県";
    stateList[3]  = "岩手県";
    stateList[4]  = "宮城県";
    stateList[5]  = "秋田県";
    stateList[6]  = "山形県";
    stateList[7]  = "福島県";
    stateList[8]  = "茨城県";
    stateList[9]  = "栃木県";
    stateList[10] = "群馬県";
    stateList[11] = "埼玉県";
    stateList[12] = "千葉県";
    stateList[13] = "東京都";
    stateList[14] = "神奈川県";
    stateList[15] = "新潟県";
    stateList[16] = "富山県";
    stateList[17] = "石川県";
    stateList[18] = "福井県";
    stateList[19] = "山梨県";
    stateList[20] = "長野県";
    stateList[21] = "岐阜県";
    stateList[22] = "静岡県";
    stateList[23] = "愛知県";
    stateList[24] = "三重県";
    stateList[25] = "滋賀県";
    stateList[26] = "京都府";
    stateList[27] = "大阪府";
    stateList[28] = "兵庫県";
    stateList[29] = "奈良県";
    stateList[30] = "和歌山県";
    stateList[31] = "鳥取県";
    stateList[32] = "島根県";
    stateList[33] = "岡山県";
    stateList[34] = "広島県";
    stateList[35] = "山口県";
    stateList[36] = "徳島県";
    stateList[37] = "香川県";
    stateList[38] = "愛媛県";
    stateList[39] = "高知県";
    stateList[40] = "福岡県";
    stateList[41] = "佐賀県";
    stateList[42] = "長崎県";
    stateList[43] = "熊本県";
    stateList[44] = "大分県";
    stateList[45] = "宮崎県";
    stateList[46] = "鹿児島県";
    stateList[47] = "沖縄県";

    return stateList;

}

