<?php
/**
 * @file
 * Code for the Feature Slideshow feature.
 */

include_once 'feature_slideshow.features.inc';

/**
 * Implements hook_theme_registry_alter()
 **/
function feature_slideshow_theme_registry_alter(&$theme_registry) {
  $mod_path = drupal_get_path('module', 'feature_slideshow');
  $theme_registry_copy = $theme_registry;       // munge on a copy
  _theme_process_registry($theme_registry_copy, 'phptemplate', 'theme_engine', 'pow', $mod_path);
  $theme_registry += array_diff_key($theme_registry_copy, $theme_registry);
  $hooks = array('node');
  foreach ($hooks as $h) {
    _feature_slideshow_insert_after_first_element($theme_registry[$h]['theme paths'], $mod_path);
  }
}
/**
 * Helper function for re-ordering arrays (needed by theme_registry_alter)
 */
function _feature_slideshow_insert_after_first_element(&$a, $element) {
  if(is_array($a)) {
    $first_element = array_shift($a);
    array_unshift($a, $first_element, $element);
  }
}

/**
 * @return array
 */
function  feature_slideshow_permission() {
  return array(
    'reference slideshow from pages' => array(
      'title' => t('Associate a slideshow with a page'),
      'description' => t('Associate a slideshow with a page'),
    ),
  );
}


/**
 *  Implements hook_form_alter().
 */
function feature_slideshow_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'page_node_form') {
    if (!user_access('reference slideshow from pages')) {
      unset($form['field_page_slideshow']);
    }
  }

  if ($form_id == 'taxonomy_form_term' && $form['#vocabulary']->machine_name == 'slideshow_styles') {
    $form['description']['#access'] = false;
    $form['relations']['#access'] = false;
    $form['#after_build'][] = '_feature_slideshow_taxonomy_term_after_build';
  }
}

/**
 * @param $form
 * @param $form_state
 * @return mixed
 */
function _feature_slideshow_taxonomy_term_after_build($form, &$form_state) {
  $form['path']['#access'] = FALSE;
  return ($form);
}

/**
 * @return mixed
 */
function feature_slideshow_admin() {
  $form = array();
  $form['feature_slideshow_page_enable'] = array(
    '#type' => 'checkbox',
    '#title' => t('Allow slideshows to be attached to pages?'),
    '#default_value' => variable_get('feature_slideshow_page_enable', 1),
    '#size' => 2,
    '#maxlength' => 2,
    '#description' => t(""),
  );
  return system_settings_form($form);
}

/**
 * Implements hook_menu().
 * @return array
 */
function feature_slideshow_menu() {
  $items = array();
  $items['admin/config/user-interface/slideshow'] = array(
    'title' => 'Slideshow',
    'description' => 'Slideshow settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('feature_slideshow_admin'),
    'access arguments' => array('administer content'),
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}

/**
 * Callback function for the allowed values of image styles.
 * @return array
 */
function _feature_slideshow_image_styles() {
  foreach (image_styles() as $key => $value) {
    $styles[$key] = $key;
  }
  return $styles;
}

/*
 * Implements hook_ctools_plugin_directory -
 * This lets ctools know to scan my module for a content_type plugin file
 * Detailed docks in ctools/ctools.api.php
 */
function feature_slideshow_ctools_plugin_directory($owner, $plugin_type) {
  // we'll be nice and limit scandir() calls
  if ($owner == 'ctools' && $plugin_type == 'content_types') {
    return 'plugins/content_types';
  }
}

/**
 * Implements hook_block_info()
 * @return mixed
 */
function feature_slideshow_block_info() {
  $blocks['slideshow'] = array(
    'info' => t('Slideshow'),
    'cache' => DRUPAL_CACHE_PER_ROLE,
  );
  return $blocks;
}

/**
 * Implements hook_block_view().
 * @param string $delta
 * @return array
 */
function feature_slideshow_block_view($delta = '') {
  $block = array();
  switch ($delta) {
    case 'slideshow':
          $block['subject'] = NULL;
          $block['content'] = _feature_slideshow_generate_carousel_block();
          break;
  }
 return $block;
}


/**
 * Generate a slideshow that is referenced by a page.
 * @return array
 */
function _feature_slideshow_generate_carousel_block() {

  $node = menu_get_object();
  $node_wrapper = entity_metadata_wrapper('node', $node);

   if ($node_wrapper->__isset('field_page_slideshow')) {
     $slideshow = $node_wrapper->field_page_slideshow->value();
   } else {
     return NULL;
   }


  if (empty( $slideshow)) {
    return NULL;
  }

  return _feature_slideshow_generate_carousel( $slideshow);
}

/**
 * Implements hook_preprocess_node().
 * @param $vars
 */
function feature_slideshow_preprocess_node(&$vars) {
  $node = $vars['node'];
  if ($node->type == 'slide') {
    $node_wrapper = entity_metadata_wrapper('node', $node);
    $slide_style = $node_wrapper->field_slide_style->value();
    $slide_link = $node_wrapper->field_slide_link->value();
    $vars['slide_style'] = "slide-style-" . strtolower(drupal_clean_css_identifier($slide_style->name)) ;
    $vars['slide_title'] =  $node_wrapper->label();
    $vars['slide_subtitle'] = $node_wrapper->field_slide_subtitle->value();
    $vars['slide_url'] =  $slide_link['url'];
    $vars['slide_button'] =  l($slide_link['title'], $slide_link['url'], array('html' => true, 'attributes' => array('class' => array('slide-button'))));
  }
}


/**
 * Callback for generating the 'carousel' block content.
 * @return null
 */
function _feature_slideshow_generate_carousel( $slideshow) {

  // Get an entity metadata wrapper for the node.
  $slideshow_wrapper = entity_metadata_wrapper('node', $slideshow);

  $slides = array();

  // Iterate through referenced slides.
  foreach ($slideshow_wrapper->field_slideshow_slides->getIterator() as $delta => $slide_wrapper) {
    $slides[] = $slide_wrapper;
  }

  $form['#attached']['libraries_load'][] = array('jquery.cycle2');
  $form['#attached']['libraries_load'][] = array('enquire.js');

  $form['#attached']['css'] = array(
    drupal_get_path('module', 'feature_slideshow') . '/css/feature_slideshow.css',
  );

  $form['#attached']['js'] = array(
    drupal_get_path('module', 'feature_slideshow') . '/js/feature_slideshow.js',
  );

  $js_settings = array('auto' => $slideshow_wrapper->__isset('field_slideshow_automatic') ? $slideshow_wrapper->field_slideshow_automatic->value() : 0);
  $form['#attached']['js'][] = array(
    'data' => array('feature_slideshow' => $js_settings),
    'type' => 'setting'
  );


  foreach ($slides as $slide_key => $slide) {
    $slide_array = node_view(node_load($slide->getIdentifier()),'teaser');
    $slides_list[] = array(
      'data' => drupal_render($slide_array),
      'class' => array('test'),
    );
  }

  // Render array using theme_item_list
  $form['slides'] = array(
    '#theme' => 'item_list',
    '#items' => $slides_list,
    '#type' => 'ul',
    '#attributes' => array(
      'id' => 'slideshow_' . $slideshow_wrapper->getIdentifier(),
      'class' => 'feature-slideshow' .  ( $slideshow_wrapper->__isset('field_slideshow_automatic') && $slideshow_wrapper->field_slideshow_automatic->value() == 1 ? ' cycle-slideshow' : ''  ),
      'data-cycle-fx' => ( $slideshow_wrapper->__isset('field_slideshow_transition') ? $slideshow_wrapper->field_slideshow_transition->value() : 'fade' ) ,
      'data-cycle-pause-on-hover' => "true",
      'data-cycle-speed' => ( $slideshow_wrapper->__isset('field_slideshow_speed') ? $slideshow_wrapper->field_slideshow_speed->value() : '200' ) ,
      'data-cycle-slides' => "> li",
      'data-cycle-prev' => "#prev",
      'data-cycle-next' => "#next",
      'data-cycle-pager' => ".cycle-pager",
      'data-cycle-timeout' =>  ( $slideshow_wrapper->__isset('field_slideshow_timeout') ? $slideshow_wrapper->field_slideshow_timeout->value() : '8000' )
    )
  );

  if ($slideshow_wrapper->field_slideshow_pager->value()) {
    $form['cycle-pager'] = array(
      '#type' => 'container',
      '#attributes' => array(
        'id' => array('controls')
      )
    );

    $form['cycle-pager']['pause'] = array(
      '#markup' => '<span id="pause" data-cycle-context="#slideshow_' . $slideshow_wrapper->getIdentifier() . '" data-cycle-cmd="pause" >•</span><span id="resume" data-cycle-context="#slideshow_' . $slideshow_wrapper->getIdentifier() . '"  data-cycle-cmd="resume">•</span>',
    );

    $form['cycle-pager']['pager'] = array(
      '#type' => 'container',
      '#attributes' => array(
        'class' => array('cycle-pager')
      )
    );
  }

  if ($slideshow_wrapper->field_slideshow_controls->value()) {
    $form['controls'] = array(
      '#type' => 'container',
      '#attributes' => array(
        'id' => 'cycle-controls'
      )
    );
    $form['controls']['prev'] = array(
      '#markup' => l('Prev', '#', array('attributes' => array('id' => 'prev')))
    );
    $form['controls']['next'] = array(
      '#markup' => l('Next', '#', array('attributes' => array('id' => 'next')))
    );
  }
  return $form;
}
