/** * Handle display of dependent, i. e. optional fieldsets * * Fieldsets may be defined as dependent on the value of a certain input. In * this case they contain a p element with the CSS class “bureaucracy_depends”. * This p element holds a span with the class “bureaucracy_depends_fname” * and optionally another span with “bureaucracy_depends_fvalue”. They * specify the target input (fname) and the target value for which the fieldset * is to be shown. * * This function adds onchange handlers to the relevant inputs for showing and * heading the respective fieldsets. * * @author Adrian Lang **/ jQuery(function () { jQuery('form.bureaucracy__plugin').each(function () { //show/hide fieldset and trigger depending children function updateFieldset(input) { jQuery.each(jQuery(input).data('dparray'), function (i, dp) { var showOrHide = input.parentNode.parentNode.style.display !== 'none' && // input/checkbox is displayed AND ((input.checked === dp.tval) || // ( checkbox is checked (input.type !== 'checkbox' && (dp.tval === true && input.value !== '')) || // OR no checkbox, but input is set input.value === dp.tval); // OR input === dp.tval ) dp.fset.toggle(showOrHide); dp.fset.find('input,select') .each(function () { //toggle required attribute var $inputelem = jQuery(this); if($inputelem.hasClass('required')) { if(showOrHide) { $inputelem.attr('required', 'required'); } else { $inputelem.removeAttr('required') } } //update dependencies if ($inputelem.data('dparray')) { $inputelem.change(); } }); }); } //look for p (with info about controller) in depending fieldsets jQuery('p.bureaucracy_depends', this) .each(function () { //get controller info var fname = jQuery(this).find('span.bureaucracy_depends_fname').html(), fvalue = jQuery(this).find('span.bureaucracy_depends_fvalue'); fvalue = (fvalue.length ? fvalue.html() : true); //get controller field and add info and change event to the input that controls depending fieldset var fieldsetinfo = { fset: jQuery(this).parent(), tval: fvalue }; jQuery("label") .has(":first-child:contains('" + fname + "')").first() .find("select,input:last") //yesno field contains first a hidden input .each(function () { if (!jQuery(this).data('dparray')) { jQuery(this).data('dparray', [fieldsetinfo]); } else { jQuery(this).data('dparray').push(fieldsetinfo); } }) .bind('change keyup', function () { updateFieldset(this); }) .change(); }) .hide(); //hide p.bureaucracy_depends in fieldset }); });