var ref_url_start;

$(document).ready(function()
{
    ref_url_start = "/utils/ajax_table_list?table_name_id=";
    
    //Фраза на языке для вывода пустой опции в селекте
    not_selected = $("#not_selected").html();
    loading = $("#loading").html();

    //Список id_cur->id_next select'ов для установки события для заполнения id_cur при выборе элемента из id_next
    var fillOnChange = {
        country_id : "region_id", 
        region_id : "city_id"
    }

    var fillOnChangeBack = {
        city_id : "region_id", 
        region_id : "country_id"
    }


    //На все существующие селекты ставлю значение не заполненное

    $("select").each(function(){
        if (!$(this).hasClass('no_null')) {
            //$(this).addOption("", not_selected);
            //$(this).find("option[value='']").insertBefore($(this).find("option:first"));
            if ($(this).find("option:first").length != 0)
                $('<option value="">' + not_selected + '</option>').insertBefore($(this).find("option:first"));
            else
                $(this).addOption("", not_selected);
        }
    });
    
    //Заполняею селекты, которые сразу должны быть заполнены
    $(".ajax_fill").each(function(){ajaxFill(this)});

    //При изменении страны или области для подгрузки областей и городов соответственно
    for (var obj in fillOnChange)
    {
        $("#" + obj).change(function ()
            {
                this_id = this.id;
                this_value = this.value;

                next_id = fillOnChange[this_id];
                url = ref_url_start + fillOnChange[this_id] + "&id_where=" + this_id + "&value="+this_value;

                fillSelect(next_id, url, this_id, this_value, false);

                if (is_defined(fillOnChange[fillOnChange[this_id]])) {
                    $("#" + fillOnChange[fillOnChange[this_id]]).selectOptions('');
                }
            }
        );
    }
    //Заполняем для спрятанных полей - когда нужно заполнить знчеимаяи нселект и дать ему сразу какое-то значение
    $("select[def_val]").each(function()
    {
        if (!is_defined(fillOnChangeBack[$(this).attr('id')])) {
            if (!$(this).hasClass('no_reference')) {
                ajaxFill(this);
            } else {
                $(this).selectOptions($(this).attr('default_val'));
            }
        }
        
        value = $(this).attr('default_val');
        url = ref_url_start + fillOnChange[$(this).attr('id')] + "&id_where=" + $(this).attr('id') + "&value="+value;
        next_id = fillOnChange[$(this).attr('id')];
        fillSelect(next_id, url, $(this).attr('id'), value, true);
    });

    $('.set_not_selected').html(not_selected);
});

var not_selected, loading;
function fillSelect(next_id, url, cur_id, cur_value, select)
{   
    if (is_defined(next_id)) {
        next_id = "#"+next_id;
    
        var params ={}, func;
        if (cur_value)
            params[cur_id] = cur_value;
        $(next_id).removeOption(/./);
        $(next_id).addOption("", loading);
        $(next_id).css("background-color", "#C0C0C0");
        if (select)
            func = function(el)
            {      
                cur_elem = el.el;

                $(cur_elem).css("background-color", "");
                if (!$(cur_elem).hasClass('no_null')) {
                    $(cur_elem + " option[value='']").attr('text', not_selected);
                    $(cur_elem).selectOptions("");
                } else
                    $(cur_elem).removeOption('');

                if (cur_elem == "#city_id" || cur_elem == '#region_id' || cur_elem == '#country_id') {
                    $(cur_elem).html($(cur_elem + " option").sort(function (a, b) {
                        return a.text == b.text ? 0 : a.text < b.text ? -1 : 1;
                    }));
                }

                if ($(cur_elem).attr('default_val') != null)
                {
                    value = $(cur_elem).attr('default_val');
                    $(cur_elem).selectOptions(value);
                } else {
                    $(cur_elem).selectOptions("");
                }
            };
        else
            func = function(el)
            {
                cur_elem = el.el;

                $(cur_elem).css("background-color", "");
                if (!$(cur_elem).hasClass('no_null'))
                $(cur_elem + " option[value='']").attr('text', not_selected);

                if (cur_elem == "#city_id" || cur_elem == '#region_id' || cur_elem == '#country_id') {
                    $(cur_elem).html($(cur_elem+" option").sort(function (a, b) {
                        return a.text == b.text ? 0 : a.text < b.text ? -1 : 1;
                    }));
                }

                $(cur_elem).selectOptions("");
            };
        
        $(next_id).ajaxAddOption(url, params, false, func, [{el : next_id}]);
    }
}

function ajaxFill(obj)
{
        var ref = $(obj).attr('id');

        if ($(obj).is('[reference]')) {
            ref = $(obj).attr('reference');
        }

        url = ref_url_start + ref;

        next_id = $(obj).attr('id');
        fillSelect(next_id, url, null, null, true);
}

function is_defined(obj) {
    return !(typeof obj === 'undefined');
}

