// This plugin auto load/select options in select boxes depending on geographic
// information of them. It's used in the quick search forms

(function ($) {

    $.fn.autolocations = function () {

        return this.each(function () {
                var container = this;
                var empty_option = "<option value=''>----------</option>";

                var province_link = $(".provinceAutolocation a.autolocationDestination");
                var touristzone_link = $(".touristzoneAutolocation a.autolocationDestination");
                var city_link = $(".cityAutolocation a.autolocationDestination");
                var results_class_input = $("span.__search_form_results_class_name", container);
                var ajax_loader_html = "<img class='search-ajax-loader' src='/media/img/ajax-loader-search.gif' />";

                var city_selected = null;

                $(".cityAutolocation select", container).before(ajax_loader_html);
                $(".touristzoneAutolocation select", container).before(ajax_loader_html);

                if (results_class_input.size() == 1) {
                    filter = 'class_name=' + results_class_input.html();
                } else {
                    filter = '';
                }

                var changeProvince = function() {
                    $(".cityAutolocation select", container).prev('.search-ajax-loader').show();
                    $(".touristzoneAutolocation select", container).prev('.search-ajax-loader').show();
                    var province = $(this).val();
                    var url = province_link.attr("href");
                    if (province != "" && province != null) {
                        url += "?provincia_id=" + province + (filter!=""?'&'+filter:'');
                    } else if (filter != "") {
                        url += "?" + filter;
                    }
                    var option_selected_val = $(".cityAutolocation select", container).find("option[selected:selected]").val();
                    $.getJSON(url, function (data) {
                            var cities_options = $.map(data.cities, function (n, i) {
                                    return "<option value='" + n.id + "'>" + n.name + "</option>";
                                });
                            // add an empty option at the begining
                            cities_options.splice(0, 0, empty_option);
                            $(".cityAutolocation select", container).html(cities_options.join("\n"));
                            $(".cityAutolocation select", container).prev('.search-ajax-loader').hide();
                            if (city_selected) {
                                $(".cityAutolocation select", container).val(city_selected);
                            }

                            if(option_selected_val) {
                                $(".cityAutolocation select", container).change();
                            }
                            var tourist_zones_options = $.map(data.tourist_zones, function (n, i) {
                                    return "<option value='" + n.id + "'>" + n.name + "</option>";
                                });
                            // add an empty option at the begining
                            tourist_zones_options.splice(0, 0, empty_option);
                            $(".touristzoneAutolocation select", container).html(tourist_zones_options.join("\n"));
                            $(".touristzoneAutolocation select", container).prev('.search-ajax-loader').hide();
                        });
                }

                $(".provinceAutolocation select", container).change(changeProvince);
                
                $(document).ready(function() {
                    province = $(".provinceAutolocation select");
                    if (province.get(0) != undefined) {
                        changeProvince.call($(".provinceAutolocation select", container));
                    }
                });

                $(".touristzoneAutolocation select", container).change(function () {
                        $(".cityAutolocation select", container).prev('.search-ajax-loader').show();
                        var tourist_zone = $(this).val();
                        var url = touristzone_link.attr("href");
                        if (tourist_zone != "" && tourist_zone != null) {
                            url += "?zona_turistica_id=" + tourist_zone + (filter!=""?'&'+filter:'');
                        } else if (filter != "") {
                            url += "?" + filter;
                        }
                        $.getJSON(url, function (data) {
                                var cities_options = $.map(data.cities, function (n, i) {
                                        return "<option value='" + n.id + "'>" + n.name + "</option>";
                                    });
                                // add an empty option at the begining
                                cities_options.splice(0, 0, empty_option);
                                $(".cityAutolocation select", container).html(cities_options.join("\n"));
                                $(".cityAutolocation select", container).prev('.search-ajax-loader').hide();
                                if (data.province != null) {
                                    $(".provinceAutolocation select option[value=" + data.province.id + "]", container).attr("selected", "selected");
                                } else {
                                    $(".provinceAutolocation select option").removeAttr("selected");
                                }
                            });
                    });

                $(".cityAutolocation select", container).change(function () {
                        $(".touristzoneAutolocation select", container).prev('.search-ajax-loader').show();
                        var selected_touristzone = $(".touristzoneAutolocation select", container).val();
                        var city = $(this).val();
                        var url = city_link.attr("href");
                        if (city != "" && city != null) {
                            url += "?municipio_id=" + city;
                            $.getJSON(url, function (data) {
                                var tourist_zones_options = $.map(data.tourist_zones, function (n, i) {
                                        return "<option value='" + n.id + "'>" + n.name + "</option>";
                                    });
                                // add an empty option at the begining
                                tourist_zones_options.splice(0, 0, empty_option);
                                $(".touristzoneAutolocation select", container).html(tourist_zones_options.join("\n"));
                                $(".touristzoneAutolocation select", container).val(selected_touristzone);
                                $(".touristzoneAutolocation select", container).prev('.search-ajax-loader').hide();

                                if (data.province != null) {
                                    $(".provinceAutolocation select option[value=" + data.province.id + "]", container).attr("selected", "selected");
                                } else {
                                    $(".provinceAutolocation select option").removeAttr("selected");
                                }
                            });
                        }
                    });

                // City radio buttons for enabling and disabling controls
                $("input[name=__cityselect]", container).change(function () {
                        var disable = "";
                        var enable = "";
                        if ($(this).val() == "only-city") {
                            disable = "#location__cities__touristzone__exact, #location__cities__province__exact, #location__cities__exact";
                            enable = "#location__cities__name__icontains";
                        } else {
                            disable = "#location__cities__name__icontains";
                            enable = "#location__cities__touristzone__exact, #location__cities__province__exact, #location__cities__exact";
                        }
                        $(disable).attr("disabled", "disabled");
                        $(enable).removeAttr("disabled");
                    });
                $("input[name=__cityselect]:last").attr("checked", "checked");
                $("input[name=__cityselect]").change();

                if ($(".provinceAutolocation select", container).val()) {
                    city_selected = $(".cityAutolocation select", container).val();
                    $(".provinceAutolocation select", container).change();
                }

            }); // End of each

    }; // End of autolocations

})(jQuery);
