Mercurial > hg > rr-repo
diff sites/all/modules/flexslider/flexslider.module @ 2:b74b41bb73f0
-- Google analytics module
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Thu, 22 Aug 2013 17:22:54 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/flexslider/flexslider.module Thu Aug 22 17:22:54 2013 +0100 @@ -0,0 +1,588 @@ +<?php +/** + * @file + * A light-weight, customizable image gallery plugin for Drupal based on jQuery + */ + +define("FLEXSLIDER_VERSION", variable_get('flexslider_version', '2.0')); +define("FLEXSLIDER_DEBUG", variable_get('flexslider_debug', FALSE)); + +/** + * Implements hook_libraries_info(). + */ +function flexslider_libraries_info() { + $libraries['flexslider'] = array( + 'name' => 'FlexSlider', + 'vendor url' => 'http://www.woothemes.com/flexslider/', + 'download url' => 'https://github.com/woothemes/FlexSlider', + 'version arguments' => array( + 'file' => 'jquery.flexslider-min.js', + // jQuery FlexSlider v2.1 + 'pattern' => '/jQuery FlexSlider v(\d+\.+\d+)/', + 'lines' => 2, + ), + 'files' => array( + 'js' => array( + 'jquery.flexslider-min.js', + ), + 'css' => array( + 'flexslider.css', + ), + ), + 'integration files' => array( + 'flexslider' => array( + 'css' => array('assets/css/flexslider_img.css'), + ), + ), + ); + + return $libraries; +} + +/** + * Implements hook_libraries_info_alter(). + */ +function flexslider_libraries_info_alter(&$libraries) { + $debug = variable_get('flexslider_debug', FALSE); + if ($debug) { + // Switch to the unminified version of the library + if (isset($libraries['flexslider'])) { + $libraries['flexslider']['files']['js'] = array( + 'jquery.flexslider.js', + ); + } + } + + // Add support for jQuery Easing module + if (module_exists('jqeasing')) { + $libraries['flexslider']['dependencies'][] = 'easing (>=1.3)'; + } +} + +/** + * Implements hook_library(). + * + * We also define FlexSlider through the core library callbacks + */ +function flexslider_library() { + $module_path = drupal_get_path('module', 'flexslider'); + $library_path = libraries_get_path('flexslider'); + + $libraries['flexslider'] = array( + 'title' => 'FlexSlider', + 'website' => 'http://flexslider.woothemes.com', + 'version' => FLEXSLIDER_VERSION, + 'js' => array( + $library_path . '/jquery.flexslider-min.js' => array( + 'scope' => 'footer', + ), + ), + 'css' => array( + $library_path . '/flexslider.css' => array( + 'type' => 'file', + 'media' => 'screen', + ), + $module_path . '/assets/css/flexslider_img.css' => array( + 'type' => 'file', + 'media' => 'screen', + ), + ), + ); + return $libraries; +} + +/** + * Implements hook_library_alter(). + */ +function flexslider_library_alter(&$libraries, $module) { + // Enable debug mode + if (FLEXSLIDER_DEBUG) { + if ($module == 'flexslider' and isset($libraries['flexslider'])) { + $libraries['flexslider']['js'] = array( + libraries_get_path() . '/jquery.flexslider.js' => array( + 'scope' => 'footer', + ), + ); + } + } +} + +/** + * Implements hook_permission(). + */ +function flexslider_permission() { + return array( + 'administer flexslider' => array( + 'title' => t('Administer the FlexSlider module'), + ), + ); +} + +/** + * Implements hook_menu(). + */ +function flexslider_menu() { + $items = array(); + + $items['admin/config/media/flexslider/advanced'] = array( + 'title' => 'Advanced settings', + 'description' => 'Configure the advanced flexslider module settings.', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('flexslider_form_settings'), + 'access arguments' => array('administer flexslider'), + 'type' => MENU_LOCAL_TASK, + 'weight' => 2, + 'file' => 'flexslider.admin.inc', + ); + + return $items; +} + +/** + * Implements hook_help(). + */ +function flexslider_help($path, $arg) { + switch ($path) { + case 'admin/config/media/flexslider/edit/%': + return + '<p>' + . t('An <em>option set</em> defines exactly how a flexslider image gallery looks like on your site. ' + . 'It is s a combination of <a href="@styles">image styles</a> for the various image sizes and FlexSlider library options.', array('@styles' => url('admin/config/media/image-styles'))) . '<br />' + . t('For a full documentation of all options, refer to the official @docs.', array('@docs' => l(t('FlexSlider documentation'), 'http://www.woothemes.com/flexslider/'))) + . '</p>'; + } +} + +/** + * Implements hook_theme(). + */ +function flexslider_theme() { + return array( + // Container for nav elements (arrows) + 'flexslider' => array( + 'variables' => array('items' => array(), 'settings' => array()), + 'template' => 'theme/flexslider', + 'file' => 'theme/flexslider.theme.inc', + ), + 'flexslider_list' => array( + 'variables' => array('items' => array(), 'settings' => array()), + 'file' => 'theme/flexslider.theme.inc', + ), + 'flexslider_list_item' => array( + 'variables' => array('item' => array(), 'settings' => array()), + 'file' => 'theme/flexslider.theme.inc', + ), + ); +} + +/** + * Implements hook_image_default_styles(). + */ +function flexslider_image_default_styles() { + $styles = array(); + + // Default image preset for FlexSlider + $styles['flexslider_full'] = array( + 'effects' => array( + array( + 'name' => 'image_scale_and_crop', + 'data' => array('width' => 800, 'height' => 500), + 'weight' => 0, + ), + ), + ); + + // Default image preset for FlexSlider thumbnails + $styles['flexslider_thumbnail'] = array( + 'effects' => array( + array( + 'name' => 'image_scale_and_crop', + 'data' => array('width' => 160, 'height' => 100), + 'weight' => 0, + ), + ), + ); + + return $styles; +} + +/** + * Implements hook_ctools_plugin_api(). + */ +function flexslider_ctools_plugin_api($owner, $api) { + if ($owner == 'flexslider' && $api == 'flexslider_default_preset') { + return array('version' => 1); + } +} + +/** + * Implements hook_ctools_plugin_directory(). + */ +function flexslider_ctools_plugin_directory($module, $type) { + if ($type == 'export_ui') { + return 'plugins/export_ui'; + } +} + +/** + * Create a new optionset object + * + * Note that this function does not save the optionset to the database. + * @see flexslider_optionset_save() + */ +function flexslider_optionset_create($values = array()) { + ctools_include('export'); + $optionset = ctools_export_crud_new('flexslider_optionset'); + + // Set the options to an array + $optionset->options = array(); + + // Assign specified values + if (isset($values['name'])) { + $optionset->name = $values['name']; + } + if (isset($values['title'])) { + $optionset->title = $values['title']; + } + if (isset($values['options']) and is_array($values['options'])) { + $optionset->options = $values['options']; + } + + // Merge default settings with any given settings + $optionset_defaults = _flexslider_optionset_defaults(); + $optionset->options = $optionset_defaults += $optionset->options; + + return $optionset; +} + +/** + * Fetches all option sets from the database and returns them as an associative array. + */ +function flexslider_optionset_load_all() { + ctools_include('export'); + $optionsets = ctools_export_crud_load_all('flexslider_optionset'); + foreach ($optionsets as $optionset) { + // Ensure the optionset is typecast after being loaded from DB + _flexslider_typecast_optionset($optionset->options); + } + return $optionsets; +} + +/** + * Fetches the given option set and returns it as an object or NULL, if no set could be found. + */ +function flexslider_optionset_load($optionset_name) { + ctools_include('export'); + $optionset = ctools_export_crud_load('flexslider_optionset', $optionset_name); + // Ensure the optionset is typecast after being loaded from DB + _flexslider_typecast_optionset($optionset->options); + return $optionset; +} + +/** + * Checks whether an option set with the given name already exists. + */ +function flexslider_optionset_exists($optionset_name) { + ctools_include('export'); + $optionset = ctools_export_crud_load('flexslider_optionset', $optionset_name); + return isset($optionset->name); +} + +/** + * Saves the given option set to the database. + * Set the $new flag if this set has not been written before. + * + * @return object|boolean + * Returns the newly saved object, FALSE otherwise. + */ +function flexslider_optionset_save($optionset, $new = FALSE) { + // If the machine name is missing or already in use, return an error. + if (empty($optionset->name) or (FALSE != flexslider_optionset_exists($optionset->name) and $new)) { + return FALSE; + } + + // Check for an invalid list of options + if (isset($optionset->options) and !is_array($optionset->options)) { + return FALSE; + } + + + // If the title is missing, default to the name + if (empty($optionset->title)) { + $optionset->title = $optionset->name; + } + + // Merge default settings with any given settings + $optionset_defaults = _flexslider_optionset_defaults(); + $optionset->options = $optionset_defaults += $optionset->options; + + // Prepare the database values. + $db_values = array( + 'name' => $optionset->name, + 'title' => $optionset->title, + 'options' => _flexslider_typecast_optionset($optionset->options), + ); + + if ($new) { + $result = drupal_write_record('flexslider_optionset', $db_values); + } + else { + $result = drupal_write_record('flexslider_optionset', $db_values, 'name'); + } + + // Return the object if the values were saved successfully. + if (($new and SAVED_NEW == $result) or (!$new and SAVED_UPDATED == $result)) { + return $optionset; + } + + // Otherwise, an error occured + return FALSE; +} + +/** + * Deletes the given option set from the database. + * + * @param object|string $optionset + * Optionset object or machine name + */ +function flexslider_optionset_delete($optionset) { + if (isset($optionset->name)) { + $name = $optionset->name; + } + else { + $name = $optionset; + } + db_delete('flexslider_optionset')->condition('name', $name)->execute(); +} + +/* + * This function loads the required JavaScripts and settings for a flexslider + * instance. + * + * @param string $id [optional] + * ID Attribute for FlexSlider container + * @param object|strong $optionset [optional] + * Option set to load or the machine name of an existing optionset + */ +function flexslider_add($id = NULL, $optionset = NULL) { + // Check optionset value + if (is_string($optionset)) { + $name = $optionset; + $optionset = flexslider_optionset_load($name); + if (empty($optionset)) { + watchdog('flexslider', 'Invalid optionset name supplied to flexslider_add: @name', array('@name' => $name), WATCHDOG_WARNING); + return; + } + } + + // Static array to remember which scripts are already attached. + // @todo not currently in use + $cache = &drupal_static(__FUNCTION__, array()); + + // @todo investigate the best way to cache data loaded from libraries_load() + libraries_load('flexslider'); + + // If the ID or optionset aren't set, it is assumed the settings will be set + // manually via the calling module/theme + if (!empty($id) && !empty($optionset)) { + // JavaScript settings + $js_settings = array( + 'optionsets' => array( + $optionset->name => $optionset->options, + ), + 'instances' => array( + $id => $optionset->name, + ), + ); + // @todo add alter hook for optionset + drupal_add_js(array('flexslider' => $js_settings), 'setting'); + } + // Loader JavaScript + drupal_add_js(drupal_get_path('module', 'flexslider') . '/assets/js/flexslider.load.js', array('type' => 'file', 'scope' => 'footer')); +} + +/** + * Default settings for a newly created option set + * + * @param string $key [optional] + * Get specific default value + * + * @see https://github.com/woothemes/FlexSlider/blob/master/README.mdown + * @see https://github.com/woothemes/FlexSlider/wiki/FlexSlider-Properties + */ +function _flexslider_optionset_defaults($key = NULL) { + + // We add typecasts to ensure the variables get json encoded properly + + $defaults = array( + // v2.x options + 'namespace' => 'flex-', + 'selector' => '.slides > li', + 'easing' => 'swing', + 'direction' => 'horizontal', + 'reverse' => FALSE, // @todo verify data value + 'smoothHeight' => FALSE, // @todo verify data value + 'startAt' => 0, + 'animationSpeed' => 600, + 'initDelay' => 0, + 'useCSS' => TRUE, + 'touch' => TRUE, + 'video' => FALSE, + 'keyboard' => TRUE, + 'multipleKeyboard' => FALSE, + 'mousewheel' => FALSE, // requires https://github.com/brandonaaron/jquery-mousewheel @todo add to make file + 'controlsContainer' => '.flex-control-nav-container', + 'sync' => '', + 'asNavFor' => '', + 'itemWidth' => 0, + 'itemMargin' => 0, + 'minItems' => 0, + 'maxItems' => 0, + 'move' => 0, + //'start' => '', + //'before' => '', + //'after' => '', + //'end' => '', + //'added' => '', + //'removed' => '', + + // @todo verify the 1.x options are still valid + // v1.x options + 'animation' => 'fade', + //'animationDuration' => 6000, -- replaced by 'animationSpeed' + //'slidedirection' => 'horizontal', -- replaced by "direction" + 'slideshow' => TRUE, + 'slideshowSpeed' => 7000, + 'directionNav' => TRUE, + 'controlNav' => TRUE, + //'keyboardnav' => TRUE, -- replaced by 'keyboard' + //'mousewheel' => FALSE, + 'prevText' => t('Previous'), + 'nextText' => t('Next'), + 'pausePlay' => FALSE, + 'pauseText' => t('Pause'), + 'playText' => t('Play'), + 'randomize' => FALSE, + //'slidetostart' => 0, // integer value, not boolean -- replace by "startAt" + 'animationLoop' => TRUE, + 'pauseOnAction' => TRUE, + 'pauseOnHover' => FALSE, + //'controlscontainer' => '.flex-nav-container', -- updated in v2 + 'manualControls' => '', + //'startCallback' => 'function() {}', -- replace by 'start' + //'beforeCallback' => 'function() {}', -- replaced by 'before' + //'afterCallback' => 'function() {}', -- replaced by 'after' + //'endCallback' => 'function() {}', -- replaced by 'end' + ); + + // Typecast the values + _flexslider_typecast_optionset($defaults); + + // Return the specific item + if (isset($key) and array_key_exists($key, $defaults)) { + return $defaults[$key]; + } + + // Return all items + return $defaults; +} + +/** + * Adds the typecasting to the values so that the generated + * json array keeps the right values + */ +function _flexslider_typecast_optionset(&$options) { + if (isset($options) && !empty($options)) { + foreach ($options as $key => $value) { + switch ($key) { + case 'namespace': + case 'selector': + case 'easing': + case 'direction': + case 'controlsContainer': + case 'sync': + case 'asNavFor': + case 'fade': + case 'prevText': + case 'nextText': + case 'pauseText': + case 'playText': + case 'manualControls': + $options[$key] = (string)$value; + break; + case 'startAt': + case 'animationSpeed': + case 'initDelay': + case 'itemWidth': + case 'itemMargin': + case 'minItems': + case 'maxItems': + case 'move': + $options[$key] = (int)$value; + break; + case 'controlNav': + if ($value == 'thumbnails') { + $options[$key] = (string)$value; + break; + } + case 'reverse': + case 'smoothHeight': + case 'useCSS': + case 'touch': + case 'video': + case 'keyboard': + case 'multipleKeyboard': + case 'mouseWheel': + case 'slideshow': + case 'directionNav': + case 'pausePlay': + case 'randomize': + case 'animationLoop': + case 'pauseOnAction': + case 'pauseOnHover': + $options[$key] = (boolean)$value; + break; + } + } + } +} + +/** + * List of all easing methods available from jQuery Easing v1.3 + */ +function _flexslider_jqeasing_options() { + return array( + "jswing" => "jswing", + "def" => "def", + "easeInQuad" => "easeInQuad", + "easeOutQuad" => "easeOutQuad", + "easeInOutQuad" => "easeInOutQuad", + "easeInCubic" => "easeInCubic", + "easeOutCubic" => "easeOutCubic", + "easeInOutCubic" => "easeInOutCubic", + "easeInQuart" => "easeInQuart", + "easeOutQuart" => "easeOutQuart", + "easeInOutQuart" => "easeInOutQuart", + "easeInQuint" => "easeInQuint", + "easeOutQuint" => "easeOutQuint", + "easeInOutQuint" => "easeInOutQuint", + "easeInSine" => "easeInSine", + "easeOutSine" => "easeOutSine", + "easeInOutSine" => "easeInOutSine", + "easeInExpo" => "easeInExpo", + "easeOutExpo" => "easeOutExpo", + "easeInOutExpo" => "easeInOutExpo", + "easeInCirc" => "easeInCirc", + "easeOutCirc" => "easeOutCirc", + "easeInOutCirc" => "easeInOutCirc", + "easeInElastic" => "easeInElastic", + "easeOutElastic" => "easeOutElastic", + "easeInOutElastic" => "easeInOutElastic", + "easeInBack" => "easeInBack", + "easeOutBack" => "easeOutBack", + "easeInOutBack" => "easeInOutBack", + "easeInBounce" => "easeInBounce", + "easeOutBounce" => "easeOutBounce", + "easeInOutBounce" => "easeInOutBounce", + ); +} \ No newline at end of file