(function ($) {
    $.fn.geoSearch = function (options) {
        var defaults = {
            key: "id",
            value: "label",
            data: "",
            useButtonVisibility: true,
            defaultText: "",
            textPrefix: "",
            textPostfix: "",
            onClick: null,
            onLoad: null
        };
        
        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 getAttrs = function(option) {
        	try {
        		var data = {};
            	var attrs = $(option).get(0).attributes;
    			for(var key in attrs) {
    				if(!isNaN(key)) {
    					data[attrs[key].name] = attrs[key].value;
    				}
    			}
            	return data;
        	} catch(e) {
        		return {};
        	}
        }
        
        
        var selectedOption = settings.selects.children("option:selected").last(); 
        var name = selectedOption.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();
            
            return false;
        });
        
        settings.handle.click(function(event) {
            settings.fader.css("visibility", "hidden");
            settings.overlay.hide();
            
            return false;
        });
        
        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 option = settings.selects.eq(index).children(":selected"); 
            var name = option.html();
            if(name && name.length > 0)
                name = settings.textPrefix + name + settings.textPostfix;
            else
                name = settings.defaultText;

            settings.target.html(name);
            settings.handle.html(name);
            
            if($.isFunction(settings.onClick)) {
            	settings.onClick(getAttrs(option));
            }

            return false;
        });
        
        if($.isFunction(settings.onLoad)) {
        	settings.onLoad(getAttrs(selectedOption));
        }
    };
})(jQuery);
