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 += '<option value="0"></option>';
}
jQuery.each(
list,
function(i, obj) {
eval('var key = obj.' + selectId + ';');
eval('var value = obj.' + selectDesc + ';');
options += '<option value="' + key + '">' + value + '</option>';
}
);
select.html(options);
select.find('option[value=' + selectVal + ']').attr('selected', 'selected');
if (jQuery.browser.msie && jQuery.browser.version.number() <= 7) {
select.css('width', 'auto');
}
}
});
