(function(jQuery){

     jQuery.fn.extend({

         addressLookup: function(options) {

            //Set the default values, use comma to separate the settings, example:
            var defaults = {
                renderLocationName: function(dataItem){ return dataItem.name + ' ' + dataItem.postcode + ' (' + dataItem.municipality + ')'; },
                getStateFilter: function(){ return ''; },
                onSelectAddress: function(id, text){}
            }

            var options =  jQuery.extend(defaults, options);

            return this.each(function() {

                var opts = options;
                var obj = jQuery(this);

                var delaytimer;

                var resultsDivID = obj.attr('id') + '_results';

                // Add the empty div to store the lookup results.
                obj.parent().append('<div class="ajaxAddressLookupResults" id="' + resultsDivID + '" style="display:none; left:0; top:18px; width:200px;"></div>');

                obj.keyup(function(){

                    if(!obj.attr("readonly"))
                    {
                        clearTimeout(delaytimer);

                        delaytimer = setTimeout(function(){ doLookup(); }, 300);
                    }

                });

                doLookup = function(){

                    var searchTerm = obj.val();

                    if (searchTerm.length > 2) {

                        jQuery("#" + resultsDivID).empty().append('<ul><li><a><span>Loading...<span></a></li></ul>').fadeIn("fast");

                        url = BASE + 'locations-lookup/find-suburbs/?q=' + escape(searchTerm);

                        if(opts.getStateFilter() != '') {
                            url += '&s=' + opts.getStateFilter();
                        }

                        jQuery.getJSON(url, function(data, status){
                        
                            if(data.length > 0) {
    
                                jQuery("#" + resultsDivID).empty().append('<ul></ul>');
    
                                jQuery(data).each(function(i){
    
                                    jQuery("#" + resultsDivID + ' ul').append('<li><a href="#' + data[i].id + '" rel="ajaxOption"><span>' + opts.renderLocationName(data[i]) + '</span></a></li>');
    
                                });
                                
                            } else {
                            
                                jQuery("#" + resultsDivID).empty().append('<ul><li><a><span>No results found<span></a></li></ul>');
                            
                            }

                        });

                    }

                };
                
                jQuery("#" + resultsDivID + " [rel=ajaxOption]").live('click', function(){

                    href = jQuery(this).attr("href");

                    location_id = href.substr(href.indexOf('#')+1);
                    location_name = jQuery('span', jQuery(this)).text();

                    opts.onSelectAddress(location_id, location_name);

                    obj.blur();

                    jQuery("#" + resultsDivID).empty().hide();

                    return false;

                });
                
                obj.val("Enter suburb name...");

                obj.focus(function() {

                    jQuery(this).val("");

                });

                obj.blur(function() {

                    jQuery(this).val("Enter suburb name...");

                });

                jQuery("div:not(#" + resultsDivID + ")").click(function() {
                    jQuery("#" + resultsDivID).hide();
                });
            });
        }
    });

})(jQuery);

