function DoubleCombo( masterId, slaveId, url, options ) {
   this.master     = document.getElementById(masterId);
   this.slave      = document.getElementById(slaveId);
   this.options = options;
   this.url = url;

   this.initializeBehavior();
}

DoubleCombo.prototype = {

    initializeBehavior: function () {
        var thisObj = this;
        jQuery(this.master).change(function (e) { thisObj.masterComboChanged(); });
    },

    masterComboChanged: function () {
        var val = jQuery(this.master).val();
        var query = (!this.options.requestParameters ? '' : this.options.requestParameters.join('&') + '&') +
                    'query=' + (jQuery.isArray(val) ? val.join(',') : val);

        var thisObj = this;
        jQuery.post(this.url, query, function(data, textStatus) { thisObj.ajaxUpdate(data, textStatus) }, "xml");
    },

    ajaxUpdate: function (data, textStatus) {
        var slaveOptions = this.createOptions(data.documentElement);

        var selectedOptions = [];

        // preserve selected options if possible
        for (var i = 0; i < this.slave.options.length; i++) {
            if (this.slave.options[i].selected) {
                selectedOptions.push(this.slave.options[i].value);
            }
        }

        this.slave.length = 0;
        var optionsObj = this.slave.options;
        for (var i = 0; i < slaveOptions.length; i++) {
            for (var j = 0; j < selectedOptions.length; j++) {
                if (slaveOptions[i].value == selectedOptions[j]) {
                    slaveOptions[i].selected = true;
                }
            }
            optionsObj.add(slaveOptions[i]);
        }

        // call DoubleCombo_onChange "event" in calling page
        if (typeof (window.DoubleCombo_onChange) == 'function')
            window.DoubleCombo_onChange(this);

        if (typeof (this.onchange) == 'function') {
            this.onchange(this);
        }
    },

    createOptions: function (ajaxResponse) {
        var newOptions = [];
        var entries = ajaxResponse.getElementsByTagName('option');
        for (var i = 0; i < entries.length; i++) {
            var text = this.getElementContent(entries[i]);
            var value = entries[i].getAttribute('value');
            newOptions.push(new Option(text, value));
        }
        return newOptions;
    },

    handleError: function (request) {
        if (this.options.errorHandler)
            this.options.errorHandler(request);
    },

    getElementContent: function (element) {
        return element.text != undefined ? element.text : element.textContent;
    }

};



