<?php
/**
 * @file
 * This module allows create responsive slideshows.
 */

/**
 * Implements hook_permission().
 */
function responsive_slideshow_permission() {
  return array(
    'administer responsive slideshow' => array(
      'title' => t('Administer responsive slideshow'),
    ),
  );
}

/**
 * Implements hook_menu().
 */
function responsive_slideshow_menu() {
  $items = array();
  $items['admin/config/user-interface/responsive_slideshow'] = array(
    'title' => 'Responsive Slideshow',
    'description' => 'Configure the responsive slideshow.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('responsive_slideshow_settings'),
    'access arguments' => array('administer responsive slideshow'),
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}

/**
 * Form to configure responsive slideshow.
 *
 * @ingroup forms
 */
function responsive_slideshow_settings($form, &$form_state) {
  $form = array();
  $form['responsive_slideshow_no_of_slides'] = array(
    '#type' => 'textfield',
    '#title' => t('Number of Slides'),
    '#required' => TRUE,
    '#default_value' => variable_get('responsive_slideshow_no_of_slides'),
    '#weight' => 0,
    '#description' => t('Enter the number of slides to be included in the slideshow.'),
  );
  $form['responsive_slideshow_description_length'] = array(
    '#type' => 'textfield',
    '#title' => t('Maximum Description Length'),
    '#required' => TRUE,
    '#default_value' => variable_get('responsive_slideshow_description_length'),
    '#weight' => 1,
    '#description' => t('Enter maximum number of charecters in the description to be displayed in the carousel. If set to zero the description will be displayed full.'),
  );
  $form['responsive_slideshow_interval'] = array(
    '#type' => 'textfield',
    '#title' => t('Interval between the slides'),
    '#required' => TRUE,
    '#default_value' => variable_get('responsive_slideshow_interval'),
    '#weight' => 2,
    '#description' => t('Enter the interval between the slides in the carousel in Milliseconds(5000ms = 5sec).'),
  );
  $form['#validate'][] = 'responsive_slideshow_numeric_validation';
  return system_settings_form($form);
}

/**
 * Implements hook_block_info().
 */
function responsive_slideshow_block_info() {
  $blocks['responsive_slideshow'] = array(
    // info: The name of the block.
    'info' => t('Responsive Slideshow'),
    'visibility' => BLOCK_VISIBILITY_LISTED,
    'pages' => "<front>",
  );
  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function responsive_slideshow_block_view($delta = '') {
  $block = array();
  // The $delta parameter tells us which block is being requested.
  switch ($delta) {
    case 'responsive_slideshow':
      drupal_add_css(drupal_get_path('module', 'responsive_slideshow') . '/responsive_slideshow.css');
      // Create your block content here.
      $sliders = responsive_slideshow_homepage();
      $slider_count = count($sliders);
      $block['content'] = array(
        '#theme' => 'responsive_slideshow',
        '#responsive_slideshow_items' => $sliders,
        '#responsive_slideshow_item_count' => $slider_count,
      );
      break;
  }
  return $block;
}

/**
 * Implements hook_theme().
 */
function responsive_slideshow_theme() {
  return array(
    'responsive_slideshow' => array(
      'variables' => array('responsive_slideshow_items' => 'NULL', 'responsive_slideshow_item_count' => 'NULL'),
      'template' => 'responsive-slideshow',
    ),
  );
}

/**
 * Function for retreiving slideshow contents.
 *
 * @see responsive_slideshow_block_view()
 */
function responsive_slideshow_homepage() {
  $sliders = array();
  $nids = array();
  global $language;
  $current_language = isset($language->language) ? $language->language : 'en';
  $query = db_select('node', 'n')
    ->fields('n', array('nid'))
    ->condition('n.type', 'responsive_slideshow', '=')
    ->condition('n.status', 1, '=')
    ->condition('n.language', array($current_language, LANGUAGE_NONE), 'IN');
  $query->innerJoin('field_data_field_slideshow_image', 'img', 'n.nid = img.entity_id');
  $query->orderBy('n.changed', 'DESC');
  $query->range(0, variable_get('responsive_slideshow_no_of_slides'));
  $query->addTag('node_access');
  $query_result = $query->execute();
  foreach ($query_result as $key => $record) {
    $nids[] = $record->nid;
  }
  $nodes = node_load_multiple($nids);
  $key = 0;
  foreach ($nodes as $slide_node) {
    $sliders[$key]['nid'] = $slide_node->nid;
    $field_slideshow_image = field_get_items('node', $slide_node, 'field_slideshow_image');
    if (!empty($field_slideshow_image)) {
      $sliders[$key]['image']['alt'] = !empty($field_slideshow_image[0]['alt']) ? check_plain($field_slideshow_image[0]['alt']) : check_plain($slide_node->title);
      $sliders[$key]['image']['title'] = !empty($field_slideshow_image[0]['title']) ? check_plain($field_slideshow_image[0]['title']) : check_plain($slide_node->title);
      $sliders[$key]['image']['pic'] = image_style_url('responsive_slideshow_style', $field_slideshow_image[0]['uri']);
    }
    $sliders[$key]['title'] = truncate_utf8(check_plain($slide_node->title), 90, TRUE, TRUE);
    $sliders[$key]['title'] = strlen(check_plain($slide_node->title)) > 90 ? $sliders[$key]['title'] . '...' : $sliders[$key]['title'];
    $slide_desc = '';
    $field_slideshow_teaser = field_get_items('node', $slide_node, 'field_slideshow_teaser');
    if (!empty($field_slideshow_teaser)) {
      $slide_desc = check_markup($field_slideshow_teaser[0]['value'], 'filtered_html');
    }
    else {
      $body = field_get_items('node', $slide_node, 'body');
      if (!empty($body)) {
        $slide_desc = check_markup($body[0]['value'], 'filtered_html');
      }
    }
    $sliders[$key]['description'] = truncate_utf8($slide_desc, variable_get('responsive_slideshow_description_length'), TRUE, TRUE);
    if ($sliders[$key]['description']) {
      $sliders[$key]['description'] .= '... ';
    }
    $path = 'node/' . $slide_node->nid . '/edit';
    if (node_access('update', $slide_node)) {
      // The user has access to the page in $path.
      $sliders[$key]['link'] = l(t('Edit'), $path, array('attributes' => array('class' => 'edit-link'), 'query' => array('destination' => 'node')));
    }
    $key++;
  }
  return $sliders;
}

/**
 * Implements hook_help().
 */
function responsive_slideshow_help($path, $arg) {
  switch ($path) {
    case 'admin/help#responsive_slideshow':
      $path = dirname(__FILE__) . '/README.txt';
      if (file_exists($path)) {
        $readme = file_get_contents($path);
      }
      if (!isset($readme)) {
        return NULL;
      }
      if (module_exists('markdown')) {
        $filters = module_invoke('markdown', 'filter_info');
        $info = $filters['filter_markdown'];
        if (function_exists($info['process callback'])) {
          $output = $info['process callback']($readme, NULL);
        }
        else {
          $output = '<pre>' . $readme . '</pre>';
        }
      }
      else {
        $output = '<pre>' . $readme . '</pre>';
      }
      return $output;
  }
}

/**
 * Function for validating Responsive Slideshow settings form.
 */
function responsive_slideshow_numeric_validation($form, &$form_state) {
  if ((!is_numeric($form['responsive_slideshow_no_of_slides']['#value'])) || ($form['responsive_slideshow_no_of_slides']['#value'] == 0)) {
    form_set_error('responsive_slideshow_no_of_slides', t('Number of Slides must be a numeric value greater than 0.'));
  }
  if (!is_numeric($form['responsive_slideshow_description_length']['#value'])) {
    form_set_error('responsive_slideshow_description_length', t('Maximum Description Length must be a numeric value.'));
  }
  if ((!is_numeric($form['responsive_slideshow_interval']['#value'])) || ($form['responsive_slideshow_interval']['#value'] == 0)) {
    form_set_error('responsive_slideshow_interval', t('Interval between the slides must be a numeric value greater than 0.'));
  }
}
