cms/drupal/sites/all/modules/masonry/masonry.module
changeset 541 e756a8c72c3d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/drupal/sites/all/modules/masonry/masonry.module	Fri Sep 08 12:04:06 2017 +0200
@@ -0,0 +1,282 @@
+<?php
+/**
+ * @file
+ * Provides an API for integrating the jQuery Masonry plugin with Drupal.
+ */
+
+/**
+ * Implements hook_libraries_info().
+ */
+function masonry_libraries_info() {
+  $libraries['masonry'] = array(
+    'name' => 'Masonry',
+    'vendor url' => 'http://masonry.desandro.com/',
+    'download url' => 'http://masonry.desandro.com/',
+    'version arguments' => array(
+      'file' => 'masonry.pkgd.min.js',
+      // Masonry 3.x
+      'pattern' => '/Masonry\s+PACKAGED\s+v?([0-9\.]+)/',
+      'lines' => 2,
+      'cols' => 30,
+    ),
+    'files' => array(
+      'js' => array(
+        'masonry.pkgd.min.js',
+      ),
+    ),
+  );
+  $libraries['imagesloaded'] = array(
+    'name' => 'Images Loaded',
+    'vendor url' => 'http://desandro.github.io/imagesloaded',
+    'download url' => 'http://desandro.github.io/imagesloaded/imagesloaded.pkgd.min.js',
+    'version arguments' => array(
+      'file' => 'imagesloaded.pkgd.min.js',
+      // imagesLoaded 3.x
+      'pattern' => '/imagesLoaded\s+PACKAGED\s+v?([0-9\.]+)/',
+      'lines' => 2,
+      'cols' => 30,
+    ),
+    'files' => array(
+      'js' => array(
+        'imagesloaded.pkgd.min.js',
+      ),
+    ),
+  );
+
+  return $libraries;
+}
+
+/**
+ * Check if the Masonry and imagesLoaded libraries are installed.
+ *
+ * @return
+ *   A boolean indicating the installed status.
+ */
+function masonry_installed() {
+  $masonry = libraries_detect('masonry');
+  $imagesloaded = libraries_detect('imagesloaded');
+  if ((!empty($masonry['installed'])) && (!empty($imagesloaded['installed']))) {
+    return TRUE;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Check if the Masonry and imagesLoaded libraries have been loaded.
+ *
+ * @return
+ *   A boolean indicating the loaded status.
+ */
+function masonry_loaded() {
+  $masonry = libraries_load('masonry');
+  $imagesloaded = libraries_load('imagesloaded');
+  if ((!empty($masonry['loaded'])) && (!empty($imagesloaded['loaded']))) {
+    return TRUE;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Get default Masonry options.
+ *
+ * @return
+ *   An associative array of default options for Masonry.
+ *   Contains:
+ *   - masonry_column_width: The width of each column (in pixels or as a
+ *     percentage).
+ *   - masonry_column_width_units: The units to use for the column width ('px'
+ *     or '%').
+ *   - masonry_gutter_width: The spacing between each column (in pixels).
+ *   - masonry_resizable: Automatically rearrange items when the container is
+ *     resized.
+ *   - masonry_animated: Animate item rearrangements.
+ *   - masonry_animation_duration: The duration of animations (in milliseconds).
+ *   - masonry_fit_width: Sets the width of the container to the nearest column.
+ *     Ideal for centering Masonry layouts.
+ *   - masonry_rtl: Display items from right-to-left.
+ *   - masonry_images_first: Load all images first before triggering Masonry.
+ */
+function masonry_default_options() {
+  $options = array(
+    'masonry_column_width' => '',
+    'masonry_column_width_units' => 'px',
+    'masonry_gutter_width' => '0',
+    'masonry_resizable' => 1,
+    'masonry_animated' => 0,
+    'masonry_animation_duration' => '500',
+    'masonry_fit_width' => 0,
+    'masonry_rtl' => 0,
+    'masonry_images_first' => 1,
+    'masonry_stamp_selector' => ''
+  );
+
+  // Allow other modules to alter the default options
+  drupal_alter('masonry_default_options', $options);
+
+  return $options;
+}
+
+/**
+ * Add Masonry options to an existing form.
+ *
+ * @param $form
+ *   A form array to add Masonry options to.
+ * @param $default_values
+ *   An array of default form values.
+ */
+function masonry_add_options_to_form(&$form, $default_values) {
+  $form['masonry_column_width'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Column width'),
+    '#description' => t("The width of each column, enter pixels, percentage, or string of css selector"),
+    '#default_value' => $default_values['masonry_column_width'],
+  );
+  $form['masonry_column_width_units'] = array(
+    '#type' => 'radios',
+    '#title' => t('Column width units'),
+    '#description' => t("The units to use for the column width."),
+    '#options' => array(
+      'px' => t("Pixels"),
+      '%' => t("Percentage (of container's width)"),
+      'css' => t("CSS selector (you must configure your css to set widths for .masonry-item)"),
+    ),
+    '#default_value' => $default_values['masonry_column_width_units'],
+  );
+  $form['masonry_gutter_width'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Gutter width'),
+    '#description' => t("The spacing between each column."),
+    '#default_value' => $default_values['masonry_gutter_width'],
+    '#size' => 4,
+    '#maxlength' => 3,
+    '#field_suffix' => t('px'),
+  );
+  $form['masonry_stamp_selector'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Stamp Selector'),
+    '#description' => t("Specifies which elements are stamped within the layout using css selector"),
+    '#default_value' => $default_values['masonry_stamp_selector']
+  );
+  $form['masonry_resizable'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Resizable'),
+    '#description' => t("Automatically rearrange items when the container is resized."),
+    '#default_value' => $default_values['masonry_resizable'],
+  );
+  $form['masonry_animated'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Animated'),
+    '#description' => t("Animate item rearrangements."),
+    '#default_value' => $default_values['masonry_animated'],
+    '#states' => array(
+      'visible' => array(
+        'input.form-checkbox[name$="[masonry_resizable]"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+  $form['masonry_animation_duration'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Animation duration'),
+    '#description' => t("The duration of animations (1000 ms = 1 sec)."),
+    '#default_value' => $default_values['masonry_animation_duration'],
+    '#size' => 5,
+    '#maxlength' => 4,
+    '#field_suffix' => t('ms'),
+    '#states' => array(
+      'visible' => array(
+        'input.form-checkbox[name$="[masonry_resizable]"]' => array('checked' => TRUE),
+        'input.form-checkbox[name$="[masonry_animated]"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+  $form['masonry_fit_width'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Fit width'),
+    '#description' => t("Sets the width of the container to the nearest column. Ideal for centering Masonry layouts. See the <a href='http://masonry.desandro.com/demos/centered.html'>'Centered' demo</a> for more information."),
+    '#default_value' => $default_values['masonry_fit_width'],
+  );
+  $form['masonry_rtl'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('RTL layout'),
+    '#description' => t("Display items from right-to-left."),
+    '#default_value' => $default_values['masonry_rtl'],
+  );
+  $form['masonry_images_first'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Load images first'),
+    '#description' => t("Load all images first before triggering Masonry."),
+    '#default_value' => $default_values['masonry_images_first'],
+  );
+
+  // Allow other modules to alter the form
+  drupal_alter('masonry_options_form', $form, $default_values);
+}
+
+/**
+ * Apply Masonry to a container.
+ *
+ * @param $container
+ *   The CSS selector of the container element to apply Masonry to.
+ * @param $options
+ *   An associative array of Masonry options.
+ *   Contains:
+ *   - masonry_item_selector: The CSS selector of the items within the
+ *     container.
+ *   - masonry_column_width: The width of each column (in pixels or as a
+ *     percentage).
+ *   - masonry_column_width_units: The units to use for the column width ('px'
+ *     or '%').
+ *   - masonry_gutter_width: The spacing between each column (in pixels).
+ *   - masonry_resizable: Automatically rearrange items when the container is
+ *     resized.
+ *   - masonry_animated: Animate item rearrangements.
+ *   - masonry_animation_duration: The duration of animations (in milliseconds).
+ *   - masonry_fit_width: Sets the width of the container to the nearest column.
+ *     Ideal for centering Masonry layouts.
+ *   - masonry_rtl: Display items from right-to-left.
+ *   - masonry_images_first: Load all images first before triggering Masonry.
+ */
+function masonry_apply($container, $options = array()) {
+  if (masonry_loaded() && !empty($container)) {
+    // For any options not specified, use default options
+    $options += masonry_default_options();
+    if (!isset($options['masonry_item_selector'])) {
+      $options['masonry_item_selector'] = '';
+    }
+
+    // Setup Masonry script
+    $masonry = array(
+      'masonry' => array(
+        $container => array(
+          'item_selector' => $options['masonry_item_selector'],
+          'column_width' => $options['masonry_column_width'],
+          'column_width_units' => $options['masonry_column_width_units'],
+          'gutter_width' => (int) $options['masonry_gutter_width'],
+          'resizable' => (bool) $options['masonry_resizable'],
+          'animated' => (bool) $options['masonry_animated'],
+          'animation_duration' => (int) $options['masonry_animation_duration'],
+          'fit_width' => (bool) $options['masonry_fit_width'],
+          'rtl' => (bool) $options['masonry_rtl'],
+          'images_first' => (bool) $options['masonry_images_first'],
+          'stamp' => $options['masonry_stamp_selector']
+        ),
+      ),
+    );
+    $script_file = drupal_get_path('module', 'masonry') . '/masonry.js';
+
+    // Allow other modules to alter the Masonry script
+    $context = array(
+      'container' => $container,
+      'options' => $options,
+    );
+    drupal_alter('masonry_script', $masonry, $script_file, $context);
+
+    // Apply the script
+    drupal_add_js($masonry, 'setting');
+    drupal_add_js($script_file);
+  }
+}