<?php
// $Id$

/**
 * @file
 * Adds Facebook's "Like" button to each selected node type.
 * Adds a block with a global static value where users can "Like" the URL set by
 * admins.
 */

/**
 * Implements of hook_menu().
 */
function fblikebutton_menu() {
  $items['admin/config/fblikebutton'] = array(
    'title' => 'FB Like Button',
    'description' => 'Configure the Facebook Like button',
    'page callback' => 'system_admin_menu_block_page',
    'access arguments' => array('administer fblikebutton'),
    'position' => 'right',
    'weight' => -20,
    'type' => MENU_NORMAL_ITEM,
    'file' => 'system.admin.inc',
    'file path' => drupal_get_path('module', 'system'),
  );
  $items['admin/config/fblikebutton/dynamic'] = array(
    'title' => 'Dynamic Like button settings',
    'description' => 'Configure the settings for the Like button as it appears on individual nodes (liking that node).',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('fblikebutton_dynamic_settings'),
    'access arguments' => array('administer fblikebutton'),
    'type' => MENU_NORMAL_ITEM,
    'file' => 'fblikebutton.admin.inc',
    'weight' => 0,
  );
  $items['admin/config/fblikebutton/static'] = array(
    'title' => 'Static Like button settings',
    'description' => 'Configure the settings for the static Like button as it appears in the block (liking a given url). Use this to like for example your Facebook fanpage.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('fblikebutton_static_settings'),
    'access arguments' => array('administer fblikebutton block'),
    'type' => MENU_NORMAL_ITEM,
    'file' => 'fblikebutton.admin.inc',
    'weight' => 1,
  );
  return $items;
}

/**
 * Helper function to generate the configuration array used to generate the like
 * button.
 */
function fblikebutton_conf($type = 'dynamic') {
  $prefix = 'fblikebutton';
  if ($type == 'static') {
    $prefix = 'fblikebutton_bl';
  }
  $conf = array(
    'layout' => variable_get($prefix . '_layout', 'standard'),
    'action' => variable_get($prefix . '_action', 'like'),
    'color_scheme' => variable_get($prefix . '_color_scheme', 'light'),
    'show_faces' => variable_get($prefix . '_show_faces', 'true'),
    'font' => variable_get($prefix . '_font', 'arial'),
    'height' => variable_get($prefix . '_iframe_height', '80'),
    'width' => variable_get($prefix . '_iframe_width', '450'),
    'send' => variable_get($prefix . '_send', 'true'),
    'other_css' => variable_get($prefix . '_iframe_css', ''),
    'language' => variable_get($prefix . '_language', 'en_US'),
  );
  return $conf;
}

/**
 * Implements of hook_node_view().
 */
function fblikebutton_node_view($node, $view_mode) {
  global $user, $base_url;
  $types = variable_get('fblikebutton_node_types', array());
  $fullnodedisplay = variable_get('fblikebutton_full_node_display', 0);
  $teaserdisplay = variable_get('fblikebutton_teaser_display', 0);
  $full = ($view_mode == 'full') ? TRUE : FALSE;
  $show = ( ! empty($types[$node->type]) && user_access('access fblikebutton'));
  $webpage_to_like = url("node/$node->nid", array('absolute' => TRUE));
  $likebutton_weight = variable_get('fblikebutton_weight', '0');
  $conf = fblikebutton_conf();
  if ($show) {
    // Content area
    if (($view_mode == 'teaser' && $teaserdisplay == 1) || ($view_mode == 'full' && $fullnodedisplay == 0)) {
      $node->content['fblikebutton_field'] = array(
        '#markup' => _fblikebutton_field($webpage_to_like, $conf),
        '#weight' => $likebutton_weight,
      );
    }
    // Link area
    if (($view_mode == 'teaser' && $teaserdisplay == 2) || ($view_mode == 'full' && $fullnodedisplay == 2)) {
      $node->content['links']['#links']['fblikebutton_field'] = array(
        'title' => _fblikebutton_field($webpage_to_like, $conf),
        'html' => TRUE,
      );
    }
  }
}


/**
 * Implements of hook_permission().
 */
function fblikebutton_permission() {
  return array(
    'administer fblikebutton' => array(
      'title' => t('Administer FB Like button'),
      'description' => t('Perform administration tasks for FB Like button')
    ),
    'administer fblikebutton block' => array(
      'title' => t('Administer FB Like button block'),
      'description' => t('Perform administration tasks for FB Like button block')
    ),
    'access fblikebutton' => array(
      'title' => t('Access FB Like button'),
    ),
  );
}

/**
 * Implementation of hook_block_info().
 */
function fblikebutton_block_info() {
  $fullnodedisplay = variable_get('fblikebutton_full_node_display', 0);
  $blocks['fblikebutton_static_block'] = array(
    'info' => t('Static FB Like button'),
    'cache' => DRUPAL_NO_CACHE,
  );
  if ($fullnodedisplay == 1) {
    $blocks['fblikebutton_dynamic_block'] = array(
      'info' => t('Dynamic FB Like button'),
      'cache' => DRUPAL_NO_CACHE,
    );
  }
  return $blocks;
}

/**
 * Implementation of hook_block_configure().
 */
function fblikebutton_block_configure($delta = '') {
  global $base_url;
  $form = array();
  if ($delta == 'fblikebutton_static_block') {
    $form['fblikebutton_static_block'] = array(
      '#type' => 'fieldset',
      '#title' => t('Static FB Like button block'),
      '#collapsible' => FALSE,
    );
    $form['fblikebutton_static_block']['fblikebutton_static_config'] = array(
      '#markup' => '<p>' . t('To configure the URL and the appearance of the button go to the ' . l(t('static Like button settings'), 'admin/config/fblikebutton/static') . '. Make sure you set the right permissions on the ' . l(t('permissions page'), 'admin/people/permissions') . '.</p>'),
    );
  }
  if ($delta == 'fblikebutton_dynamic_block') {
    $form['fblikebutton_dynamic_block'] = array(
      '#type' => 'fieldset',
      '#title' => t('Dynamic FB Like button block'),
      '#collapsible' => FALSE,
    );
    $form['fblikebutton_dynamic_block']['fblikebutton_dynamic_config'] = array(
      '#markup' => '<p>' . t('To configure the visibility and the appearance of the button go to the ' . l(t('dynamic Like button settings'), 'admin/config/fblikebutton/dynamic') . '. You can enhance the visibility settings by using the settings on this page. Make sure you set the right permissions on the ' . l(t('permissions page'), 'admin/people/permissions') . '.</p>'),
    );
  }
  return $form;
}

/**
 * Implementation of hook_block_view().
 */
function fblikebutton_block_view($delta = '') {
  global $base_url;
  $node = node_load(arg(1));
  $types = variable_get('fblikebutton_node_types', array());
  if ($node) {
    $show = ( ! empty($types[$node->type]) && user_access('access fblikebutton'));
  }
  else {
    $show = NULL;
  }
  $fullnodedisplay = variable_get('fblikebutton_full_node_display', 0);
  $block = array();
  switch ($delta) {
    case 'fblikebutton_dynamic_block':
      if ($show && $fullnodedisplay == 1) {
        $webpage_to_like = url("node/$node->nid", array('absolute' => TRUE));
        $conf = fblikebutton_conf();
        $block['content'] = _fblikebutton_field($webpage_to_like, $conf);
      }
      break;
    case 'fblikebutton_static_block':
      $addr = variable_get('fblikebutton_block_url', $base_url);
      $conf = fblikebutton_conf('static');
      $block['content'] = _fblikebutton_field($addr, $conf);
      break;
  }
  return $block;
}

/**
 * Implements hook_ds_fields_info().
 */
function fblikebutton_ds_fields_info($entity_type) {
  $fields = array();

  if ($entity_type == 'node') {
    $ui_limit = array();
    $bundles = variable_get('fblikebutton_node_types', array());
    foreach ($bundles as $bundle) {
      $ui_limit[] = $bundle . '|*';
    }
    $fields['node'] = array();
    $fields['node']['fblikebutton_ds_field'] = array(
      'title' => t('Dynamic Facebook Like button'),
      'field_type' => DS_FIELD_TYPE_FUNCTION,
      'function' => '_fblikebutton_ds_field',
      'ui_limit' => $ui_limit,
    );
  }

  return $fields;
}

/**
 * Callback for ds button.
 */
function _fblikebutton_ds_field($field) {
  if (!user_access('access fblikebutton')) {
    return '';
  }

  $uri = entity_uri($field['entity_type'], $field['entity']);
  $url = url($uri['path'], array('absolute' => TRUE));

  $conf = fblikebutton_conf();
  return _fblikebutton_field($url, $conf);
}

/**
 * Build the like button. This is essentially just a convienience function that
 * appends the url to the configuration array.
 */
function _fblikebutton_field($webpage_to_like, $conf) {
  $conf['url'] = $webpage_to_like;
  return theme('fblikebutton', $conf);
}

/**
 * Implements hook_theme().
 */
function fblikebutton_theme() {
  $theme = array();
  $theme['fblikebutton'] = array(
    'variables' => fblikebutton_conf('static'),
    'file' => 'fblikebutton.theme.inc',
    'template' => 'fblikebutton',
  );
  return $theme;
}
