﻿
(function($) {

    $.selectCascadeCreate = function(parent, target, url, options) {
        var defaults = { selectContainer: null, container: null, promptValue: '', delay: true, selectName: 'locations', dummyContainer: '' }
        var settings = jQuery.extend({}, defaults, options);

        if ((parent) && !(parent instanceof $)) parent = $(parent);
        var parentSelect = parent;

        while (!parentSelect.is('select') && parentSelect.length > 0) {
            parentSelect = parent.find('select');
        }
        if ((settings.container) && !(settings.container instanceof $)) settings.container = $(settings.container);

        this.reset = function() {
            if (target) {
                target.reset();
                target = null;
            }
            parent.remove();
        };
        var xmlRequest;

        this.load = function() {
            
            var newurl = url + "/" + parentSelect.val();
            if (!xmlRequest || xmlRequest.readyState == 4 || xmlRequest.readyState == 0) {
                xmlRequest = $.getJSON(
                    newurl,
                    function(result) {
                        if (result.list.length > 0) {
                            if (settings.dummyContainer) {
                                var s = settings.dummyContainer + result.cascadeDepth;
                                $(s).html('');
                                settings.container = $(s);
                            }
                            var targetSelect = $('<select name=' + settings.selectName + result.targetName + ' id=' + settings.selectName + result.targetName + ' ></select>').insertAfter(parent);
                            $.each(result.list, function(i, item) {
                                var o = document.createElement("OPTION");
                                o.text = item.text;
                                o.value = item.value;
                                targetSelect.get(0).options[targetSelect.get(0).options.length] = o;
                            });
                            targetSelect.removeAttr("disabled");

                            if (settings.selectContainer) {
                                targetSelect.wrap(settings.selectContainer);
                                targetSelect = targetSelect.parent();
                            } else {
                                targetSelect.insertAfter(parent);
                            }

                            if (settings.container) {
                                settings.container.append(targetSelect);
                            } else {
                                targetSelect.insertAfter(parent);
                            }

                            if (result.cascade) {
                                settings.delay = false;
                                target = new $.selectCascadeCreate(targetSelect, null, newurl, settings);
                            };
                            parent.trigger("cascade.loaded", [null]);
                        } else {


                            parent.trigger("cascade.loaded", [null]);
                        };
                    }
                );
            }
        };

        if ((settings.delay == false) && (parentSelect.val() != settings.promptValue)) {
            if (!(target)) { this.load(); }
        };


        parentSelect.bind('change', { cascade: this }, function(event) {
            if ($(this).val() != settings.promptValue) {
                if (target) target.reset();
                event.data.cascade.load();
            } else {
                if (target) target.reset();
            };
        });
    };

})(jQuery);  