var RegionBox = Class.create();
RegionBox.prototype = {
    initialize : function(el, url, selected, onComplete) {
        var element = $(el);
        var label = $$("label[for=" + element.id + "]")[0];

        new Ajax.Request(url, {
            method: "get",
            onComplete: onComplete,
            onSuccess: function(transport) {
                // Ziskaj regiony z responseTextu formatovaneho ako JSON.
                try {
                    var regions = transport.responseText.evalJSON();
                } catch (SyntaxError) {
                    var regions = {}
                }

                // Vytvor listbox.
                var select = new Element("select");

                // Nacitaj do neho tie regiony.
                for (id in regions) {
                    var option = new Element("option", {value: id});
                    option.innerHTML = regions[id];

                    select.appendChild(option);
                }

                // Ak bol aspon jeden region, pridaj listbox do stranky a
                // nastav mu event handler ktory vytvori listbox z podregionmi.
                if (select.childNodes.length > 0) {
                    select.insertBefore(
                        new Element("option"), select.firstChild
                    );

                    if (selected && selected[0]) {
                        for (var i = 0; i < select.options.length; i++) {
                            if (select.options[i].value == selected[0]) {
                                select.selectedIndex = i;
                                break;
                            }
                        }

                        new RegionBox(
                            element,
                            URL.append(url, "parent=" + selected[0]),
                            selected.slice(1),
                            onComplete
                        );
                    } else {
                        select.selectedIndex = 0;
                    }

                    new Form.Element.EventObserver(
                        select, function(select, value) {
                            // Vymaz vsetky listboxy napravo od tohoto.
                            var node;
                            while (node = select.next("select")) {
                                Element.remove(node);
                            }

                            if (value) {
                                new RegionBox(
                                    element,
                                    URL.append(url, "parent=" + value), [], onComplete
                                );

                                // Ak je vybrata nejaka hodnota, tak ju nastav.
                                element.value = value;
                            } else {
                                // Ak nieje, nastav hodnotu predosleho listboxu.
                                var previousSelect = select.previous("select");

                                if (previousSelect) {
                                    element.value = previousSelect.options[
                                        previousSelect.selectedIndex
                                    ].value;
                                } else {
                                    // Ak nieje predosly listbox, nastav null:
                                    element.value = null;
                                }
                            }
                        }
                    );

                    element.parentNode.insertBefore(select, element);
                    label.show();

                } else if (!element.previous("select")) {
                    // Ak nie je ziaden region, tak skri label.
                    label.hide();
                }
            }
        });

        element.hide();
    }
}
