var cBDynYmm = function() {
    var selTier  = new Array();
    var oReverse = {};

    var xhr;

    var api = {
    }

    var init = function() {
        xhr = new xmlhttpHandler('/modules/module-grouping.php');

        var aTiers = new Array('category', 'make', 'model');
        for (var i = 0, len = aTiers.length; i < len; i++) {
            var id = aTiers[i];
            var o = document.getElementById([id]);
            if (!o || o.tagName.toLowerCase() != 'select') {
                selTier.push(false);
                continue;
            }


            selTier.push(o);
            oReverse[id] = i;
            addEvent(o, 'change', triggerChange);
        }
    }

    var triggerChange = function(e) {
        var iNext = oReverse[e.target.id] + 1;
        if (!selTier[iNext]) {
            return;
        }

        while (selTier[iNext]) {
            clearSelect(selTier[iNext]);
            iNext++;
        }

        xhr.call(handleChange, {tier: selTier[oReverse[e.target.id] + 1].id, val: e.target.options[e.target.selectedIndex].value});
    }

    var handleChange = function(oResponse) {
        var oOpts = oResponse.options;
        if (oOpts.length == 0) {
            return;
        }

        var oAdd = document.getElementById(oResponse.tier);
        for (var i = 0, len = oOpts.length; i < len; i++) {
            var oNew = document.createElement('option');
            oNew.value = oOpts[i];
            oNew.appendChild(document.createTextNode(oOpts[i]));

            oAdd.appendChild(oNew);
        }
    }

    var clearSelect = function(o) {
        // Starting at 1 to not clear the first (empty) option
        for (var i = 1, len = o.options.length; i < len; i++) {
            o.remove(1);
        }
    }

    addEvent(window, 'load', init);
}();
