<?php

/**
 * Implements hook_form_FORM_ID_alter().
 */
function hide_block_by_role_form_block_admin_configure_alter(&$form, &$form_state) {
  $block = block_load($form['module']['#value'], $form['delta']['#value']);
  
  // Load role hidden values
  $default_role_options = db_query("SELECT rid FROM {hide_block_role} WHERE module = :module AND delta = :delta", array(
    ':module' => $block->module, 
    ':delta' => $block->delta,
  ))->fetchCol();
  $role_options = array_map('check_plain', user_roles());
  
  $form['visibility']['role']['hide_roles'] = array(
    '#type' => 'checkboxes', 
    '#title' => t('Hide block for specific roles'), 
    '#default_value' => $default_role_options, 
    '#options' => $role_options, 
    '#description' => t('Hide this block for the selected role(s). This always takes precedant over the allowed roles above.'),
  );
  
  $form['#submit'][] = 'hide_block_by_role_form_block_admin_configure_submit';
}

/**
 * Save Hide role settings.
 */
function hide_block_by_role_form_block_admin_configure_submit(&$form, &$form_state) {
  db_delete('hide_block_role')
    ->condition('module', $form_state['values']['module'])
    ->condition('delta', $form_state['values']['delta'])
    ->execute();

  $query = db_insert('hide_block_role')->fields(array('rid', 'module', 'delta'));
  foreach (array_filter($form_state['values']['hide_roles']) as $rid) {
    $query->values(array(
      'rid' => $rid, 
      'module' => $form_state['values']['module'], 
      'delta' => $form_state['values']['delta'],
    ));
  }
  $query->execute();
}

/**
 * Implements hook_block_view_alter().
 */
function hide_block_by_role_block_view_alter(&$data, $block) {
  global $user;
  
  $hide_options = db_query("SELECT rid FROM {hide_block_role} WHERE module = :module AND delta = :delta", array(
    ':module' => $block->module, 
    ':delta' => $block->delta,
  ))->fetchCol();
  
  $hidden = FALSE;
  foreach ($user->roles as $key => $role) {
    if (in_array($key, $hide_options)) {
      $hidden = TRUE;
      break;
    }
  }
  
  if ($hidden) {
    $data = array();
  }  
}
