
function address_field_ids(customer, order_id) {
    var address_field_ids = new Array();

    address_field_ids["street_address"] = ((customer) ? 'billing_' : '') + 'street_address' + ((order_id) ? '_' + order_id : '');
    address_field_ids["suburb"] = ((customer) ? 'billing_' : '') + 'suburb' + ((order_id) ? '_' + order_id : '');
    address_field_ids["town_city"] = ((customer) ? 'billing_' : '') + 'town_city' + ((order_id) ? '_' + order_id : '');
    address_field_ids["postcode"] = ((customer) ? 'billing_' : '') + 'postcode' + ((order_id) ? '_' + order_id : '');

    return address_field_ids;
}

function attach_addr_autocomplete(customer, order_id) {
    var cached_terms   = '';
    var cached_results = [];
    // keypress count that result in no longer matching, trigger clear of cached_results
    var mkp = 0;

    var addr_field_ids = address_field_ids(customer, order_id);
    var street_address_field_id = addr_field_ids["street_address"];
    var suburb_field_id = addr_field_ids["suburb"];
    var town_city_field_id = addr_field_ids["town_city"];
    var postcode_field_id = addr_field_ids["postcode"];

    $('#' + street_address_field_id).autocomplete({
        minLength: 2,
        source: function( request, response ) {
            $.ajax({
                search_terms: request.term,

                url:      "/address-autocomplete",
                data: {
                    sa: request.term,
                    json: 1,
                },
                success: function( data ) {
                    if(!data || data.length == 0) {
                        //erase cached if it doesn't relate to the current input
                        if((cached_results.length > 0 && this.search_terms.indexOf(cached_terms) != 0) || mkp++ > 1) {
                            cached_results = [];
                            cached_terms = '';
                            mkp = 0;
                        }
                        response( cached_results );
                        return;
                    }

                    //console.log(data);

                    var matches = data;

                    cached_terms   = this.search_terms;
                    cached_results = $.map( matches, function( match ) {
                        //console.log(match);
                        var address_string = match.address_lines.join(', ');

                        return {
                            label: address_string,
                            value: match
                        }
                    });

                    response( cached_results );
                }});
            },
        select: function( event, ui ) {
            //console.log(ui.item);

            address = ui.item.value;

            if(!address) return false;

            $('#' + street_address_field_id).val(address.street_address);
            $('#' + street_address_field_id + '_auto').val(address.street_address);
            $('#' + suburb_field_id).val(address.suburb);
            $('#' + suburb_field_id + '_auto').val(address.suburb);
            $('#' + town_city_field_id).val(address.town_city);
            $('#' + town_city_field_id + '_auto').val(address.town_city);
            $('#' + postcode_field_id).val(address.postcode);
            $('#' + postcode_field_id + '_auto').val(address.postcode);

            return false;
        }
    });
    $('#' + street_address_field_id).attr('autocomplete', 'off');
}

function detach_addr_autocomplete(customer, order_id) {

    var addr_field_ids = address_field_ids(customer, order_id);
    var street_address_field_id = addr_field_ids["street_address"];

    $('#' + street_address_field_id).unbind(".autocomplete()");
    $('#' + street_address_field_id).attr('autocomplete', 'on');
}
