You are here

supersized.module in Supersized 8

Same filename and directory in other branches
  1. 7 supersized.module

Supersized module file.

File

supersized.module
View source
<?php

/**
 * @file
 * Supersized module file.
 */

// Load all Field module hooks for Supersized.
require_once 'supersized.field.inc';

/**
 * Implements hook_library_info().
 */
function supersized_libraries_info() {
  $libraries['supersized'] = array(
    'title' => 'Supersized',
    'website' => 'http://www.buildinternet.com/project/supersized/',
    'download url' => 'https://github.com/f3ndot/supersized/tree/3718ae83f0945e327cc09530b959c5a8b049871f',
    'version arguments' => array(
      'file' => 'slideshow/js/supersized.3.2.8.min.js',
      'pattern' => '/Version : (\\d+)/',
      'lines' => 4,
    ),
    'files' => array(
      'js' => array(
        'slideshow/js/jquery.easing.min.js',
        'slideshow/js/supersized.3.2.8.min.js',
        'slideshow/theme/supersized.shutter.min.js',
      ),
      'css' => array(
        'slideshow/theme/supersized.shutter.css',
        'slideshow/css/supersized.css',
      ),
    ),
  );
  return $libraries;
}

/**
 * Implements hook_theme().
 */
function supersized_theme($existing, $type, $theme, $path) {
  return array(
    'supersized_form_element' => array(
      'render element' => 'element',
    ),
    'supersized_form_element_label' => array(
      'render element' => 'element',
    ),
    'supersized_overlay' => array(
      'variables' => array(
        'overlay_key' => NULL,
      ),
    ),
    'supersized_arrow_nav' => array(),
    'supersized_progress_bar' => array(),
    'supersized_thumbnail_navigation' => array(),
    'supersized_thumb_links' => array(),
    'supersized_slide_links' => array(),
    'supersized_control_bar' => array(
      'template' => 'supersized_control_bar',
    ),
  );
}

/**
 * Theme function of supersized_form_element.
 *
 * This is an exact clone of theme_form_element, but labels theme are overiden.
 */
function theme_supersized_form_element($variables) {
  $element =& $variables['element'];

  // This function is invoked as theme wrapper, but the rendered form element
  // may not necessarily have been processed by form_builder().
  $element += array(
    '#title_display' => 'before',
  );

  // Add element #id for #type 'item'.
  if (isset($element['#markup']) && !empty($element['#id'])) {
    $attributes['id'] = $element['#id'];
  }

  // Add element's #type and #name as class to aid with JS/CSS selectors.
  $attributes['class'] = array(
    'form-item',
  );
  if (!empty($element['#type'])) {
    $attributes['class'][] = 'form-type-' . strtr($element['#type'], '_', '-');
  }
  if (!empty($element['#name'])) {
    $attributes['class'][] = 'form-item-' . strtr($element['#name'], array(
      ' ' => '-',
      '_' => '-',
      '[' => '-',
      ']' => '',
    ));
  }

  // Add a class for disabled elements to facilitate cross-browser styling.
  if (!empty($element['#attributes']['disabled'])) {
    $attributes['class'][] = 'form-disabled';
  }
  $output = '<div' . drupal_attributes($attributes) . '>' . "\n";

  // If #title is not set, we don't display any label or required marker.
  if (!isset($element['#title'])) {
    $element['#title_display'] = 'none';
  }
  $prefix = isset($element['#field_prefix']) ? '<span class="field-prefix">' . $element['#field_prefix'] . '</span> ' : '';
  $suffix = isset($element['#field_suffix']) ? ' <span class="field-suffix">' . $element['#field_suffix'] . '</span>' : '';
  switch ($element['#title_display']) {
    case 'before':
    case 'invisible':
      $output .= ' ' . theme('supersized_form_element_label', $variables);
      $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n";
      break;
    case 'after':
      $output .= ' ' . $prefix . $element['#children'] . $suffix;
      $output .= ' ' . theme('supersized_form_element_label', $variables) . "\n";
      break;
    case 'none':
    case 'attribute':

      // Output no label and no required marker, only the children.
      $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n";
      break;
  }
  if (!empty($element['#description'])) {
    $output .= '<div class="description">' . $element['#description'] . "</div>\n";
  }
  $output .= "</div>\n";
  return $output;
}

/**
 * Theme function of supersized_form_element_label.
 *
 * This is for avoid filtering out attributes of label.
 */
function theme_supersized_form_element_label($variables) {
  $element = $variables['element'];

  // This is also used in the installer, pre-database setup.
  $t = get_t();

  // If title and required marker are both empty, output no label.
  if ((!isset($element['#title']) || $element['#title'] === '') && empty($element['#required'])) {
    return '';
  }

  // If the element is required, a required marker is appended to the label.
  $required = !empty($element['#required']) ? theme('form_required_marker', array(
    'element' => $element,
  )) : '';
  $title = $element['#title'];
  $attributes = array();

  // Style the label as class option to display inline with the element.
  if ($element['#title_display'] == 'after') {
    $attributes['class'] = 'option';
  }
  elseif ($element['#title_display'] == 'invisible') {
    $attributes['class'] = 'element-invisible';
  }
  if (!empty($element['#id'])) {
    $attributes['for'] = $element['#id'];
  }

  // The leading whitespace helps visually separate fields from inline labels.
  return ' <label' . drupal_attributes($attributes) . '>' . $t('!title !required', array(
    '!title' => $title,
    '!required' => $required,
  )) . "</label>\n";
}

/**
 * A radios process function.
 *
 * We need to customized the theme wrapper for the radio buttons so labels
 * support full HTML.
 */
function supersized_form_process_radios($element) {
  if (count($element['#options']) > 0) {
    $weight = 0;
    foreach ($element['#options'] as $key => $choice) {

      // Maintain order of options as defined in #options, in case the element
      // defines custom option sub-elements, but does not define all option
      // sub-elements.
      $weight += 0.001;
      $element += array(
        $key => array(),
      );

      // Generate the parents as the autogenerator does, so we will have a
      // unique id for each radio button.
      $parents_for_id = array_merge($element['#parents'], array(
        $key,
      ));
      $element[$key] += array(
        '#type' => 'radio',
        '#title' => $choice,
        // The key is sanitized in drupal_attributes() during output from the
        // theme function.
        '#return_value' => $key,
        // Use default or FALSE. A value of FALSE means that the radio button is
        // not 'checked'.
        '#default_value' => isset($element['#default_value']) ? $element['#default_value'] : FALSE,
        '#attributes' => $element['#attributes'],
        '#parents' => $element['#parents'],
        '#id' => drupal_html_id('edit-' . implode('-', $parents_for_id)),
        '#ajax' => isset($element['#ajax']) ? $element['#ajax'] : NULL,
        '#weight' => $weight,
        '#theme_wrappers' => array(
          'supersized_form_element',
        ),
      );
    }
  }
  return $element;
}

/**
 * Theme fuction for overlay.
 */
function theme_supersized_overlay($variables) {
  $overlay = supersized_overlay($variables['overlay_key']);
  $path = url($overlay['file path'] . '/' . $overlay['file']);
  return '<div id="supersized-overlay" style="background-image: url(' . $path . ');"></div>';
}

/**
 * Theme fuction for arrow_nav.
 */
function theme_supersized_arrow_nav() {
  return '<a id="prevslide" class="load-item"></a><a id="nextslide" class="load-item"></a>';
}

/**
 * Theme fuction for progress_var.
 */
function theme_supersized_progress_bar() {
  return '<div id="progress-back" class="load-item"><div id="progress-bar"></div></div>';
}

/**
 * Theme fuction for thumbnail_navigation.
 */
function theme_supersized_thumbnail_navigation() {
  return '<div id="prevthumb"></div><div id="nextthumb"></div>';
}

/**
 * Theme fuction for thumb_links.
 */
function theme_supersized_thumb_links() {
  return '<div id="thumb-tray" class="load-item"><div id="thumb-back"></div><div id="thumb-forward"></div></div>';
}

/**
 * Theme fuction for control_bar.
 */
function template_preprocess_supersized_control_bar(&$variables) {
  $library = libraries_load('supersized');

  // Create play/puase button.
  $pause_path = $library['library path'] . '/slideshow/img/pause.png';
  $pause_attr = array(
    'id' => 'pauseplay',
  );
  $pause_image = theme('image', array(
    'path' => $pause_path,
    'attributes' => $pause_attr,
  ));
  $options = array(
    'attributes' => array(
      'id' => 'play-button',
    ),
    'html' => TRUE,
    'fragment' => 'play-pause',
    'external' => TRUE,
  );
  $variables['pause_link'] = l($pause_image, '', $options);

  // Create tray trigger button.
  $tray_button_path = $library['library path'] . '/slideshow/img/button-tray-up.png';
  $tray_button_attr = array(
    'id' => 'tray-arrow',
  );
  $tray_button_image = theme('image', array(
    'path' => $tray_button_path,
    'attributes' => $tray_button_attr,
  ));
  $options = array(
    'attributes' => array(
      'id' => 'tray-button',
    ),
    'html' => TRUE,
    'fragment' => 'play-pause',
    'external' => TRUE,
  );
  $variables['tray_button_link'] = l($tray_button_image, '', $options);
}

/**
 * Implements hook_image_default_styles().
 */
function supersized_image_default_styles() {
  $styles = array();
  $styles['supersized'] = array(
    'effects' => array(
      array(
        'name' => 'image_scale_and_crop',
        'data' => array(
          'width' => 1920,
          'height' => 1080,
          'upscale' => 0,
        ),
        'weight' => 0,
      ),
      array(
        'label' => t('Change file format'),
        'help' => t('Choose to save the image as a different filetype.'),
        'effect callback' => 'coloractions_convert_image',
        'dimensions passthrough' => TRUE,
        'form callback' => 'coloractions_convert_form',
        'summary theme' => 'coloractions_convert_summary',
        'module' => 'imagecache_coloractions',
        'name' => 'coloractions_convert',
        'data' => array(
          'format' => 'image/jpeg',
          'quality' => '100',
        ),
        'weight' => '-9',
      ),
    ),
  );
  $styles['supersized-thumbnail'] = array(
    'name' => 'supersized-thumbnail',
    'effects' => array(
      1 => array(
        'label' => t('Scale and crop'),
        'help' => t('Scale and crop will maintain the aspect-ratio of the original image, then crop the larger dimension. This is most useful for creating perfectly square thumbnails without stretching the image.'),
        'effect callback' => 'image_scale_and_crop_effect',
        'dimensions callback' => 'image_resize_dimensions',
        'form callback' => 'image_resize_form',
        'summary theme' => 'image_resize_summary',
        'module' => 'image',
        'name' => 'image_scale_and_crop',
        'data' => array(
          'width' => '60',
          'height' => '60',
        ),
        'weight' => '-10',
      ),
      3 => array(
        'label' => t('Change file format'),
        'help' => t('Choose to save the image as a different filetype.'),
        'effect callback' => 'coloractions_convert_image',
        'dimensions passthrough' => TRUE,
        'form callback' => 'coloractions_convert_form',
        'summary theme' => 'coloractions_convert_summary',
        'module' => 'imagecache_coloractions',
        'name' => 'coloractions_convert',
        'data' => array(
          'format' => 'image/png',
          'quality' => '100',
        ),
        'weight' => '-9',
      ),
      2 => array(
        'label' => t('Rounded Corners'),
        'help' => t('This is true cropping, not overlays, so the result <em>can</em> be transparent.'),
        'effect callback' => 'canvasactions_roundedcorners_image',
        'dimensions passthrough' => TRUE,
        'form callback' => 'canvasactions_roundedcorners_form',
        'summary theme' => 'canvasactions_roundedcorners_summary',
        'module' => 'imagecache_canvasactions',
        'name' => 'canvasactions_roundedcorners',
        'data' => array(
          'radius' => '30',
          'independent_corners_set' => array(
            'independent_corners' => 0,
            'radii' => array(
              'tl' => 0,
              'tr' => 0,
              'bl' => 0,
              'br' => 0,
            ),
          ),
        ),
        'weight' => '-8',
      ),
    ),
  );
  return $styles;
}

/**
 * Implements hook_page_alter().
 */
function supersized_page_alter(&$page) {
  $node = NULL;
  $plugin = NULL;
  if (module_exists('context')) {

    // Check disable context reaction.
    $plugin = context_get_plugin('reaction', 'supersized_disable_context');
    if (is_object($plugin) && $plugin
      ->execute()) {
      return;
    }

    // Try to see if there's any supersized set by context.
    $plugin = context_get_plugin('reaction', 'supersized_context');
    if (is_object($plugin)) {
      $node = node_load($plugin
        ->execute());
    }
  }

  // If there's a node defined, try to run supersized.
  if (empty($node)) {
    $node = menu_get_object();
  }
  if (!empty($node)) {
    supersized_run_supersized($node, $page);
  }
}

/**
 * Start supersized with Supersized plugin.
 */
function supersized_run_supersized($node, &$page) {
  module_load_include('inc', 'supersized', 'supersized.run');
  supersized_run($node, $page);
}

/**
 * Get supersized field by node.
 */
function supersized_get_supersized_field($node) {
  $fields = field_info_instances('node', $node->type);
  foreach ($fields as $field_name => $field) {

    // Supersized will only be available in full page view.
    // Assume only one supersized field in each node type.
    if ($field['display']['default']['type'] == 'supersized' || isset($field['display']['full']['type']) && $field['display']['full']['type'] == 'supersized') {
      $items = field_get_items('node', $node, $field_name);
      $instance = field_info_instance('node', $field_name, $node->type);
      return array(
        'instance' => $instance,
        'items' => $items,
      );
    }
  }
  return NULL;
}

/**
 * Implements hook_permission().
 */
function supersized_permission() {
  return array(
    'administer node supersized settings' => array(
      'title' => t('Administer node supersized settings'),
      'description' => t('Administer supersized settings per node.'),
    ),
  );
}

/**
 * Implements hook_menu().
 */
function supersized_menu() {
  $items = array();
  $items['node/%node/supersized'] = array(
    'title' => 'Supersized settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'supersized_node_settings_form',
      1,
    ),
    'access callback' => 'supersized_node_settings_access',
    'access arguments' => array(
      1,
    ),
    'weight' => 1,
    'type' => MENU_LOCAL_TASK,
    'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
  );
  $items['node/%node/supersized/delete'] = array(
    'title' => 'Delete Supersized settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'supersized_node_settings_delete_confirm',
      1,
    ),
    'access callback' => 'supersized_node_settings_access',
    'access arguments' => array(
      1,
    ),
    'weight' => 1,
    'type' => MENU_LOCAL_TASK,
    'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
  );
  return $items;
}

/**
 * Implements hook_admin_paths().
 */
function supersized_admin_paths() {
  if (variable_get('node_admin_theme')) {
    $paths = array(
      'node/*/supersized' => TRUE,
    );
    return $paths;
  }
}

/**
 * Supersized setting form for node.
 */
function supersized_node_settings_form($form, &$form_state, $node) {

  // Get overlay options.
  $overlay_options = supersized_overlay_options();
  $form = array();
  $form['nid'] = array(
    '#type' => 'hidden',
    '#value' => $node->nid,
  );
  $settings = supersized_get_node_settings($node);
  if (empty($settings)) {
    $field = supersized_get_supersized_field($node);
    $settings = $field['instance']['settings'];
  }
  else {
    drupal_set_message(t('There are specific Supersized settings. Pleaes check the following form.'));
    $form['delete'] = array(
      '#type' => 'submit',
      '#value' => t('Delete this setting'),
      '#submit' => array(
        'supersized_node_settings_delete_submit',
      ),
      '#weight' => 100,
    );
  }
  $url = l(t('Browscap'), 'http://drupal.org/project/browscap');
  $description = t('You may disable Supersized! if !url installed.', array(
    '!url' => $url,
  ));
  if (module_exists('browscap')) {
    $form['mobile_disabled'] = array(
      '#type' => 'checkbox',
      '#title' => t('Disabled Supersized on mobile devices'),
      '#default_value' => isset($settings['mobile_disabled']) ? $settings['mobile_disabled'] : supersized_default_settings('mobile_disabled'),
    );
  }
  else {
    $form['mobile_disabled_tips'] = array(
      '#markup' => $description,
    );
  }
  $form['functionalities'] = array(
    '#type' => 'fieldset',
    '#title' => t("Supersized functionality settings"),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  );
  $form['functionalities']['autoplay'] = array(
    '#type' => 'radios',
    '#title' => t('Auto play'),
    '#description' => t('Determines whether slideshow begins playing when page is loaded.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['functionalities']['autoplay']) ? $settings['functionalities']['autoplay'] : supersized_default_settings('autoplay'),
    '#required' => TRUE,
  );
  $form['functionalities']['start_slide'] = array(
    '#type' => 'hidden',
    '#value' => 1,
  );
  $form['functionalities']['stop_loop'] = array(
    '#type' => 'radios',
    '#title' => t('Loop'),
    '#description' => t('Pauses slideshow upon reaching the last slide.'),
    '#options' => array(
      0 => t('Yes'),
      1 => 'No',
    ),
    '#default_value' => isset($settings['functionalities']['stop_loop']) ? $settings['functionalities']['stop_loop'] : supersized_default_settings('stop_loop'),
    '#required' => TRUE,
  );
  $form['functionalities']['random'] = array(
    '#type' => 'radios',
    '#title' => t('Random'),
    '#description' => t('Slides are shown in a random order.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['functionalities']['random']) ? $settings['functionalities']['random'] : supersized_default_settings('random'),
    '#required' => TRUE,
  );
  $form['functionalities']['slide_interval'] = array(
    '#type' => 'textfield',
    '#title' => t('Slide interval'),
    '#description' => t('Time between slide changes in milliseconds.'),
    '#default_value' => isset($settings['functionalities']['slide_interval']) ? $settings['functionalities']['slide_interval'] : supersized_default_settings('slide_interval'),
    '#size' => 6,
    '#maxlength' => 6,
    '#required' => TRUE,
  );
  $form['functionalities']['transition'] = array(
    '#type' => 'select',
    '#title' => t('Transition'),
    '#descipion' => t('Controls which effect is used to transition between slides.'),
    '#options' => array(
      0 => t('None'),
      1 => t('Fade'),
      2 => t('Slide Top'),
      3 => t('Slide Right'),
      4 => t('Slide Bottom'),
      5 => t('Slide Left'),
      6 => t('Carousel Right'),
      7 => t('Carousel Left'),
    ),
    '#default_value' => isset($settings['functionalities']['transition']) ? $settings['functionalities']['transition'] : supersized_default_settings('transition'),
    '#required' => TRUE,
  );
  $form['functionalities']['transition_speed'] = array(
    '#type' => 'textfield',
    '#title' => t('Transition speed'),
    '#description' => t('Speed of transitions in milliseconds.'),
    '#default_value' => isset($settings['functionalities']['transition_speed']) ? $settings['functionalities']['transition_speed'] : supersized_default_settings('transition_speed'),
    '#size' => 6,
    '#maxlength' => 6,
    '#required' => TRUE,
  );
  $form['functionalities']['new_window'] = array(
    '#type' => 'radios',
    '#title' => t('New window'),
    '#description' => t('Slide links open in a new window.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['functionalities']['new_window']) ? $settings['functionalities']['new_window'] : supersized_default_settings('new_window'),
    '#required' => TRUE,
  );
  $form['functionalities']['pause_hover'] = array(
    '#type' => 'radios',
    '#title' => t('Pause on hover'),
    '#description' => t('Pauses slideshow while current image hovered over.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['functionalities']['pause_hover']) ? $settings['functionalities']['pause_hover'] : supersized_default_settings('pause_hover'),
    '#required' => TRUE,
  );
  $form['functionalities']['keyboard_nav'] = array(
    '#type' => 'hidden',
    '#value' => 1,
  );
  $form['functionalities']['performance'] = array(
    '#type' => 'hidden',
    '#value' => 1,
  );
  $form['functionalities']['image_protect'] = array(
    '#type' => 'hidden',
    '#value' => 1,
  );
  $form['functionalities']['on_new_slide'] = array(
    '#type' => 'hidden',
    '#value' => 'on_new_slide_callback',
  );
  $form['functionalities']['overlay'] = array(
    '#type' => 'radios',
    '#title' => t('Overylay'),
    '#description' => t('To add an overlay texture to the slide images.'),
    '#options' => $overlay_options,
    '#default_value' => isset($settings['functionalities']['overlay']) ? $settings['functionalities']['overlay'] : supersized_default_settings('overlay'),
    '#required' => TRUE,
    '#process' => array(
      'supersized_form_process_radios',
    ),
  );
  $form['dimension'] = array(
    '#type' => 'fieldset',
    '#title' => t("Supersized Dimension settings"),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  );
  $form['dimension']['min_width'] = array(
    '#type' => 'textfield',
    '#title' => t('Minimum width'),
    '#description' => t("Minimum width the image is allowed to be. If it is met, the image won't size down any further."),
    '#default_value' => isset($settings['dimension']['min_width']) ? $settings['dimension']['min_width'] : supersized_default_settings('min_width'),
    '#size' => 6,
    '#maxlength' => 6,
    '#required' => TRUE,
  );
  $form['dimension']['min_height'] = array(
    '#type' => 'textfield',
    '#title' => t('Minimum height'),
    '#description' => t("Minimum height the image is allowed to be. If it is met, the image won't size down any further."),
    '#default_value' => isset($settings['dimension']['min_height']) ? $settings['dimension']['min_height'] : supersized_default_settings('min_height'),
    '#size' => 6,
    '#maxlength' => 6,
    '#required' => TRUE,
  );
  $form['dimension']['vertical_center'] = array(
    '#type' => 'hidden',
    '#value' => 1,
  );
  $form['dimension']['horizontal_center'] = array(
    '#type' => 'hidden',
    '#value' => 1,
  );
  $form['dimension']['fit_always'] = array(
    '#type' => 'radios',
    '#title' => t('Always fit'),
    '#description' => t('Prevents the image from ever being cropped. Ignores minimum width and height.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['dimension']['fit_always']) ? $settings['dimension']['fit_always'] : supersized_default_settings('fit_always'),
    '#required' => TRUE,
  );
  $form['dimension']['fit_portrait'] = array(
    '#type' => 'radios',
    '#title' => t('Fit portrait'),
    '#description' => t('Prevents the image from being cropped by locking it at 100% height.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['dimension']['fit_portrait']) ? $settings['dimension']['fit_portrait'] : supersized_default_settings('fit_portrait'),
    '#required' => TRUE,
  );
  $form['dimension']['fit_landscape'] = array(
    '#type' => 'radios',
    '#title' => t('Fit landscape'),
    '#description' => t('Prevents the image from being cropped by locking it at 100% width.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['dimension']['fit_landscape']) ? $settings['dimension']['fit_landscape'] : supersized_default_settings('fit_landscape'),
    '#required' => TRUE,
  );
  $form['components'] = array(
    '#type' => 'fieldset',
    '#title' => t("Supersized component settings"),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  );
  $form['components']['arrow_nav'] = array(
    '#type' => 'radios',
    '#title' => t('Arrow navigation'),
    '#description' => t('Provide arrows for left and right navigation.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['components']['arrow_nav']) ? $settings['components']['arrow_nav'] : supersized_default_settings('arrow_nav'),
    '#required' => TRUE,
  );
  $form['components']['slide_links'] = array(
    '#type' => 'select',
    '#title' => t('Slide links'),
    '#description' => t('Generates a list of links that jump to the corresponding slide.'),
    '#options' => array(
      0 => t('Disables slide links'),
      'num' => t('Numbers (Default)'),
      'name' => t('Title of slide'),
      'blank' => t('Links are empty. Allows for background sprites.'),
    ),
    '#default_value' => isset($settings['components']['slide_links']) ? $settings['components']['slide_links'] : supersized_default_settings('slide_links'),
    '#required' => TRUE,
  );
  $form['components']['thumb_links'] = array(
    '#type' => 'radios',
    '#title' => t('Thumb links'),
    '#description' => t('Individual thumb links for each slide.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['components']['thumb_links']) ? $settings['components']['thumb_links'] : supersized_default_settings('thumb_links'),
    '#required' => TRUE,
  );
  $form['components']['thumbnail_navigation'] = array(
    '#type' => 'radios',
    '#title' => t('Thumbnail navigation'),
    '#description' => t("Toggles forward/backward thumbnail navigation. When on, thumbnails from the next/previous posts are generated and can be clicked to navigate. If the 'thumb' field for the slide is empty, it will simply scale down the full size image."),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['components']['thumbnail_navigation']) ? $settings['components']['thumbnail_navigation'] : supersized_default_settings('thumbnail_navigation'),
    '#required' => TRUE,
  );
  $form['components']['progress_bar'] = array(
    '#type' => 'radios',
    '#title' => t('Progress bar'),
    '#description' => t('Progress bar that runs based on the the slide interval.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['components']['progress_bar']) ? $settings['components']['progress_bar'] : supersized_default_settings('progress_bar'),
    '#required' => TRUE,
  );
  $form['components']['control_bar'] = array(
    '#type' => 'radios',
    '#title' => t('Control bar'),
    '#description' => t('Control bar that the slides.'),
    '#options' => array(
      1 => t('Yes'),
      0 => 'No',
    ),
    '#default_value' => isset($settings['components']['control_bar']) ? $settings['components']['control_bar'] : supersized_default_settings('control_bar'),
    '#required' => TRUE,
  );
  $form['components']['mouse_scrub'] = array(
    '#type' => 'hidden',
    '#value' => 0,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  return $form;
}

/**
 * Submit handler for node supersized settings form.
 */
function supersized_node_settings_form_submit($form, &$form_state) {
  $values = $form_state['values'];
  $settings['mobile_disabled'] = isset($values['mobile_disabled']) ? $values['mobile_disabled'] : FALSE;
  $settings['functionalities']['autoplay'] = $values['autoplay'];
  $settings['functionalities']['start_slide'] = $values['start_slide'];
  $settings['functionalities']['stop_loop'] = $values['stop_loop'];
  $settings['functionalities']['random'] = $values['random'];
  $settings['functionalities']['slide_interval'] = $values['slide_interval'];
  $settings['functionalities']['transition'] = $values['transition'];
  $settings['functionalities']['transition_speed'] = $values['transition_speed'];
  $settings['functionalities']['new_window'] = $values['new_window'];
  $settings['functionalities']['pause_hover'] = $values['pause_hover'];
  $settings['functionalities']['keyboard_nav'] = $values['keyboard_nav'];
  $settings['functionalities']['performance'] = $values['performance'];
  $settings['functionalities']['image_protect'] = $values['image_protect'];
  $settings['functionalities']['on_new_slide'] = $values['on_new_slide'];
  $settings['functionalities']['overlay'] = $values['overlay'];
  $settings['dimension']['min_width'] = $values['min_width'];
  $settings['dimension']['min_height'] = $values['min_height'];
  $settings['dimension']['vertical_center'] = $values['vertical_center'];
  $settings['dimension']['horizontal_center'] = $values['horizontal_center'];
  $settings['dimension']['fit_always'] = $values['fit_always'];
  $settings['dimension']['fit_portrait'] = $values['fit_portrait'];
  $settings['dimension']['fit_landscape'] = $values['fit_landscape'];
  $settings['components']['arrow_nav'] = $values['arrow_nav'];
  $settings['components']['slide_links'] = $values['slide_links'];
  $settings['components']['thumb_links'] = $values['thumb_links'];
  $settings['components']['thumbnail_navigation'] = $values['thumbnail_navigation'];
  $settings['components']['progress_bar'] = $values['progress_bar'];
  $settings['components']['control_bar'] = $values['control_bar'];
  $settings['components']['mouse_scrub'] = $values['mouse_scrub'];
  $record = array(
    'nid' => $values['nid'],
    'settings' => serialize($settings),
  );
  $previous_settings = supersized_get_node_settings($values['nid']);
  if (empty($previous_settings)) {
    $result = drupal_write_record('supersized', $record);
  }
  else {
    $result = drupal_write_record('supersized', $record, array(
      'nid',
    ));
  }
  drupal_set_message(t('Supersized settings saved successfully.'));
}

/**
 * Supersized setting delete button handler.
 */
function supersized_node_settings_delete_submit($form, &$form_state) {
  $destination = array();
  if (isset($_GET['destination'])) {
    $destination = drupal_get_destination();
    unset($_GET['destination']);
  }
  $nid = $form_state['values']['nid'];
  $form_state['redirect'] = array(
    'node/' . $nid . '/supersized/delete',
    array(
      'query' => $destination,
    ),
  );
}

/**
 * Supersized setting delete confirm form.
 */
function supersized_node_settings_delete_confirm($form, &$form_state, $node) {
  $form['#node'] = $node;

  // Always provide entity id in the same form key as in the entity edit form.
  $form['nid'] = array(
    '#type' => 'value',
    '#value' => $node->nid,
  );
  return confirm_form($form, t('Are you sure you want to delete Supersized settings of %title?', array(
    '%title' => $node->title,
  )), 'node/' . $node->nid, t('This action cannot be undone.'), t('Delete'), t('Cancel'));
}

/**
 * Supersized setting delete confirm form handler.
 */
function supersized_node_settings_delete_confirm_submit($form, &$form_state) {
  if ($form_state['values']['confirm']) {
    $node = node_load($form_state['values']['nid']);
    supersized_delete_node_settings($form_state['values']['nid']);
    drupal_set_message(t('Supersized of %title has been deleted.', array(
      '%title' => $node->title,
    )));
  }
  $form_state['redirect'] = 'node/' . $form_state['values']['nid'];
}

/**
 * Get supersized settings by node.
 */
function supersized_get_node_settings($node) {
  $nid = is_object($node) ? $node->nid : $node;
  $result = db_select('supersized', 'supersized')
    ->fields('supersized')
    ->condition('nid', $nid)
    ->execute()
    ->fetchAssoc();
  if ($result) {
    return unserialize($result['settings']);
  }
  return array();
}

/**
 * Delete supersized settings by node.
 */
function supersized_delete_node_settings($node) {
  $nid = is_object($node) ? $node->nid : $node;
  $result = db_delete('supersized')
    ->condition('nid', $nid)
    ->execute();
}

/**
 * An access check helper function.
 */
function supersized_node_settings_access($node) {
  return user_access('administer node supersized settings') && supersized_get_supersized_field($node);
}

/**
 * Return available overlay patterns.
 */
function supersized_overlay($overlay_key = NULL) {

  // Defaut overlay options.
  $file_path = drupal_get_path('module', 'supersized') . '/images';
  $overlay = array(
    'style_01' => array(
      'name' => t('Style 1'),
      'file' => 'overlay_01.png',
      'file path' => $file_path,
    ),
    'style_02' => array(
      'name' => t('Style 2'),
      'file' => 'overlay_02.png',
      'file path' => $file_path,
    ),
    'style_03' => array(
      'name' => t('Style 3'),
      'file' => 'overlay_03.png',
      'file path' => $file_path,
    ),
    'style_04' => array(
      'name' => t('Style 4'),
      'file' => 'overlay_04.png',
      'file path' => $file_path,
    ),
    'style_05' => array(
      'name' => t('Style 5'),
      'file' => 'overlay_05.png',
      'file path' => $file_path,
    ),
    'style_06' => array(
      'name' => t('Style 6'),
      'file' => 'overlay_06.png',
      'file path' => $file_path,
    ),
    'style_07' => array(
      'name' => t('Style 7'),
      'file' => 'overlay_07.png',
      'file path' => $file_path,
    ),
    'style_08' => array(
      'name' => t('Style 8'),
      'file' => 'overlay_08.png',
      'file path' => $file_path,
    ),
    'style_09' => array(
      'name' => t('Style 9'),
      'file' => 'overlay_09.png',
      'file path' => $file_path,
    ),
    'style_10' => array(
      'name' => t('Style 10'),
      'file' => 'overlay_10.png',
      'file path' => $file_path,
    ),
    'style_11' => array(
      'name' => t('Style 11'),
      'file' => 'overlay_11.png',
      'file path' => $file_path,
    ),
    'style_12' => array(
      'name' => t('Style 12'),
      'file' => 'overlay_12.png',
      'file path' => $file_path,
    ),
    'style_13' => array(
      'name' => t('Style 13'),
      'file' => 'overlay_13.png',
      'file path' => $file_path,
    ),
    'style_14' => array(
      'name' => t('Style 14'),
      'file' => 'overlay_14.png',
      'file path' => $file_path,
    ),
  );

  // Additional overlay options by other modules.
  $overlay_additions = module_invoke_all('supersized_overlay');
  foreach ($overlay_additions as $k => $addition) {
    $overlay[$k] = $addition;
  }

  // Return specify overlay info.
  if ($overlay_key !== NULL) {
    return $overlay[$overlay_key];
  }
  return $overlay;
}

/**
 * Return available overlay patterns.
 */
function supersized_overlay_options() {
  $options['none'] = t('None');
  $overlays = supersized_overlay();
  foreach ($overlays as $k => $overlay) {
    $path = url($overlay['file path'] . '/' . $overlay['file']);
    $options[$k] = '<div class="supersized-overlay-option"><div class="supersized-overlay-preview" style="background: url(' . $path . ') transparent repeat;"></div>' . $overlay['name'] . '</div>';
  }
  return $options;
}

Functions

Namesort descending Description
supersized_admin_paths Implements hook_admin_paths().
supersized_delete_node_settings Delete supersized settings by node.
supersized_form_process_radios A radios process function.
supersized_get_node_settings Get supersized settings by node.
supersized_get_supersized_field Get supersized field by node.
supersized_image_default_styles Implements hook_image_default_styles().
supersized_libraries_info Implements hook_library_info().
supersized_menu Implements hook_menu().
supersized_node_settings_access An access check helper function.
supersized_node_settings_delete_confirm Supersized setting delete confirm form.
supersized_node_settings_delete_confirm_submit Supersized setting delete confirm form handler.
supersized_node_settings_delete_submit Supersized setting delete button handler.
supersized_node_settings_form Supersized setting form for node.
supersized_node_settings_form_submit Submit handler for node supersized settings form.
supersized_overlay Return available overlay patterns.
supersized_overlay_options Return available overlay patterns.
supersized_page_alter Implements hook_page_alter().
supersized_permission Implements hook_permission().
supersized_run_supersized Start supersized with Supersized plugin.
supersized_theme Implements hook_theme().
template_preprocess_supersized_control_bar Theme fuction for control_bar.
theme_supersized_arrow_nav Theme fuction for arrow_nav.
theme_supersized_form_element Theme function of supersized_form_element.
theme_supersized_form_element_label Theme function of supersized_form_element_label.
theme_supersized_overlay Theme fuction for overlay.
theme_supersized_progress_bar Theme fuction for progress_var.
theme_supersized_thumbnail_navigation Theme fuction for thumbnail_navigation.
theme_supersized_thumb_links Theme fuction for thumb_links.