diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc b/profiles/panopoly/modules/contrib/search_api/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc
index 8abec28..ee27201 100644
--- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc
+++ b/profiles/panopoly/modules/contrib/search_api/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc
@@ -49,8 +49,7 @@ class SearchApiFacetapiAdapter extends FacetapiAdapter {
     if ($search && $search[0]->getOption('search_api_base_path')) {
       return $search[0]->getOption('search_api_base_path');
     }
-    $item = menu_get_item();
-    return $item['href'];
+    return $_GET['q'];
   }
 
   /**
diff --git a/search_api_facetapi.patch b/search_api_facetapi.patch
index 45ac845..e69de29 100644
--- a/search_api_facetapi.patch
+++ b/search_api_facetapi.patch
@@ -1,1432 +0,0 @@
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc b/profiles/panopoly/modules/contrib/search_api/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc
-index 8abec28..ee27201 100644
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc
-+++ b/profiles/panopoly/modules/contrib/search_api/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc
-@@ -49,8 +49,7 @@ class SearchApiFacetapiAdapter extends FacetapiAdapter {
-     if ($search && $search[0]->getOption('search_api_base_path')) {
-       return $search[0]->getOption('search_api_base_path');
-     }
--    $item = menu_get_item();
--    return $item['href'];
-+    return $_GET['q'];
-   }
- 
-   /**
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/README.txt b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/README.txt
-deleted file mode 100644
-index 89ebf6a..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/README.txt
-+++ /dev/null
-@@ -1,125 +0,0 @@
--Search facets
---------------
--
--This module allows you to create facetted searches for any search executed via
--the Search API, no matter if executed by a search page, a view or any other
--module. The only thing you'll need is a search service class that supports the
--"search_api_facets" feature. Currently, the "Database search" and "Solr search"
--modules supports this.
--
--This module is built on the Facet API [1], which is needed for this module to
--work.
--
--[1] http://drupal.org/project/facetapi
--
--
--Information for site builders
-------------------------------
--
--For creating a facetted search, you first need a search. Create or find some
--page displaying Search API search results, either via a search page, a view or
--by any other means. Now go to the configuration page for the index on which
--this search is executed.
--If the index lies on a server supporting facets (and if this module is enabled),
--you'll notice a "Facets" tab. Click it and it will take you to the index' facet
--configuration page. You'll see a table containing all indexed fields and options
--for enabling and configuring facets for them.
--For a detailed explanation of the available options, please refer to the Facet
--API documentation.
--
--- Creating facets via the URL
--
--Facets can be added to a search (for which facets are activated) by passing
--appropriate GET parameters in the URL. Assuming you have an indexed field with
--the machine name "field_price", you can filter on it in the following ways:
--
--- Filter for a specific value. For finding only results that have a price of
--  exactly 100, pass the following $options to url() or l():
--
--  $options['query']['f'][] = 'field_price:100';
--
--  Or manually append the following GET parameter to a URL:
--
--  ?f[0]=field_price:100
--
--- Search for values in a specified range. The following example will only return
--  items that have a price greater than or equal to 100 and lower than 500.
--
--  Code: $options['query']['f'][] = 'field_price:[100 TO 500]';
--  URL:  ?f[0]=field_price%3A%5B100%20TO%20500%5D
--
--- Search for values above a value. The next example will find results which have
--  a price greater than or equal to 100. The asterisk (*) stands for "unlimited",
--  meaning that there is no upper limit. Filtering for values lower than a
--  certain value works equivalently.
--
--  Code: $options['query']['f'][] = 'field_price:[100 TO *]';
--  URL:  ?f[0]=field_price%3A%5B100%20TO%20%2A%5D
--
--- Search for missing values. This example will filter out all items which have
--  any value at all in the price field, and will therefore only list items on
--  which this field was omitted. (This naturally only makes sense for fields
--  that aren't required.)
--
--  Code: $options['query']['f'][] = 'field_price:!';
--  URL:  ?f[0]=field_price%3A%21
--
--- Search for present values. The following example will only return items which
--  have the price field set (regardless of the actual value). You can see that it
--  is actually just a range filter with unlimited lower and upper bound.
--
--  Code: $options['query']['f'][] = 'field_price:[* TO *]';
--  URL:  ?f[0]=field_price%3A%5B%2A%20TO%20%2A%5D
--
--Note: When filtering a field whose machine name contains a colon (e.g.,
--"author:roles"), you'll have to additionally URL-encode the field name in these
--filter values:
--  Code: $options['query']['f'][] = rawurlencode('author:roles') . ':100';
--  URL:  ?f[0]=author%253Aroles%3A100
--
--- Issues
--
--If you find any bugs or shortcomings while using this module, please file an
--issue in the project's issue queue [1], using the "Facets" component.
--
--[1] http://drupal.org/project/issues/search_api
--
--
--Information for developers
----------------------------
--
--- Features
--
--If you are the developer of a SearchApiServiceInterface implementation and want
--to support facets with your service class, too, you'll have to support the
--"search_api_facets" feature. You can find details about the necessary additions
--to your class in the example_servive.php file. In short, you'll just, when
--executing a query, have to return facet terms and counts according to the
--query's "search_api_facets" option, if present.
--In order for the module to be able to tell that your server supports facets,
--you will also have to change your service's supportsFeature() method to
--something like the following:
--  public function supportsFeature($feature) {
--    return $feature == 'search_api_facets';
--  }
--
--There is also a second feature defined by this module, namely
--"search_api_facets_operator_or", for supporting "OR" facets. The requirements
--for this feature are also explained in the example_servive.php file.
--
--- Query option
--
--The facets created follow the "search_api_base_path" option on the search query.
--If set, this path will be used as the base path from which facet links will be
--created. This can be used to show facets on pages without searches – e.g., as a
--landing page.
--
--- Hidden variable
--
--The module uses one hidden variable, "search_api_facets_search_ids", to keep
--track of the search IDs of searches executed for a given index. It is only
--updated when a facet is displayed for the respective search, so isn't really a
--reliable measure for this.
--In any case, if you e.g. did some test searches and now don't want them to show
--up in the block configuration forever after, just clear the variable:
--  variable_del("search_api_facets_search_ids")
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/example_service.php b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/example_service.php
-deleted file mode 100644
-index be3760d..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/example_service.php
-+++ /dev/null
-@@ -1,209 +0,0 @@
--<?php
--
--/**
-- * @file
-- * Example implementation for a service class which supports facets.
-- */
--
--/**
-- * Example class explaining how facets can be supported by a service class.
-- *
-- * This class defines the "search_api_facets" and
-- * "search_api_facets_operator_or" features. Read the method documentation and
-- * inline comments in search() to learn how they can be supported by a service
-- * class.
-- */
--abstract class SearchApiFacetapiExampleService extends SearchApiAbstractService {
--
--  /**
--   * Determines whether this service class implementation supports a given
--   * feature. Features are optional extensions to Search API functionality and
--   * usually defined and used by third-party modules.
--   *
--   * If the service class supports facets, it should return TRUE if called with
--   * the feature name "search_api_facets". If it also supports "OR" facets, it
--   * should also return TRUE if called with "search_api_facets_operator_or".
--   *
--   * @param string $feature
--   *   The name of the optional feature.
--   *
--   * @return boolean
--   *   TRUE if this service knows and supports the specified feature. FALSE
--   *   otherwise.
--   */
--  public function supportsFeature($feature) {
--    $supported = array(
--      'search_api_facets' => TRUE,
--      'search_api_facets_operator_or' => TRUE,
--    );
--    return isset($supported[$feature]);
--  }
--
--  /**
--   * Executes a search on the server represented by this object.
--   *
--   * If the service class supports facets, it should check for an additional
--   * option on the query object:
--   * - search_api_facets: An array of facets to return along with the results
--   *   for this query. The array is keyed by an arbitrary string which should
--   *   serve as the facet's unique identifier for this search. The values are
--   *   arrays with the following keys:
--   *   - field: The field to construct facets for.
--   *   - limit: The maximum number of facet terms to return. 0 or an empty
--   *     value means no limit.
--   *   - min_count: The minimum number of results a facet value has to have in
--   *     order to be returned.
--   *   - missing: If TRUE, a facet for all items with no value for this field
--   *     should be returned (if it conforms to limit and min_count).
--   *   - operator: (optional) If the service supports "OR" facets and this key
--   *     contains the string "or", the returned facets should be "OR" facets. If
--   *     the server doesn't support "OR" facets, this key can be ignored.
--   *
--   * The basic principle of facets is explained quite well in the
--   * @link http://en.wikipedia.org/wiki/Faceted_search Wikipedia article on
--   * "Faceted search" @endlink. Basically, you should return for each field
--   * filter values which would yield some results when used with the search.
--   * E.g., if you return for a field $field the term $term with $count results,
--   * the given $query along with
--   *   $query->condition($field, $term)
--   * should yield exactly (or about) $count results.
--   *
--   * For "OR" facets, all existing filters on the facetted field should be
--   * ignored for computing the facets.
--   *
--   * @param $query
--   *   The SearchApiQueryInterface object to execute.
--   *
--   * @return array
--   *   An associative array containing the search results, as required by
--   *   SearchApiQueryInterface::execute().
--   *   In addition, if the "search_api_facets" option is present on the query,
--   *   the results should contain an array of facets in the "search_api_facets"
--   *   key, as specified by the option. The facets array should be keyed by the
--   *   facets' unique identifiers, and contain a numeric array of facet terms,
--   *   sorted descending by result count. A term is represented by an array with
--   *   the following keys:
--   *   - count: Number of results for this term.
--   *   - filter: The filter to apply when selecting this facet term. A filter is
--   *     a string of one of the following forms:
--   *     - "VALUE": Filter by the literal value VALUE (always include the
--   *       quotes, not only for strings).
--   *     - [VALUE1 VALUE2]: Filter for a value between VALUE1 and VALUE2. Use
--   *       parantheses for excluding the border values and square brackets for
--   *       including them. An asterisk (*) can be used as a wildcard. E.g.,
--   *       (* 0) or [* 0) would be a filter for all negative values.
--   *     - !: Filter for items without a value for this field (i.e., the
--   *       "missing" facet).
--   *
--   * @throws SearchApiException
--   *   If an error prevented the search from completing.
--   */
--  public function search(SearchApiQueryInterface $query) {
--    // We assume here that we have an AI search which understands English
--    // commands.
--
--    // First, create the normal search query, without facets.
--    $search = new SuperCoolAiSearch($query->getIndex());
--    $search->cmd('create basic search for the following query', $query);
--    $ret = $search->cmd('return search results in Search API format');
--
--    // Then, let's see if we should return any facets.
--    if ($facets = $query->getOption('search_api_facets')) {
--      // For the facets, we need all results, not only those in the specified
--      // range.
--      $results = $search->cmd('return unlimited search results as a set');
--      foreach ($facets as $id => $facet) {
--        $field = $facet['field'];
--        $limit = empty($facet['limit']) ? 'all' : $facet['limit'];
--        $min_count = $facet['min_count'];
--        $missing = $facet['missing'];
--        $or = isset($facet['operator']) && $facet['operator'] == 'or';
--
--        // If this is an "OR" facet, existing filters on the field should be
--        // ignored for computing the facets.
--        // You can ignore this if your service class doesn't support the
--        // "search_api_facets_operator_or" feature.
--        if ($or) {
--          // We have to execute another query (in the case of this hypothetical
--          // search backend, at least) to get the right result set to facet.
--          $tmp_search = new SuperCoolAiSearch($query->getIndex());
--          $tmp_search->cmd('create basic search for the following query', $query);
--          $tmp_search->cmd("remove all conditions for field $field");
--          $tmp_results = $tmp_search->cmd('return unlimited search results as a set');
--        }
--        else {
--          // Otherwise, we can just use the normal results.
--          $tmp_results = $results;
--        }
--
--        $filters = array();
--        if ($search->cmd("$field is a date or numeric field")) {
--          // For date, integer or float fields, range facets are more useful.
--          $ranges = $search->cmd("list $limit ranges of field $field in the following set", $tmp_results);
--          foreach ($ranges as $range) {
--            if ($range->getCount() >= $min_count) {
--              // Get the lower and upper bound of the range. * means unlimited.
--              $lower = $range->getLowerBound();
--              $lower = ($lower == SuperCoolAiSearch::RANGE_UNLIMITED) ? '*' : $lower;
--              $upper = $range->getUpperBound();
--              $upper = ($upper == SuperCoolAiSearch::RANGE_UNLIMITED) ? '*' : $upper;
--              // Then, see whether the bounds are included in the range. These
--              // can be specified independently for the lower and upper bound.
--              // Parentheses are used for exclusive bounds, square brackets are
--              // used for inclusive bounds.
--              $lowChar = $range->isLowerBoundInclusive() ? '[' : '(';
--              $upChar = $range->isUpperBoundInclusive() ? ']' : ')';
--              // Create the filter, which separates the bounds with a single
--              // space.
--              $filter = "$lowChar$lower $upper$upChar";
--              $filters[$filter] = $range->getCount();
--            }
--          }
--        }
--        else {
--          // Otherwise, we use normal single-valued facets.
--          $terms = $search->cmd("list $limit values of field $field in the following set", $tmp_results);
--          foreach ($terms as $term) {
--            if ($term->getCount() >= $min_count) {
--              // For single-valued terms, we just need to wrap them in quotes.
--              $filter = '"' . $term->getValue() . '"';
--              $filters[$filter] = $term->getCount();
--            }
--          }
--        }
--
--        // If we should also return a "missing" facet, compute that as the
--        // number of results without a value for the facet field.
--        if ($missing) {
--          $count = $search->cmd("return number of results without field $field in the following set", $tmp_results);
--          if ($count >= $min_count) {
--            $filters['!'] = $count;
--          }
--        }
--
--        // Sort the facets descending by result count.
--        arsort($filters);
--
--        // With the "missing" facet, we might have too many facet terms (unless
--        // $limit was empty and is therefore now set to "all"). If this is the
--        // case, remove those with the lowest number of results.
--        while (is_numeric($limit) && count($filters) > $limit) {
--          array_pop($filters);
--        }
--
--        // Now add the facet terms to the return value, as specified in the doc
--        // comment for this method.
--        foreach ($filters as $filter => $count) {
--          $ret['search_api_facets'][$id][] = array(
--            'count' => $count,
--            'filter' => $filter,
--          );
--        }
--      }
--    }
--
--    // Return the results, which now also includes the facet information.
--    return $ret;
--  }
--
--}
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc
-deleted file mode 100644
-index ee27201..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/adapter.inc
-+++ /dev/null
-@@ -1,242 +0,0 @@
--<?php
--
--/**
-- * @file
-- * Classes used by the Facet API module.
-- */
--
--/**
-- * Facet API adapter for the Search API module.
-- */
--class SearchApiFacetapiAdapter extends FacetapiAdapter {
--
--  /**
--   * Cached value for the current search for this searcher, if any.
--   *
--   * @see getCurrentSearch()
--   *
--   * @var array
--   */
--  protected $current_search;
--
--  /**
--   * The active facet fields for the current search.
--   *
--   * @var array
--   */
--  protected $fields = array();
--
--  /**
--   * Returns the path to the admin settings for a given realm.
--   *
--   * @param $realm_name
--   *   The name of the realm.
--   *
--   * @return
--   *   The path to the admin settings.
--   */
--  public function getPath($realm_name) {
--    $base_path = 'admin/config/search/search_api';
--    $index_id = $this->info['instance'];
--    return $base_path . '/index/' . $index_id . '/facets/' . $realm_name;
--  }
--
--  /**
--   * Overrides FacetapiAdapter::getSearchPath().
--   */
--  public function getSearchPath() {
--    $search = $this->getCurrentSearch();
--    if ($search && $search[0]->getOption('search_api_base_path')) {
--      return $search[0]->getOption('search_api_base_path');
--    }
--    return $_GET['q'];
--  }
--
--  /**
--   * Allows the backend to initialize its query object before adding the facet filters.
--   *
--   * @param mixed $query
--   *   The backend's native object.
--   */
--  public function initActiveFilters($query) {
--    $search_id = $query->getOption('search id');
--    $index_id = $this->info['instance'];
--    $facets = facetapi_get_enabled_facets($this->info['name']);
--    $this->fields = array();
--
--    // We statically store the current search per facet so that we can correctly
--    // assign it when building the facets. See the build() method in the query
--    // type plugin classes.
--    $active = &drupal_static('search_api_facetapi_active_facets', array());
--    foreach ($facets as $facet) {
--      $options = $this->getFacet($facet)->getSettings()->settings;
--      // The 'default_true' option is a choice between "show on all but the
--      // selected searches" (TRUE) and "show for only the selected searches".
--      $default_true = isset($options['default_true']) ? $options['default_true'] : TRUE;
--      // The 'facet_search_ids' option is the list of selected searches that
--      // will either be excluded or for which the facet will exclusively be
--      // displayed.
--      $facet_search_ids = isset($options['facet_search_ids']) ? $options['facet_search_ids'] : array();
--
--      if (array_search($search_id, $facet_search_ids) === FALSE) {
--        $search_ids = variable_get('search_api_facets_search_ids', array());
--        if (empty($search_ids[$index_id][$search_id])) {
--          // Remember this search ID.
--          $search_ids[$index_id][$search_id] = $search_id;
--          variable_set('search_api_facets_search_ids', $search_ids);
--        }
--        if (!$default_true) {
--          continue; // We are only to show facets for explicitly named search ids.
--        }
--      }
--      elseif ($default_true) {
--        continue; // The 'facet_search_ids' in the settings are to be excluded.
--      }
--      $active[$facet['name']] = $search_id;
--      $this->fields[$facet['name']] = array(
--        'field'             => $facet['field'],
--        'limit'             => $options['hard_limit'],
--        'operator'          => $options['operator'],
--        'min_count'         => $options['facet_mincount'],
--        'missing'           => $options['facet_missing'],
--      );
--    }
--  }
--
--  /**
--   * Add the given facet to the query.
--   */
--  public function addFacet(array $facet, SearchApiQueryInterface $query) {
--    if (isset($this->fields[$facet['name']])) {
--      $options = &$query->getOptions();
--      $options['search_api_facets'][$facet['name']] = $this->fields[$facet['name']];
--    }
--  }
--
--  /**
--   * Returns a boolean flagging whether $this->_searcher executed a search.
--   */
--  public function searchExecuted() {
--    return (bool) $this->getCurrentSearch();
--  }
--
--  /**
--   * Helper method for getting a current search for this searcher.
--   *
--   * @return array
--   *   The first matching current search, in the form specified by
--   *   search_api_current_search(). Or NULL, if no match was found.
--   */
--  public function getCurrentSearch() {
--    if (!isset($this->current_search)) {
--      $this->current_search = FALSE;
--      $index_id = $this->info['instance'];
--      // There is currently no way to configure the "current search" block to
--      // show on a per-searcher basis as we do with the facets. Therefore we
--      // cannot match it up to the correct "current search".
--      // I suspect that http://drupal.org/node/593658 would help.
--      // For now, just taking the first current search for this index. :-/
--      foreach (search_api_current_search() as $search) {
--        list($query, $results) = $search;
--        if ($query->getIndex()->machine_name == $index_id) {
--          $this->current_search = $search;
--        }
--      }
--    }
--    return $this->current_search ? $this->current_search : NULL;
--  }
--
--  /**
--   * Returns a boolean flagging whether facets in a realm shoud be displayed.
--   *
--   * Useful, for example, for suppressing sidebar blocks in some cases.
--   *
--   * @return
--   *   A boolean flagging whether to display a given realm.
--   */
--  public function suppressOutput($realm_name) {
--    // Not sure under what circumstances the output will need to be suppressed?
--    return FALSE;
--  }
--
--  /**
--   * Returns the search keys.
--   */
--  public function getSearchKeys() {
--    $search = $this->getCurrentSearch();
--    $keys = $search[0]->getOriginalKeys();
--    if (is_array($keys)) {
--      // This will happen nearly never when displaying the search keys to the
--      // user, so go with a simple work-around.
--      // If someone complains, we can easily add a method for printing them
--      // properly.
--      $keys = '[' . t('complex query') . ']';
--    }
--    elseif (!$keys) {
--      // If a base path other than the current one is set, we assume that we
--      // shouldn't report on the current search. Highly hack-y, of course.
--      if ($search[0]->getOption('search_api_base_path', $_GET['q']) !== $_GET['q']) {
--        return NULL;
--      }
--      // Work-around since Facet API won't show the "Current search" block
--      // without keys.
--      $keys = '[' . t('all items') . ']';
--    }
--    drupal_alter('search_api_facetapi_keys', $keys, $search[0]);
--    return $keys;
--  }
--
--  /**
--   * Returns the number of total results found for the current search.
--   */
--  public function getResultCount() {
--    $search = $this->getCurrentSearch();
--    // Each search is an array with the query as the first element and the results
--    // array as the second.
--    if (isset($search[1])) {
--      return $search[1]['result count'];
--    }
--    return 0;
--  }
--
--  /**
--   * Allows for backend specific overrides to the settings form.
--   */
--  public function settingsForm(&$form, &$form_state) {
--    $facet = $form['#facetapi']['facet'];
--    $realm = $form['#facetapi']['realm'];
--    $facet_settings = $this->getFacet($facet)->getSettings();
--    $options = $facet_settings->settings;
--    $search_ids = variable_get('search_api_facets_search_ids', array());
--    $search_ids = isset($search_ids[$this->info['instance']]) ? $search_ids[$this->info['instance']] : array();
--    if (count($search_ids) > 1) {
--      $form['global']['default_true'] = array(
--        '#type' => 'select',
--        '#title' => t('Display for searches'),
--        '#options' => array(
--          TRUE => t('For all except the selected'),
--          FALSE => t('Only for the selected'),
--        ),
--        '#default_value' => isset($options['default_true']) ? $options['default_true'] : TRUE,
--      );
--      $form['global']['facet_search_ids'] = array(
--        '#type' => 'select',
--        '#title' => t('Search IDs'),
--        '#options' => $search_ids,
--        '#size' => min(4, count($search_ids)),
--        '#multiple' => TRUE,
--        '#default_value' => isset($options['facet_search_ids']) ? $options['facet_search_ids'] : array(),
--      );
--    }
--    else {
--      $form['global']['default_true'] = array(
--        '#type' => 'value',
--        '#value' => TRUE,
--      );
--      $form['global']['facet_search_ids'] = array(
--        '#type' => 'value',
--        '#value' => array(),
--      );
--    }
--  }
--}
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/query_type_date.inc b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/query_type_date.inc
-deleted file mode 100644
-index 33a8788..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/query_type_date.inc
-+++ /dev/null
-@@ -1,194 +0,0 @@
--<?php
--
--/**
-- * @file
-- * Date query type plugin for the Search API adapter.
-- */
--
--/**
-- * Plugin for "date" query types.
-- */
--class SearchApiFacetapiDate extends SearchApiFacetapiTerm implements FacetapiQueryTypeInterface {
--
--  /**
--   * Loads the include file containing the date API functions.
--   */
--  public function __construct(FacetapiAdapter $adapter, array $facet) {
--    module_load_include('date.inc', 'facetapi');
--    parent::__construct($adapter, $facet);
--  }
--
--  /**
--   * Returns the query type associated with the plugin.
--   *
--   * @return string
--   *   The query type.
--   */
--  static public function getType() {
--    return 'date';
--  }
--
--  /**
--   * Adds the filter to the query object.
--   *
--   * @param $query
--   *   An object containing the query in the backend's native API.
--   */
--  public function execute($query) {
--    // Return terms for this facet.
--    $this->adapter->addFacet($this->facet, $query);
--    // Change limit to "unlimited" (-1).
--    $options = &$query->getOptions();
--    $options['search_api_facets'][$this->facet['name']]['limit'] = -1;
--
--    if ($active = $this->adapter->getActiveItems($this->facet)) {
--      $item = end($active);
--      $field = $this->facet['field'];
--      $regex = str_replace(array('^', '$'), '', FACETAPI_REGEX_DATE);
--      $filter = preg_replace_callback($regex, array($this, 'replaceDateString'), $item['value']);
--      $this->addFacetFilter($query, $field, $filter);
--    }
--  }
--
--  /**
--   * Replacement callback for replacing ISO dates with timestamps.
--   */
--  public function replaceDateString($matches) {
--    return strtotime($matches[0]);
--  }
--
--  /**
--   * Initializes the facet's build array.
--   *
--   * @return array
--   *   The initialized render array.
--   */
--  public function build() {
--    $facet = $this->adapter->getFacet($this->facet);
--    $search_ids = drupal_static('search_api_facetapi_active_facets', array());
--    if (empty($search_ids[$facet['name']]) || !search_api_current_search($search_ids[$facet['name']])) {
--      return array();
--    }
--    $search_id = $search_ids[$facet['name']];
--    $build = array();
--    $search = search_api_current_search($search_id);
--    $results = $search[1];
--    if (!$results['result count']) {
--      return array();
--    }
--    // Gets total number of documents matched in search.
--    $total = $results['result count'];
--
--    // Most of the code below is copied from search_facetapi's implementation of
--    // this method.
--
--    // Executes query, iterates over results.
--    if (isset($results['search_api_facets']) && isset($results['search_api_facets'][$this->facet['field']])) {
--      $values = $results['search_api_facets'][$this->facet['field']];
--      foreach ($values as $value) {
--        if ($value['count']) {
--          $filter = $value['filter'];
--          // We only process single values further. The "missing" filter and
--          // range filters will be passed on unchanged.
--          if ($filter == '!') {
--            $build[$filter]['#count'] = $value['count'];
--          }
--          elseif ($filter[0] == '"') {
--            $filter = substr($value['filter'], 1, -1);
--            if ($filter) {
--              $raw_values[$filter] = $value['count'];
--            }
--          }
--          else {
--            $filter = substr($value['filter'], 1, -1);
--            $pos = strpos($filter, ' ');
--            if ($pos !== FALSE) {
--              $lower = facetapi_isodate(substr($filter, 0, $pos), FACETAPI_DATE_DAY);
--              $upper = facetapi_isodate(substr($filter, $pos + 1), FACETAPI_DATE_DAY);
--              $filter = '[' . $lower . ' TO ' . $upper . ']';
--            }
--            $build[$filter]['#count'] = $value['count'];
--          }
--        }
--      }
--    }
--
--    // Gets active facets, starts building hierarchy.
--    $parent = $gap = NULL;
--    foreach ($this->adapter->getActiveItems($this->facet) as $value => $item) {
--      // If the item is active, the count is the result set count.
--      $build[$value] = array('#count' => $total);
--
--      // Gets next "gap" increment, minute being the lowest we can go.
--      if ($value[0] != '[' || $value[strlen($value) - 1] != ']' || !($pos = strpos($value, ' TO '))) {
--        continue;
--      }
--      $start = substr($value, 1, $pos);
--      $end = substr($value, $pos + 4, -1);
--      $date_gap = facetapi_get_date_gap($start, $end);
--      $gap = facetapi_get_next_date_gap($date_gap, FACETAPI_DATE_MINUTE);
--
--      // If there is a previous item, there is a parent, uses a reference so the
--      // arrays are populated when they are updated.
--      if (NULL !== $parent) {
--        $build[$parent]['#item_children'][$value] = &$build[$value];
--        $build[$value]['#item_parents'][$parent] = $parent;
--      }
--
--      // Stores the last value iterated over.
--      $parent = $value;
--    }
--    if (empty($raw_values)) {
--      return $build;
--    }
--    ksort($raw_values);
--
--    // Mind the gap! Calculates gap from min and max timestamps.
--    $timestamps = array_keys($raw_values);
--    if (NULL === $parent) {
--      if (count($raw_values) > 1) {
--        $gap = facetapi_get_timestamp_gap(min($timestamps), max($timestamps));
--      }
--      else {
--        $gap = FACETAPI_DATE_HOUR;
--      }
--    }
--
--    // Converts all timestamps to dates in ISO 8601 format.
--    $dates = array();
--    foreach ($timestamps as $timestamp) {
--      $dates[$timestamp] = facetapi_isodate($timestamp, $gap);
--    }
--
--    // Treat each date as the range start and next date as the range end.
--    $range_end = array();
--    $previous = NULL;
--    foreach (array_unique($dates) as $date) {
--      if (NULL !== $previous) {
--        $range_end[$previous] = facetapi_get_next_date_increment($previous, $gap);
--      }
--      $previous = $date;
--    }
--    $range_end[$previous] = facetapi_get_next_date_increment($previous, $gap);
--
--    // Groups dates by the range they belong to, builds the $build array
--    // with the facet counts and formatted range values.
--    foreach ($raw_values as $value => $count) {
--      $new_value = '[' . $dates[$value] . ' TO ' . $range_end[$dates[$value]] . ']';
--      if (!isset($build[$new_value])) {
--        $build[$new_value] = array('#count' => $count);
--      }
--      else {
--        $build[$new_value]['#count'] += $count;
--      }
--
--      // Adds parent information if not already set.
--      if (NULL !== $parent && $parent != $new_value) {
--        $build[$parent]['#item_children'][$new_value] = &$build[$new_value];
--        $build[$new_value]['#item_parents'][$parent] = $parent;
--      }
--    }
--
--    return $build;
--  }
--}
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/query_type_term.inc b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/query_type_term.inc
-deleted file mode 100644
-index 41ea9b4..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/plugins/facetapi/query_type_term.inc
-+++ /dev/null
-@@ -1,151 +0,0 @@
--<?php
--
--/**
-- * @file
-- * Term query type plugin for the Apache Solr adapter.
-- */
--
--/**
-- * Plugin for "term" query types.
-- */
--class SearchApiFacetapiTerm extends FacetapiQueryType implements FacetapiQueryTypeInterface {
--
--  /**
--   * Returns the query type associated with the plugin.
--   *
--   * @return string
--   *   The query type.
--   */
--  static public function getType() {
--    return 'term';
--  }
--
--  /**
--   * Adds the filter to the query object.
--   *
--   * @param SearchApiQueryInterface $query
--   *   An object containing the query in the backend's native API.
--   */
--  public function execute($query) {
--    // Return terms for this facet.
--    $this->adapter->addFacet($this->facet, $query);
--
--    $settings = $this->adapter->getFacet($this->facet)->getSettings();
--    // Adds the operator parameter.
--    $operator = $settings->settings['operator'];
--
--    // Add active facet filters.
--    $active = $this->adapter->getActiveItems($this->facet);
--    if (empty($active)) {
--      return;
--    }
--
--    if (FACETAPI_OPERATOR_OR == $operator) {
--      // If we're dealing with an OR facet, we need to use a nested filter.
--      $facet_filter = $query->createFilter('OR');
--    }
--    else {
--      // Otherwise we set the conditions directly on the query.
--      $facet_filter = $query;
--    }
--
--    foreach ($active as $filter => $filter_array) {
--      $field = $this->facet['field'];
--      $this->addFacetFilter($facet_filter, $field, $filter);
--    }
--
--    // For OR facets, we now have to add the filter to the query.
--    if (FACETAPI_OPERATOR_OR == $operator) {
--      $query->filter($facet_filter);
--    }
--  }
--
--  /**
--   * Helper method for setting a facet filter on a query or query filter object.
--   */
--  protected function addFacetFilter($query_filter, $field, $filter) {
--    // Integer (or other nun-string) filters might mess up some of the following
--    // comparison expressions.
--    $filter = (string) $filter;
--    if ($filter == '!') {
--      $query_filter->condition($field, NULL);
--    }
--    elseif ($filter[0] == '[' && $filter[strlen($filter) - 1] == ']' && ($pos = strpos($filter, ' TO '))) {
--      $lower = trim(substr($filter, 1, $pos));
--      $upper = trim(substr($filter, $pos + 4, -1));
--      if ($lower == '*' && $upper == '*') {
--        $query_filter->condition($field, NULL, '<>');
--      }
--      else {
--        if ($lower != '*') {
--          // Iff we have a range with two finite boundaries, we set two
--          // conditions (larger than the lower bound and less than the upper
--          // bound) and therefore have to make sure that we have an AND
--          // conjunction for those.
--          if ($upper != '*' && !($query_filter instanceof SearchApiQueryInterface || $query_filter->getConjunction() === 'AND')) {
--            $original_query_filter = $query_filter;
--            $query_filter = new SearchApiQueryFilter('AND');
--          }
--          $query_filter->condition($field, $lower, '>=');
--        }
--        if ($upper != '*') {
--          $query_filter->condition($field, $upper, '<=');
--        }
--      }
--    }
--    else {
--      $query_filter->condition($field, $filter);
--    }
--    if (isset($original_query_filter)) {
--      $original_query_filter->filter($query_filter);
--    }
--  }
--
--  /**
--   * Initializes the facet's build array.
--   *
--   * @return array
--   *   The initialized render array.
--   */
--  public function build() {
--    $facet = $this->adapter->getFacet($this->facet);
--    // The current search per facet is stored in a static variable (during
--    // initActiveFilters) so that we can retrieve it here and get the correct
--    // current search for this facet.
--    $search_ids = drupal_static('search_api_facetapi_active_facets', array());
--    if (empty($search_ids[$facet['name']]) || !search_api_current_search($search_ids[$facet['name']])) {
--      return array();
--    }
--    $search_id = $search_ids[$facet['name']];
--    $search = search_api_current_search($search_id);
--    $build = array();
--    $results = $search[1];
--    if (isset($results['search_api_facets']) && isset($results['search_api_facets'][$this->facet['field']])) {
--      $values = $results['search_api_facets'][$this->facet['field']];
--      foreach ($values as $value) {
--        if ($value['count']) {
--          $filter = $value['filter'];
--          // As Facet API isn't really suited for our native facet filter
--          // representations, convert the format here. (The missing facet can
--          // stay the same.
--          if ($filter[0] == '"') {
--            $filter = substr($filter, 1, -1);
--          }
--          elseif ($filter != '!') {
--            // This is a range filter.
--            $filter = substr($filter, 1, -1);
--            $pos = strpos($filter, ' ');
--            if ($pos !== FALSE) {
--              $filter = '[' . substr($filter, 0, $pos) . ' TO ' . substr($filter, $pos + 1) . ']';
--            }
--          }
--          $build[$filter] = array(
--            '#count' => $value['count'],
--          );
--        }
--      }
--    }
--    return $build;
--  }
--
--}
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.api.php b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.api.php
-deleted file mode 100644
-index eb5c890..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.api.php
-+++ /dev/null
-@@ -1,31 +0,0 @@
--<?php
--
--/**
-- * @file
-- * Hooks provided by the Search facets module.
-- */
--
--/**
-- * @addtogroup hooks
-- * @{
-- */
--
--/**
-- * Lets modules alter the search keys that are returned to FacetAPI and used
-- * in the current search block and breadcrumb trail.
-- *
-- * @param string $keys
-- *   The string representing the user's current search query.
-- * @param SearchApiQuery $query
-- *   The SearchApiQuery object for the current search.
-- */
--function hook_search_api_facetapi_keys_alter(&$keys, $query) {
--  if ($keys == '[' . t('all items') . ']') {
--    // Change $keys to something else, perhaps based on filters in the query
--    // object.
--  }
--}
--
--/**
-- * @} End of "addtogroup hooks".
-- */
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.info b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.info
-deleted file mode 100644
-index 6c153fc..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.info
-+++ /dev/null
-@@ -1,17 +0,0 @@
--name = Search facets
--description = "Integrate the Search API with the Facet API to provide facetted searches."
--dependencies[] = search_api
--dependencies[] = facetapi
--core = 7.x
--package = Search
--
--files[] = plugins/facetapi/adapter.inc
--files[] = plugins/facetapi/query_type_term.inc
--files[] = plugins/facetapi/query_type_date.inc
--
--; Information added by drupal.org packaging script on 2012-07-06
--version = "7.x-1.2"
--core = "7.x"
--project = "search_api"
--datestamp = "1341612141"
--
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.install b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.install
-deleted file mode 100644
-index a626a0c..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.install
-+++ /dev/null
-@@ -1,13 +0,0 @@
--<?php
--
--/**
-- * @file
-- * Install, update and uninstall functions for the Search facets module.
-- */
--
--/**
-- * Implements hook_uninstall().
-- */
--function search_api_facetapi_uninstall() {
--  variable_del('search_api_facets_search_ids');
--}
-\ No newline at end of file
-diff --git a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.module b/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.module
-deleted file mode 100644
-index b452734..0000000
---- a/profiles/panopoly/modules/contrib/search_api/contrib/search_api_facetapi/search_api_facetapi.module
-+++ /dev/null
-@@ -1,381 +0,0 @@
--<?php
--
--/**
-- * @file
-- * Integrates the Search API with the Facet API.
-- */
--
--/**
-- * Implements hook_menu().
-- */
--function search_api_facetapi_menu() {
--  // We need to handle our own menu paths for facets because we need a facet
--  // configuration page per index.
--  $first = TRUE;
--  foreach (facetapi_get_realm_info() as $realm_name => $realm) {
--    if ($first) {
--      $first = FALSE;
--      $items['admin/config/search/search_api/index/%search_api_index/facets'] = array(
--        'title'            => 'Facets',
--        'page callback'    => 'search_api_facetapi_settings',
--        'page arguments'   =>  array($realm_name, 5),
--        'weight'           => -1,
--        'access arguments' => array('administer search_api'),
--        'type'             => MENU_LOCAL_TASK,
--        'context'          => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
--      );
--      $items['admin/config/search/search_api/index/%search_api_index/facets/' . $realm_name] = array(
--        'title'            => $realm['label'],
--        'type'             => MENU_DEFAULT_LOCAL_TASK,
--        'weight'           => $realm['weight'],
--      );
--    }
--    else {
--      $items['admin/config/search/search_api/index/%search_api_index/facets/' . $realm_name] = array(
--        'title'            => $realm['label'],
--        'page callback'    => 'search_api_facetapi_settings',
--        'page arguments'   => array($realm_name, 5),
--        'access arguments' => array('administer search_api'),
--        'type'             => MENU_LOCAL_TASK,
--        'context'          => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
--        'weight'           => $realm['weight'],
--      );
--    }
--  }
--
--  return $items;
--}
--
--/**
-- * Implements hook_facetapi_searcher_info().
-- */
--function search_api_facetapi_facetapi_searcher_info() {
--  $info = array();
--  $indexes = search_api_index_load_multiple(FALSE);
--  foreach ($indexes as $index) {
--    if ($index->enabled && $index->server()->supportsFeature('search_api_facets')) {
--      $searcher_name = 'search_api@' . $index->machine_name;
--      $info[$searcher_name] = array(
--        'label' => t('Search service: @name', array('@name' => $index->name)),
--        'adapter' => 'search_api',
--        'instance' => $index->machine_name,
--        'types' => array($index->item_type),
--        'path' => '',
--        'supports facet missing' => TRUE,
--        'supports facet mincount' => TRUE,
--        'include default facets' => FALSE,
--      );
--    }
--  }
--  return $info;
--}
--
--/**
-- * Implements hook_facetapi_facet_info().
-- */
--function search_api_facetapi_facetapi_facet_info(array $searcher_info) {
--  $facet_info = array();
--  if ('search_api' == $searcher_info['adapter']) {
--    $index = search_api_index_load($searcher_info['instance']);
--    if (!empty($index->options['fields'])) {
--      $wrapper = $index->entityWrapper();
--      $bundle_key = NULL;
--      if (($entity_info = entity_get_info($index->item_type)) && !empty($entity_info['bundle keys']['bundle'])) {
--        $bundle_key = $entity_info['bundle keys']['bundle'];
--      }
--
--      // Some type-specific settings. Allowing to set some additional callbacks
--      // (and other settings) in the map options allows for easier overriding by
--      // other modules.
--      $type_settings = array(
--        'taxonomy_term' => array(
--          'hierarchy callback' => 'facetapi_get_taxonomy_hierarchy',
--        ),
--        'date' => array(
--          'query type' => 'date',
--          'map options' => array(
--            'map callback' => 'facetapi_map_date',
--          ),
--        ),
--      );
--
--      // Iterate through the indexed fields to set the facetapi settings for
--      // each one.
--      foreach ($index->getFields() as $key => $field) {
--        $field['key'] = $key;
--        // Determine which, if any, of the field type-specific options will be
--        // used for this field.
--        $type = isset($field['entity_type']) ? $field['entity_type'] : $field['type'];
--        $type_settings += array($type => array());
--
--        $facet_info[$key] = $type_settings[$type] + array(
--          'label' => $field['name'],
--          'description' => t('Filter by @type.', array('@type' => $field['name'])),
--          'allowed operators' => array(
--            FACETAPI_OPERATOR_AND => TRUE,
--            FACETAPI_OPERATOR_OR => $index->server()->supportsFeature('search_api_facets_operator_or'),
--          ),
--          'dependency plugins' => array('role'),
--          'facet missing allowed' => TRUE,
--          'facet mincount allowed' => TRUE,
--          'map callback' => 'search_api_facetapi_facet_map_callback',
--          'map options' => array(),
--          'field type' => $type,
--        );
--        if ($type === 'date') {
--          $facet_info[$key]['description'] .= ' ' . t('(Caution: This may perform very poorly for large result sets.)');
--        }
--        $facet_info[$key]['map options'] += array(
--          'field' => $field,
--          'index id' => $index->machine_name,
--          'value callback' => '_search_api_facetapi_facet_create_label',
--        );
--        // Find out whether this property is a Field API field.
--        if (strpos($key, ':') === FALSE) {
--          if (isset($wrapper->$key)) {
--            $property_info = $wrapper->$key->info();
--            if (!empty($property_info['field'])) {
--              $facet_info[$key]['field api name'] = $key;
--            }
--          }
--        }
--
--        // Add bundle information, if applicable.
--        if ($bundle_key) {
--          if ($key === $bundle_key) {
--            // Set entity type this field contains bundle information for.
--            $facet_info[$key]['field api bundles'][] = $index->item_type;
--          }
--          else {
--            // Add "bundle" as possible dependency plugin.
--            $facet_info[$key]['dependency plugins'][] = 'bundle';
--          }
--        }
--      }
--    }
--  }
--  return $facet_info;
--}
--
--/**
-- * Implements hook_facetapi_adapters().
-- */
--function search_api_facetapi_facetapi_adapters() {
--  return array(
--    'search_api' => array(
--      'handler' => array(
--        'class' => 'SearchApiFacetapiAdapter',
--      ),
--    ),
--  );
--}
--
--/**
-- * Implements hook_facetapi_query_types().
-- */
--function search_api_facetapi_facetapi_query_types() {
--  return array(
--    'search_api_term' => array(
--      'handler' => array(
--        'class' => 'SearchApiFacetapiTerm',
--        'adapter' => 'search_api',
--      ),
--    ),
--    'search_api_date' => array(
--      'handler' => array(
--        'class' => 'SearchApiFacetapiDate',
--        'adapter' => 'search_api',
--      ),
--    ),
--  );
--}
--
--/**
-- * Implements hook_search_api_query_alter().
-- *
-- * Adds Facet API support to the query.
-- */
--function search_api_facetapi_search_api_query_alter($query) {
--  $index = $query->getIndex();
--  if ($index->server()->supportsFeature('search_api_facets')) {
--    // This is the main point of communication between the facet system and the
--    // search back-end - it makes the query respond to active facets.
--    $searcher = 'search_api@' . $index->machine_name;
--    $adapter = facetapi_adapter_load($searcher);
--    if ($adapter) {
--      $adapter->addActiveFilters($query);
--    }
--  }
--}
--
--/**
-- * Menu callback for the facet settings page.
-- */
--function search_api_facetapi_settings($realm_name, SearchApiIndex $index) {
--  if (!$index->enabled) {
--    return array('#markup' => t('Since this index is at the moment disabled, no facets can be activated.'));
--  }
--  if (!$index->server()->supportsFeature('search_api_facets')) {
--    return array('#markup' => t('This index uses a server that does not support facet functionality.'));
--  }
--  $searcher_name = 'search_api@' . $index->machine_name;
--  module_load_include('inc', 'facetapi', 'facetapi.admin');
--  return drupal_get_form('facetapi_realm_settings_form', $searcher_name, $realm_name);
--}
--
--/**
-- * Map callback for all search_api facet fields.
-- *
-- * @param array $values
-- *   The values to map.
-- * @param array $options
-- *   An associative array containing:
-- *   - field: Field information, as stored in the index, but with an additional
-- *     "key" property set to the field's internal name.
-- *   - index id: The machine name of the index for this facet.
-- *   - map callback: (optional) A callback that will be called at the beginning,
-- *     which allows initial mapping of filters. Only values not mapped by that
-- *     callback will be processed by this method.
-- *   - value callback: A callback used to map single values and the limits of
-- *     ranges. The signature is the same as for this function, but all values
-- *     will be single values.
-- *   - missing label: (optional) The label used for the "missing" facet.
-- *
-- * @return array
-- *   An array mapping raw filter values to their labels.
-- */
--function search_api_facetapi_facet_map_callback(array $values, array $options = array()) {
--  $map = array();
--  // See if we have an additional map callback.
--  if (isset($options['map callback']) && is_callable($options['map callback'])) {
--    $map = call_user_func($options['map callback'], $values, $options);
--  }
--
--  // Then look at all unmapped values and save information for them.
--  $mappable_values = array();
--  $ranges = array();
--  foreach ($values as $value) {
--    $value = (string) $value;
--    if (isset($map[$value])) {
--      continue;
--    }
--    if ($value == '!') {
--      // The "missing" filter is usually always the same, but we allow an easy
--      // override via the "missing label" map option.
--      $map['!'] = isset($options['missing label']) ? $options['missing label'] : '(' . t('none') . ')';
--      continue;
--    }
--    $length = strlen($value);
--    if ($length > 5 && $value[0] == '[' && $value[$length - 1] == ']' && ($pos = strpos($value, ' TO '))) {
--      // This is a range filter.
--      $lower = trim(substr($value, 1, $pos));
--      $upper = trim(substr($value, $pos + 4, -1));
--      if ($lower != '*') {
--        $mappable_values[$lower] = TRUE;
--      }
--      if ($upper != '*') {
--        $mappable_values[$upper] = TRUE;
--      }
--      $ranges[$value] = array(
--        'lower' => $lower,
--        'upper' => $upper,
--      );
--    }
--    else {
--      // A normal, single-value filter.
--      $mappable_values[$value] = TRUE;
--    }
--  }
--
--  if ($mappable_values) {
--    $map += call_user_func($options['value callback'], array_keys($mappable_values), $options);
--  }
--
--  foreach ($ranges as $value => $range) {
--    $lower = isset($map[$range['lower']]) ? $map[$range['lower']] : $range['lower'];
--    $upper = isset($map[$range['upper']]) ? $map[$range['upper']] : $range['upper'];
--    if ($lower == '*' && $upper == '*') {
--      $map[$value] =  t('any');
--    }
--    elseif ($lower == '*') {
--      $map[$value] = "< $upper";
--    }
--    elseif ($upper == '*') {
--      $map[$value] = "> $lower";
--    }
--    else {
--      $map[$value] = "$lower – $upper";
--    }
--  }
--
--  return $map;
--}
--
--/**
-- * Creates a human-readable label for single facet filter values.
-- */
--function _search_api_facetapi_facet_create_label(array $values, array $options) {
--  $field = $options['field'];
--  // For entities, we can simply use the entity labels.
--  if (isset($field['entity_type'])) {
--    $type = $field['entity_type'];
--    $entities = entity_load($type, $values);
--    $map = array();
--    foreach ($entities as $id => $entity) {
--      $label = entity_label($type, $entity);
--      if ($label) {
--        $map[$id] = $label;
--      }
--    }
--    return $map;
--  }
--  // Then, we check whether there is an options list for the field.
--  $index = search_api_index_load($options['index id']);
--  $wrapper = $index->entityWrapper();
--  foreach (explode(':', $field['key']) as $part) {
--    if (!isset($wrapper->$part)) {
--      $wrapper = NULL;
--      break;
--    }
--    $wrapper = $wrapper->$part;
--    while (($info = $wrapper->info()) && search_api_is_list_type($info['type'])) {
--      $wrapper = $wrapper[0];
--    }
--  }
--  if ($wrapper && ($options = $wrapper->optionsList('view'))) {
--    return $options;
--  }
--  // As a "last resort" we try to create a label based on the field type.
--  $map = array();
--  foreach ($values as $value) {
--    switch ($field['type']) {
--      case 'boolean':
--        $map[$value] = $value ? t('true') : t('false');
--        break;
--      case 'date':
--        $v = is_numeric($value) ? $value : strtotime($value);
--        $map[$value] = format_date($v, 'short');
--        break;
--      case 'duration':
--        $map[$value] = format_interval($value);
--        break;
--    }
--  }
--  return $map;
--}
--
--/**
-- * Implements hook_form_FORM_ID_alter().
-- */
--function search_api_facetapi_form_search_api_admin_index_fields_alter(&$form, &$form_state) {
--  $form['#submit'][] = 'search_api_facetapi_search_api_admin_index_fields_submit';
--}
--
--/**
-- * Form submission handler for search_api_admin_index_fields().
-- */
--function search_api_facetapi_search_api_admin_index_fields_submit($form, &$form_state) {
--  // Clears this searcher's cached facet definitions.
--  $cid = 'facetapi:facet_info:search_api@' . $form_state['index']->machine_name . ':';
--  cache_clear_all($cid, 'cache', TRUE);
--}
