(function ($) {
    $.fn.geoSearch = function (options) {
        var defaults = {
            key: "id",
            value: "label",
            data: "",
            useButtonVisibility: true,
            defaultText: "",
            textPrefix: "",
            textPostfix: ""
        };
        
        var settings = $.extend({}, defaults, options);
        settings.target = this;

        if (!(settings.fader instanceof $)) settings.fader = $(settings.fader);
        if (!(settings.overlay instanceof $)) settings.overlay = $(settings.overlay);
        if (!(settings.selects instanceof $)) settings.selects = $(settings.selects);
        if (!(settings.buttons instanceof $)) settings.buttons = $(settings.buttons);
        if (!(settings.handle instanceof $)) settings.handle = $(settings.handle);

        var name = settings.selects.children("option:selected").last().html();
        if(name && name.length > 0)
            name = settings.textPrefix + name + settings.textPostfix;
        else
            name = settings.defaultText;

        this.html(name);
        settings.handle.html(name);
        
        this.click(function(event) {
            settings.fader.css("visibility", "visible");
            settings.overlay.show();
        });
        
        settings.handle.click(function(event) {
            settings.fader.css("visibility", "hidden");
            settings.overlay.hide();
        });
        
        settings.selects.each(function(idx) {

            var showButton = function(event) {
                if(settings.useButtonVisibility) {
                    settings.buttons.css("visibility", "hidden").eq(idx).css("visibility", "visible");
                } else {
                    settings.buttons.hide().eq(idx).show();
                }
            }

            $(this).click(showButton)
               .change(showButton);

            if(idx != settings.selects.size() - 1) {
                $(this).selectChain({target: settings.selects.slice(idx + 1), url: settings.url})
            }
        });

        settings.buttons.click(function() {
            var index = settings.buttons.index(this);
            settings.selects.slice(index + 1).val("").slice(1).empty();
            settings.fader.css("visibility", "hidden");
            settings.overlay.hide();

            var name = settings.selects.eq(index).children(":selected").html();
            if(name && name.length > 0)
                name = settings.textPrefix + name + settings.textPostfix;
            else
                name = settings.defaultText;

            settings.target.html(name);
            settings.handle.html(name);

            return false;
        });
    };
})(jQuery);