Liferay.DynamicSelect = new Class({ /* array: an array of params params.select: a select box params.selectId: JSON object field name for an option value params.selectDesc: JSON object field name for an option description params.selectVal: selected value of the select box params.selectData: function that returns a JSON array to populate the next select box */ initialize: function(array) { var instance = this; instance.array = array; jQuery.each( array, function(i, params) { var select = jQuery('#' + params.select); var selectData = params.selectData; var prevSelectVal = null; if (i > 0) { prevSelectVal = array[i - 1].selectVal; } selectData( function(list) { instance._updateSelect(instance, i, list); }, prevSelectVal ); select.attr('name', select.attr('id')); select.bind( 'change', function() { instance._callSelectData(instance, i); } ); } ); }, _callSelectData: function(instance, i) { var array = instance.array; if ((i + 1) < array.length) { var curSelect = jQuery('#' + array[i].select); var nextSelectData = array[i + 1].selectData; nextSelectData( function(list) { instance._updateSelect(instance, i + 1, list); }, curSelect.val() ); } }, _updateSelect: function(instance, i, list) { var params = instance.array[i]; var select = jQuery('#' + params.select); var selectId = params.selectId; var selectDesc = params.selectDesc; var selectVal = params.selectVal; var selectNullable = params.selectNullable || true; var options = ''; if (selectNullable) { options += ''; } jQuery.each( list, function(i, obj) { eval('var key = obj.' + selectId + ';'); eval('var value = obj.' + selectDesc + ';'); options += ''; } ); select.html(options); select.find('option[@value=' + selectVal + ']').attr('selected', 'selected'); if (jQuery.browser.msie && jQuery.browser.version.number() <= 7) { select.css('width', 'auto'); } } });