pascal baro
2/14/2016 10:49:00 PM
new (function() {
var jqsdElements = { };
this.changeActiveState = function(obj, mode, enabled) {
switch (mode) {
case 'hide':
if (enabled) {
obj.show();
} else {
obj.hide();
}
break;
case 'disable':
default:
if (enabled) {
obj.attr('disabled', false);
} else {
obj.attr('disabled', 'disabled');
}
break;
}
};
this.disableChildren = function(node_id) {
if (node_id in jqsdElements) {
for (var dependent in jqsdElements[node_id]) {
var el = $('#' + dependent);
var mode = el.attr('jqsd:hide_mode');
el.find(':nth-child(1)').prop('selected',true);
this.changeActiveState(el, mode, false);
this.disableChildren(dependent);
}
}
};
this.onChange = function(id, val) {
for (var dependent in jqsdElements[id]) {
var dObj = $('#' + dependent);
var keys = ['_ALL_'];
if (val in jqsdElements[id][dependent]['options']) {
keys[keys.length] = val;
}
dObj.find('option').remove();
var totalOps = 0;
var opsToAdd = { };
for (var i=0;i<keys.length;i++) {
var key = keys[i];
for (var optOrder in jqsdElements[id][dependent]['options'][key]) {
var opt = jqsdElements[id][dependent]['options'][key][optOrder];
opsToAdd[optOrder] = opt;
totalOps++;
}
}
if (Object.keys) {
var reOrder = opsToAdd, keys = Object.keys(opsToAdd), i, len = keys.length;
keys.sort();
for (i = 0; i < len; i++) {
k = keys[i];
dObj.append(opsToAdd[k]);
}
} else {
for (var orderKey in opsToAdd) {
dObj.append(opsToAdd[orderKey]);
}
}
dObj.find(':nth-child(1)').prop('selected',true);
this.disableChildren(dependent);
if (totalOps > 0) {
if (totalOps == 1) {
if (dObj.find(':nth-child(1)').val() != '') {
this.changeActiveState(dObj, jqsdElements[id][dependent].hidemode, true);
}
} else {
this.changeActiveState(dObj, jqsdElements[id][dependent].hidemode, true);
}
}
}
};
this.init = function() {
var p = this;
$('select[jqsd\\:depends_on]').each(function() {
var selId = $(this).attr('id');
if (!selId) {
alert('JQSD Error - One or more selects are missing id values');
return;
}
var hideMode = ($(this).attr('jqsd:hide_mode')) ? $(this).attr('jqsd:hide_mode') : 'disable';
var depends_on = $(this).attr('jqsd:depends_on');
p.changeActiveState($(this), hideMode, false);
if ($('#' + depends_on).length == 0) {
alert('JQSD Error - One or more selects are missing id values');
return;
}
var options = {
'_ALL_': { }
};
var optOrder = 0;
$(this).find('option').each(function() {
var rel = $(this).attr('rel');
if (!rel) {
options['_ALL_'][optOrder] = $(this);
} else {
var opts = rel.split(',');
for (var i=0;i<opts.length;i++) {
if (!options[opts[i]]) {
options[opts[i]] = [ ];
}
options[opts[i]][optOrder] = $(this);
}
}
optOrder++;
});
if (!jqsdElements[depends_on]) {
jqsdElements[depends_on] = { };
}
jqsdElements[depends_on][selId] = {
options: options,
hidemode: hideMode
};
p.onChange(depends_on, $('#' + depends_on).val());
});
$('select').on('change', $.proxy(function(evt) {
var id = $(evt.target).attr('id');
if (!(id in jqsdElements)) {
return;
}
var val = $(evt.target).val();
this.onChange(id, val);
}, this));
}
this.preInit = function() {
$(document).ready($.proxy(this.init, this));
}
})().preInit();