PostCodeComplete = (function(){
    // Utilities

    function getLastScriptNode() {
        var n = document;
        while(n && n.nodeName.toLowerCase() != "script") { n = n.lastChild;}
        return n;
    };

    function addEventListener(elem, evname, func)
    {
        if(!elem){return;}
        if(elem.addEventListener){ //for DOM
            elem.addEventListener(evname, func, false);
        }
        else if(elem.attachEvent){ //for IE
            elem.attachEvent("on" + evname, func);
        }
    };

    //
    var AsyncData = function(url){
        var data = null;
        var loading = false;
        var waitors = [];

        this.getData = function(callback) {
            if(!callback){
                return;
            }
            if(data){
                callback(data);
            }
            else{
                waitors.push(callback);
                if(!loading){
                    loading = true;
                    HttpLoader.loadJson(url, function(dataLoaded){
                        data = dataLoaded;
                        for(var i = 0; i < waitors.length; ++i){
                            waitors[i](data);
                        }
                    }, "POST", "");
                }
            }
        };
    }
    
    //
    //var DATA_DIR = "data";
    var DATA_DIR = "postcode/data";
    var prefectures = new AsyncData(DATA_DIR + "/prefectures.json");
    var areas = {}
    
    function complete(elemCode3, elemCode4, elemPref, elemCity, elemTown)
    {
        var code3str = elemCode3.value
        var code4str = elemCode4.value
        var code3 = parseInt(code3str, 10)
        var code4 = parseInt(code4str, 10)
        if(code3 >= 0 && code3 <= 999 && code4 >= 0 && code4 <= 9999){
            var area = areas[code3];
            if(!area){
                var url = DATA_DIR + "/" + code3str + ".json";
                areas[code3] = area = new AsyncData(url);
            }
            area.getData(function(subareas){
                prefectures.getData(function(prefs){
                    if(subareas && prefs){
                        var sa = subareas[code4];
                        if(sa){
                            var prefId = sa[0];
                            var city = sa[1];
                            var town = sa[2];
                            var pref = prefs[prefId];
                            //alert(pref + "," + city + "," + town);

                            if(elemPref){elemPref.value = pref;}
                            if(elemCity){elemCity.value = city;}
                            if(elemTown){elemTown.value = town;}
                        }
                    }
                });
            });
        }
    }

    function createButton(nameCode3, nameCode4, namePref, nameCity, nameTown)
    {
        var elemCode3 = document.getElementsByName(nameCode3).item(0);
        var elemCode4 = document.getElementsByName(nameCode4).item(0);
        var elemPref = document.getElementsByName(namePref).item(0);
        var elemCity = document.getElementsByName(nameCity).item(0);
        var elemTown = document.getElementsByName(nameTown).item(0);
        if(!elemCode3 || !elemCode4 || !elemPref || !elemCity || !elemTown
           || elemCode3.type == "hidden"
           || elemCode4.type == "hidden"
           || elemPref.type == "hidden"
           || elemCity.type == "hidden"
           || elemTown.type == "hidden"){
            return null;
        }
        
        var button = document.createElement("input");
        button.setAttribute("type", "button");
        button.setAttribute("value", "郵便番号から住所を入力");
        addEventListener(button, "click", function(){
            complete(elemCode3, elemCode4, elemPref, elemCity, elemTown);
        });
        return button;
    }
    
    // public functions

    return {
        insertButtonAfterLastScriptNode: function(name3, name4, namePref, nameCity, nameTown) {
            var button = createButton(name3, name4, namePref, nameCity, nameTown);
            if(button){
                var parent = getLastScriptNode().parentNode;
                if(parent){
                    parent.appendChild(button);
                }
            }
            return button;
        },

        insertButtonAfterNamedElement: function(nameBefore, name3, name4, namePref, nameCity, nameTown) {
            var button = createButton(name3, name4, namePref, nameCity, nameTown);
            if(button){
                var elem = document.getElementsByName(nameBefore).item(0);
                if(elem && elem.type != "hidden"){
                    var parent = elem.parentNode;
                    if(parent){
                        parent.insertBefore(button, elem.nextSibling);
                    }
                }
            }
            return button;
        }
    };

})();

