site.checkout.initAddressLookupForm = function(args) {  
    var options = Object.extend({}, args || {} );
    if ( !options.lookupButtonNode ||
            !options.postcodeInputNode ||
            !options.cityInputNode ||
            !options.streetInputNode ||
            !options.prefectureSelectNode ||
            !options.resultContainerNode ) {
        return null;
    }

   //console.log("site.checkout.initAddressLookupForm "+options); 
    
    options.lookupButtonNode.observe("click", function (clickEvt) {
        clickEvt.preventDefault();        
        var postcode = options.postcodeInputNode.value;
            
        generic.jsonrpc.fetch({
            method: 'address.PcsByPostalCode',
            params: [{ 'POSTAL_CODE':postcode }],
            onSuccess: function(jsonRpcResponse) {
                if (jsonRpcResponse) {
                    var resultsArray = jsonRpcResponse.getValue();
                    if (resultsArray) {                        
                        if (resultsArray.length === 1) {
                            populateAddressFields(resultsArray[0]);
                            hideAddressOptions();
                        } else {
                            displayAddressOptions(resultsArray, postcode);
                        }
                    } else {
                    	     displayAddressOptions([], postcode);
                    }
                }
            },
            onError: function (r) {
                console.log(r)
                displayAddressOptions([], postcode); 
            }
        });
    }); // end options.lookupButtonNode.observe


    var displayAddressOptions = function (resultsArray, postcode) {
     // wire up CLOSE button (same element in both templates)
         var initializeCloseLink = function () {
             var closeNodes = options.resultContainerNode.select("div.action-close a");
             closeNodes.each( function (node) {
                 node.observe("click", function(closeClinkEvt) {
                     closeClinkEvt.preventDefault();
                     hideAddressOptions();
                 });
             })
         };
         // handle zero results
         if (resultsArray.length === 0) {
             generic.templates.factory.get({path:"/js/site/checkout/templates/address-lookup-no-results.tmpl"}).evaluateCallback({
                 callback: function(html) {
                     options.resultContainerNode.update(html);
                     initializeCloseLink();
                 }
             });
         } else {
             generic.templates.factory.get({path:"/js/site/checkout/templates/address-lookup-results.tmpl"}).evaluateCallback({
                 callback: function(html) {
                     options.resultContainerNode.update(html);
                     var resultsListNode = options.resultContainerNode.select("ul.address-list")[0];
                     if (resultsListNode) {
                         for (var i=0, len=resultsArray.length; i<len; i++) {
                             var addressObj = resultsArray[i];
                             // this index value gets appended to the class of the
                             // "select" link, e.g.: <a class="address_id_0">
                             addressObj.index = i;
                             addressObj.postcode = postcode;
                             displayAddressItem(addressObj, resultsListNode);
                         }
                     }
                     initializeCloseLink();
                 }
             });
         }
     }; // end displayAddressOptions


    var hideAddressOptions = function() {
        if (options.resultContainerNode) {
            options.resultContainerNode.update("");
        }
    };

    var displayAddressItem = function (addressObj, resultsListNode) {
        generic.templates.factory.get({path:"/js/site/checkout/templates/address-lookup-item.tmpl"}).evaluateCallback({
            object: addressObj,
            callback: function(itemHtml) {
                resultsListNode.insert(itemHtml);
                var addressSelectNode = resultsListNode.select("a.address_id_" + addressObj.index)[0];
                if (addressSelectNode) {
                    addressSelectNode.observe("click", function (addressObj, selectClickEvt) {
                        populateAddressFields(addressObj);
                        hideAddressOptions();
                        selectClickEvt.preventDefault();
                    }.curry(addressObj))
                }
            }
        });
    };

    var populateAddressFields = function(resultObj) {
        if (options.cityInputNode) {
            options.cityInputNode.value = resultObj.CITY_NAME_KANJI;
        }
        if (options.streetInputNode) {
            options.streetInputNode.value = resultObj.STREET_NAME_KANJI;
        }
        if (options.prefectureSelectNode) {
            var optsArray = $A(options.prefectureSelectNode.options);
            var opt = optsArray.detect(function(opt, idx) {
                if (opt.value === resultObj.PREFECTURE_NAME_KANJI) {
                    return opt;
                }
            });
            if (opt) {
                options.prefectureSelectNode.selectedIndex = optsArray.indexOf(opt);
            }
        }
    }; 

};
