﻿function initBound(name, maxlevel, url, changecb, fincb, other) {
    
    var selects = [];
    var selectvalues = {};

    var onchangecallback = function() {
        eval(changecb);
    };
    var onfinishcallback = function() {
        eval(fincb);
    };
    
    for (i = 0; i <= maxlevel; i++) {
        selects[i] = name + '_' + i;
        if($(selects[i])) {
            $(selects[i]).stopObserving('change');
            $(selects[i]).observe('change', onChangeSelect);
        }
    }
    
    for (i=0; i <= maxlevel; i++) {
        if($(selects[i])) {
            if ($(name+'_'+i).value > 0)
                selectvalues[i] = $(name + '_' + i).value;
            else
                break;
        }
    }
        
    function onChangeSelect() {
        var level = Number(this.id.replace(name + '_', ''));
        var leveld = (name + '_' + (level + 1));
        
        selectvalues[level] = this.value;
        
        var arr = {};
        for (i = 0; i <= level; i++) {
            arr[i] = selectvalues[i];
        }
        selectvalues = arr;
        
        if ($(name + '_' + level).value == 0 || $(name + '_' + level).value == 'other') {
            for (i = (level + 1); i <= maxlevel; i++) {
                $($(name + '_' + i).parentNode).setStyle({'display' : 'none'});
                $(name + '_' + i).value = 0;
            }
    
            onchangecallback();
            
        } else if ($(leveld)) {
            var jSonRequest = new Ajax.Request(url + '?l=' + level + '&id=' + selectvalues[level], {
                method: 'get',
                onSuccess: function(response) {
                    var optstr = '';
                    if (response.responseJSON != null){
                        
                        var i = 0;
                        $(leveld).innerHTML = '';
                        
                        if (Prototype.Browser.WebKit) {
                            var keys = [];
                            var arr = [];
                            
                            for ( key in  response.responseJSON ) {
                                val = response.responseJSON[key];
                                if (key != 0) {
                                    keys[i] = key;
                                    arr[i] = val;
                                }
                                i++;
                            }
                            arr = arr.sort(function(a, b){
                                return a.toLowerCase() > b.toLowerCase() ? 1 : -1 ;
                            });
                            
                            $(leveld).options[0] = new Option(response.responseJSON[0], 0);
                            for (i=0; i< (keys.length); i++) {
                                $(leveld).options[i+1] = new Option(arr[i], keys[i]);
                            }
                        } else {
                            for ( key in response.responseJSON ) {
                                $(leveld).options[i] = new Option(response.responseJSON[key], key);
                                i++; 
                            }
                        }
                        if (other==1) {
                            $(leveld).options[i] = new Option('-- другое', 'other');
                        }
                    }
                    
                    if (response.responseJSON != null && level != maxlevel) {
                        $($(name + '_' + Number(level + 1)).parentNode).setStyle({'display' : ''});;
                        for (i = (level + 2); i <= maxlevel; i++) {
                            $($(name + '_' + i).parentNode).setStyle({'display' : 'none'});;
                            $(name + '_' + i).value=0;
                        }
                        
                        onchangecallback();
                    } else {
                        $($(name + '_' + Number(level + 1)).parentNode).setStyle({'display' : 'none'});
                        $(name + '_'+Number(level + 1)).value=0;
                        
                        onfinishcallback();
                    }
                }
            });
        }
    }
}