function geo_selector() {

    this.init = function(element) {

        var element_box_id = element.name + "_box";

        $(element).wrap("<div>").parent().attr("id", element_box_id);

        $("<div class='geo_subjects_results'></div>").css("display", "none").appendTo($(element.parentNode));

        var hidden_id = element.name + "_id";


        if (!$("#" + hidden_id)[0]) {
            $("<input type='hidden' id='" + hidden_id + "' name='" + hidden_id + "' value='' />");
        }

        $(element).keyup(function() {

            var search_function = function() {

                var params = {
                    value: element.value
                };

                $.post("/module/geo/index/geo-selector-search", params, function(results) {

                    var box = $(".geo_subjects_results", element.parentNode);

                    box.empty();
                    box.css("display", "none");

                    for (var i in results) {
                        $("<a href='javascript:;' city_id='" + results[i]["id"] + "' title='" + results[i]["city_title"] + "'>" + results[i]["title"] + "</a>").appendTo(box);
                    }

                    $("a", box).click(function() {
                        var city_id = $(this).attr("city_id");

                        element.value = $(this).attr("title");
                        element.title = $(this).html();

                        $("#" + hidden_id).val(city_id);
                    });

                    if (i) {
                        box.css("display", "block");
                    }

                }, "json");

            };

            if (element.search_timer)
                clearTimeout(element.search_timer);

            element.search_timer = setTimeout(search_function, 300);
        });

    
            $(element).blur(function() {
                var hide_box = function() {
                    $(".geo_subjects_results", element.parentNode).css("display", "none");
                };
                
                setTimeout(hide_box, 300);
            });
    };

    return this;
}

$(function() {
    $(".geo_selector").each(function() {
        geo_selector().init(this);
    });
});
