0x1949 Team - FAZEMRX - MANAGER
Edit File: permissions.js
/** * Hide and show all checkboxes * status = true (show boxes), false (hide boxes) */ function display_checkboxes(status) { var form = document.getElementById('set-permissions'); var cb = document.getElementsByTagName('input'); var display; //show if (status) { display = 'inline'; } //hide else { display = 'none'; } for (var i = 0; i < cb.length; i++ ) { if (cb[i].className === 'permissions-checkbox') { cb[i].style.display = display; } } } /** * Change opacity of element * e = element * value = 0 (hidden) till 10 (fully visible) */ function set_opacity(e, value) { e.style.opacity = value/10; //IE opacity currently turned off, because of its astronomical stupidity //e.style.filter = 'alpha(opacity=' + value*10 + ')'; } /** * Reset the opacity and checkboxes * block_id = id of the element that needs to be toggled */ function toggle_opacity(block_id) { var cb = document.getElementById('checkbox' + block_id); var fs = document.getElementById('perm' + block_id); if (cb.checked) { set_opacity(fs, 5); } else { set_opacity(fs, 10); } } /** * Reset the opacity and checkboxes * value = 0 (checked) and 1 (unchecked) * except_id = id of the element not to hide */ function reset_opacity(status, except_id) { var perm = document.getElementById('set-permissions'); var fs = perm.getElementsByTagName('fieldset'); var opacity = 5; if (status) { opacity = 10; } for (var i = 0; i < fs.length; i++ ) { if (fs[i].className !== 'quick') { set_opacity(fs[i], opacity); } } if (typeof(except_id) !== 'undefined') { set_opacity(document.getElementById('perm' + except_id), 10); } //reset checkboxes too marklist('set-permissions', 'inherit', !status); } /** * Check whether we have a full radiobutton row of true * index = offset for the row of inputs (0 == first row, 1 == second, 2 == third), * rb = array of radiobuttons */ function get_radio_status(index, rb) { for (var i = index; i < rb.length; i = i + 3 ) { if (rb[i].checked !== true) { if (i > index) { //at least one is true, but not all (custom) return 2; } //first one is not true return 0; } } // all radiobuttons true return 1; } /** * Set tab colours * id = panel the tab needs to be set for, * init = initialising on open, * quick = If no calculation needed, this contains the colour */ function set_colours(id, init, quick) { var table = document.getElementById('table' + id); var tab = document.getElementById('tab' + id); if (typeof(quick) !== 'undefined') { tab.className = 'permissions-preset-' + quick + ' activetab'; return; } var rb = table.getElementsByTagName('input'); var colour = 'custom'; var status = get_radio_status(0, rb); if (status === 1) { colour = 'yes'; } else if (status === 0) { // We move on to No status = get_radio_status(1, rb); if (status === 1) { colour = 'no'; } else if (status === 0) { // We move on to Never status = get_radio_status(2, rb); if (status === 1) { colour = 'never'; } } } if (init) { tab.className = 'permissions-preset-' + colour; } else { tab.className = 'permissions-preset-' + colour + ' activetab'; } } /** * Initialise advanced tab colours on first load * block_id = block that is opened */ function init_colours(block_id) { var block = document.getElementById('advanced' + block_id); var panels = block.getElementsByTagName('div'); var tab = document.getElementById('tab' + id); for (var i = 0; i < panels.length; i++) { if (panels[i].className === 'permissions-panel') { set_colours(panels[i].id.replace(/options/, ''), true); } } tab.className = tab.className + ' activetab'; } /** * Show/hide option panels * value = suffix for ID to show * adv = we are opening advanced permissions * view = called from view permissions */ function swap_options(pmask, fmask, cat, adv, view) { id = pmask + fmask + cat; active_option = active_pmask + active_fmask + active_cat; var old_tab = document.getElementById('tab' + active_option); var new_tab = document.getElementById('tab' + id); var adv_block = document.getElementById('advanced' + pmask + fmask); if (adv_block.style.display === 'block' && adv === true) { phpbb.toggleDisplay('advanced' + pmask + fmask, -1); reset_opacity(1); display_checkboxes(false); return; } // no need to set anything if we are clicking on the same tab again if (new_tab === old_tab && !adv) { return; } // init colours if (adv && (pmask + fmask) !== (active_pmask + active_fmask)) { init_colours(pmask + fmask); display_checkboxes(true); reset_opacity(1); } else if (adv) { //Checkbox might have been clicked, but we need full visibility display_checkboxes(true); reset_opacity(1); } // set active tab old_tab.className = old_tab.className.replace(/\ activetab/g, ''); new_tab.className = new_tab.className + ' activetab'; if (id === active_option && adv !== true) { return; } phpbb.toggleDisplay('options' + active_option, -1); //hiding and showing the checkbox if (document.getElementById('checkbox' + active_pmask + active_fmask)) { phpbb.toggleDisplay('checkbox' + pmask + fmask, -1); if ((pmask + fmask) !== (active_pmask + active_fmask)) { document.getElementById('checkbox' + active_pmask + active_fmask).style.display = 'inline'; } } if (!view) { phpbb.toggleDisplay('advanced' + active_pmask + active_fmask, -1); } if (!view) { phpbb.toggleDisplay('advanced' + pmask + fmask, 1); } phpbb.toggleDisplay('options' + id, 1); active_pmask = pmask; active_fmask = fmask; active_cat = cat; } /** * Mark all radio buttons in one panel * id = table ID container, s = status ['y'/'u'/'n'] */ function mark_options(id, s) { var t = document.getElementById(id); if (!t) { return; } var rb = t.getElementsByTagName('input'); for (var r = 0; r < rb.length; r++) { if (rb[r].id.substr(rb[r].id.length-1) === s) { rb[r].checked = true; } } } function mark_one_option(id, field_name, s) { var t = document.getElementById(id); if (!t) { return; } var rb = t.getElementsByTagName('input'); for (var r = 0; r < rb.length; r++) { if (rb[r].id.substr(rb[r].id.length-field_name.length-3, field_name.length) === field_name && rb[r].id.substr(rb[r].id.length-1) === s) { rb[r].checked = true; } } } /** * (Re)set the permission role dropdown. * * Try and match the set permissions to an existing role. * Otherwise reset the dropdown to "Select a role.." * * @param {string} id The fieldset identifier * @returns {void} */ function reset_role(id) { var t = document.getElementById(id); if (!t) { return; } // Before resetting the role dropdown, try and match any permission role var parent = t.parentNode, roleId = match_role_settings(id.replace('role', 'perm')), text = no_role_assigned, index = 0; // If a role permissions was matched, grab that option's value and index if (roleId) { for (var i = 0; i < t.options.length; i++) { if (parseInt(t.options[i].value, 10) === roleId) { text = t.options[i].text; index = i; break; } } } // Update the select's value and selected index t.value = roleId; t.options[index].selected = true; // Update the dropdown trigger to show the new value parent.querySelector('span.dropdown-trigger').innerText = text; parent.querySelector('input[data-name^=role]').value = roleId; } /** * Load role and set options accordingly */ function set_role_settings(role_id, target_id) { var settings = role_options[role_id]; if (!settings) { return; } // Mark all options to no (unset) first... mark_options(target_id, 'u'); for (var r in settings) { mark_one_option(target_id, r, (settings[r] === 1) ? 'y' : 'n'); } } /** * Match the set permissions against the available roles. * * @param {string} id The parent fieldset identifier * @return {number} The permission role identifier */ function match_role_settings(id) { var fieldset = document.getElementById(id), radios = fieldset.getElementsByTagName('input'), set = {}; // Iterate over all the radio buttons for (var i = 0; i < radios.length; i++) { var matches = radios[i].id.match(/setting\[\d+]\[\d+]\[([a-z_]+)]/); // Make sure the name attribute matches, the radio is checked and it is not the "No" (-1) value. if (matches !== null && radios[i].checked && radios[i].value !== '-1') { set[matches[1]] = parseInt(radios[i].value, 10); } } // Sort and stringify the 'set permissions' object set = sort_and_stringify(set); // Iterate over the available role options and return the first match for (var r in role_options) { if (sort_and_stringify(role_options[r]) === set) { return parseInt(r, 10); } } return 0; } /** * Sort and stringify an Object so it can be easily compared against another object. * * @param {object} obj The object to sort (by key) and stringify * @return {string} The sorted object as a string */ function sort_and_stringify(obj) { return JSON.stringify(Object.keys(obj).sort().reduce(function (result, key) { result[key] = obj[key]; return result; }, {})); }