diff --git a/profiles/wcm_base/CHANGELOG.txt b/profiles/wcm_base/CHANGELOG.txt index 45be2251493c5e47720d15866032de406a22f5c9..4c17fe1f946c36abf6c15031dfe7c31445f94aa7 100644 --- a/profiles/wcm_base/CHANGELOG.txt +++ b/profiles/wcm_base/CHANGELOG.txt @@ -1,3 +1,8 @@ +WCM Base 7.x-1.x, 2015-07-14 +---------------------------- +- Media Magnet: added OpenOSU module to allow adding Media Magnet feeds. +- OCIO Panels Settings: Media Magnet modifications. + WCM Base 7.x-1.x, 2015-07-13 ---------------------------- - Media: updated to 7.x-2.0-alpha4 @@ -17,7 +22,6 @@ WCM Base 7.x-1.x, 2015-07-07 - OCIO Omega Base: Fixed image overflow, image captions and missing mobile menu icon. - OCIO Omega Base: Added 3x3 tile grid to 'ocio-omega-tiles-equalcol' panels layout. - WCM Base 7.x-1.x, 2015-07-06 ---------------------------- - Created changelog. diff --git a/profiles/wcm_base/modules/custom/mm/.gitignore b/profiles/wcm_base/modules/custom/mm/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..67b702362efd43c0fd499fe25d8045fdbc3793af --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/.gitignore @@ -0,0 +1,13 @@ +# OSX hidden files +.DS_Store +.AppleDouble +.LSOverride +Icon +._* +.Spotlight-V100 +.Trashes + +# Windows hidden files +Thumbs.db +ehthumbs.db +$RECYCLE.BIN/ diff --git a/profiles/wcm_base/modules/custom/mm/README.md b/profiles/wcm_base/modules/custom/mm/README.md new file mode 100644 index 0000000000000000000000000000000000000000..aa35f2d292ac1fb394d8d94f4f1df2f46c7b8a94 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/README.md @@ -0,0 +1,27 @@ +Media Magnet +============ + +This is a collection of Drupal modules providing integration with Media Magenet + +Vocabularies (mm_vocab) +----------------------- + + * Creates one vocabulary per media magnet group. + * Dynamically syncs vocabularies at installation and cron. + * Adds hooks to create vocabularies based on things like directories. + * Creates a single MM base field. + +### Installation + 1. Download the `entityreference`, `features`, `mm_vocab`, `mm_vocab_field`, `mm_example` modules + 2. Enable `mm_vocab` + 3. Enable the `mm_vocab_field` and `mm_example` features + 4. Add the newly created `field_media_magnet_keywords` field to any of your content types you wish to add the field to + +Widgets (mm_widgets) +-------------------- + + * Allows for creation of one or more blocks pulling in Media Magnet content. + * Supports [Multiblock](https://www.drupal.org/project/multiblock). + * Supports [Panels](https://www.drupal.org/project/panels) + * Block-level configuration of template to render item. + * All content is loaded and rendered client side via Javascript -- no need to cache content items. diff --git a/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.field_base.inc b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.field_base.inc new file mode 100644 index 0000000000000000000000000000000000000000..0327507e17ba448f57ed9a7c2a615c0fa858e551 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.field_base.inc @@ -0,0 +1,48 @@ +<?php +/** + * @file + * mm_example.features.field_base.inc + */ + +/** + * Implements hook_field_default_field_bases(). + */ +function mm_example_field_default_field_bases() { + $field_bases = array(); + + // Exported field_base: 'field_media_magnet_keywords' + $field_bases['field_media_magnet_keywords'] = array( + 'active' => 1, + 'cardinality' => -1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_media_magnet_keywords', + 'indexes' => array( + 'target_id' => array( + 0 => 'target_id', + ), + ), + 'locked' => 0, + 'module' => 'entityreference', + 'settings' => array( + 'handler' => 'views', + 'handler_settings' => array( + 'behaviors' => array( + 'views-select-list' => array( + 'status' => 1, + ), + ), + 'view' => array( + 'args' => array(), + 'display_name' => 'entityreference_1', + 'view_name' => 'media_magnet_filter', + ), + ), + 'target_type' => 'taxonomy_term', + ), + 'translatable' => 0, + 'type' => 'entityreference', + ); + + return $field_bases; +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.field_instance.inc b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.field_instance.inc new file mode 100644 index 0000000000000000000000000000000000000000..62f9fe340f88e18a4f861feaf36b435239bae4a8 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.field_instance.inc @@ -0,0 +1,110 @@ +<?php +/** + * @file + * mm_example.features.field_instance.inc + */ + +/** + * Implements hook_field_default_field_instances(). + */ +function mm_example_field_default_field_instances() { + $field_instances = array(); + + // Exported field_instance: 'node-media_magnet_example-body' + $field_instances['node-media_magnet_example-body'] = array( + 'bundle' => 'media_magnet_example', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array(), + 'type' => 'text_default', + 'weight' => 0, + ), + 'teaser' => array( + 'label' => 'hidden', + 'module' => 'text', + 'settings' => array( + 'trim_length' => 600, + ), + 'type' => 'text_summary_or_trimmed', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'body', + 'label' => 'Body', + 'required' => FALSE, + 'settings' => array( + 'display_summary' => TRUE, + 'text_processing' => 1, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'module' => 'text', + 'settings' => array( + 'rows' => 20, + 'summary_rows' => 5, + ), + 'type' => 'text_textarea_with_summary', + 'weight' => 31, + ), + ); + + // Exported field_instance: + // 'node-media_magnet_example-field_media_magnet_keywords' + $field_instances['node-media_magnet_example-field_media_magnet_keywords'] = array( + 'bundle' => 'media_magnet_example', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'above', + 'module' => 'entityreference', + 'settings' => array( + 'link' => FALSE, + ), + 'type' => 'entityreference_label', + 'weight' => 1, + ), + 'teaser' => array( + 'label' => 'above', + 'settings' => array(), + 'type' => 'hidden', + 'weight' => 0, + ), + ), + 'entity_type' => 'node', + 'field_name' => 'field_media_magnet_keywords', + 'label' => 'Media Magnet Keywords', + 'required' => 0, + 'settings' => array( + 'behaviors' => array( + 'taxonomy-index' => array( + 'status' => TRUE, + ), + ), + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array( + 'apply_chosen' => '', + ), + 'type' => 'options_select', + 'weight' => 33, + ), + ); + + // Translatables + // Included for use with string extractors like potx. + t('Body'); + t('Media Magnet Keywords'); + + return $field_instances; +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.inc b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.inc new file mode 100644 index 0000000000000000000000000000000000000000..a4514066a9ae7ef3fd02db1eda62f60631c00b3c --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.features.inc @@ -0,0 +1,32 @@ +<?php +/** + * @file + * mm_example.features.inc + */ + +/** + * Implements hook_ctools_plugin_api(). + */ +function mm_example_ctools_plugin_api($module = NULL, $api = NULL) { + if ($module == "strongarm" && $api == "strongarm") { + return array("version" => "1"); + } +} + +/** + * Implements hook_node_info(). + */ +function mm_example_node_info() { + $items = array( + 'media_magnet_example' => array( + 'name' => t('Media Magnet Example'), + 'base' => 'node_content', + 'description' => t('Example content type '), + 'has_title' => '1', + 'title_label' => t('Title'), + 'help' => '', + ), + ); + drupal_alter('node_info', $items); + return $items; +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.info b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.info new file mode 100644 index 0000000000000000000000000000000000000000..7779c6b2de1401893864670acfdb2a3e568e72c7 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.info @@ -0,0 +1,25 @@ +name = Media Magnet Example +description = Example feature for getting the Media Magnet Vocab module fully set up. +core = 7.x +package = Media Magnet +version = 7.x-1.0 +dependencies[] = entityreference +dependencies[] = features +dependencies[] = mm_vocab +dependencies[] = options +dependencies[] = text +features[ctools][] = strongarm:strongarm:1 +features[features_api][] = api:2 +features_exclude[field_base][] = field_media_magnet_keywords +features[field_instance][] = node-media_magnet_example-body +features[field_instance][] = node-media_magnet_example-field_media_magnet_keywords +features[node][] = media_magnet_example +features[variable][] = field_bundle_settings_node__media_magnet_example +features[variable][] = language_content_type_media_magnet_example +features[variable][] = menu_options_media_magnet_example +features[variable][] = menu_parent_media_magnet_example +features[variable][] = node_options_media_magnet_example +features[variable][] = node_preview_media_magnet_example +features[variable][] = node_submitted_media_magnet_example +features_exclude[field_base][] = field_media_magnet_keywords +features_exclude[dependencies][strongarm] = strongarm diff --git a/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.module b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.module new file mode 100644 index 0000000000000000000000000000000000000000..e5a8bc02afae25043fc30a91ae5f230e1a412b1f --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.module @@ -0,0 +1,7 @@ +<?php +/** + * @file + * Code for the Media Magnet Example feature. + */ + +include_once 'mm_example.features.inc'; diff --git a/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.strongarm.inc b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.strongarm.inc new file mode 100644 index 0000000000000000000000000000000000000000..0949751ca39b46310bf84118c329ad4858d72fef --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_example/mm_example.strongarm.inc @@ -0,0 +1,81 @@ +<?php +/** + * @file + * mm_example.strongarm.inc + */ + +/** + * Implements hook_strongarm(). + */ +function mm_example_strongarm() { + $export = array(); + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'field_bundle_settings_node__media_magnet_example'; + $strongarm->value = array( + 'view_modes' => array(), + 'extra_fields' => array( + 'form' => array( + 'title' => array( + 'weight' => '-5', + ), + 'path' => array( + 'weight' => '30', + ), + ), + 'display' => array(), + ), + ); + $export['field_bundle_settings_node__media_magnet_example'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'language_content_type_media_magnet_example'; + $strongarm->value = '0'; + $export['language_content_type_media_magnet_example'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'menu_options_media_magnet_example'; + $strongarm->value = array( + 0 => 'main-menu', + ); + $export['menu_options_media_magnet_example'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'menu_parent_media_magnet_example'; + $strongarm->value = 'main-menu:0'; + $export['menu_parent_media_magnet_example'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_options_media_magnet_example'; + $strongarm->value = array( + 0 => 'status', + 1 => 'promote', + ); + $export['node_options_media_magnet_example'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_preview_media_magnet_example'; + $strongarm->value = '1'; + $export['node_preview_media_magnet_example'] = $strongarm; + + $strongarm = new stdClass(); + $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */ + $strongarm->api_version = 1; + $strongarm->name = 'node_submitted_media_magnet_example'; + $strongarm->value = 1; + $export['node_submitted_media_magnet_example'] = $strongarm; + + return $export; +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab/MmVocabSyncService.inc b/profiles/wcm_base/modules/custom/mm/mm_vocab/MmVocabSyncService.inc new file mode 100644 index 0000000000000000000000000000000000000000..277f89922dcd6bb70d748afc132c6a4382ec1d95 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab/MmVocabSyncService.inc @@ -0,0 +1,109 @@ +<?php + +class MmVocabSyncService { + + /** + * Fetches an associative array of categories and keywords. + * + * @return array + * An associative array of categories and keywords. + */ + public static function fetch() { + $categories = array(); + $page = 0; + $last = 1; + while ($page < $last) { + $page++; + $path = "https://mediamagnet.osu.edu/api/v1/keywords.json?page=$page"; + $request = drupal_http_request($path); + $result = json_decode($request->data); + $last = $result->meta->total_pages; + foreach ($result->keywords as $keyword) { + $categories[$keyword->category][] = $keyword; + } + } + return $categories; + } + + /** + * Create and synchronize vocabularies. + */ + public static function sync() { + $categories = MmVocabSyncService::fetch(); + foreach ($categories as $category => $keywords) { + + // Create the vocabulary if it doesn't exist. + $machine_name = 'mm_' . $category; + $plural = ucfirst($category) . 's'; + $vocab = taxonomy_vocabulary_machine_name_load($machine_name); + if (!$vocab) { + $vocab = new stdClass(); + MmVocabSyncService::addDisplayName($machine_name); + } + + // Update and save vocabulary. + $vocab->name = $plural . ' (Media Magnet)'; + $vocab->machine_name = $machine_name; + $vocab->description = $plural . ' keywords from Media Magnet'; + $vocab->hierarchy = 0; + $vocab->module = 'mm'; + $vocab->weight = 0; + taxonomy_vocabulary_save($vocab); + + // Create each term if it doesn't exist. + foreach ($keywords as $keyword) { + $term = taxonomy_get_term_by_name($keyword->name, $machine_name); + if (!$term) { + $term = new stdClass(); + $term->name = $keyword->name; + $term->field_mm_display_name[LANGUAGE_NONE][0]['value'] = $keyword->display_name; + $term->description = $keyword->description; + $term->vid = $vocab->vid; + taxonomy_term_save($term); + } + } + } + } + + /** + * @param $machine_name + * Machine name of the target vocabulary. + */ + private static function addDisplayName($machine_name) { + + $field_name = 'field_mm_display_name'; + if (!field_info_field($field_name)) { + $field = array( + 'field_name' => $field_name, + 'type' => 'text', + 'label' => t('Display name')); + field_create_field($field); + } + + // Attach the field to our taxonomy entity + $instance = array( + 'field_name' => 'field_mm_display_name', + 'entity_type' => 'taxonomy_term', + 'bundle' => $machine_name, + 'label' => t('Display name'), + 'description' => t('Human readable name'), + 'required' => true, + 'widget' => array( + 'type' => 'text_textfield', + 'settings'=> array( + 'max_width'=>60, + ) + ), + ); + field_create_instance($instance); + } + + public static function uninstall() { + $vocabs = taxonomy_get_vocabularies(); + foreach ($vocabs as $vid => $vocab) { + if ($vocab->module == 'mm') { + taxonomy_vocabulary_delete($vid); + } + } + } +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.drush.inc b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.drush.inc new file mode 100644 index 0000000000000000000000000000000000000000..a391e24fc3621be07610bb29e911892c67399701 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.drush.inc @@ -0,0 +1,31 @@ +<?php +include_once 'mm_vocab.module'; + +// register drush commands +function mm_vocab_drush_command() { + $items = array(); + + // register individual Drush commands + $items['mm-vocabulary-sync'] = array( + 'description' => dt('Syncs the Media Magnet vocabularies'), + 'drupal dependencies' => array('mm_vocab'), + 'examples' => array( + 'Example 1' => 'drush mm-vocabulary-sync', + 'Example 2' => 'drush mm-vsync', + ), + 'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_FULL, + 'aliases' => array('mm-vsync'), + ); + + // return list of drush commands + return $items; +} + +// mm-vocabulary-sync function +function drush_mm_vocab_mm_vocabulary_sync() { + drush_log('Syncing vocabularies now...', 'ok'); + + mm_vocab_cron(); + + drush_log('Sync complete!', 'ok'); +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.info b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.info new file mode 100644 index 0000000000000000000000000000000000000000..048289ed0bd16a31263312de8950f974984a4dee --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.info @@ -0,0 +1,11 @@ +name = Media Magnet Vocabularies +description = Vocabularies and synchronization logic for Media Magnet +core = 7.x +package = Media Magnet +version = 7.x-1.0 +project = mm +dependencies[] = entityreference +dependencies[] = features +dependencies[] = taxonomy +dependencies[] = views +files[] = MmVocabSyncService.inc diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.install b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.install new file mode 100644 index 0000000000000000000000000000000000000000..72038b1e0d9eb26b4ab088ec6d87efadee9b2e1f --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.install @@ -0,0 +1,22 @@ +<?php + +/** + * @file + * Installation methods. + */ + +/** + * Implements hook_install(). + */ +function mm_vocab_install() { + + MmVocabSyncService::sync(); + +} + +/** + * Implements hook_uninstall(). + */ +function mm_vocab_uninstall() { + MmVocabSyncService::uninstall(); +} \ No newline at end of file diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.module b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.module new file mode 100644 index 0000000000000000000000000000000000000000..fa899ff7cce7a894c46cbf582c96ee9132368292 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.module @@ -0,0 +1,21 @@ +<?php +/** + * @file + * Code for the Media Magnet Vocabularies feature. + */ + +// include_once 'mm_vocab.features.inc'; + +/** + * @file + * Code for the OSU News feature. + */ + +include_once 'mm_vocab.widget.inc'; + +/** + * Implements hook_cron(). + */ +function mm_vocab_cron() { + MmVocabSyncService::sync(); +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.views_default.inc b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.views_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..78d99eebd8986c03d3a541b8608901b58d803d62 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.views_default.inc @@ -0,0 +1,57 @@ +<?php +/** + * @file + * mm_vocab.views_default.inc + */ + +/** + * Implements hook_views_default_views(). + */ +function mm_vocab_views_default_views() { + $export = array(); + + $view = new view(); + $view->name = 'mm_autocomplete'; + $view->description = ''; + $view->tag = 'default'; + $view->base_table = 'taxonomy_term_data'; + $view->human_name = 'mm_autocomplete'; + $view->core = 7; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Master */ + $handler = $view->new_display('default', 'Master', 'default'); + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['access']['type'] = 'perm'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['style_plugin'] = 'default'; + $handler->display->display_options['row_plugin'] = 'fields'; + /* Field: Taxonomy term: Display name */ + $handler->display->display_options['fields']['field_mm_display_name']['id'] = 'field_mm_display_name'; + $handler->display->display_options['fields']['field_mm_display_name']['table'] = 'field_data_field_mm_display_name'; + $handler->display->display_options['fields']['field_mm_display_name']['field'] = 'field_mm_display_name'; + $handler->display->display_options['fields']['field_mm_display_name']['label'] = ''; + $handler->display->display_options['fields']['field_mm_display_name']['element_label_colon'] = FALSE; + + /* Display: Entity Reference */ + $handler = $view->new_display('entityreference', 'Entity Reference', 'entityreference_1'); + $handler->display->display_options['defaults']['title'] = FALSE; + $handler->display->display_options['pager']['type'] = 'some'; + $handler->display->display_options['defaults']['style_plugin'] = FALSE; + $handler->display->display_options['style_plugin'] = 'entityreference_style'; + $handler->display->display_options['style_options']['search_fields'] = array( + 'field_mm_display_name' => 'field_mm_display_name', + 'name' => 0, + ); + $handler->display->display_options['defaults']['style_options'] = FALSE; + $handler->display->display_options['defaults']['row_plugin'] = FALSE; + $handler->display->display_options['row_plugin'] = 'entityreference_fields'; + $handler->display->display_options['defaults']['row_options'] = FALSE; + $export['mm_autocomplete'] = $view; + + return $export; +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.widget.inc b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.widget.inc new file mode 100644 index 0000000000000000000000000000000000000000..a4abe2dafcb3fabac023b6d4630c24fed41379c0 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab/mm_vocab.widget.inc @@ -0,0 +1,2 @@ +<?php + diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.features.field_base.inc b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.features.field_base.inc new file mode 100644 index 0000000000000000000000000000000000000000..fe2421062c2c67fc0ef223eacd681252fd904df1 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.features.field_base.inc @@ -0,0 +1,48 @@ +<?php +/** + * @file + * mm_vocab_field.features.field_base.inc + */ + +/** + * Implements hook_field_default_field_bases(). + */ +function mm_vocab_field_field_default_field_bases() { + $field_bases = array(); + + // Exported field_base: 'field_media_magnet_keywords' + $field_bases['field_media_magnet_keywords'] = array( + 'active' => 1, + 'cardinality' => -1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_media_magnet_keywords', + 'indexes' => array( + 'target_id' => array( + 0 => 'target_id', + ), + ), + 'locked' => 0, + 'module' => 'entityreference', + 'settings' => array( + 'handler' => 'views', + 'handler_settings' => array( + 'behaviors' => array( + 'views-select-list' => array( + 'status' => 1, + ), + ), + 'view' => array( + 'args' => array(), + 'display_name' => 'entityreference_1', + 'view_name' => 'media_magnet_filter', + ), + ), + 'target_type' => 'taxonomy_term', + ), + 'translatable' => 0, + 'type' => 'entityreference', + ); + + return $field_bases; +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.features.inc b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.features.inc new file mode 100644 index 0000000000000000000000000000000000000000..4466e7620d708ae37ad990fc1e4040e47c910dc7 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.features.inc @@ -0,0 +1,12 @@ +<?php +/** + * @file + * mm_vocab_field.features.inc + */ + +/** + * Implements hook_views_api(). + */ +function mm_vocab_field_views_api($module = NULL, $api = NULL) { + return array("api" => "3.0"); +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.info b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.info new file mode 100644 index 0000000000000000000000000000000000000000..de9989d1d2b8ec377385ed878af068433b4a5939 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.info @@ -0,0 +1,14 @@ +name = Media Magnet Vocabulary Feature +description = Feature for getting Media Magnet vocabulary field imported +core = 7.x +package = Media Magnet +version = 7.x-1.0 +dependencies[] = entityreference +dependencies[] = features +dependencies[] = mm_vocab +dependencies[] = views +features[ctools][] = views:views_default:3.0 +features[features_api][] = api:2 +features[field_base][] = field_media_magnet_keywords +features[views_view][] = media_magnet_filter +features_exclude[dependencies][ctools] = ctools diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.module b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.module new file mode 100644 index 0000000000000000000000000000000000000000..ca52ab9a37264ffc75834dc91c5dd7216f37c782 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.module @@ -0,0 +1,7 @@ +<?php +/** + * @file + * Code for the Media Magnet Vocabulary Feature feature. + */ + +include_once 'mm_vocab_field.features.inc'; diff --git a/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.views_default.inc b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.views_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..518256d70a5c94339c702776d2a2d19ee7d37346 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_vocab_field/mm_vocab_field.views_default.inc @@ -0,0 +1,124 @@ +<?php +/** + * @file + * mm_vocab_field.views_default.inc + */ + +/** + * Implements hook_views_default_views(). + */ +function mm_vocab_field_views_default_views() { + $export = array(); + + $view = new view(); + $view->name = 'media_magnet_filter'; + $view->description = ''; + $view->tag = 'default'; + $view->base_table = 'taxonomy_term_data'; + $view->human_name = 'Media Magnet Filter'; + $view->core = 7; + $view->api_version = '3.0'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Master */ + $handler = $view->new_display('default', 'Master', 'default'); + $handler->display->display_options['use_more_always'] = FALSE; + $handler->display->display_options['access']['type'] = 'perm'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['style_plugin'] = 'default'; + $handler->display->display_options['row_plugin'] = 'fields'; + /* Field: Taxonomy term: Display name */ + $handler->display->display_options['fields']['field_mm_display_name']['id'] = 'field_mm_display_name'; + $handler->display->display_options['fields']['field_mm_display_name']['table'] = 'field_data_field_mm_display_name'; + $handler->display->display_options['fields']['field_mm_display_name']['field'] = 'field_mm_display_name'; + $handler->display->display_options['fields']['field_mm_display_name']['label'] = ''; + $handler->display->display_options['fields']['field_mm_display_name']['element_label_colon'] = FALSE; + /* Field: Taxonomy term: Name */ + $handler->display->display_options['fields']['name']['id'] = 'name'; + $handler->display->display_options['fields']['name']['table'] = 'taxonomy_term_data'; + $handler->display->display_options['fields']['name']['field'] = 'name'; + $handler->display->display_options['fields']['name']['label'] = ''; + $handler->display->display_options['fields']['name']['exclude'] = TRUE; + $handler->display->display_options['fields']['name']['alter']['word_boundary'] = FALSE; + $handler->display->display_options['fields']['name']['alter']['ellipsis'] = FALSE; + $handler->display->display_options['fields']['name']['element_label_colon'] = FALSE; + $handler->display->display_options['fields']['name']['link_to_taxonomy'] = TRUE; + /* Field: Taxonomy vocabulary: Name */ + $handler->display->display_options['fields']['name_1']['id'] = 'name_1'; + $handler->display->display_options['fields']['name_1']['table'] = 'taxonomy_vocabulary'; + $handler->display->display_options['fields']['name_1']['field'] = 'name'; + $handler->display->display_options['fields']['name_1']['label'] = ''; + $handler->display->display_options['fields']['name_1']['exclude'] = TRUE; + $handler->display->display_options['fields']['name_1']['element_label_colon'] = FALSE; + /* Sort criterion: Taxonomy vocabulary: Name */ + $handler->display->display_options['sorts']['name']['id'] = 'name'; + $handler->display->display_options['sorts']['name']['table'] = 'taxonomy_vocabulary'; + $handler->display->display_options['sorts']['name']['field'] = 'name'; + /* Filter criterion: Taxonomy term: Vocabulary */ + $handler->display->display_options['filters']['vid']['id'] = 'vid'; + $handler->display->display_options['filters']['vid']['table'] = 'taxonomy_term_data'; + $handler->display->display_options['filters']['vid']['field'] = 'vid'; + + /* get list of media magnet vocabularies in the system */ + // FIXME this will get overwritten when the feature is recreated + $vocabularies = taxonomy_vocabulary_get_names(); + $mm_vids = array(); + + foreach ($vocabularies as $vocab) { + $machine_name = $vocab->machine_name; + if (substr($machine_name, 0, 3) == 'mm_') { + $mm_vid = $vocab->vid; + $mm_vids[$mm_vid] = "$mm_vid"; + } + } + + $handler->display->display_options['filters']['vid']['value'] = $mm_vids; + + /* Display: Entity Reference */ + $handler = $view->new_display('entityreference', 'Entity Reference', 'entityreference_1'); + $handler->display->display_options['defaults']['title'] = FALSE; + $handler->display->display_options['pager']['type'] = 'some'; + $handler->display->display_options['pager']['options']['items_per_page'] = '0'; + $handler->display->display_options['pager']['options']['offset'] = '0'; + $handler->display->display_options['defaults']['style_plugin'] = FALSE; + $handler->display->display_options['style_plugin'] = 'entityreference_style'; + $handler->display->display_options['style_options']['grouping'] = array( + 0 => array( + 'field' => 'name_1', + 'rendered' => 1, + 'rendered_strip' => 0, + ), + ); + $handler->display->display_options['style_options']['search_fields'] = array( + 'field_mm_display_name' => 'field_mm_display_name', + 'name' => 0, + 'name_1' => 0, + ); + $handler->display->display_options['defaults']['style_options'] = FALSE; + $handler->display->display_options['defaults']['row_plugin'] = FALSE; + $handler->display->display_options['row_plugin'] = 'entityreference_fields'; + $handler->display->display_options['defaults']['row_options'] = FALSE; + $translatables['media_magnet_filter'] = array( + t('Master'), + t('more'), + t('Apply'), + t('Reset'), + t('Sort by'), + t('Asc'), + t('Desc'), + t('Items per page'), + t('- All -'), + t('Offset'), + t('« first'), + t('‹ previous'), + t('next ›'), + t('last »'), + t('Entity Reference'), + ); + $export['media_magnet_filter'] = $view; + + return $export; +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_widgets/LICENSE b/profiles/wcm_base/modules/custom/mm/mm_widgets/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..4df7d1aae6fbbdf501a9409827e88412d3030530 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_widgets/LICENSE @@ -0,0 +1,11 @@ +The MIT License + +Copyright (c) 2009 Chris Wanstrath (Ruby) +Copyright (c) 2010-2014 Jan Lehnardt (JavaScript) +Copyright (c) 2010-2015 The mustache.js community + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/profiles/wcm_base/modules/custom/mm/mm_widgets/js/mm_widgets.js b/profiles/wcm_base/modules/custom/mm/mm_widgets/js/mm_widgets.js new file mode 100644 index 0000000000000000000000000000000000000000..a47e6fb4c02f973b5aa87836a3dfbad6632b9414 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_widgets/js/mm_widgets.js @@ -0,0 +1,25 @@ +(function($) { + var container = document.getElementById(Drupal.settings.mm_widgets.container_id); + var template = document.getElementById(Drupal.settings.mm_widgets.template_id).innerHTML; + var url = Drupal.settings.mm_widgets.url; + var limit = Drupal.settings.mm_widgets.limit; + + $.getJSON(url, {per_page: limit}, function(data) { + $.each(data.items, function(idx, item) { + item['formatted_published_at'] = moment(item['published_at']).fromNow(); + var html = Mustache.to_html(template, item); + $(container).append(html); + }); + }).done(function() { + }).fail(function() { + $('body').append('<h1>Error Connecting to Media Magnet</h1>'); + + }); + + $(document).on('click', '.filter', function() { + var showItems = $('article.'+$(this).data('filter')).show(); + var hideItems = $('article').not('.'+$(this).data('filter')).hide(); + $(container).masonry('layout'); + }); + +})(jQuery); diff --git a/profiles/wcm_base/modules/custom/mm/mm_widgets/js/moment.js b/profiles/wcm_base/modules/custom/mm/mm_widgets/js/moment.js new file mode 100644 index 0000000000000000000000000000000000000000..275a3c3249d09b805fee83d8ed188f6337a163f2 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_widgets/js/moment.js @@ -0,0 +1,3111 @@ +//! moment.js +//! version : 2.10.3 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, function () { 'use strict'; + + var hookCallback; + + function utils_hooks__hooks () { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } + + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function create_utc__createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + function valid__isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + m._isValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + } + return m._isValid; + } + + function valid__createInvalid (flags) { + var m = create_utc__createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + var momentProperties = utils_hooks__hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = getParsingFlags(from); + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + var updateInProgress = false; + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + utils_hooks__hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function Locale() { + } + + var locales = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && typeof module !== 'undefined' && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we + // want to undo that for lazy loaded locales + locale_locales__getSetGlobalLocale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function locale_locales__getSetGlobalLocale (key, values) { + var data; + if (key) { + if (typeof values === 'undefined') { + data = locale_locales__getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + } + + return globalLocale._abbr; + } + + function defineLocale (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + locale_locales__getSetGlobalLocale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + // returns locale data + function locale_locales__getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + var aliases = {}; + + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + get_set__set(this, unit, value); + utils_hooks__hooks.updateOffset(this, keepTime); + return this; + } else { + return get_set__get(this, unit); + } + }; + } + + function get_set__get (mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function get_set__set (mom, unit, value) { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + + // MOMENTS + + function getSet (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + return this[units](value); + } + } + return this; + } + + function zeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g; + + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + + var formatFunctions = {}; + + var formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf + + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + + // any word (or two) characters or numbers including two/three word month in arabic. + var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; + + var regexes = {}; + + function addRegexToken (token, regex, strictRegex) { + regexes[token] = typeof regex === 'function' ? regex : function (isStrict) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } + + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (typeof callback === 'number') { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', matchWord); + addRegexToken('MMMM', matchWord); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m) { + return this._months[m.month()]; + } + + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m) { + return this._monthsShort[m.month()]; + } + + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + + // MOMENTS + + function setMonth (mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + utils_hooks__hooks.updateOffset(this, true); + return this; + } else { + return get_set__get(this, 'Month'); + } + } + + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } + + function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + function warn(msg) { + if (utils_hooks__hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true, + msgWithStack = msg + '\n' + (new Error()).stack; + + return extend(function () { + if (firstTime) { + warn(msgWithStack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + utils_hooks__hooks.suppressDeprecationWarnings = false; + + var from_string__isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], + ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], + ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], + ['GGGG-[W]WW', /\d{4}-W\d{2}/], + ['YYYY-DDD', /\d{4}-\d{3}/] + ]; + + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ]; + + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = from_string__isoRegex.exec(string); + + if (match) { + getParsingFlags(config).iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(matchOffset)) { + config._f += 'Z'; + } + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + utils_hooks__hooks.createFromInputFallback(config); + } + } + + utils_hooks__hooks.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + function createDate (y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYY', 'YYYYY', 'YYYYYY'], YEAR); + addParseToken('YY', function (input, array) { + array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input); + }); + + // HELPERS + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + // HOOKS + + utils_hooks__hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', false); + + function getIsLeapYear () { + return isLeapYear(this.year()); + } + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = local__createLocal(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = createUTCDate(year, 0, 1).getUTCDay(); + var daysToAdd; + var dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year : dayOfYear > 0 ? year : year - 1, + dayOfYear : dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()]; + } + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year); + week = defaults(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + utils_hooks__hooks.ISO_8601 = function () {}; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === utils_hooks__hooks.ISO_8601) { + configFromISO(config); + return; + } + + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (getParsingFlags(config).bigHour === true && + config._a[HOUR] <= 12 && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); + } + + + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } + } + + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!valid__isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = [i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond]; + + configFromArray(config); + } + + function createFromConfig (config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || locale_locales__getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return valid__createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else if (isDate(input)) { + config._d = input; + } else { + configFromInput(config); + } + + res = new Moment(checkOverflow(config)); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function configFromInput(config) { + var input = config._i; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (typeof(input) === 'object') { + configFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + utils_hooks__hooks.createFromInputFallback(config); + } + } + + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); + } + + function local__createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function () { + var other = local__createLocal.apply(null, arguments); + return other < this ? this : other; + } + ); + + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function () { + var other = local__createLocal.apply(null, arguments); + return other > this ? this : other; + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return local__createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = locale_locales__getLocale(); + + this._bubble(); + } + + function isDuration (obj) { + return obj instanceof Duration; + } + + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } + + offset('Z', ':'); + offset('ZZ', ''); + + // PARSING + + addRegexToken('Z', matchOffset); + addRegexToken('ZZ', matchOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(input); + }); + + // HELPERS + + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(string) { + var matches = ((string || '').match(matchOffset) || []); + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? +input : +local__createLocal(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + utils_hooks__hooks.updateOffset(res, false); + return res; + } else { + return local__createLocal(input).local(); + } + return model._isUTC ? local__createLocal(input).zone(model._offset || 0) : local__createLocal(input).local(); + } + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + utils_hooks__hooks.updateOffset = function () {}; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + utils_hooks__hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } + + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(offsetFromString(this._i)); + } + return this; + } + + function hasAlignedHourOffset (input) { + if (!input) { + input = 0; + } + else { + input = local__createLocal(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + } + + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); + } + + function isDaylightSavingTimeShifted () { + if (this._a) { + var other = this._isUTC ? create_utc__createUTC(this._a) : local__createLocal(this._a); + return this.isValid() && compareArrays(this._a, other.toArray()) > 0; + } + + return false; + } + + function isLocal () { + return !this._isUTC; + } + + function isUtcOffset () { + return this._isUTC; + } + + function isUtc () { + return this._isUTC && this._offset === 0; + } + + var aspNetRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/; + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + var create__isoRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/; + + function create__createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = create__isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + d : parseIso(match[4], sign), + h : parseIso(match[5], sign), + m : parseIso(match[6], sign), + s : parseIso(match[7], sign), + w : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + } + + create__createDuration.fn = Duration.prototype; + + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = create__createDuration(val, period); + add_subtract__addSubtract(this, dur, direction); + return this; + }; + } + + function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding); + } + if (months) { + setMonth(mom, get_set__get(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + utils_hooks__hooks.updateOffset(mom, days || months); + } + } + + var add_subtract__add = createAdder(1, 'add'); + var add_subtract__subtract = createAdder(-1, 'subtract'); + + function moment_calendar__calendar (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || local__createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, local__createLocal(now))); + } + + function clone () { + return new Moment(this); + } + + function isAfter (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = isMoment(input) ? input : local__createLocal(input); + return +this > +input; + } else { + inputMs = isMoment(input) ? +input : +local__createLocal(input); + return inputMs < +this.clone().startOf(units); + } + } + + function isBefore (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = isMoment(input) ? input : local__createLocal(input); + return +this < +input; + } else { + inputMs = isMoment(input) ? +input : +local__createLocal(input); + return +this.clone().endOf(units) < inputMs; + } + } + + function isBetween (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + } + + function isSame (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = isMoment(input) ? input : local__createLocal(input); + return +this === +input; + } else { + inputMs = +local__createLocal(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + } + + function absFloor (number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + function diff (input, units, asFloat) { + var that = cloneWithOffset(input, this), + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4, + delta, output; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + delta = this - that; + output = units === 'second' ? delta / 1e3 : // 1000 + units === 'minute' ? delta / 6e4 : // 1000 * 60 + units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + delta; + } + return asFloat ? output : absFloor(output); + } + + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function moment_format__toISOString () { + var m = this.clone().utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } + + function format (inputString) { + var output = formatMoment(this, inputString || utils_hooks__hooks.defaultFormat); + return this.localeData().postformat(output); + } + + function from (time, withoutSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } + + function fromNow (withoutSuffix) { + return this.from(local__createLocal(), withoutSuffix); + } + + function to (time, withoutSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } + + function toNow (withoutSuffix) { + return this.to(local__createLocal(), withoutSuffix); + } + + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = locale_locales__getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + + function localeData () { + return this._locale; + } + + function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + } + + function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + } + + function to_type__valueOf () { + return +this._d - ((this._offset || 0) * 60000); + } + + function unix () { + return Math.floor(+this / 1000); + } + + function toDate () { + return this._offset ? new Date(+this) : this._d; + } + + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } + + function moment_valid__isValid () { + return valid__isValid(this); + } + + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } + + function invalidAt () { + return getParsingFlags(this).overflow; + } + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = utils_hooks__hooks.parseTwoDigitYear(input); + }); + + // HELPERS + + function weeksInYear(year, dow, doy) { + return weekOfYear(local__createLocal([year, 11, 31 + dow - doy]), dow, doy).week; + } + + // MOMENTS + + function getSetWeekYear (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + } + + function getSetISOWeekYear (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + } + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); + } + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + addFormatToken('Q', 0, 0, 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + return isStrict ? locale._ordinalParse : locale._ordinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0], 10); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', matchWord); + addRegexToken('ddd', matchWord); + addRegexToken('dddd', matchWord); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config) { + var weekday = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + // LOCALES + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m) { + return this._weekdays[m.day()]; + } + + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return this._weekdaysShort[m.day()]; + } + + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return this._weekdaysMin[m.day()]; + } + + function localeWeekdaysParse (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = local__createLocal([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, function () { + return this.hours() % 12 || 12; + }); + + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + + // LOCALES + + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + + // MOMENTS + + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + function millisecond__milliseconds (token) { + addFormatToken(0, [token, 3], 0, 'millisecond'); + } + + millisecond__milliseconds('SSS'); + millisecond__milliseconds('SSSS'); + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + addRegexToken('SSSS', matchUnsigned); + addParseToken(['S', 'SS', 'SSS', 'SSSS'], function (input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + }); + + // MOMENTS + + var getSetMillisecond = makeGetSet('Milliseconds', false); + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var momentPrototype__proto = Moment.prototype; + + momentPrototype__proto.add = add_subtract__add; + momentPrototype__proto.calendar = moment_calendar__calendar; + momentPrototype__proto.clone = clone; + momentPrototype__proto.diff = diff; + momentPrototype__proto.endOf = endOf; + momentPrototype__proto.format = format; + momentPrototype__proto.from = from; + momentPrototype__proto.fromNow = fromNow; + momentPrototype__proto.to = to; + momentPrototype__proto.toNow = toNow; + momentPrototype__proto.get = getSet; + momentPrototype__proto.invalidAt = invalidAt; + momentPrototype__proto.isAfter = isAfter; + momentPrototype__proto.isBefore = isBefore; + momentPrototype__proto.isBetween = isBetween; + momentPrototype__proto.isSame = isSame; + momentPrototype__proto.isValid = moment_valid__isValid; + momentPrototype__proto.lang = lang; + momentPrototype__proto.locale = locale; + momentPrototype__proto.localeData = localeData; + momentPrototype__proto.max = prototypeMax; + momentPrototype__proto.min = prototypeMin; + momentPrototype__proto.parsingFlags = parsingFlags; + momentPrototype__proto.set = getSet; + momentPrototype__proto.startOf = startOf; + momentPrototype__proto.subtract = add_subtract__subtract; + momentPrototype__proto.toArray = toArray; + momentPrototype__proto.toDate = toDate; + momentPrototype__proto.toISOString = moment_format__toISOString; + momentPrototype__proto.toJSON = moment_format__toISOString; + momentPrototype__proto.toString = toString; + momentPrototype__proto.unix = unix; + momentPrototype__proto.valueOf = to_type__valueOf; + + // Year + momentPrototype__proto.year = getSetYear; + momentPrototype__proto.isLeapYear = getIsLeapYear; + + // Week Year + momentPrototype__proto.weekYear = getSetWeekYear; + momentPrototype__proto.isoWeekYear = getSetISOWeekYear; + + // Quarter + momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter; + + // Month + momentPrototype__proto.month = getSetMonth; + momentPrototype__proto.daysInMonth = getDaysInMonth; + + // Week + momentPrototype__proto.week = momentPrototype__proto.weeks = getSetWeek; + momentPrototype__proto.isoWeek = momentPrototype__proto.isoWeeks = getSetISOWeek; + momentPrototype__proto.weeksInYear = getWeeksInYear; + momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear; + + // Day + momentPrototype__proto.date = getSetDayOfMonth; + momentPrototype__proto.day = momentPrototype__proto.days = getSetDayOfWeek; + momentPrototype__proto.weekday = getSetLocaleDayOfWeek; + momentPrototype__proto.isoWeekday = getSetISODayOfWeek; + momentPrototype__proto.dayOfYear = getSetDayOfYear; + + // Hour + momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour; + + // Minute + momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute; + + // Second + momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond; + + // Millisecond + momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond; + + // Offset + momentPrototype__proto.utcOffset = getSetOffset; + momentPrototype__proto.utc = setOffsetToUTC; + momentPrototype__proto.local = setOffsetToLocal; + momentPrototype__proto.parseZone = setOffsetToParsedOffset; + momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset; + momentPrototype__proto.isDST = isDaylightSavingTime; + momentPrototype__proto.isDSTShifted = isDaylightSavingTimeShifted; + momentPrototype__proto.isLocal = isLocal; + momentPrototype__proto.isUtcOffset = isUtcOffset; + momentPrototype__proto.isUtc = isUtc; + momentPrototype__proto.isUTC = isUtc; + + // Timezone + momentPrototype__proto.zoneAbbr = getZoneAbbr; + momentPrototype__proto.zoneName = getZoneName; + + // Deprecations + momentPrototype__proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + momentPrototype__proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + momentPrototype__proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779', getSetZone); + + var momentPrototype = momentPrototype__proto; + + function moment__createUnix (input) { + return local__createLocal(input * 1000); + } + + function moment__createInZone () { + return local__createLocal.apply(null, arguments).parseZone(); + } + + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; + + function locale_calendar__calendar (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.call(mom, now) : output; + } + + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM D, YYYY LT' + }; + + function longDateFormat (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate () { + return this._invalidDate; + } + + var defaultOrdinal = '%d'; + var defaultOrdinalParse = /\d{1,2}/; + + function ordinal (number) { + return this._ordinal.replace('%d', number); + } + + function preParsePostFormat (string) { + return string; + } + + var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }; + + function relative__relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } + + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + } + + function locale_set__set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source); + } + + var prototype__proto = Locale.prototype; + + prototype__proto._calendar = defaultCalendar; + prototype__proto.calendar = locale_calendar__calendar; + prototype__proto._longDateFormat = defaultLongDateFormat; + prototype__proto.longDateFormat = longDateFormat; + prototype__proto._invalidDate = defaultInvalidDate; + prototype__proto.invalidDate = invalidDate; + prototype__proto._ordinal = defaultOrdinal; + prototype__proto.ordinal = ordinal; + prototype__proto._ordinalParse = defaultOrdinalParse; + prototype__proto.preparse = preParsePostFormat; + prototype__proto.postformat = preParsePostFormat; + prototype__proto._relativeTime = defaultRelativeTime; + prototype__proto.relativeTime = relative__relativeTime; + prototype__proto.pastFuture = pastFuture; + prototype__proto.set = locale_set__set; + + // Month + prototype__proto.months = localeMonths; + prototype__proto._months = defaultLocaleMonths; + prototype__proto.monthsShort = localeMonthsShort; + prototype__proto._monthsShort = defaultLocaleMonthsShort; + prototype__proto.monthsParse = localeMonthsParse; + + // Week + prototype__proto.week = localeWeek; + prototype__proto._week = defaultLocaleWeek; + prototype__proto.firstDayOfYear = localeFirstDayOfYear; + prototype__proto.firstDayOfWeek = localeFirstDayOfWeek; + + // Day of Week + prototype__proto.weekdays = localeWeekdays; + prototype__proto._weekdays = defaultLocaleWeekdays; + prototype__proto.weekdaysMin = localeWeekdaysMin; + prototype__proto._weekdaysMin = defaultLocaleWeekdaysMin; + prototype__proto.weekdaysShort = localeWeekdaysShort; + prototype__proto._weekdaysShort = defaultLocaleWeekdaysShort; + prototype__proto.weekdaysParse = localeWeekdaysParse; + + // Hours + prototype__proto.isPM = localeIsPM; + prototype__proto._meridiemParse = defaultLocaleMeridiemParse; + prototype__proto.meridiem = localeMeridiem; + + function lists__get (format, index, field, setter) { + var locale = locale_locales__getLocale(); + var utc = create_utc__createUTC().set(setter, index); + return locale[field](utc, format); + } + + function list (format, index, field, count, setter) { + if (typeof format === 'number') { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return lists__get(format, index, field, setter); + } + + var i; + var out = []; + for (i = 0; i < count; i++) { + out[i] = lists__get(format, i, field, setter); + } + return out; + } + + function lists__listMonths (format, index) { + return list(format, index, 'months', 12, 'month'); + } + + function lists__listMonthsShort (format, index) { + return list(format, index, 'monthsShort', 12, 'month'); + } + + function lists__listWeekdays (format, index) { + return list(format, index, 'weekdays', 7, 'day'); + } + + function lists__listWeekdaysShort (format, index) { + return list(format, index, 'weekdaysShort', 7, 'day'); + } + + function lists__listWeekdaysMin (format, index) { + return list(format, index, 'weekdaysMin', 7, 'day'); + } + + locale_locales__getSetGlobalLocale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // Side effect imports + utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale); + utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale); + + var mathAbs = Math.abs; + + function duration_abs__abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function duration_add_subtract__addSubtract (duration, input, value, direction) { + var other = create__createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function duration_add_subtract__add (input, value) { + return duration_add_subtract__addSubtract(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function duration_add_subtract__subtract (input, value) { + return duration_add_subtract__addSubtract(this, input, value, -1); + } + + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absFloor(daysToYears(days)); + days -= absFloor(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absFloor(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absFloor(years / 4) - + // absFloor(years / 100) + absFloor(years / 400); + return years * 146097 / 400; + } + + function as (units) { + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function duration_as__valueOf () { + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asYears = makeAs('y'); + + function duration_get__get (units) { + units = normalizeUnits(units); + return this[units + 's'](); + } + + function makeGetter(name) { + return function () { + return this._data[name]; + }; + } + + var duration_get__milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); + + function weeks () { + return absFloor(this.days() / 7); + } + + var round = Math.round; + var thresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) { + var duration = create__createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds < thresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set a threshold for relative time strings + function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + return true; + } + + function humanize (withSuffix) { + var locale = this.localeData(); + var output = duration_humanize__relativeTime(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); + } + + var iso_string__abs = Math.abs; + + function iso_string__toISOString() { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = iso_string__abs(this.years()); + var M = iso_string__abs(this.months()); + var D = iso_string__abs(this.days()); + var h = iso_string__abs(this.hours()); + var m = iso_string__abs(this.minutes()); + var s = iso_string__abs(this.seconds() + this.milliseconds() / 1000); + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (total < 0 ? '-' : '') + + 'P' + + (Y ? Y + 'Y' : '') + + (M ? M + 'M' : '') + + (D ? D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? h + 'H' : '') + + (m ? m + 'M' : '') + + (s ? s + 'S' : ''); + } + + var duration_prototype__proto = Duration.prototype; + + duration_prototype__proto.abs = duration_abs__abs; + duration_prototype__proto.add = duration_add_subtract__add; + duration_prototype__proto.subtract = duration_add_subtract__subtract; + duration_prototype__proto.as = as; + duration_prototype__proto.asMilliseconds = asMilliseconds; + duration_prototype__proto.asSeconds = asSeconds; + duration_prototype__proto.asMinutes = asMinutes; + duration_prototype__proto.asHours = asHours; + duration_prototype__proto.asDays = asDays; + duration_prototype__proto.asWeeks = asWeeks; + duration_prototype__proto.asMonths = asMonths; + duration_prototype__proto.asYears = asYears; + duration_prototype__proto.valueOf = duration_as__valueOf; + duration_prototype__proto._bubble = bubble; + duration_prototype__proto.get = duration_get__get; + duration_prototype__proto.milliseconds = duration_get__milliseconds; + duration_prototype__proto.seconds = seconds; + duration_prototype__proto.minutes = minutes; + duration_prototype__proto.hours = hours; + duration_prototype__proto.days = days; + duration_prototype__proto.weeks = weeks; + duration_prototype__proto.months = months; + duration_prototype__proto.years = years; + duration_prototype__proto.humanize = humanize; + duration_prototype__proto.toISOString = iso_string__toISOString; + duration_prototype__proto.toString = iso_string__toISOString; + duration_prototype__proto.toJSON = iso_string__toISOString; + duration_prototype__proto.locale = locale; + duration_prototype__proto.localeData = localeData; + + // Deprecations + duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString); + duration_prototype__proto.lang = lang; + + // Side effect imports + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + // Side effect imports + + + utils_hooks__hooks.version = '2.10.3'; + + setHookCallback(local__createLocal); + + utils_hooks__hooks.fn = momentPrototype; + utils_hooks__hooks.min = min; + utils_hooks__hooks.max = max; + utils_hooks__hooks.utc = create_utc__createUTC; + utils_hooks__hooks.unix = moment__createUnix; + utils_hooks__hooks.months = lists__listMonths; + utils_hooks__hooks.isDate = isDate; + utils_hooks__hooks.locale = locale_locales__getSetGlobalLocale; + utils_hooks__hooks.invalid = valid__createInvalid; + utils_hooks__hooks.duration = create__createDuration; + utils_hooks__hooks.isMoment = isMoment; + utils_hooks__hooks.weekdays = lists__listWeekdays; + utils_hooks__hooks.parseZone = moment__createInZone; + utils_hooks__hooks.localeData = locale_locales__getLocale; + utils_hooks__hooks.isDuration = isDuration; + utils_hooks__hooks.monthsShort = lists__listMonthsShort; + utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin; + utils_hooks__hooks.defineLocale = defineLocale; + utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort; + utils_hooks__hooks.normalizeUnits = normalizeUnits; + utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold; + + var _moment = utils_hooks__hooks; + + return _moment; + +})); \ No newline at end of file diff --git a/profiles/wcm_base/modules/custom/mm/mm_widgets/js/mustache.min.js b/profiles/wcm_base/modules/custom/mm/mm_widgets/js/mustache.min.js new file mode 100644 index 0000000000000000000000000000000000000000..58d9d5a99b99288e0c1ee3f396ac2a51fcd9d919 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_widgets/js/mustache.min.js @@ -0,0 +1 @@ +(function defineMustache(global,factory){if(typeof exports==="object"&&exports){factory(exports)}else if(typeof define==="function"&&define.amd){define(["exports"],factory)}else{Mustache={};factory(Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)==="[object Array]"};function isFunction(object){return typeof object==="function"}function escapeRegExp(string){return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function escapeHtml(string){return String(string).replace(/[&<>"'\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile==="string")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error("Invalid tags: "+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i<valueLength;++i){chr=value.charAt(i);if(isWhitespace(chr)){spaces.push(tokens.length)}else{nonSpace=true}tokens.push(["text",chr,start,start+1]);start+=1;if(chr==="\n")stripSpace()}}if(!scanner.scan(openingTagRe))break;hasTag=true;type=scanner.scan(tagRe)||"name";scanner.scan(whiteRe);if(type==="="){value=scanner.scanUntil(equalsRe);scanner.scan(equalsRe);scanner.scanUntil(closingTagRe)}else if(type==="{"){value=scanner.scanUntil(closingCurlyRe);scanner.scan(curlyRe);scanner.scanUntil(closingTagRe);type="&"}else{value=scanner.scanUntil(closingTagRe)}if(!scanner.scan(closingTagRe))throw new Error("Unclosed tag at "+scanner.pos);token=[type,value,start,scanner.pos];tokens.push(token);if(type==="#"||type==="^"){sections.push(token)}else if(type==="/"){openSection=sections.pop();if(!openSection)throw new Error('Unopened section "'+value+'" at '+start);if(openSection[1]!==value)throw new Error('Unclosed section "'+openSection[1]+'" at '+start)}else if(type==="name"||type==="{"||type==="&"){nonSpace=true}else if(type==="="){compileTags(value)}}openSection=sections.pop();if(openSection)throw new Error('Unclosed section "'+openSection[1]+'" at '+scanner.pos);return nestTokens(squashTokens(tokens))}function squashTokens(tokens){var squashedTokens=[];var token,lastToken;for(var i=0,numTokens=tokens.length;i<numTokens;++i){token=tokens[i];if(token){if(token[0]==="text"&&lastToken&&lastToken[0]==="text"){lastToken[1]+=token[1];lastToken[3]=token[3]}else{squashedTokens.push(token);lastToken=token}}}return squashedTokens}function nestTokens(tokens){var nestedTokens=[];var collector=nestedTokens;var sections=[];var token,section;for(var i=0,numTokens=tokens.length;i<numTokens;++i){token=tokens[i];switch(token[0]){case"#":case"^":collector.push(token);sections.push(token);collector=token[4]=[];break;case"/":section=sections.pop();section[5]=token[2];collector=sections.length>0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===""};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){value=context.view;names=name.split(".");index=0;while(value!=null&&index<names.length){if(index===names.length-1&&value!=null)lookupHit=typeof value==="object"&&value.hasOwnProperty(names[index]);value=value[names[index++]]}}else if(context.view!=null&&typeof context.view==="object"){value=context.view[name];lookupHit=context.view.hasOwnProperty(name)}if(lookupHit)break;context=context.parent}cache[name]=value}if(isFunction(value))value=value.call(this.view);return value};function Writer(){this.cache={}}Writer.prototype.clearCache=function clearCache(){this.cache={}};Writer.prototype.parse=function parse(template,tags){var cache=this.cache;var tokens=cache[template];if(tokens==null)tokens=cache[template]=parseTemplate(template,tags);return tokens};Writer.prototype.render=function render(template,view,partials){var tokens=this.parse(template);var context=view instanceof Context?view:new Context(view);return this.renderTokens(tokens,context,partials,template)};Writer.prototype.renderTokens=function renderTokens(tokens,context,partials,originalTemplate){var buffer="";var token,symbol,value;for(var i=0,numTokens=tokens.length;i<numTokens;++i){value=undefined;token=tokens[i];symbol=token[0];if(symbol==="#")value=this.renderSection(token,context,partials,originalTemplate);else if(symbol==="^")value=this.renderInverted(token,context,partials,originalTemplate);else if(symbol===">")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol==="&")value=this.unescapedValue(token,context);else if(symbol==="name")value=this.escapedValue(token,context);else if(symbol==="text")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j<valueLength;++j){buffer+=this.renderTokens(token[4],context.push(value[j]),partials,originalTemplate)}}else if(typeof value==="object"||typeof value==="string"||typeof value==="number"){buffer+=this.renderTokens(token[4],context.push(value),partials,originalTemplate)}else if(isFunction(value)){if(typeof originalTemplate!=="string")throw new Error("Cannot use higher-order sections without the original template");value=value.call(context.view,originalTemplate.slice(token[3],token[5]),subRender);if(value!=null)buffer+=value}else{buffer+=this.renderTokens(token[4],context,partials,originalTemplate)}return buffer};Writer.prototype.renderInverted=function renderInverted(token,context,partials,originalTemplate){var value=context.lookup(token[1]);if(!value||isArray(value)&&value.length===0)return this.renderTokens(token[4],context,partials,originalTemplate)};Writer.prototype.renderPartial=function renderPartial(token,context,partials){if(!partials)return;var value=isFunction(partials)?partials(token[1]):partials[token[1]];if(value!=null)return this.renderTokens(this.parse(value),context,partials,value)};Writer.prototype.unescapedValue=function unescapedValue(token,context){var value=context.lookup(token[1]);if(value!=null)return value};Writer.prototype.escapedValue=function escapedValue(token,context){var value=context.lookup(token[1]);if(value!=null)return mustache.escape(value)};Writer.prototype.rawValue=function rawValue(token){return token[1]};mustache.name="mustache.js";mustache.version="2.1.0";mustache.tags=["{{","}}"];var defaultWriter=new Writer;mustache.clearCache=function clearCache(){return defaultWriter.clearCache()};mustache.parse=function parse(template,tags){return defaultWriter.parse(template,tags)};mustache.render=function render(template,view,partials){return defaultWriter.render(template,view,partials)};mustache.to_html=function to_html(template,view,partials,send){var result=mustache.render(template,view,partials);if(isFunction(send)){send(result)}else{return result}};mustache.escape=escapeHtml;mustache.Scanner=Scanner;mustache.Context=Context;mustache.Writer=Writer}); diff --git a/profiles/wcm_base/modules/custom/mm/mm_widgets/mm_widgets.info b/profiles/wcm_base/modules/custom/mm/mm_widgets/mm_widgets.info new file mode 100644 index 0000000000000000000000000000000000000000..9ea2b2860512b438b9ad212b08cf248d4f621f99 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_widgets/mm_widgets.info @@ -0,0 +1,9 @@ +name = Media Magnet Widgets +description = Front-end presentation widgets for Media Magnet +core = 7.x +package = Media Magnet +version = 7.x-1.0 +project = mm +scripts[] = js/mustache.min.js +scripts[] = js/moment.js +dependencies[] = jquery_update diff --git a/profiles/wcm_base/modules/custom/mm/mm_widgets/mm_widgets.module b/profiles/wcm_base/modules/custom/mm/mm_widgets/mm_widgets.module new file mode 100644 index 0000000000000000000000000000000000000000..88ed664e1ecc3ef7ca48a7ddeffe58154bfd4c05 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_widgets/mm_widgets.module @@ -0,0 +1,211 @@ +<?php +/** + * @file + * Main module file for Media Magnet Widgets + */ + +/** + * Implements hook_ctools_plugin_directory(). + */ +function mm_widgets_ctools_plugin_directory($owner, $plugin_type) { + if (($owner == 'ctools' && $plugin_type == 'content_types')) { + return 'plugins/' . $plugin_type; + } +} + + +/** + * Implements hook_help(). + */ +function mm_widgets_help($path, $arg) { + switch ($path) { + // Main module help for the mm_widgets module + case 'admin/help#mm_widgets': + $content = '<p>' . t('Allows for creation of one or more blocks pulling in Media Magnet content. Each content item can be templated using Moustache. All items are loaded and rendered client side -- no need to cache content.') . '</p>'; + $content .= '<h3>' . t('Block') . '</h3><p>' . t('The Media Magnet Item block will pull Media Magnet content items and format them using a Moustache template.') . '</p>'; + $content .= '<dl><dt>' . t('Multiblock') . '</dt><dd>' . t('The Media Magnet block supports the <a href="https://www.drupal.org/project/multiblock">Multiblock</a> module, which allows several instances of the block to be configured with different settings') . '</dd></dl>'; + $content .= '<h3>' . t('Panels') . '</h3><p>' . t('Media Magnet provides a panels widget with the same configuration options as the block.') . '</p>'; + $content .= '<h3>' . t('Configuration') . '</h3>'; + $content .= '<dl><dt>' . t('Media Magnet items API URL') . '</dt><dd>' . t('The URL of the Media Magnet API call. You can use the <a href="https://mediamagnet.osu.edu/items ">items explorer</a> to build the call') . '</dd>'; + $content .= '<dt>' . t('Item template') . '</dt><dd>' . t('The markup for each content item. Uses the <a href="https://mustache.github.io">Moustache</a> templating engine. Available fields can be found in the <a href="https://mediamagnet.osu.edu/help/api/items#items-show">documentation</a>.') . '</dd></dl>'; + return $content; + } +} + + +/** + * Implements hook_block_info(). + */ +function mm_widgets_block_info() { + $blocks['mm_items'] = array( + 'info' => t('Media Magnet Items'), + 'mb_enabled' => true, + ); + + return $blocks; +} + + +/** + * Implements hook_block_configure(). + */ +function mm_widgets_block_configure($delta = '', $edit=array()) { + $form = array(); + + $default = _mm_widgets_block_template(); + + if ($delta == 'mm_items') { + $form[_mm_widgets_block_setting_name('mm_widgets_items_url', $edit)] = array( + '#type' => 'textfield', + '#title' => t('Media Magnet items API URL'), + '#required' => true, + '#default_value' => variable_get(_mm_widgets_block_setting_name('mm_widgets_items_url', $edit), 'https://mediamagnet.osu.edu/api/v1/items.json'), + ); + + $form[_mm_widgets_block_setting_name('mm_widgets_items_limit', $edit)] = array( + '#type' => 'select', + '#title' => t('Items to display'), + '#required' => true, + '#options' => array( + 0 => t('Show all'), + 5 => 5, + 10 => 10, + 15 => 15, + 20 => 20, + 25 => 25, + ), + '#default_value' => variable_get(_mm_widgets_block_setting_name('mm_widgets_items_limit', $edit), 10), + ); + + $form[_mm_widgets_block_setting_name('mm_widgets_items_template', $edit)] = array( + '#type' => 'textarea', + '#title' => t('Item template'), + '#required' => true, + '#description' => '<strong>' . t('Example') . '</strong><pre>' . htmlentities($default) . '</pre>', + '#default_value' => variable_get(_mm_widgets_block_setting_name('mm_widgets_items_template', $edit), $default), + ); + } + return $form; +} + + +/** + * Implements hook_block_save(). + */ +function mm_widgets_block_save($delta = '', $edit = array()) { + if ($delta == 'mm_items') { + variable_set(_mm_widgets_block_setting_name('mm_widgets_items_url', $edit), $edit[_mm_widgets_block_setting_name('mm_widgets_items_url', $edit)]); + variable_set(_mm_widgets_block_setting_name('mm_widgets_items_limit', $edit), $edit[_mm_widgets_block_setting_name('mm_widgets_items_limit', $edit)]); + variable_set(_mm_widgets_block_setting_name('mm_widgets_items_template', $edit), $edit[_mm_widgets_block_setting_name('mm_widgets_items_template', $edit)]); + } +} + + +/** + * Implements hook_block_view(). + */ +function mm_widgets_block_view($delta = '', $edit = array()) { + $url = variable_get(_mm_widgets_block_setting_name('mm_widgets_items_url', $edit), ''); + $limit = variable_get(_mm_widgets_block_setting_name('mm_widgets_items_limit', $edit), 10); + $container_id = _mm_widgets_block_setting_name('mm_items', $edit); + $template_id = _mm_widgets_block_setting_name('mm_item_template', $edit); + + $block = array(); + + switch ($delta) { + case 'mm_items': + $block['subject'] = t('Media Magnet Items'); + $block['content']['#markup'] = _mm_block_content($edit, $container_id, $template_id); + $block['content']['#attached']['js'][] = array( + 'data' => array( + 'mm_widgets' => array( + 'url' => $url, + 'limit' => $limit, + 'container_id' => $container_id, + 'template_id' => $template_id, + ) + ), + 'type' => 'setting', + ); + $block['content']['#attached']['js'][] = array( + 'data' => drupal_get_path('module', 'mm_widgets') . '/js/mm_widgets.js', + 'scope' => 'footer', + ); + break; + } + return $block; +} + + +/** + * Defines content for the Media Magnet items block + * + * @param array $edit + * The block edit array + * @param string $container_id + * The ID string for the item container DIV + * @param string $template_id + * The ID string for the template script tag + * + * @return string + * The block content markup + */ +function _mm_block_content($edit, $container_id, $template_id) { + $template = variable_get(_mm_widgets_block_setting_name('mm_widgets_items_template', $edit), _mm_widgets_block_template()); + + $output = <<<EOD +<script id="$template_id" type="text/html"> +$template +</script> +<div id="$container_id"></div> +EOD; + + return $output; +} + + +/** + * Creates a multiblock-compatible setting name + * + * @param string $name + * The base setting name + * @param array $edit + * The block edit array + * + * @return string + * The block setting name + */ +function _mm_widgets_block_setting_name($name, $edit=array()) { + if (isset($edit['multiblock_delta']['#value'])) { + $block_id = '_' . $edit['multiblock_delta']['#value']; + } else { + $block_id = null; + } + + return $name . $block_id; +} + + +/** + * The default item Moustache template + * + * @return string + * The template + */ +function _mm_widgets_block_template() { + $default = <<<EOD +<article class="item {{channel.machine_type_name}}"> + <div class="content"> + <span class="excerpt"><a href="{{link}}">{{{excerpt}}}</a></span> + <br /> + </div> + <div class="network"> + <div class="attribution"> + {{formatted_published_at}} via <a href="{{channel.url}}">{{channel.name}}</a>. + </div> + </div> +</article> +EOD; + + return $default; +} diff --git a/profiles/wcm_base/modules/custom/mm/mm_widgets/plugins/content_types/mm_widgets_live_pane.inc b/profiles/wcm_base/modules/custom/mm/mm_widgets/plugins/content_types/mm_widgets_live_pane.inc new file mode 100644 index 0000000000000000000000000000000000000000..073330faf3264967b51c57c3192ba9ba94a8f3e5 --- /dev/null +++ b/profiles/wcm_base/modules/custom/mm/mm_widgets/plugins/content_types/mm_widgets_live_pane.inc @@ -0,0 +1,140 @@ +<?php +/** + * @file + * Panel for live, javascript-based Media Magnet display pane + */ + +/** + * Define the CTools plugin + */ +$plugin = array( + // Just do this one, it is needed. + 'single' => TRUE, + 'title' => t('Media Magnet Items'), + // Title to show up on the pane screen. + 'description' => t('Content feed from Media Magnet'), + // Description to show up on the pane screen. + 'category' => t('Widgets'), + // A category to put this under. + 'edit form' => 'mm_widgets_live_pane_edit_form', + // A function that will return the settings form for the pane. + 'render callback' => 'mm_widgets_live_pane_render', + // A function that will return the renderable content. + // Array of defaults for the settings form. + 'defaults' => array( + 'items_url' => 'https://mediamagnet.osu.edu/api/v1/items.json', + 'item_template' => _mm_widgets_block_template(), + 'items_limit' => 10 + ), + 'all contexts' => TRUE, + // This is NEEDED to be able to use substitution strings in your pane. +); + + +/** + * Panel pane edit form callback + */ +function mm_widgets_live_pane_edit_form($form, &$form_state) { + $conf = $form_state['conf']; + $default = _mm_widgets_block_template(); + + $form['items_url'] = array( + '#type' => 'textfield', + '#title' => t('Media Magnet items API URL'), + '#required' => true, + '#default_value' => $conf['items_url'], + ); + + $form['items_limit'] = array( + '#type' => 'select', + '#title' => t('Items to display'), + '#required' => true, + '#options' => array( + 0 => t('Show all'), + 5 => 5, + 10 => 10, + 15 => 15, + 20 => 20, + 25 => 25, + ), + '#default_value' => $conf['items_limit'], + ); + + $form['item_template'] = array( + '#type' => 'textarea', + '#title' => t('Item template'), + '#required' => true, + '#description' => '<strong>' . t('Example') . '</strong><pre>' . htmlentities($default) . '</pre>', + '#default_value' => $conf['item_template'], + ); + + return $form; +} + + +/** + * Submit function. + * + * Note anything in the form_state[conf] automatically gets saved. + * Notice, the magic that automatically does that for you. + */ +function mm_widgets_live_pane_edit_form_submit(&$form, &$form_state) { + // Set anything with a default value configured. + foreach (array_keys($form_state['plugin']['defaults']) as $key) { + if (isset($form_state['values'][$key])) { + $form_state['conf'][$key] = $form_state['values'][$key]; + } + } +} + + +/** + * Implements hook_panels_pane_prerender(). + */ +function mm_widgets_panels_pane_prerender($pane) { + $pane->configuration['delta'] = $pane->pid; +} + + +/** + * Run-time rendering of the body of the block (content type). + * + * See ctools_plugin_examples for more advanced info + */ +function mm_widgets_live_pane_render($subtype, $conf, $args, $contexts) { + $template = $conf['item_template']; + $container_id = 'mm_live_pane_'.$conf['delta'].'_container'; + $template_id = 'mm_live_pane_'.$conf['delta'].'_template'; + $url = $conf['items_url']; + $limit = $conf['items_limit']; + + $content = <<<EOD +<script id="{$template_id}" type="text/html"> +$template +</script> +<div id="{$container_id}"></div> +EOD; + + $block = new stdclass(); + $block->title = t('Media Magnet'); + $block->title_classes = array('mm-widgets-pane'); + $block->content = array(); + $block->content['#markup'] = $content; + $block->content['#attached']['js'][] = array( + 'data' => array( + 'mm_widgets' => array( + 'url' => $url, + 'limit' => $limit, + 'container_id' => $container_id, + 'template_id' => $template_id, + ) + ), + 'type' => 'setting', + ); + $block->content['#attached']['js'][] = array( + 'data' => drupal_get_path('module', 'mm_widgets') . '/js/mm_widgets.js', + 'scope' => 'footer', + ); + + return $block; +} diff --git a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.context.inc b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.context.inc new file mode 100644 index 0000000000000000000000000000000000000000..04fee615e78119e975384f6cc05c4bd65b20f422 --- /dev/null +++ b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.context.inc @@ -0,0 +1,49 @@ +<?php +/** + * @file + * ocio_landing_page.context.inc + */ + +/** + * Implements hook_context_default_contexts(). + */ +function ocio_landing_page_context_default_contexts() { + $export = array(); + + $context = new stdClass(); + $context->disabled = FALSE; /* Edit this to true to make a default context disabled initially */ + $context->api_version = 3; + $context->name = 'landing-page-layout'; + $context->description = ''; + $context->tag = 'OCIO Landing Page'; + $context->conditions = array( + 'node' => array( + 'values' => array( + 'ocio_landing_page' => 'ocio_landing_page', + ), + 'options' => array( + 'node_form' => '1', + ), + ), + ); + $context->reactions = array( + 'block' => array( + 'blocks' => array( + 'ds_extras-ds_hero' => array( + 'module' => 'ds_extras', + 'delta' => 'ds_hero', + 'region' => 'hero', + 'weight' => '-10', + ), + ), + ), + ); + $context->condition_mode = 0; + + // Translatables + // Included for use with string extractors like potx. + t('OCIO Landing Page'); + $export['landing-page-layout'] = $context; + + return $export; +} diff --git a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.ds.inc b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.ds.inc new file mode 100644 index 0000000000000000000000000000000000000000..cba8409c79d65f421f80854671fa3af4a1df2e6c --- /dev/null +++ b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.ds.inc @@ -0,0 +1,45 @@ +<?php +/** + * @file + * ocio_landing_page.ds.inc + */ + +/** + * Implements hook_ds_layout_settings_info(). + */ +function ocio_landing_page_ds_layout_settings_info() { + $export = array(); + + $ds_layout = new stdClass(); + $ds_layout->api_version = 1; + $ds_layout->id = 'node|ocio_landing_page|full'; + $ds_layout->entity_type = 'node'; + $ds_layout->bundle = 'ocio_landing_page'; + $ds_layout->view_mode = 'full'; + $ds_layout->layout = 'ds_1col'; + $ds_layout->settings = array( + 'regions' => array( + 'ds_hero' => array( + 0 => 'field_banner_image', + ), + ), + 'fields' => array( + 'field_banner_image' => 'ds_hero', + ), + 'classes' => array(), + 'wrappers' => array( + 'ds_content' => 'div', + 'ds_hidden' => 'div', + ), + 'layout_wrapper' => 'div', + 'layout_attributes' => '', + 'layout_attributes_merge' => 1, + 'layout_link_attribute' => '', + 'layout_link_custom' => '', + 'hide_page_title' => '0', + 'page_option_title' => '', + ); + $export['node|ocio_landing_page|full'] = $ds_layout; + + return $export; +} diff --git a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.fe_block_settings.inc b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.fe_block_settings.inc new file mode 100644 index 0000000000000000000000000000000000000000..082703e4d18bc671cea5cf29b4f57670a106a914 --- /dev/null +++ b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.fe_block_settings.inc @@ -0,0 +1,54 @@ +<?php +/** + * @file + * ocio_landing_page.features.fe_block_settings.inc + */ + +/** + * Implements hook_default_fe_block_settings(). + */ +function ocio_landing_page_default_fe_block_settings() { + $export = array(); + + $export['version'] = '2.0'; + + $export['ds_extras-ds_hero'] = array( + 'cache' => -1, + 'custom' => 0, + 'delta' => 'ds_hero', + 'module' => 'ds_extras', + 'node_types' => array(), + 'pages' => '', + 'roles' => array(), + 'themes' => array( + 'ocio_1' => array( + 'region' => '', + 'status' => 0, + 'theme' => 'ocio_1', + 'weight' => 0, + ), + 'ocio_2' => array( + 'region' => '', + 'status' => 0, + 'theme' => 'ocio_2', + 'weight' => 0, + ), + 'ocio_3' => array( + 'region' => '', + 'status' => 0, + 'theme' => 'ocio_3', + 'weight' => 0, + ), + 'ocio_4' => array( + 'region' => '', + 'status' => 0, + 'theme' => 'ocio_4', + 'weight' => 0, + ), + ), + 'title' => '', + 'visibility' => 0, + ); + + return $export; +} diff --git a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.field_base.inc b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.field_base.inc new file mode 100644 index 0000000000000000000000000000000000000000..cc156c092e85cd652345cd72bb2a064de2d88391 --- /dev/null +++ b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.field_base.inc @@ -0,0 +1,36 @@ +<?php +/** + * @file + * ocio_landing_page.features.field_base.inc + */ + +/** + * Implements hook_field_default_field_bases(). + */ +function ocio_landing_page_field_default_field_bases() { + $field_bases = array(); + + // Exported field_base: 'field_banner_image' + $field_bases['field_banner_image'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_banner_image', + 'indexes' => array( + 'fid' => array( + 0 => 'fid', + ), + ), + 'locked' => 0, + 'module' => 'image', + 'settings' => array( + 'default_image' => 0, + 'uri_scheme' => 'public', + ), + 'translatable' => 0, + 'type' => 'image', + ); + + return $field_bases; +} diff --git a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.field_instance.inc b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.field_instance.inc new file mode 100644 index 0000000000000000000000000000000000000000..5e5be7ca51fb1877e0bfdd26a696beaf18ef7d4e --- /dev/null +++ b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.field_instance.inc @@ -0,0 +1,102 @@ +<?php +/** + * @file + * ocio_landing_page.features.field_instance.inc + */ + +/** + * Implements hook_field_default_field_instances(). + */ +function ocio_landing_page_field_default_field_instances() { + $field_instances = array(); + + // Exported field_instance: 'node-ocio_landing_page-field_banner_image' + $field_instances['node-ocio_landing_page-field_banner_image'] = array( + 'bundle' => 'ocio_landing_page', + 'deleted' => 0, + 'description' => 'Full width banner image. Photos must be at least 2000px wide. Height can be anything 320px or taller. Crop to desired proportions before uploading the image. ', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'image', + 'settings' => array( + 'image_link' => '', + 'image_style' => '', + ), + 'type' => 'image', + 'weight' => 0, + ), + 'full' => array( + 'label' => 'hidden', + 'module' => 'image', + 'settings' => array( + 'image_link' => '', + 'image_style' => '', + ), + 'type' => 'image', + 'weight' => 0, + ), + ), + 'ds_extras_field_template' => '', + 'entity_type' => 'node', + 'field_name' => 'field_banner_image', + 'label' => 'Banner Image', + 'required' => 0, + 'settings' => array( + 'alt_field' => 0, + 'default_image' => 0, + 'file_directory' => 'banner-images', + 'file_extensions' => 'png jpg jpeg', + 'max_filesize' => '3mb', + 'max_resolution' => '', + 'min_resolution' => '2000x320', + 'title_field' => 0, + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'media', + 'settings' => array( + 'allowed_schemes' => array( + 'public' => 'public', + 'vimeo' => 0, + 'youtube' => 0, + ), + 'allowed_types' => array( + 'audio' => 0, + 'document' => 0, + 'image' => 'image', + 'video' => 0, + ), + 'browser_plugins' => array( + 'media_default--media_browser_1' => 0, + 'media_default--media_browser_my_files' => 0, + 'media_internet' => 0, + 'upload' => 0, + 'youtube' => 0, + ), + 'manualcrop_crop_info' => 1, + 'manualcrop_default_crop_area' => 1, + 'manualcrop_enable' => 0, + 'manualcrop_inline_crop' => 0, + 'manualcrop_instant_crop' => FALSE, + 'manualcrop_instant_preview' => 1, + 'manualcrop_keyboard' => 1, + 'manualcrop_maximize_default_crop_area' => 0, + 'manualcrop_require_cropping' => array(), + 'manualcrop_styles_list' => array(), + 'manualcrop_styles_mode' => 'include', + 'manualcrop_thumblist' => 0, + ), + 'type' => 'media_generic', + 'weight' => 31, + ), + ); + + // Translatables + // Included for use with string extractors like potx. + t('Banner Image'); + t('Full width banner image. Photos must be at least 2000px wide. Height can be anything 320px or taller. Crop to desired proportions before uploading the image. '); + + return $field_instances; +} diff --git a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.inc b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.inc index 26ce4472a36a01e7e32a12637ff94c595285825a..1feedcd6f6ddd9c21a2e7145b55b49dda61f8ba4 100644 --- a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.inc +++ b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.features.inc @@ -8,6 +8,12 @@ * Implements hook_ctools_plugin_api(). */ function ocio_landing_page_ctools_plugin_api($module = NULL, $api = NULL) { + if ($module == "context" && $api == "context") { + return array("version" => "3"); + } + if ($module == "ds" && $api == "ds") { + return array("version" => "1"); + } if ($module == "panelizer" && $api == "panelizer") { return array("version" => "1"); } diff --git a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.info b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.info index 035974bc1603e8f541582d9c3c9aa446f0aa7b6f..a5f645238c31a40c46d7a9ddb6650c521538d7b3 100644 --- a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.info +++ b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.info @@ -4,14 +4,26 @@ core = 7.x package = OCIO Features version = 7.x-1.0 project = ocio_landing_page +dependencies[] = context dependencies[] = ctools dependencies[] = defaultconfig +dependencies[] = ds +dependencies[] = ds_extras +dependencies[] = fe_block dependencies[] = features +dependencies[] = media dependencies[] = panelizer dependencies[] = strongarm +features[context][] = landing-page-layout +features[ctools][] = context:context:3 +features[ctools][] = ds:ds:1 features[ctools][] = panelizer:panelizer:1 features[ctools][] = strongarm:strongarm:1 +features[ds_layout_settings][] = node|ocio_landing_page|full +features[fe_block_settings][] = ds_extras-ds_hero features[features_api][] = api:2 +features[field_base][] = field_banner_image +features[field_instance][] = node-ocio_landing_page-field_banner_image features[node][] = ocio_landing_page features[panelizer_defaults][] = node:ocio_landing_page:default features[panelizer_defaults][] = node:ocio_landing_page:default:default diff --git a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.strongarm.inc b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.strongarm.inc index 4ec46d8db71c9c110e9fec13119c4ce09b987378..1e84625a18d789c5f23161522477f4eace9daecb 100644 --- a/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.strongarm.inc +++ b/profiles/wcm_base/modules/custom/ocio_landing_page/ocio_landing_page.strongarm.inc @@ -29,7 +29,35 @@ function ocio_landing_page_strongarm() { $strongarm->api_version = 1; $strongarm->name = 'field_bundle_settings_node__ocio_landing_page'; $strongarm->value = array( - 'view_modes' => array(), + 'view_modes' => array( + 'full' => array( + 'custom_settings' => TRUE, + ), + 'teaser' => array( + 'custom_settings' => FALSE, + ), + 'rss' => array( + 'custom_settings' => FALSE, + ), + 'search_index' => array( + 'custom_settings' => FALSE, + ), + 'search_result' => array( + 'custom_settings' => FALSE, + ), + 'print' => array( + 'custom_settings' => FALSE, + ), + 'featured' => array( + 'custom_settings' => FALSE, + ), + 'token' => array( + 'custom_settings' => FALSE, + ), + 'revision' => array( + 'custom_settings' => FALSE, + ), + ), 'extra_fields' => array( 'form' => array( 'title' => array( diff --git a/profiles/wcm_base/modules/custom/ocio_panels_settings/ocio_panels_settings.module b/profiles/wcm_base/modules/custom/ocio_panels_settings/ocio_panels_settings.module index f9453dc8359ae0aa37f292bffc9e3d89258d745c..ddefef40d9ee09c7f6e32abf6c8b05157195170a 100644 --- a/profiles/wcm_base/modules/custom/ocio_panels_settings/ocio_panels_settings.module +++ b/profiles/wcm_base/modules/custom/ocio_panels_settings/ocio_panels_settings.module @@ -47,18 +47,40 @@ function _ocio_panels_settings_region_style_settings($form) { } /** - * Implements hook_form_alter(). + * Implements hook_form_FORM_ID_alter(). * - * Simplify form for fpp. Remove the option for title as a link. + * Simplify form for fpp. Remove the option for title as a link. */ -function ocio_panels_settings_form_alter(&$form, &$form_state, $form_id) { - - if ($form_id == 'fieldable_panels_panes_fieldable_panels_pane_content_type_edit_form') { - $form['link']['#access'] = FALSE; - } +function ocio_panels_settings_form_fieldable_panels_panes_fieldable_panels_pane_content_type_edit_form_alter(&$form, &$form_state) { + $form['link']['#access'] = FALSE; } +/** + * Implements hook_form_FORM_ID_alter(). + */ +function ocio_panels_settings_form_mm_widgets_live_pane_edit_form_alter(&$form, &$form_state) { + $form['override_title']['#default_value'] = 1; + $form['override_title']['#access'] = FALSE; + $form['override_title_markup']['#access'] = FALSE; + $form['override_title_heading']['#access'] = FALSE; + $form['override_title_text']['#attributes']['placeholder'] = t('Title'); + $form['item_template']['#access'] = FALSE; + + array_unshift($form['#submit'], 'ocio_panels_settings_form_mm_widgets_live_pane_edit_form_submit'); +} +/** + * Submit handler for mm_widgets_live_pane form. + */ +function ocio_panels_settings_form_mm_widgets_live_pane_edit_form_submit($form, &$form_state) { + $form_state['values']['override_title'] = !empty($form_state['values']['override_title_text']); +} +/* + * Implements hook_panopoly_magic_forms_to_improve_alter(). + */ +function ocio_panels_settings_panopoly_magic_forms_to_improve_alter(&$form_ids) { + $form_ids[] = 'mm_widgets_live_pane_edit_form'; +} /* * Implements hook_settings_preprocess_panels_add_content_modal(). diff --git a/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.features.field_base.inc b/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.features.field_base.inc index b5d4fa077fe9dbc2c4e0a61b5b5448a10afef435..a52ecc5b2487eee5d5c66e5a7c3ddfe7b6fb8682 100644 --- a/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.features.field_base.inc +++ b/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.features.field_base.inc @@ -10,6 +10,35 @@ function wcm_tile_panes_field_default_field_bases() { $field_bases = array(); + // Exported field_base: 'field_background_color' + $field_bases['field_background_color'] = array( + 'active' => 1, + 'cardinality' => 1, + 'deleted' => 0, + 'entity_types' => array(), + 'field_name' => 'field_background_color', + 'indexes' => array( + 'value' => array( + 0 => 'value', + ), + ), + 'locked' => 0, + 'module' => 'list', + 'settings' => array( + 'allowed_values' => array( + 'white' => 'White', + 'lt-gray' => 'Light Gray', + 'md-gray' => 'Mid Gray', + 'dk-gray' => 'Dark Gray', + 'black' => 'Black', + 'red' => 'Red', + ), + 'allowed_values_function' => '', + ), + 'translatable' => 0, + 'type' => 'list_text', + ); + // Exported field_base: 'field_tile_background_img' $field_bases['field_tile_background_img'] = array( 'active' => 1, diff --git a/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.features.field_instance.inc b/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.features.field_instance.inc index 362dac9ccf8138e12578a5d8bc59cc900eae2397..9ed9fb80e400f682132244966bad1c50f25d2f36 100644 --- a/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.features.field_instance.inc +++ b/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.features.field_instance.inc @@ -10,6 +10,38 @@ function wcm_tile_panes_field_default_field_instances() { $field_instances = array(); + // Exported field_instance: 'fieldable_panels_pane-tile_pane-field_background_color' + $field_instances['fieldable_panels_pane-tile_pane-field_background_color'] = array( + 'bundle' => 'tile_pane', + 'default_value' => NULL, + 'deleted' => 0, + 'description' => '', + 'display' => array( + 'default' => array( + 'label' => 'hidden', + 'module' => 'list', + 'settings' => array(), + 'type' => 'list_default', + 'weight' => 2, + ), + ), + 'ds_extras_field_template' => '', + 'entity_type' => 'fieldable_panels_pane', + 'field_name' => 'field_background_color', + 'label' => 'Background Color', + 'required' => 1, + 'settings' => array( + 'user_register_form' => FALSE, + ), + 'widget' => array( + 'active' => 1, + 'module' => 'options', + 'settings' => array(), + 'type' => 'options_buttons', + 'weight' => 2, + ), + ); + // Exported field_instance: 'fieldable_panels_pane-tile_pane-field_tile_background_img' $field_instances['fieldable_panels_pane-tile_pane-field_tile_background_img'] = array( 'bundle' => 'tile_pane', @@ -79,7 +111,7 @@ function wcm_tile_panes_field_default_field_instances() { 'manualcrop_thumblist' => 0, ), 'type' => 'media_generic', - 'weight' => 2, + 'weight' => 3, ), ); @@ -312,6 +344,7 @@ function wcm_tile_panes_field_default_field_instances() { // Translatables // Included for use with string extractors like potx. + t('Background Color'); t('Background Image'); t('Link'); t('Text Area'); diff --git a/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.info b/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.info index 41e03c6ae9ec5f52eb5c41b4f35b931dea076fb9..61f15bb09cc79d453e18a99889642d55fc24deb4 100644 --- a/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.info +++ b/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.info @@ -9,14 +9,18 @@ dependencies[] = features dependencies[] = fieldable_panels_panes dependencies[] = image dependencies[] = link +dependencies[] = list +dependencies[] = options dependencies[] = strongarm dependencies[] = text features[ctools][] = fieldable_panels_panes:fieldable_panels_pane_type:1 features[ctools][] = strongarm:strongarm:1 features[features_api][] = api:2 +features[field_base][] = field_background_color features[field_base][] = field_tile_background_img features[field_base][] = field_tile_link features[field_base][] = field_tile_text_area +features[field_instance][] = fieldable_panels_pane-tile_pane-field_background_color features[field_instance][] = fieldable_panels_pane-tile_pane-field_tile_background_img features[field_instance][] = fieldable_panels_pane-tile_pane-field_tile_link features[field_instance][] = fieldable_panels_pane-tile_pane_plus_text_area-field_tile_background_img diff --git a/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.strongarm.inc b/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.strongarm.inc index bce48dec8f8ce5db3fc3b0bdae400b459b05a739..9e7d2a1e434e4da1674486b90b4352fb66fbb29c 100644 --- a/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.strongarm.inc +++ b/profiles/wcm_base/modules/custom/wcm_tile_panes/wcm_tile_panes.strongarm.inc @@ -35,7 +35,7 @@ function wcm_tile_panes_strongarm() { 'display' => array( 'title' => array( 'default' => array( - 'weight' => '2', + 'weight' => '3', 'visible' => FALSE, ), ), diff --git a/profiles/wcm_base/themes/ocio_omega_1/layouts/ocio-full/ocio-full-layout.tpl.php b/profiles/wcm_base/themes/ocio_omega_1/layouts/ocio-full/ocio-full-layout.tpl.php index 19df206fdb0204e52e3773102a9c157b84f780cf..1ec5058f659d29760e7c05605292a35e84e81f2d 100755 --- a/profiles/wcm_base/themes/ocio_omega_1/layouts/ocio-full/ocio-full-layout.tpl.php +++ b/profiles/wcm_base/themes/ocio_omega_1/layouts/ocio-full/ocio-full-layout.tpl.php @@ -5,6 +5,10 @@ <?php print render($page['masthead']); ?> <?php print render($page['main_menu']); ?> </header> + + <div class="l-region--hero-wrapper <?php print $main_classes; ?>"> + <?php print render($page['hero']); ?> + </div> <?php if (!empty($page['highlighted'])): ?> <div class="l-highlighted-wrapper"> diff --git a/profiles/wcm_base/themes/ocio_omega_1/layouts/ocio-full/ocio-full.layout.inc b/profiles/wcm_base/themes/ocio_omega_1/layouts/ocio-full/ocio-full.layout.inc index 96a36dd4aa5631bdcf75ad4acb501682b14b8ad2..997a99117f25b7e2e5176822e507b324c194ad35 100755 --- a/profiles/wcm_base/themes/ocio_omega_1/layouts/ocio-full/ocio-full.layout.inc +++ b/profiles/wcm_base/themes/ocio_omega_1/layouts/ocio-full/ocio-full.layout.inc @@ -8,6 +8,7 @@ regions[osu_navbar] = OSU Navbar regions[masthead] = Masthead regions[main_menu] = Main Menu regions[workbench] = Workbench Info +regions[hero] = Hero regions[content] = Content regions[sidebar_1] = Sidebar 1 regions[sidebar_2] = Sidebar 2 diff --git a/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.no-query.css b/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.no-query.css index 4082c25b253d071f0a051f50ab9b9da8016d3d50..c46ef5a5ddf1dae3e76fbb94be92418084f82fa7 100644 --- a/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.no-query.css +++ b/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.no-query.css @@ -1,3 +1,16 @@ +/*** THIS Theme uses its own grid variables ***/ +.l-constrained { + padding: 0 4%; + margin: 0 auto; + *zoom: 1; + padding: 0 10%; +} +.l-constrained:after { + content: ""; + display: table; + clear: both; +} + img, media { max-width: 100%; } diff --git a/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.normalize.css b/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.normalize.css index 47cda488433275cef55552c268b9a0ca299cbe7a..458c481c04b9c56cff4ce76eca2310d87d967233 100644 --- a/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.normalize.css +++ b/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.normalize.css @@ -1,3 +1,4 @@ +/*** THIS Theme uses its own grid variables ***/ /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ /*! normalize.css v3.0.0 | HTML5 Display Definitions | MIT License | git.io/normalize */ article, diff --git a/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.styles.css b/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.styles.css index 4082c25b253d071f0a051f50ab9b9da8016d3d50..197af2cedaa9d15532669942e4171e4d01712145 100644 --- a/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.styles.css +++ b/profiles/wcm_base/themes/ocio_omega_2/css/ocio-2.styles.css @@ -1,3 +1,27 @@ +/*** THIS Theme uses its own grid variables ***/ +.l-constrained { + padding: 0 4%; + margin: 0 auto; + *zoom: 1; +} +.l-constrained:after { + content: ""; + display: table; + clear: both; +} +@media (min-width: 47.5em) { + .l-constrained { + padding: 0 10%; + } +} + +@media (min-width: 91.25em) { + .max-width { + max-width: 72.875em; + margin: 0 auto; + padding: 0; + } +} img, media { max-width: 100%; } diff --git a/profiles/wcm_base/themes/ocio_omega_2/sass/base/_layout-base.scss b/profiles/wcm_base/themes/ocio_omega_2/sass/base/_layout-base.scss new file mode 100644 index 0000000000000000000000000000000000000000..245cd013ec8a5da2a67268c766e06e78f4f6a2d0 --- /dev/null +++ b/profiles/wcm_base/themes/ocio_omega_2/sass/base/_layout-base.scss @@ -0,0 +1,20 @@ +// Setting l-constrained as percent padding +.l-constrained { + padding:0 4%; + margin: 0 auto; + @include pie-clearfix; + + @include breakpoint($tab, true) { + padding:0 10%; + } +} + + +// setting max-width of content containers +@include breakpoint($x-wide){ + .max-width { + max-width: $max-width; + margin: 0 auto; + padding: 0; + } +} diff --git a/profiles/wcm_base/themes/ocio_omega_2/sass/variables/_grid.scss b/profiles/wcm_base/themes/ocio_omega_2/sass/variables/_grid.scss index fcdf59a23c52d3f5c921dd5a3ea74a23cd2d9a5c..4ffe735415d9c690addcae9bcc1fc1e78a3237af 100644 --- a/profiles/wcm_base/themes/ocio_omega_2/sass/variables/_grid.scss +++ b/profiles/wcm_base/themes/ocio_omega_2/sass/variables/_grid.scss @@ -1,5 +1,18 @@ -//import grid variables from ocio_omega_base -@import "../../../ocio_omega_base/sass/variables/_grid.scss"; +/*** THIS Theme uses its own grid variables ***/ -//uncomment line below if you do not want to use gutters -//$gutters: 0; \ No newline at end of file +// Set consistent vertical and horizontal spacing units. +$vert-spacing-unit: 20px; +$horz-spacing-unit: 1.5em; + +$small: max-width 47.5em; // 760px +$tab: 47.5em; //760px +$desk: 60em; //960px +$wide: 75em; //1200px +$x-wide: 91.25em; //1460px + +$max-width: 72.875em; //1166px + +$grids: 4; +$grids: add-grid(12 at $tab); + +$gutters: 1/3; \ No newline at end of file diff --git a/profiles/wcm_base/themes/ocio_omega_3/css/layouts/ocio-3/ocio-3.layout.css b/profiles/wcm_base/themes/ocio_omega_3/css/layouts/ocio-3/ocio-3.layout.css index da305e0792ca6f3d488bc35016d4c7e33a29081a..b545285f7584bf53c0fa3271497bd873ab26359a 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/css/layouts/ocio-3/ocio-3.layout.css +++ b/profiles/wcm_base/themes/ocio_omega_3/css/layouts/ocio-3/ocio-3.layout.css @@ -3,6 +3,7 @@ * * Styles for the OCIO Default layout. ******************************************************************************/ +/*** THIS Theme uses its own grid variables ***/ .red-button, input[type=button], .button, .form-submit, @@ -84,7 +85,7 @@ } @media (min-width: 47.5em) { .l-constrained, .l-region--highlighted, .l-region--footer { - padding: 0 7%; + padding: 0 9%; } } @@ -93,6 +94,13 @@ padding: 0 4%; } } +@media (min-width: 100em) { + .max-width { + max-width: 81.875em; + margin: 0 auto; + padding: 0; + } +} /* Setting body and page background color */ body.html { background: #2d2d2d; @@ -219,7 +227,7 @@ h2.block__title { line-height: 150%; } } -@media (min-width: 60em) { +@media (min-width: 72em) { html { font-size: 62.5%; } @@ -231,7 +239,7 @@ h2.block__title { line-height: 150%; } } -@media (min-width: 75em) { +@media (min-width: 90em) { html { font-size: 66%; } @@ -458,7 +466,7 @@ h6 a:hover, .zeta a:hover { clear: both; } } -@media (min-width: 60em) { +@media (min-width: 72em) { /* Sidebars */ .has-one-sidebar .l-content { width: 66.10169%; diff --git a/profiles/wcm_base/themes/ocio_omega_3/css/layouts/ocio-3/ocio-3.layout.no-query.css b/profiles/wcm_base/themes/ocio_omega_3/css/layouts/ocio-3/ocio-3.layout.no-query.css index 1550e7512d8ebf753a75ad4d4da056e288662e58..2ae96eca193e53bbe9aadf2737269fbdd2aea5f9 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/css/layouts/ocio-3/ocio-3.layout.no-query.css +++ b/profiles/wcm_base/themes/ocio_omega_3/css/layouts/ocio-3/ocio-3.layout.no-query.css @@ -3,6 +3,7 @@ * * Styles for the OCIO Default layout. ******************************************************************************/ +/*** THIS Theme uses its own grid variables ***/ .red-button, input[type=button], .button, .form-submit, @@ -76,7 +77,7 @@ padding: 0; margin: 0 auto; *zoom: 1; - padding: 0 7%; + padding: 0 9%; } .l-constrained:after, .l-region--highlighted:after, .l-region--footer:after { content: ""; diff --git a/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.no-query.css b/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.no-query.css index bbe5faa39fd5e2169a4d17abb74536fae883473c..d6dabd8371c7aab5e491479e7b418c5d6f96db8f 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.no-query.css +++ b/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.no-query.css @@ -1,3 +1,4 @@ +/*** THIS Theme uses its own grid variables ***/ /* No files to import found in abstractions/**\/* */ .red-button, input[type=button], .button, @@ -72,7 +73,7 @@ padding: 0; margin: 0 auto; *zoom: 1; - padding: 0 7%; + padding: 0 9%; } .l-constrained:after { content: ""; diff --git a/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.normalize.css b/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.normalize.css index 47cda488433275cef55552c268b9a0ca299cbe7a..458c481c04b9c56cff4ce76eca2310d87d967233 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.normalize.css +++ b/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.normalize.css @@ -1,3 +1,4 @@ +/*** THIS Theme uses its own grid variables ***/ /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ /*! normalize.css v3.0.0 | HTML5 Display Definitions | MIT License | git.io/normalize */ article, diff --git a/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.styles.css b/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.styles.css index 44b1005cc44e51da8b3914cb7e8e85bc517b8321..e838ff6367361c4d2b7241022c306a74216fa8c0 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.styles.css +++ b/profiles/wcm_base/themes/ocio_omega_3/css/ocio-3.styles.css @@ -1,3 +1,4 @@ +/*** THIS Theme uses its own grid variables ***/ /* No files to import found in abstractions/**\/* */ .red-button, input[type=button], .button, @@ -80,7 +81,7 @@ } @media (min-width: 47.5em) { .l-constrained { - padding: 0 7%; + padding: 0 9%; } } @@ -89,6 +90,13 @@ padding: 0 4%; } } +@media (min-width: 100em) { + .max-width { + max-width: 81.875em; + margin: 0 auto; + padding: 0; + } +} /* Setting body and page background color */ body.html { background: #2d2d2d; @@ -215,7 +223,7 @@ h2.block__title { line-height: 150%; } } -@media (min-width: 60em) { +@media (min-width: 72em) { html { font-size: 62.5%; } @@ -227,7 +235,7 @@ h2.block__title { line-height: 150%; } } -@media (min-width: 75em) { +@media (min-width: 90em) { html { font-size: 66%; } diff --git a/profiles/wcm_base/themes/ocio_omega_3/layouts/ocio-3/ocio-3-layout.tpl.php b/profiles/wcm_base/themes/ocio_omega_3/layouts/ocio-3/ocio-3-layout.tpl.php index 004e18b197e60a42b310973ac6b72ed398c86172..6e14bf965948f1e5671a938e10ffe7c8e725d50f 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/layouts/ocio-3/ocio-3-layout.tpl.php +++ b/profiles/wcm_base/themes/ocio_omega_3/layouts/ocio-3/ocio-3-layout.tpl.php @@ -9,7 +9,10 @@ <div class="constrained-container"> <?php print render($page['main_menu']); ?> - + + <div class="l-region--hero-wrapper <?php print $main_classes; ?>"> + <?php print render($page['hero']); ?> + </div> <?php if (!empty($page['highlighted'])): ?> <div class="l-highlighted-wrapper"> diff --git a/profiles/wcm_base/themes/ocio_omega_3/layouts/ocio-3/ocio-3.layout.inc b/profiles/wcm_base/themes/ocio_omega_3/layouts/ocio-3/ocio-3.layout.inc index 3dc77071853ed173dc4543b29e9abe48b4fd7900..02abfa30fa4f1a2c0c3aa9b1c1c5caaffd4f9844 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/layouts/ocio-3/ocio-3.layout.inc +++ b/profiles/wcm_base/themes/ocio_omega_3/layouts/ocio-3/ocio-3.layout.inc @@ -7,6 +7,7 @@ template = ocio-3-layout regions[osu_navbar] = OSU Navbar regions[masthead] = Masthead regions[main_menu] = Main Menu +regions[hero] = Hero regions[workbench] = Workbench Info regions[content] = Content regions[sidebar_1] = Sidebar 1 diff --git a/profiles/wcm_base/themes/ocio_omega_3/sass/base/_layout-base.scss b/profiles/wcm_base/themes/ocio_omega_3/sass/base/_layout-base.scss index 5d5fa2e33f03fc54a869d32f671d77cd48a7280b..8965bd1c05feaecefc4b0722883d70600b0c2d94 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/sass/base/_layout-base.scss +++ b/profiles/wcm_base/themes/ocio_omega_3/sass/base/_layout-base.scss @@ -5,9 +5,8 @@ @include pie-clearfix; @include breakpoint($tab, true) { - padding:0 7%; + padding:0 9%; } - } //add padding to navbar and masthead for mobile @@ -20,6 +19,15 @@ } +// setting max-width of content containers +@include breakpoint($x-wide){ + .max-width { + max-width: $max-width; + margin: 0 auto; + padding: 0; + } +} + /* Setting body and page background color */ body.html { diff --git a/profiles/wcm_base/themes/ocio_omega_3/sass/variables/_grid.scss b/profiles/wcm_base/themes/ocio_omega_3/sass/variables/_grid.scss index fcdf59a23c52d3f5c921dd5a3ea74a23cd2d9a5c..5ef60b92a8b0187af57ec5c3b9f5c3318a46f383 100644 --- a/profiles/wcm_base/themes/ocio_omega_3/sass/variables/_grid.scss +++ b/profiles/wcm_base/themes/ocio_omega_3/sass/variables/_grid.scss @@ -1,5 +1,18 @@ -//import grid variables from ocio_omega_base -@import "../../../ocio_omega_base/sass/variables/_grid.scss"; +/*** THIS Theme uses its own grid variables ***/ -//uncomment line below if you do not want to use gutters -//$gutters: 0; \ No newline at end of file +// Set consistent vertical and horizontal spacing units. +$vert-spacing-unit: 20px; +$horz-spacing-unit: 1.5em; + +$small: max-width 47.5em; // 760px +$tab: 47.5em; //760px +$desk: 72em; //1152px +$wide: 90em; //1440px +$x-wide: 100em; //1600px + +$max-width: 81.875em; //1310px + +$grids: 4; +$grids: add-grid(12 at $tab); + +$gutters: 1/3; \ No newline at end of file diff --git a/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.no-query.css b/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.no-query.css index 730465b6a843af28908445349d42dc07cba16e30..39878634150801989b062a80543c08301d1bc0a1 100644 --- a/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.no-query.css +++ b/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.no-query.css @@ -1,3 +1,4 @@ +/*** THIS Theme uses its own grid variables ***/ /* No files to import found in abstractions/**\/* */ .l-main.lt-gray .ui-accordion-header, .l-main.lt-gray .ui-accordion-header.ui-state-active, .l-main.lt-gray .ui-accordion-header.ui-state-default, .l-main.lt-gray .ui-accordion-header.ui-state-hover { border: 0; @@ -87,10 +88,10 @@ } .l-constrained { - padding: 0; + padding: 0 4%; margin: 0 auto; *zoom: 1; - padding: 0 7%; + padding: 0 10%; } .l-constrained:after { content: ""; @@ -383,6 +384,14 @@ ul.flex-direction-nav, ul.flex-direction-nav:hover { padding: 0; } +.l-region--hero-wrapper.lt-gray { + background: #ececec; +} + +.l-region--hero-wrapper.white { + background: white; +} + .l-region--main-menu, .l-region--main-menu.white { background-color: #fff; } diff --git a/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.normalize.css b/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.normalize.css index 47cda488433275cef55552c268b9a0ca299cbe7a..458c481c04b9c56cff4ce76eca2310d87d967233 100644 --- a/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.normalize.css +++ b/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.normalize.css @@ -1,3 +1,4 @@ +/*** THIS Theme uses its own grid variables ***/ /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ /*! normalize.css v3.0.0 | HTML5 Display Definitions | MIT License | git.io/normalize */ article, diff --git a/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.styles.css b/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.styles.css index 383a8b949309837364abe74ef3cc7d20a9edc0bd..7d983953c58e8b5bf5c7e57774e03477d788bca0 100644 --- a/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.styles.css +++ b/profiles/wcm_base/themes/ocio_omega_4/css/ocio-4.styles.css @@ -1,3 +1,4 @@ +/*** THIS Theme uses its own grid variables ***/ /* No files to import found in abstractions/**\/* */ .l-main.lt-gray .ui-accordion-header, .l-main.lt-gray .ui-accordion-header.ui-state-active, .l-main.lt-gray .ui-accordion-header.ui-state-default, .l-main.lt-gray .ui-accordion-header.ui-state-hover { border: 0; @@ -87,7 +88,7 @@ } .l-constrained { - padding: 0; + padding: 0 4%; margin: 0 auto; *zoom: 1; } @@ -98,10 +99,17 @@ } @media (min-width: 47.5em) { .l-constrained { - padding: 0 7%; + padding: 0 10%; } } +@media (min-width: 85.375em) { + .max-width { + max-width: 68.25em; + margin: 0 auto; + padding: 0; + } +} img, media { max-width: 100%; } @@ -372,7 +380,7 @@ ul.flex-direction-nav, ul.flex-direction-nav:hover { height: 17px; } } -@media (min-width: 68em) { +@media (min-width: 60em) { .flex-control-paging li a { width: 20px; height: 20px; @@ -399,6 +407,14 @@ ul.flex-direction-nav, ul.flex-direction-nav:hover { padding: 0; } +.l-region--hero-wrapper.lt-gray { + background: #ececec; +} + +.l-region--hero-wrapper.white { + background: white; +} + .l-region--main-menu, .l-region--main-menu.white { background-color: #fff; } diff --git a/profiles/wcm_base/themes/ocio_omega_4/ocio_4.info b/profiles/wcm_base/themes/ocio_omega_4/ocio_4.info index d6ee3ba022e51edb6d28f07385b12bb9efe078ce..bfe34694f1f4697f44a54a0aa45299662a6c500b 100644 --- a/profiles/wcm_base/themes/ocio_omega_4/ocio_4.info +++ b/profiles/wcm_base/themes/ocio_omega_4/ocio_4.info @@ -84,6 +84,5 @@ settings[omega_libraries][modernizr][status] = 1 settings[ocio_omega_breadcrumb] = 1 settings[ocio_omega_color_navbar] = lt-gray settings[ocio_omega_color_masthead] = white -settings[ocio_omega_color_menu] = white -settings[ocio_omega_color_accent] = none +settings[ocio_omega_color_menu] = md-gray settings[ocio_omega_color_body] = lt-gray diff --git a/profiles/wcm_base/themes/ocio_omega_4/sass/base/_layout-base.scss b/profiles/wcm_base/themes/ocio_omega_4/sass/base/_layout-base.scss index 6a3ae7f716319910f0e7c3a5eb874f4aed38149f..245cd013ec8a5da2a67268c766e06e78f4f6a2d0 100644 --- a/profiles/wcm_base/themes/ocio_omega_4/sass/base/_layout-base.scss +++ b/profiles/wcm_base/themes/ocio_omega_4/sass/base/_layout-base.scss @@ -1,8 +1,20 @@ +// Setting l-constrained as percent padding .l-constrained { - padding:0 ; + padding:0 4%; margin: 0 auto; @include pie-clearfix; + @include breakpoint($tab, true) { - padding:0 7%; + padding:0 10%; } -} \ No newline at end of file +} + + +// setting max-width of content containers +@include breakpoint($x-wide){ + .max-width { + max-width: $max-width; + margin: 0 auto; + padding: 0; + } +} diff --git a/profiles/wcm_base/themes/ocio_omega_4/sass/components/regions/_hero.scss b/profiles/wcm_base/themes/ocio_omega_4/sass/components/regions/_hero.scss new file mode 100644 index 0000000000000000000000000000000000000000..d8a2fdf46b238fb8d663de13ca1f3da719a304d6 --- /dev/null +++ b/profiles/wcm_base/themes/ocio_omega_4/sass/components/regions/_hero.scss @@ -0,0 +1,7 @@ +.l-region--hero-wrapper.lt-gray { + background: $lt-gray; +} + +.l-region--hero-wrapper.white { + background: white; +} diff --git a/profiles/wcm_base/themes/ocio_omega_4/sass/variables/_grid.scss b/profiles/wcm_base/themes/ocio_omega_4/sass/variables/_grid.scss index fcdf59a23c52d3f5c921dd5a3ea74a23cd2d9a5c..fc0219df4ded96fa32daf97a480594ab68715c8b 100644 --- a/profiles/wcm_base/themes/ocio_omega_4/sass/variables/_grid.scss +++ b/profiles/wcm_base/themes/ocio_omega_4/sass/variables/_grid.scss @@ -1,5 +1,18 @@ -//import grid variables from ocio_omega_base -@import "../../../ocio_omega_base/sass/variables/_grid.scss"; +/*** THIS Theme uses its own grid variables ***/ -//uncomment line below if you do not want to use gutters -//$gutters: 0; \ No newline at end of file +// Set consistent vertical and horizontal spacing units. +$vert-spacing-unit: 20px; +$horz-spacing-unit: 1.5em; + +$small: max-width 47.5em; // 760px +$tab: 47.5em; //760px +$desk: 60em; //960px +$wide: 75em; //1200px +$x-wide: 85.375em; //1366px + +$max-width: 68.25em; //1092px + +$grids: 4; +$grids: add-grid(12 at $tab); + +$gutters: 1/3; \ No newline at end of file diff --git a/profiles/wcm_base/themes/ocio_omega_base/css/layouts/ocio-default/ocio-default.layout.css b/profiles/wcm_base/themes/ocio_omega_base/css/layouts/ocio-default/ocio-default.layout.css index ceb720f1d28f0c39464d75094800fbde5c4f3c4a..db5ff6e34556aa5b1e0a46abb4c55420d9746f3c 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/css/layouts/ocio-default/ocio-default.layout.css +++ b/profiles/wcm_base/themes/ocio_omega_base/css/layouts/ocio-default/ocio-default.layout.css @@ -526,7 +526,6 @@ input:focus { } .l-constrained, .l-region--highlighted, .l-region--footer { - padding: 0 4%; margin: 0 auto; *zoom: 1; } @@ -535,24 +534,7 @@ input:focus { display: table; clear: both; } -@media (min-width: 47.5em) { - .l-constrained, .l-region--highlighted, .l-region--footer { - padding: 0 8%; - } -} -@media (min-width: 60em) { - .l-constrained, .l-region--highlighted, .l-region--footer { - padding: 0 10%; - } -} -@media (min-width: 85.375em) { - .max-width { - max-width: 75em; - margin: 0 auto; - padding: 0; - } -} body.html { background-color: #2d2d2d; } diff --git a/profiles/wcm_base/themes/ocio_omega_base/css/layouts/ocio-default/ocio-default.layout.no-query.css b/profiles/wcm_base/themes/ocio_omega_base/css/layouts/ocio-default/ocio-default.layout.no-query.css index 353a4479a3d6059d38608607a78a512f4867a248..4c377d0c5ccd42f07daeba17ebd3f9b692d92aeb 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/css/layouts/ocio-default/ocio-default.layout.no-query.css +++ b/profiles/wcm_base/themes/ocio_omega_base/css/layouts/ocio-default/ocio-default.layout.no-query.css @@ -526,11 +526,8 @@ input:focus { } .l-constrained, .l-region--highlighted, .l-region--footer { - padding: 0 4%; margin: 0 auto; *zoom: 1; - padding: 0 8%; - padding: 0 10%; } .l-constrained:after, .l-region--highlighted:after, .l-region--footer:after { content: ""; diff --git a/profiles/wcm_base/themes/ocio_omega_base/css/ocio-omega-base.no-query.css b/profiles/wcm_base/themes/ocio_omega_base/css/ocio-omega-base.no-query.css index 99b68f6370f5a2712416bc20aa824decd072b595..9d56fde8e690b513fe2fba7bc629b3681eeca22d 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/css/ocio-omega-base.no-query.css +++ b/profiles/wcm_base/themes/ocio_omega_base/css/ocio-omega-base.no-query.css @@ -522,11 +522,8 @@ input:focus { } .l-constrained { - padding: 0 4%; margin: 0 auto; *zoom: 1; - padding: 0 8%; - padding: 0 10%; } .l-constrained:after { content: ""; @@ -1574,29 +1571,119 @@ p.search-result__snippet { .panel-pane.pane-bundle-tile-pane:hover { opacity: 0.9; } +.panel-pane.pane-bundle-tile-pane .title-box { + background: #fff; + padding: 0.8em 1em; + width: 100%; + position: absolute; + bottom: -2.6em; + z-index: 99; +} +.panel-pane.pane-bundle-tile-pane .title-box.lt-gray { + background: #ececec; +} +.panel-pane.pane-bundle-tile-pane .title-box.md-gray { + background: #666666; +} +.panel-pane.pane-bundle-tile-pane .title-box.dk-gray { + background: #2d2d2d; +} +.panel-pane.pane-bundle-tile-pane .title-box.black { + background: black; +} +.panel-pane.pane-bundle-tile-pane .title-box.red { + background: #b00; +} .panel-pane.pane-bundle-tile-pane a { text-decoration: none; - color: #fff; + color: #b00; } .panel-pane.pane-bundle-tile-pane a:visited { - color: #fff; + color: #b00; } .panel-pane.pane-bundle-tile-pane a:focus { color: #92b0d7; } .panel-pane.pane-bundle-tile-pane a:hover { - color: #ececec; + color: #666666; } .panel-pane.pane-bundle-tile-pane a:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray { + color: #2d2d2d; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray:visited { + color: #2d2d2d; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray:hover { + color: #b00; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.md-gray { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.md-gray:visited { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.md-gray:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.md-gray:hover { color: #ececec; } -.panel-pane.pane-bundle-tile-pane .title-box { - background: #666666; - padding: 0.8em 1em; - width: 100%; - position: absolute; - bottom: -2.6em; - z-index: 99; +.panel-pane.pane-bundle-tile-pane a.md-gray:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray:visited { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray:hover { + color: #ececec; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.black { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.black:visited { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.black:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.black:hover { + color: #ececec; +} +.panel-pane.pane-bundle-tile-pane a.black:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.red { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.red:visited { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.red:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.red:hover { + color: #ececec; +} +.panel-pane.pane-bundle-tile-pane a.red:active { + color: #92b0d7; } .panel-pane.pane-bundle-tile-pane .title-text { display: table-cell; @@ -1718,6 +1805,10 @@ div.workbench-info-block #edit-submit { padding: 0.4em 0.8em 0.4em 0.8em !important; } +.node-type-ocio-landing-page .l-header { + padding: 0 !important; +} + .l-footer-wrapper { background: #2d2d2d; color: #fff; @@ -1804,6 +1895,15 @@ div.workbench-info-block #edit-submit { margin-left: 0; } +.l-region--hero-wrapper { + background: white; +} + +#block-ds-extras-ds-hero { + max-height: 400px; + overflow: hidden; +} + /* Styles for main menu */ .l-region--main-menu .menu .leaf, .l-region--main-menu .menu .expanded, .l-region--main-menu .menu .collapsed, .l-region--sidebar-1 .menu .leaf, .l-region--sidebar-1 .menu .expanded, .l-region--sidebar-1 .menu .collapsed { list-style-image: none; diff --git a/profiles/wcm_base/themes/ocio_omega_base/css/ocio-omega-base.styles.css b/profiles/wcm_base/themes/ocio_omega_base/css/ocio-omega-base.styles.css index 2f606e045a34d30854a4a1054172ab13e89aff0c..b2f984a80345a181c27af1ab9302d69ef922ff46 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/css/ocio-omega-base.styles.css +++ b/profiles/wcm_base/themes/ocio_omega_base/css/ocio-omega-base.styles.css @@ -522,7 +522,6 @@ input:focus { } .l-constrained { - padding: 0 4%; margin: 0 auto; *zoom: 1; } @@ -531,24 +530,7 @@ input:focus { display: table; clear: both; } -@media (min-width: 47.5em) { - .l-constrained { - padding: 0 8%; - } -} -@media (min-width: 60em) { - .l-constrained { - padding: 0 10%; - } -} -@media (min-width: 85.375em) { - .max-width { - max-width: 75em; - margin: 0 auto; - padding: 0; - } -} body.html { background-color: #2d2d2d; } @@ -1611,29 +1593,119 @@ p.search-result__snippet { .panel-pane.pane-bundle-tile-pane:hover { opacity: 0.9; } +.panel-pane.pane-bundle-tile-pane .title-box { + background: #fff; + padding: 0.8em 1em; + width: 100%; + position: absolute; + bottom: -2.6em; + z-index: 99; +} +.panel-pane.pane-bundle-tile-pane .title-box.lt-gray { + background: #ececec; +} +.panel-pane.pane-bundle-tile-pane .title-box.md-gray { + background: #666666; +} +.panel-pane.pane-bundle-tile-pane .title-box.dk-gray { + background: #2d2d2d; +} +.panel-pane.pane-bundle-tile-pane .title-box.black { + background: black; +} +.panel-pane.pane-bundle-tile-pane .title-box.red { + background: #b00; +} .panel-pane.pane-bundle-tile-pane a { text-decoration: none; - color: #fff; + color: #b00; } .panel-pane.pane-bundle-tile-pane a:visited { - color: #fff; + color: #b00; } .panel-pane.pane-bundle-tile-pane a:focus { color: #92b0d7; } .panel-pane.pane-bundle-tile-pane a:hover { - color: #ececec; + color: #666666; } .panel-pane.pane-bundle-tile-pane a:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray { + color: #2d2d2d; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray:visited { + color: #2d2d2d; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray:hover { + color: #b00; +} +.panel-pane.pane-bundle-tile-pane a.lt-gray:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.md-gray { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.md-gray:visited { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.md-gray:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.md-gray:hover { color: #ececec; } -.panel-pane.pane-bundle-tile-pane .title-box { - background: #666666; - padding: 0.8em 1em; - width: 100%; - position: absolute; - bottom: -2.6em; - z-index: 99; +.panel-pane.pane-bundle-tile-pane a.md-gray:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray:visited { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray:hover { + color: #ececec; +} +.panel-pane.pane-bundle-tile-pane a.dk-gray:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.black { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.black:visited { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.black:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.black:hover { + color: #ececec; +} +.panel-pane.pane-bundle-tile-pane a.black:active { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.red { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.red:visited { + color: #fff; +} +.panel-pane.pane-bundle-tile-pane a.red:focus { + color: #92b0d7; +} +.panel-pane.pane-bundle-tile-pane a.red:hover { + color: #ececec; +} +.panel-pane.pane-bundle-tile-pane a.red:active { + color: #92b0d7; } .panel-pane.pane-bundle-tile-pane .title-text { display: table-cell; @@ -1756,6 +1828,10 @@ div.workbench-info-block #edit-submit { padding: 0.4em 0.8em 0.4em 0.8em !important; } +.node-type-ocio-landing-page .l-header { + padding: 0 !important; +} + .l-footer-wrapper { background: #2d2d2d; color: #fff; @@ -1843,6 +1919,15 @@ div.workbench-info-block #edit-submit { margin-left: 0; } } +.l-region--hero-wrapper { + background: white; +} + +#block-ds-extras-ds-hero { + max-height: 400px; + overflow: hidden; +} + /* Styles for main menu */ .l-region--main-menu .menu .leaf, .l-region--main-menu .menu .expanded, .l-region--main-menu .menu .collapsed, .l-region--sidebar-1 .menu .leaf, .l-region--sidebar-1 .menu .expanded, .l-region--sidebar-1 .menu .collapsed { list-style-image: none; diff --git a/profiles/wcm_base/themes/ocio_omega_base/layouts/ocio-default/ocio-default-layout.tpl.php b/profiles/wcm_base/themes/ocio_omega_base/layouts/ocio-default/ocio-default-layout.tpl.php index 2bbeba19b682d2a8e034c5ce3b0dffeb6471a54f..4c777f6a092f98041a3a40845b039539d03418bc 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/layouts/ocio-default/ocio-default-layout.tpl.php +++ b/profiles/wcm_base/themes/ocio_omega_base/layouts/ocio-default/ocio-default-layout.tpl.php @@ -5,6 +5,10 @@ <?php print render($page['main_menu']); ?> </header> + <div class="l-region--hero-wrapper <?php print $main_classes; ?>"> + <?php print render($page['hero']); ?> + </div> + <?php if (!empty($page['highlighted'])): ?> <div class="l-highlighted-wrapper"> <?php print render($page['highlighted']); ?> diff --git a/profiles/wcm_base/themes/ocio_omega_base/layouts/ocio-default/ocio-default.layout.inc b/profiles/wcm_base/themes/ocio_omega_base/layouts/ocio-default/ocio-default.layout.inc index 218073992a6bf667927419528af89bb69d390382..c3bfdc334d1caf13021574ab587edbb6a24a4f35 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/layouts/ocio-default/ocio-default.layout.inc +++ b/profiles/wcm_base/themes/ocio_omega_base/layouts/ocio-default/ocio-default.layout.inc @@ -7,6 +7,7 @@ template = ocio-default-layout regions[osu_navbar] = OSU Navbar regions[masthead] = Masthead regions[main_menu] = Main Menu +regions[hero] = Hero regions[workbench] = Workbench Info regions[content] = Content regions[sidebar_1] = Sidebar 1 diff --git a/profiles/wcm_base/themes/ocio_omega_base/sass/base/_layout-base.scss b/profiles/wcm_base/themes/ocio_omega_base/sass/base/_layout-base.scss index d08b36aa8d9f7d422bd21d7c9afa3b70116c2b3c..a7b09d6d845f14a163dbd51e3eb6bf1556b04bc2 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/sass/base/_layout-base.scss +++ b/profiles/wcm_base/themes/ocio_omega_base/sass/base/_layout-base.scss @@ -1,27 +1,10 @@ // Setting l-constrained as percent padding .l-constrained { - padding:0 4%; margin: 0 auto; @include pie-clearfix; - @include breakpoint($tab, true) { - padding:0 8%; - } - @include breakpoint($desk, true) { - padding:0 10%; - } } -// setting max-width of content containers -// note: main-menu region max-width is defined in ../components/regions/_main-menu.scss -@include breakpoint($x-wide){ - .max-width { - max-width: $max-width; - margin: 0 auto; - padding: 0; - } -} - // Setting body and page background color body.html { background-color: $dk-gray; diff --git a/profiles/wcm_base/themes/ocio_omega_base/sass/components/_media_magnet.scss b/profiles/wcm_base/themes/ocio_omega_base/sass/components/_media_magnet.scss new file mode 100644 index 0000000000000000000000000000000000000000..8b80a0a0e15a74b6c3eef24d0199729d5f80c3a8 --- /dev/null +++ b/profiles/wcm_base/themes/ocio_omega_base/sass/components/_media_magnet.scss @@ -0,0 +1,32 @@ +.block--mm-widgets, +.pane-mm-widgets-live-pane { + .item { + margin: 1em 0; + + .excerpt:before { + font-family: FontAwesome; + margin-right: 0.4em; + } + + &.twitter .excerpt:before { + content: ''; + color: $twitter; + } + &.facebook-page .excerpt:before { + content: ''; + color: $facebook; + } + &.instagram .excerpt:before { + content: ''; + color: $instagram; + } + &.rss .excerpt:before { + content: ''; + color: $rss; + } + &.youtube-playlist .excerpt:before { + content: ''; + color: $youtube; + } + } +} diff --git a/profiles/wcm_base/themes/ocio_omega_base/sass/components/_tiles.scss b/profiles/wcm_base/themes/ocio_omega_base/sass/components/_tiles.scss index 94cdec571f6a99aef7e37aab282421b21e5b4058..7696180aacd1ad34ae17be3bb5322369fc59fda0 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/sass/components/_tiles.scss +++ b/profiles/wcm_base/themes/ocio_omega_base/sass/components/_tiles.scss @@ -9,20 +9,52 @@ &:hover { opacity: 0.9; } - - a { - text-decoration: none; - @include link-colors($white, $lt-gray, $lt-gray, $white, $blue); - } - + .title-box { - background: $md-gray; + background: $white; padding: 0.8em 1em; width: 100%; position: absolute; bottom: -2.6em; z-index: 99; + + &.lt-gray { + background: $lt-gray; + } + &.md-gray { + background: $md-gray; + } + &.dk-gray { + background: $dk-gray; + } + &.black{ + background: black; + } + &.red { + background: $red; + } } + + a { + text-decoration: none; + @include link-colors($red, $md-gray, $blue, $red, $blue); + + &.lt-gray { + @include link-colors($dk-gray, $red, $blue, $dk-gray, $blue); + } + &.md-gray { + @include link-colors($white, $lt-gray, $blue, $white, $blue); + } + &.dk-gray { + @include link-colors($white, $lt-gray, $blue, $white, $blue); + } + &.black { + @include link-colors($white, $lt-gray, $blue, $white, $blue); + } + &.red { + @include link-colors($white, $lt-gray, $blue, $white, $blue); + } + } .title-text { display: table-cell; diff --git a/profiles/wcm_base/themes/ocio_omega_base/sass/components/nodes/_landing-page.scss b/profiles/wcm_base/themes/ocio_omega_base/sass/components/nodes/_landing-page.scss new file mode 100644 index 0000000000000000000000000000000000000000..01d64ff81f395beab2e3ea82d2e9e482ff0dd681 --- /dev/null +++ b/profiles/wcm_base/themes/ocio_omega_base/sass/components/nodes/_landing-page.scss @@ -0,0 +1,7 @@ +//removes header padding for banner images on themes that use it +.node-type-ocio-landing-page { + .l-header { + padding:0 !important; + } + +} \ No newline at end of file diff --git a/profiles/wcm_base/themes/ocio_omega_base/sass/components/regions/_hero.scss b/profiles/wcm_base/themes/ocio_omega_base/sass/components/regions/_hero.scss new file mode 100644 index 0000000000000000000000000000000000000000..0c292d0fd616c02a5c82690448578d0d94e55bed --- /dev/null +++ b/profiles/wcm_base/themes/ocio_omega_base/sass/components/regions/_hero.scss @@ -0,0 +1,8 @@ +.l-region--hero-wrapper { + background: white; +} + +#block-ds-extras-ds-hero { + max-height: 400px; + overflow: hidden; +} \ No newline at end of file diff --git a/profiles/wcm_base/themes/ocio_omega_base/sass/variables/_colors.scss b/profiles/wcm_base/themes/ocio_omega_base/sass/variables/_colors.scss index 2b5862940eb12a05fbdd579e7afc8360933358d0..ae5fffa3d5eacdd63d8d208e7e0f640f3a8fabc2 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/sass/variables/_colors.scss +++ b/profiles/wcm_base/themes/ocio_omega_base/sass/variables/_colors.scss @@ -14,11 +14,13 @@ $purple: #442369; // social media colors $facebook: #3b5998; -$twitter: #00aced; $youtube: $red; $google-plus: #dd4b39; +$twitter: #00aced; $linkedin: #007bb6; $flickr: #ff0084; +$instagram: #517fa4; +$rss: #ff6600; //misc osu colors $orange: #d65828; diff --git a/profiles/wcm_base/themes/ocio_omega_base/sass/variables/_grid.scss b/profiles/wcm_base/themes/ocio_omega_base/sass/variables/_grid.scss index c3d44404e5bc29892725c837a69ee0f792dd1d07..423c7859ee65c1ca0cd697470ecda9b17d233d11 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/sass/variables/_grid.scss +++ b/profiles/wcm_base/themes/ocio_omega_base/sass/variables/_grid.scss @@ -8,8 +8,6 @@ $desk: 60em; //960px $wide: 75em; //1200px $x-wide: 85.375em; //1366px -$max-width: 75em; //1200px - $grids: 4; $grids: add-grid(12 at $tab); diff --git a/profiles/wcm_base/themes/ocio_omega_base/template.php b/profiles/wcm_base/themes/ocio_omega_base/template.php index 053987fb986c30ad75e71e2f1d94a3eeb4bfbf88..948f34668a95203ea5a637c81cd984c73d85f668 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/template.php +++ b/profiles/wcm_base/themes/ocio_omega_base/template.php @@ -109,4 +109,5 @@ function ocio_omega_base_omega_theme_libraries_info() { function ocio_omega_base_preprocess_fieldable_panels_pane(&$vars) { $vars['tile_title'] = $vars['content']['title']['#value']; $vars['tile_url'] = $vars['content']['field_tile_link']['#items'][0]['url']; + $vars['tile_color'] = $vars['content']['field_background_color']['#items'][0]['value']; } diff --git a/profiles/wcm_base/themes/ocio_omega_base/templates/node/node--ocio-landing-page.tpl.php b/profiles/wcm_base/themes/ocio_omega_base/templates/node/node--ocio-landing-page.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..4c2f69503c1bb20ab1db9804f56d5156d602214f --- /dev/null +++ b/profiles/wcm_base/themes/ocio_omega_base/templates/node/node--ocio-landing-page.tpl.php @@ -0,0 +1,91 @@ +<?php + +/** + * @file + * Default theme implementation to display a node. + * + * Available variables: + * - $title: the (sanitized) title of the node. + * - $content: An array of node items. Use render($content) to print them all, + * or print a subset such as render($content['field_example']). Use + * hide($content['field_example']) to temporarily suppress the printing of a + * given element. + * - $user_picture: The node author's picture from user-picture.tpl.php. + * - $date: Formatted creation date. Preprocess functions can reformat it by + * calling format_date() with the desired parameters on the $created variable. + * - $name: Themed username of node author output from theme_username(). + * - $node_url: Direct url of the current node. + * - $display_submitted: Whether submission information should be displayed. + * - $submitted: Submission information created from $name and $date during + * template_preprocess_node(). + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default values can be one or more of the + * following: + * - node: The current template type, i.e., "theming hook". + * - node-[type]: The current node type. For example, if the node is a + * "Article" it would result in "node-article". Note that the machine + * name will often be in a short form of the human readable label. + * - node-teaser: Nodes in teaser form. + * - node-preview: Nodes in preview mode. + * The following are controlled through the node publishing options. + * - node-promoted: Nodes promoted to the front page. + * - node-sticky: Nodes ordered above other non-sticky nodes in teaser + * listings. + * - node-unpublished: Unpublished nodes visible only to administrators. + * - $title_prefix (array): An array containing additional output populated by + * modules, intended to be displayed in front of the main title tag that + * appears in the template. + * - $title_suffix (array): An array containing additional output populated by + * modules, intended to be displayed after the main title tag that appears in + * the template. + * + * Other variables: + * - $node: Full node object. Contains data that may not be safe. + * - $type: Node type, i.e. page, article, etc. + * - $comment_count: Number of comments attached to the node. + * - $uid: User ID of the node author. + * - $created: Time the node was published formatted in Unix timestamp. + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. + * - $zebra: Outputs either "even" or "odd". Useful for zebra striping in + * teaser listings. + * - $id: Position of the node. Increments each time it's output. + * + * Node status variables: + * - $view_mode: View mode, e.g. 'full', 'teaser'... + * - $teaser: Flag for the teaser state (shortcut for $view_mode == 'teaser'). + * - $page: Flag for the full page state. + * - $promote: Flag for front page promotion state. + * - $sticky: Flags for sticky post setting. + * - $status: Flag for published status. + * - $comment: State of comment settings for the node. + * - $readmore: Flags true if the teaser content of the node cannot hold the + * main body content. + * - $is_front: Flags true when presented in the front page. + * - $logged_in: Flags true when the current user is a logged-in member. + * - $is_admin: Flags true when the current user is an administrator. + * + * Field variables: for each field instance attached to the node a corresponding + * variable is defined, e.g. $node->body becomes $body. When needing to access + * a field's raw values, developers/themers are strongly encouraged to use these + * variables. Otherwise they will have to explicitly specify the desired field + * language, e.g. $node->body['en'], thus overriding any language negotiation + * rule that was previously applied. + * + * @see template_preprocess() + * @see template_preprocess_node() + * @see template_process() + */ +?> +<article<?php print $attributes; ?>> + + + <?php print $title; ?> + + + <?php print render($content['field_banner_image']); ?> + + + +</article> diff --git a/profiles/wcm_base/themes/ocio_omega_base/templates/node/node.tpl.php b/profiles/wcm_base/themes/ocio_omega_base/templates/node/node.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..77c117a1a10caa914c60f7b5bac1740c86ce45ce --- /dev/null +++ b/profiles/wcm_base/themes/ocio_omega_base/templates/node/node.tpl.php @@ -0,0 +1,110 @@ +<?php + +/** + * @file + * Default theme implementation to display a node. + * + * Available variables: + * - $title: the (sanitized) title of the node. + * - $content: An array of node items. Use render($content) to print them all, + * or print a subset such as render($content['field_example']). Use + * hide($content['field_example']) to temporarily suppress the printing of a + * given element. + * - $user_picture: The node author's picture from user-picture.tpl.php. + * - $date: Formatted creation date. Preprocess functions can reformat it by + * calling format_date() with the desired parameters on the $created variable. + * - $name: Themed username of node author output from theme_username(). + * - $node_url: Direct url of the current node. + * - $display_submitted: Whether submission information should be displayed. + * - $submitted: Submission information created from $name and $date during + * template_preprocess_node(). + * - $classes: String of classes that can be used to style contextually through + * CSS. It can be manipulated through the variable $classes_array from + * preprocess functions. The default values can be one or more of the + * following: + * - node: The current template type, i.e., "theming hook". + * - node-[type]: The current node type. For example, if the node is a + * "Article" it would result in "node-article". Note that the machine + * name will often be in a short form of the human readable label. + * - node-teaser: Nodes in teaser form. + * - node-preview: Nodes in preview mode. + * The following are controlled through the node publishing options. + * - node-promoted: Nodes promoted to the front page. + * - node-sticky: Nodes ordered above other non-sticky nodes in teaser + * listings. + * - node-unpublished: Unpublished nodes visible only to administrators. + * - $title_prefix (array): An array containing additional output populated by + * modules, intended to be displayed in front of the main title tag that + * appears in the template. + * - $title_suffix (array): An array containing additional output populated by + * modules, intended to be displayed after the main title tag that appears in + * the template. + * + * Other variables: + * - $node: Full node object. Contains data that may not be safe. + * - $type: Node type, i.e. page, article, etc. + * - $comment_count: Number of comments attached to the node. + * - $uid: User ID of the node author. + * - $created: Time the node was published formatted in Unix timestamp. + * - $classes_array: Array of html class attribute values. It is flattened + * into a string within the variable $classes. + * - $zebra: Outputs either "even" or "odd". Useful for zebra striping in + * teaser listings. + * - $id: Position of the node. Increments each time it's output. + * + * Node status variables: + * - $view_mode: View mode, e.g. 'full', 'teaser'... + * - $teaser: Flag for the teaser state (shortcut for $view_mode == 'teaser'). + * - $page: Flag for the full page state. + * - $promote: Flag for front page promotion state. + * - $sticky: Flags for sticky post setting. + * - $status: Flag for published status. + * - $comment: State of comment settings for the node. + * - $readmore: Flags true if the teaser content of the node cannot hold the + * main body content. + * - $is_front: Flags true when presented in the front page. + * - $logged_in: Flags true when the current user is a logged-in member. + * - $is_admin: Flags true when the current user is an administrator. + * + * Field variables: for each field instance attached to the node a corresponding + * variable is defined, e.g. $node->body becomes $body. When needing to access + * a field's raw values, developers/themers are strongly encouraged to use these + * variables. Otherwise they will have to explicitly specify the desired field + * language, e.g. $node->body['en'], thus overriding any language negotiation + * rule that was previously applied. + * + * @see template_preprocess() + * @see template_preprocess_node() + * @see template_process() + */ +?> +<article<?php print $attributes; ?>> + <?php if (!empty($title_prefix) || !empty($title_suffix) || !$page): ?> + <header> + <?php print render($title_prefix); ?> + <?php if (!$page): ?> + <h2<?php print $title_attributes; ?>><a href="<?php print $node_url; ?>" rel="bookmark"><?php print $title; ?></a></h2> + <?php endif; ?> + <?php print render($title_suffix); ?> + </header> + <?php endif; ?> + + <?php if ($display_submitted): ?> + <footer class="node__submitted"> + <?php print $user_picture; ?> + <p class="submitted"><?php print $submitted; ?></p> + </footer> + <?php endif; ?> + + <div<?php print $content_attributes; ?>> + <?php + // We hide the comments and links now so that we can render them later. + hide($content['comments']); + hide($content['links']); + print render($content); + ?> + </div> + + <?php print render($content['links']); ?> + <?php print render($content['comments']); ?> +</article> diff --git a/profiles/wcm_base/themes/ocio_omega_base/templates/panes/fieldable-panels-pane--tile-pane.tpl.php b/profiles/wcm_base/themes/ocio_omega_base/templates/panes/fieldable-panels-pane--tile-pane.tpl.php index 3c17e02fb22a151cb4d7836fb8b6557269102040..ba9f968f4cac74d6fa8d11c76b11cc27634d24e2 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/templates/panes/fieldable-panels-pane--tile-pane.tpl.php +++ b/profiles/wcm_base/themes/ocio_omega_base/templates/panes/fieldable-panels-pane--tile-pane.tpl.php @@ -1,6 +1,6 @@ -<a href="<?php print $tile_url; ?>"> +<a href="<?php print $tile_url; ?>" class="<?php print $tile_color; ?>"> <?php print render($content['field_tile_background_img']); ?> - <div class="title-box"> + <div class="title-box <?php print $tile_color; ?>"> <div class="title-text"><h2><?php print $tile_title; ?></h2></div> <div class="title-icon"><i class="fa fa-angle-right"></i></div> </div> diff --git a/profiles/wcm_base/themes/ocio_omega_base/templates/system/html.tpl.php b/profiles/wcm_base/themes/ocio_omega_base/templates/system/html.tpl.php index b50eaab6b32120d05dac0df00d88bb1e37c37187..4fa4378eeab4b765f825036b23ba83eb7e59e4be 100644 --- a/profiles/wcm_base/themes/ocio_omega_base/templates/system/html.tpl.php +++ b/profiles/wcm_base/themes/ocio_omega_base/templates/system/html.tpl.php @@ -11,7 +11,7 @@ <?php endif; ?> <head> <!-- font awesome --> - <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet"> + <link href="//netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css" rel="stylesheet"> <!-- code font --> <script src="//use.edgefonts.net/courier-prime.js"></script> diff --git a/profiles/wcm_base/wcm_base.info b/profiles/wcm_base/wcm_base.info index 354aca0396a96561e708da8917f9dcbaba34ee4e..9d92037fc28c1c7c5e3900dea9a339cc2babd32b 100644 --- a/profiles/wcm_base/wcm_base.info +++ b/profiles/wcm_base/wcm_base.info @@ -82,6 +82,7 @@ dependencies[] = uuid ; Custom +dependencies[] = mm_widgets dependencies[] = ocio_accessibility dependencies[] = ocio_admin_menu dependencies[] = ocio_aggregator diff --git a/profiles/wcm_base/wcm_base.make b/profiles/wcm_base/wcm_base.make index 1c77ab24a687515136362b09bd28587e425667d6..bf2b8c018ef69266a80e1293511562b9e656e03e 100644 --- a/profiles/wcm_base/wcm_base.make +++ b/profiles/wcm_base/wcm_base.make @@ -91,6 +91,12 @@ projects[omega][version] = 4.3 ; ********************************************** ; ****************** CUSTOM ******************** +projects[mm][type] = module +projects[mm][subdir] = custom +projects[mm][download][type] = "git" +projects[mm][download][url] = git@code.osu.edu:openosu/mm.git +projects[mm][download][branch] = 7.x-1.x + projects[ocio_accessibility][type] = module projects[ocio_accessibility][subdir] = custom projects[ocio_accessibility][download][type] = "git"