/**
  * Process the role comparision.
  * @throws Commmand_Exception.
  */
 private function _process()
 {
     global $CFG, $DB, $OUTPUT;
     // Checking if command has been runned.
     if (!$this->isRunned()) {
         throw new Command_Exception('commandnotrun');
     }
     // Getting table name.
     $table = $this->getParameter('table')->getValue();
     // Getting hosts.
     $hosts = array_keys($this->capabilities);
     $host_labels = get_available_platforms();
     // Getting local roles.
     $roles = $DB->get_records('role', null, '', 'sortorder');
     /*
      * processing results
      */
     // Creating header.
     $this->report = '<h3>' . get_string('allowcompare', 'vmoodleadminset_roles', vmoodle_get_string($table . 'table', 'vmoodleadminset_roles')) . help_button_vml('rolelib', 'allowcompare', 'vmoodleadminset_roles') . '</h3>';
     // Adding edit role link
     $this->report .= '<center><p>' . $OUTPUT->single_button(new moodle_url($CFG->wwwroot . '/admin/roles/allow.php?mode=' . $table, array('roleid' => $role->id, 'action' => 'edit')), vmoodle_get_string('editallowtable', 'vmoodleadminset_roles'), 'get') . '</p></center>';
     // Creation form.
     $this->report .= '<form action="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/controller.rolelib.sadmin.php?what=syncallow" method="post" onsubmit="return validate_syncrole()">';
     $this->report .= '<input id="target" type="hidden" name="target" value=""/>';
     $this->report .= '<input id="role" type="hidden" name="role" value=""/>';
     $this->report .= '<input id="source_platform" type="hidden" name="source_platform" value=""/>';
     // Creating table.
     $this->report .= '<table id="allowcompare" cellspacing="1" cellpadding="5" class="generaltable boxaligncenter" style="min-width: 75%;"><tbody>';
     // Creating header.
     $this->report .= '<tr><th scope="col" class="header c0" style="vertical-align: bottom; text-align: left;">&nbsp</th>';
     $col = 1;
     foreach ($hosts as $host) {
         $this->report .= '<th id="cap_' . $col . '" scope="col" class="header c' . $col . '" style="vertical-align: bottom; text-align: center;"><label for="platform_' . $col . '"><img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/draw_platformname.php?caption=' . urlencode($host_labels[$host]) . '" alt="' . $host_labels[$host] . '"/></label><br/><input id="platform_' . $col . '" type="checkbox" name="platforms[]" value="' . $host . '" disabled="disabled"/></th>';
         $col++;
     }
     $this->report .= '</tr>';
     // Initializing variables.
     $row = 0;
     // Creating table data.
     foreach ($allroles as $rolename => $role) {
         $localrole = $DB->get_field('role', 'name', array('shortname' => $rolename));
         $displayrole = $localrole ? $localrole : '--' . $rolename . '--';
         $this->report .= "<tr valign='top'>{$displayrole}</td>";
         $row++;
     }
     // Closing table.
     $this->report .= '</tboby></table><br/>';
     $this->report .= '<center><input type="submit" value="' . vmoodle_get_string('synchronize', 'vmoodleadminset_roles') . '"/><div id="allowcompare_validation_message"></div></center></form><br/><br/>';
 }
 /**
  * Process the role comparison.
  * @throws Commmand_Exception.
  */
 private function _process()
 {
     global $CFG, $DB, $OUTPUT;
     // Checking if command has been runned.
     if (!$this->isRunned()) {
         throw new Command_Exception('commandnotrun');
     }
     // Defining capabilities values.
     $cap_permissions = array(CAP_ALLOW => array('count' => 0, 'label' => 1, 'name' => 'allow'), CAP_PREVENT => array('count' => 0, 'label' => 2, 'name' => 'prevent'), CAP_PROHIBIT => array('count' => 0, 'label' => 3, 'name' => 'prohibit'));
     // Defining capabilities context.
     $cap_contexts = array(CONTEXT_BLOCK => array('count' => 0, 'label' => 'B', 'name' => 'block'), CONTEXT_COURSE => array('count' => 0, 'label' => 'C', 'name' => 'course'), CONTEXT_COURSECAT => array('count' => 0, 'label' => 'CC', 'name' => 'coursecat'), CONTEXT_MODULE => array('count' => 0, 'label' => 'M', 'name' => 'module'), CONTEXT_SYSTEM => array('count' => 0, 'label' => 'S', 'name' => 'system'), CONTEXT_USER => array('count' => 0, 'label' => 'U', 'name' => 'user'));
     // Getting role name.
     $role = $this->getParameter('role')->getValue();
     $role = $DB->get_record('role', array('shortname' => $role));
     // Getting hosts.
     $hosts = array_keys($this->capabilities);
     $host_labels = get_available_platforms();
     // Getting capabilities.
     $records_capabilities = $DB->get_records('capabilities', null, '', 'name,contextlevel,component');
     // Getting lang.
     $lang = str_replace('_utf8', '', current_language());
     $strcapabilities = s(get_string('capabilities', 'role'));
     // 'Capabilities' MDL-11687
     // Getting all capabilities names.
     $capability_names = array();
     foreach ($this->capabilities as $platform_capabilities) {
         $platform_capabilities = array_keys((array) $platform_capabilities);
         $capability_names = array_merge($capability_names, $platform_capabilities);
     }
     $capability_names = array_unique($capability_names);
     // Getting problematic component name
     $problematic_component_name = get_string('problematiccomponent', 'vmoodleadminset_roles');
     // Creating normalized capabilities.
     $capabilities = array();
     foreach ($capability_names as $capability_name) {
         // Creating capability.
         $capability = new \StdClass();
         $capability->name = $capability_name;
         // Initializing counters.
         $cap_permissions[CAP_ALLOW]['count'] = $cap_permissions[CAP_PREVENT]['count'] = $cap_permissions[CAP_PROHIBIT]['count'] = 0;
         $cap_contexts[CONTEXT_BLOCK]['count'] = $cap_contexts[CONTEXT_COURSE]['count'] = $cap_contexts[CONTEXT_COURSECAT]['count'] = $cap_contexts[CONTEXT_MODULE]['count'] = $cap_contexts[CONTEXT_SYSTEM]['count'] = $cap_contexts[CONTEXT_USER]['count'] = 0;
         // Counting.
         foreach ($this->capabilities as $platform_capabilities) {
             if (!property_exists($platform_capabilities, $capability_name) || is_null($platform_capabilities->{$capability_name})) {
                 continue;
             }
             $platform_capability = $platform_capabilities->{$capability_name};
             $cap_permissions[$platform_capability->permission]['count']++;
             $cap_contexts[$platform_capability->contextlevel]['count']++;
         }
         // Getting major values.
         $nbr_value_max = max(array_map(array($this, '_getCounterValue'), $cap_permissions));
         $nbr_context_max = max(array_map(array($this, '_getCounterValue'), $cap_contexts));
         // Setting major permission.
         foreach ($cap_permissions as $permission => $cap_permission) {
             if ($cap_permission['count'] == $nbr_value_max) {
                 $capability->major_permission = $permission;
                 break;
             }
         }
         // Setting major contexlevel.
         foreach ($cap_contexts as $contextlevel => $cap_context) {
             if ($cap_context['count'] == $nbr_context_max) {
                 $capability->major_contextlevel = $contextlevel;
                 break;
             }
         }
         // Setting component.
         $capability->component = isset($records_capabilities[$capability_name]) ? $records_capabilities[$capability_name]->component : $problematic_component_name;
         // Setting capability contextlevel.
         $capability->contextlevel = isset($records_capabilities[$capability_name]) ? $records_capabilities[$capability_name]->contextlevel : CONTEXT_SYSTEM;
         // Adding capability.
         $capabilities[$capability_name] = $capability;
     }
     // Sort capabilities on contextlevel, component and name.
     uasort($capabilities, array($this, '_orderCapability'));
     /*
      * Creating html report.
      */
     // Creating header.
     $this->report = '<h3>' . get_string('comparerole', 'vmoodleadminset_roles', $role->name) . help_button_vml('rolelib', 'rolecompare', 'rolecompare') . '</h3>';
     // Adding edit role link.
     $this->report .= '<center><p>' . $OUTPUT->single_button(new moodle_url('/admin/roles/define.php', array('roleid' => $role->id, 'action' => 'edit')), get_string('editrole', 'vmoodleadminset_roles'), 'get') . '</p></center>';
     // Adding a capability client side filter.
     $this->report .= get_string('capfilter', 'local_vmoodle') . ': ' . '<input type="text" name="capfilter" value="" onchange="filtercapabilitytable(this)" />';
     // Creation form.
     $rolecapsyncurl = new moodle_url('/local/vmoodle/plugins/roles/controller.rolelib.sadmin.php', array('what' => 'syncrole'));
     $this->report .= '<form action="' . $rolecapsyncurl . '" method="post" onsubmit="return validate_syncrole()">';
     $this->report .= '<input id="capability" type="hidden" name="capability" value="" />';
     $this->report .= '<input id="source_platform" type="hidden" name="source_platform" value="" />';
     // Creating table.
     $this->report .= '<table id="rolecompare" cellspacing="1" cellpadding="5" class="generaltable boxaligncenter" style="min-width: 75%;"><tbody>';
     // Creating header.
     $this->report .= '<tr><th scope="col" class="header c0" style="vertical-align: bottom; text-align: left;">&nbsp</th>';
     $col = 1;
     foreach ($hosts as $host) {
         $this->report .= '<th id="cap_' . $col . '" scope="col" class="header c' . $col . '" style="vertical-align: bottom; text-align: center;"><label for="platform_' . $col . '"><img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/draw_platformname.php?caption=' . urlencode($host_labels[$host]) . '" alt="' . $host_labels[$host] . '"/></label><br/><input id="platform_' . $col . '" type="checkbox" name="platforms[]" value="' . $host . '" disabled="disabled"/></th>';
         $col++;
     }
     $this->report .= '</tr>';
     // Initializing variables.
     $row = 0;
     $contextlevel = 0;
     $component = '';
     $rowtitleids = array();
     // Creating table data.
     foreach ($capabilities as $capability) {
         $col = 1;
         $componentlevelchanged = component_level_changed($capability, $component, $contextlevel);
         // Recording context.
         $contextlevel = $capability->contextlevel;
         $component = $capability->component;
         $rowtitleids[] = $capability->name;
         $rowcontent = '<tr class="r' . $row % 2 . ' capabilityrow" id="' . $capability->name . '">';
         $rowcontent .= '<td id="cap_0_' . $row . '" class="cell c0" style="vertical-align: middle; text-align: left;"><a onclick="this.target=\'docspopup\'" href="' . $CFG->docroot . '/' . $lang . '/' . $strcapabilities . '/' . $capability->name . '">' . get_capability_string($capability->name) . '</a><br/>' . $capability->name . '</td>';
         foreach ($hosts as $host) {
             $extra_class = false;
             $title = get_capability_string($capability->name) . ' | ' . $host_labels[$host];
             if (array_key_exists($host, $this->capabilities) && property_exists($this->capabilities[$host], $capability->name)) {
                 $platform_capability = $this->capabilities[$host]->{$capability->name};
                 if (is_null($platform_capability)) {
                     $cell = '<img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/pix/norolecapability.png" alt="No role capability" title="' . $title . '" onclick="setCapability(' . $col . ',' . $row . ',\'' . $capability->name . '\',\'' . $host . '\');"/>';
                 } else {
                     $cell = '<img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/pix/compare' . $cap_permissions[$platform_capability->permission]['label'] . $cap_contexts[$platform_capability->contextlevel]['label'] . '.png" alt="Permission: ' . $cap_permissions[$platform_capability->permission]['name'] . ' | Context: ' . $cap_contexts[$platform_capability->contextlevel]['name'] . '" title="' . $title . '" onclick="setCapability(' . $col . ',' . $row . ',\'' . $capability->name . '\',\'' . $host . '\');"/>';
                     if ($platform_capability->permission != $capabilities[$platform_capability->capability]->major_permission) {
                         $extra_class = 'wrongvalue';
                     } elseif ($platform_capability->contextlevel != $capabilities[$platform_capability->capability]->major_contextlevel) {
                         $extra_class = 'wrongcontext';
                     }
                 }
             } else {
                 $cell = '<img src="' . $CFG->wwwroot . '/local/vmoodle/plugins/roles/pix/nocapability.png" alt="No capability" title="' . $title . '"/>';
             }
             $rowcontent .= '<td id="cap_' . $col . '_' . $row . '" class="cell c' . $col . ($extra_class ? ' ' . $extra_class : '') . '" style="vertical-align: middle; text-align: center;" onmouseout="cellOut(' . $col . ',' . $row . ');" onmouseover="cellOver(' . $col . ',' . $row . ');">' . $cell . '</td>';
             $col++;
         }
         // Adding contextual heading.
         if ($componentlevelchanged) {
             $rowhead = '<tr class="capabilityrow" id="' . implode(',', $rowtitleids) . '"><td colspan="' . (count($hosts) + 1) . '" class="header"><strong>' . ($capability->component == $problematic_component_name ? $problematic_component_name : get_component_string($capability->component, $capability->contextlevel)) . '</strong></td></tr>';
             $rowtitleids = array();
         }
         $this->report .= $rowhead . $rowcontent . '</tr>';
         $row++;
     }
     // Closing table.
     $this->report .= '</tboby></table><br/><center><input type="submit" value="' . get_string('synchronize', 'vmoodleadminset_roles') . '"/><div id="rolecompare_validation_message"></div></center></form><br/><br/>';
 }