<?php
/**
 * *****************************************************************************
 * Copyright (c) 2016 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Christopher Guindon (Eclipse Foundation) - Initial implementation
 * *****************************************************************************
 */

class BaseTheme {

  /**
   *
   * @var App()
   */
  protected $App = NULL;

  /**
   * Store
   *
   * @var array
   */
  protected $attributes = array();

  /**
   * Theme base url
   *
   * For example ://www.eclipse.org
   *
   * @var string
   */
  protected $base_url = "";

  /**
   * Base URL for login links
   *
   * @var string
   */
  protected $base_url_login = "";

  /**
   *
   * @var Breadcrumb()
   */
  protected $Breadcrumb = NULL;

  /**
   * Display footer prefix
   *
   * @var bool
   */
  protected $display_footer_prefix = TRUE;

  /**
   * Footer content prefix
   *
   * @var bool
   */
  protected $footer_content_prefix = "";

  /**
   * Display header right html
   *
   * @var bool
   */
  protected $display_header_right = TRUE;

  /**
   * Display header title
   *
   * @var bool
   */
  protected $display_header_title = FALSE;

  /**
   * More menu flag
   *
   * @var bool
   */
  protected $display_more = TRUE;

  /**
   * Inlude user toolbar in output
   *
   * @var unknown
   */
  protected $display_toolbar = TRUE;

  /**
   * Display google search in output
   *
   * @var unknown
   */
  protected $display_google_search = TRUE;

  /**
   * Extra headers for <head>
   *
   * @var unknown
   */
  protected $extra_headers = "";

  /**
   * Extra header html for #header-wrapper element
   */
  protected $extra_header_html = "";

  /**
   * Featured story xml path
   */
  protected $featured_story_xml = "";

  /**
   * Links for the footer
   *
   * @var array
   */
  protected $footer_links = array();

  /**
   * Page HTML content
   *
   * @var string
   */
  protected $html = "";

  /**
   * Page layout
   *
   * @var string
   */
  protected $layout = "";

  /**
   * List of theme logos
   *
   * @var array
   */
  protected $logos = array();

  /**
   *
   * @var Menu()
   */
  protected $Menu = NULL;

  /**
   * Metatags
   *
   * @var array
   */
  protected $metatags = array();

    /**
   * Open Graph Protocol title
   *
   * @var string
   */
  private $MetaTitle = "";

  /**
   * Open Graph Protocol description
   *
   * @var string
   */
  private $MetaDescription = "";

  /**
   * Open Graph Protocol image
   *
   * @var string
   */
  private $MetaImage = "";

  /**
   * Open Graph Protocol image width
   *
   * @var string
   */
  private $MetaImageWidth = "";

  /**
   * Open Graph Protocol image height
   *
   * @var string
   */
  private $MetaImageHeight = "";

  /**
   *
   * @var Nav()
   */
  protected $Nav = NULL;

  /**
   * Page Author
   *
   * @var string
   */
  protected $page_author = "";

  /**
   * Page Keywords
   *
   * @var string
   */
  protected $page_keywords = "";

  /**
   * Page Title
   *
   * @var string
   */
  protected $page_title = "";

  /**
   *
   * @var Session()
   */
  protected $Session = NULL;

  /**
   * User Session information
   *
   * List of links based of the session status.
   *
   * @var array
   */
  protected $session_variables = array();

  /**
   * The current theme name
   *
   * @var string
   */
  protected $theme = "baseTheme";

  /**
   * List of theme_variables
   *
   * @var unknown
   */
  protected $theme_variables = array();

  /**
   * Text for <title> tag
   *
   * @var string
   */
  protected $title = "";

  protected $toolbar_left_content = "";

  /**
   * Position of sidebar Nav
   *
   * @var string
   */
  protected $nav_position = "default";

  /**
   * Constructor
   */
  function __construct($App = NULL) {
    $this->setApp($App);
    $image_path = '//www.eclipse.org' . $this->getThemeUrl('solstice') . 'public/images/logo/';

    // Set default images
    $this->setAttributes('img_logo_default', $image_path . 'eclipse-foundation-grey-orange.svg', 'src');
    $this->setAttributes('img_logo_default', 'Eclipse.org logo', 'alt');
    $this->setAttributes('img_logo_default', 'logo-eclipse-default img-responsive hidden-xs', 'class');

    $this->setAttributes('img_logo_eclipse_default', $image_path . 'eclipse-foundation-grey-orange.svg', 'src');
    $this->setAttributes('img_logo_eclipse_default', 'Eclipse.org logo', 'alt');
    $this->setAttributes('img_logo_eclipse_default', 'img-responsive hidden-xs', 'class');

    $this->setAttributes('img_logo_eclipse_white', $image_path . 'eclipse-foundation-white.svg', 'src');
    $this->setAttributes('img_logo_eclipse_white', 'Eclipse.org black and white logo', 'alt');
    $this->setAttributes('img_logo_eclipse_white', 'logo-eclipse-white img-responsive');

    $this->setAttributes('img_logo_mobile', $image_path . 'eclipse-foundation-grey-orange.svg', 'src');
    $this->setAttributes('img_logo_mobile', 'Eclipse.org logo', 'alt');
    $this->setAttributes('img_logo_mobile', 'logo-eclipse-default-mobile img-responsive', 'class');

    // Set attributes on mobile logo
    $this->setAttributes('link_logo_mobile', 'navbar-brand visible-xs', 'class');

    // Set attributes on body
    $this->setAttributes('body', 'body_solstice', 'id');

    // Set attribute on toolbar
    $this->setAttributes('toolbar-container-wrapper', 'clearfix toolbar-container-wrapper');
    $this->setAttributes('toolbar-container', 'container');
    $this->setAttributes('toolbar-row', 'text-right toolbar-row row hidden-print');
    $this->setAttributes('toolbar-user-links', 'col-md-24 row-toolbar-col');

    // Set attributes for header
    $this->setAttributes('header-wrapper', 'header-wrapper', 'id');
    $this->setAttributes('header-wrapper', 'header-wrapper');
    $this->setAttributes('header-container', 'container');
    $this->setAttributes('header-row', 'header-row', 'id');
    $this->setAttributes('header-row', 'row');
    $this->setAttributes('header-left', 'header-left', 'id');
    $this->setAttributes('header-left', 'hidden-xs');
    $this->setAttributes('header-right', 'header-right', 'id');

    // Set attributes on CFA button
    $this->setAttributes('btn-call-for-action', 'btn-call-for-action', 'id');

    // Set attributes on main-menu
    $this->setAttributes('main-menu-wrapper', 'main-menu-wrapper', 'id');
    $this->setAttributes('main-menu', 'main-menu', 'id');
    $this->setAttributes('main-menu', 'navbar yamm');
    $this->setAttributes('main-menu-ul-navbar', 'nav navbar-nav');
    $this->setAttributes('navbar-main-menu', 'navbar-main-menu', 'id');
    $this->setAttributes('navbar-main-menu', 'navbar-collapse collapse reset');

    // Set attributes on breadcrumbs
    $this->setAttributes('breadcrumbs', 'default-breadcrumbs');
    $this->setAttributes('breadcrumbs', 'breadcrumb', 'id');
    $this->setAttributes('breadcrumbs', 'hidden-print');
    $this->setAttributes('breadcrumbs-container', 'container');

    // Set attributes on main content
    $this->setAttributes('main', 'main', 'role');
    $this->setAttributes('main', 'no-promo');
    $this->setAttributes('main', 'content', 'id');
    $this->setAttributes('main-container', 'novaContent');
    $this->setAttributes('main-container', 'novaContent', 'id');

    // Set attributes on main sidebar
    $this->setAttributes('main-sidebar', 'main-sidebar','id');
    $this->setAttributes('main-sidebar-html-block', 'main-sidebar-html-block');

    // Set attributes on footer
    $this->setAttributes('footer', 'solstice-footer', 'id');
    $this->setAttributes('footer', 'contentinfo', 'role');
    $this->setAttributes('footer-container', 'container');

    $this->setAttributes('footer1', 'footer-eclipse-foundation', 'id');
    $this->setAttributes('footer2', 'footer-legal', 'id');
    $this->setAttributes('footer3', 'footer-useful-links', 'id');
    $this->setAttributes('footer4', 'footer-other', 'id');

    // Default theme js file
    $this->setAttributes('script-theme-main-js', $this->getThemeUrl('solstice') . 'public/javascript/main.min.js?var=0.0.272', 'src');
  }

  /**
   * Verify if consent was given to use cookies
   *
   * @return boolean
   */
  public function hasCookieConsent() {
    return $this->App->hasCookieConsent();
  }

  /**
   * Get a featured story from the provided xml file
   *
   * @param $xml_file
   *
   * @return array
   */
  public function getFeaturedStoryFooter() {
   return '<div class="eclipsefdn-featured-story featured-footer" data-publish-target="eclipse_org"><div class="container featured-container"></div></div>';
  }

  /**
   * Get Google Tag Manager
   *
   * Insert this code as high in the <head> of the page as possible.
   *
   * @return string
   */
  public function getGoogleTagManager(){
    return "<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-5WLCZXC');</script>
<!-- End Google Tag Manager -->";
  }

  /**
   * Get Google Tag Manager (noscript)
   *
   * Insert this code immediately after the opening <body> tag
   *
   * @return string
   */
  public function getGoogleTagManagerNoScript(){
    return '<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5WLCZXC"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->';
  }


  /**
   * Set alternate layout
   */
  public function setAlternateLayout($enable = FALSE) {

  }

  /**
   * Get $App
   *
   * @return App()
   */
  protected function _getApp() {
    if (!$this->App instanceof App) {
      $this->setApp();
    }
    return $this->App;
  }

  /**
   * Set $App
   *
   * @param App() $App
   */
  public function setApp($App = NULL) {
    if (!$App instanceof App) {
      if (!class_exists('App')) {
        require_once(realpath(dirname(__FILE__) . '/../../system/app.class.php'));
      }
      $App = new App();
    }
    $this->_hookSetApp($App);
    $this->App = $App;
  }

  /**
   * Hook for making changes to $App when using setApp()
   *
   * @param App $App
   */
  protected function _hookSetApp(App $App) {

  }

  /**
   * Get the HTML of the Share buttons
   *
   * @return string
   */
  public function getShareButtonsHTML() {
    $App = new App();
    $display_buttons = $this->getThemeVariables('sharethis');
    $page_title = $this->getPageTitle();

    if (!$display_buttons || empty($page_title)) {
      return "";
    }

    $campaign = "?utm_source=". $_SERVER['SERVER_NAME'] . "&utm_campaign=" . urlencode($this->getPageTitle());

    // Create Twitter button
    $campaign_twitter = $campaign . '&utm_medium=social-media-twitter-icon';
    $buttons['twitter'] = '<a class="share-button share-button-twitter" href="#" onclick="
    window.open(
      \'https://twitter.com/intent/tweet?text=' . $this->getPageTitle() . '%20-%20&url=\'+encodeURIComponent(location.href+\''. $campaign_twitter .'\'),
      \'twitter-share-dialog\',
      \'width=626,height=436\');
    return false;"><i class="fa fa-twitter"></i></a>';

    // Create Facebook button
    $campaign_facebook = $campaign . '&utm_medium=social-media-facebook-icon';
    $buttons['facebook'] = '<a class="share-button share-button-facebook" href="#" onclick="
    window.open(
      \'https://www.facebook.com/sharer/sharer.php?u=\'+encodeURIComponent(location.href+\''. $campaign_facebook .'\'),
      \'facebook-share-dialog\',
      \'width=626,height=436\');
    return false;"><i class="fa fa-facebook"></i></a>';

    // Create Mail button
    $campaign_email = $campaign . '&utm_medium=social-media-email-icon';
    $buttons['mail'] = '<a class="share-button share-button-mail" href="mailto:?subject=' . urlencode($this->getPageTitle()) . '&body='. urlencode($App->getCurrentURL() . $campaign_email) .'"><i class="fa fa-envelope"></i></a>';

    $html = '<ul class="list-inline margin-bottom-0 text-right">';
    foreach ($buttons as $button) {
      $html .= "<li>" . $button . "</li>";
    }
    $html .= "</ul>";

    return $html;

  }

  /**
   * Get the JS of the Share buttons
   * (This should go in the head of the html page)
   *
   * @deprecated
   *
   * @return string
   */
  public function getShareButtonsJS() {
    return "";
  }

  /**
   * Get Attributes
   *
   * Fetch a specific attribute.
   *
   * @param string $element
   *        - Attribute name, i.e, body.
   * @param string $type
   *        - Either class or id.
   *
   * @return string
   */
  public function getAttributes($element = '', $type = NULL) {

    $allowed_type = array(
      'class',
      'id',
      'alt',
      'title',
      'href',
      'height',
      'width',
      'src',
      'title',
      'style'
    );

    // If type is null, we shall return the string with both class and id.
    if (is_null($type)) {
      $html = array();
      if (is_string($element) && !empty($element)) {
        foreach ($allowed_type as $type) {
          if (isset($this->attributes[$type][$element]) && is_array($this->attributes[$type][$element])) {
            $html[] = $type . '="' . implode(' ', $this->attributes[$type][$element]) . '"';
          }
        }
      }

      // Add a space if we have someting to return.
      $prefix = "";
      if (!empty($html)) {
        $prefix = " ";
      }

      return $prefix . implode(" ", $html);
    }

    // If type is set, return only class or id values.
    if (in_array($type, $allowed_type) && is_string($element) && !empty($element)) {
      if (isset($this->attributes[$type][$element]) && is_array($this->attributes[$type][$element])) {
        return implode(' ', $this->attributes[$type][$element]);
      }
    }

    return '';
  }

  public function resetAttributes($element = '', $type = 'class') {
    $this->attributes[$type][$element] = array();
  }

  /**
   * Set Attributes
   *
   * Set a specific attributes
   *
   * @param string $element
   *        - Attribute name, i.e, body.
   * @param string $value
   *        - Attribute value
   * @param string $type
   *        - Either class or id.
   *
   * @return array $attributes
   */
  public function setAttributes($element = '', $value = "", $type = 'class') {
    $allowed_type = array(
      'class',
      'id',
      'alt',
      'title',
      'href',
      'height',
      'width',
      'src',
      'title',
      'style'
    );

    $type = strtolower($type);
    if (!in_array($type, $allowed_type) || !is_string($element) || empty($element) || empty($value)) {
      return $this->attributes;
    }

    switch ($type) {
      case 'class':
        $value = explode(' ', $value);
        foreach ($value as $val) {
          // Append classes instead of overriting them.
          // This way we can set multiple classes for differents contexts.
          if (!isset($this->attributes[$type][$element]) || !in_array($val, $this->attributes[$type][$element])) {
            $this->attributes['class'][$element][] = $val;
          }
        }
        break;

      // For everything else, we only keep the last value set.
      default:
        $this->attributes[$type][$element] = array(
          $value
        );
        break;
    }
    return $this->attributes;
  }

  /**
   * Remove attributes
   *
   * @param string $element
   * @param string $value
   * @param string $type
   */
  public function removeAttributes($element = '', $value = "", $type = 'class') {

    if (!is_string($element) || empty($element) || empty($value)) {
      return FALSE;
    }

    $type = strtolower($type);

    if ($type !== "class") {
      $this->resetAttributes($element, $type);
      return TRUE;
    }

    $number_value = is_array($value) ?  count($value) : 1;
    $value = explode(' ', $value);
    $count = 0;
    foreach ($value as $val) {
      if (isset($this->attributes[$type][$element]) && in_array($val, $this->attributes[$type][$element])) {
        $key = array_search ($val, $this->attributes['class'][$element]);
        unset($this->attributes['class'][$element][$key]);
        continue;
      }
      $count++;
    }

    // Remove element if now empty
    if (empty($this->attributes['class'][$element])) {
      unset($this->attributes['class'][$element]);
    }

    // Check if we removed the value from the array
    if ($count !== $number_value) {
      return TRUE;
    }
    // Nothing happened
    return FALSE;
  }

  /**
   * Set $base_url
   *
   * The $base_url is a prefix for hardcoded links
   * to the main site. For example, the footer and
   * the main menu.
   *
   * @param string $url
   */
  public function setBaseUrl($url = "") {
    $this->base_url = $url;
  }

  /**
   * Get $base_url
   *
   * The $base_url is a prefix for hardcoded links
   * to the main site. For example, the footer and
   * the main menu.
   *
   * @return string
   */
  public function getBaseUrl() {
    if (empty($this->base_url)) {
      $App = $this->_getApp();
      $this->base_url = $App->getWWWPrefix() . '/';
    }
    return $this->base_url;
  }

  /**
   * Get $base_url_login
   *
   * @return string
   */
  public function getBaseUrlLogin() {
    if (empty($this->base_url_login)) {
      $domain = $this->App->getEclipseDomain();
      $this->base_url_login = 'https://' . $domain['accounts'];
    }
    return $this->base_url_login;
  }

  /**
   * Set $base_url_login
   *
   * @param string $url
   */
  public function setBaseUrlLogin($url = "") {
    $this->base_url_login = $url;
  }

  /**
   * Get Breadcrumb HTML output
   *
   * @return string
   */
  public function getBreadcrumbHtml() {
    // Breadcrumbs
    if ($this->getThemeVariables('hide_breadcrumbs')){
      return "";
    }

    $Breadcrumb = $this->_getBreadcrumb();
    $crumb_list = $Breadcrumb->getCrumbList();

    // fetch key of the last element of the array.
    $crumb_last_key = $Breadcrumb->getCrumbCount() - 1;

    $breadcrumb_html = '<ol class="breadcrumb">';
    $request_uri = explode('/', $_SERVER['REQUEST_URI']);

    foreach ($crumb_list as $k => $v) {
      // add .active class to the last item of the breadcrumbs
      if ($k == $crumb_last_key) {
        if (count($request_uri) >= 3 && ($request_uri[2] != "" && $request_uri[2] != "index.php")) {
          $breadcrumb_html .= '<li class="active">' . $v->getText() . '</li>';
        }
      }
      else {
        $breadcrumb_html .= '<li><a href="' . $v->getURL() . '">' . $v->getText() . '</a></li>';
      }
    }
    $breadcrumb_html .= "</ol>";

    $content_html = '<div class="col-sm-24">' . $breadcrumb_html . '</div>';
    $sharethis_html = $this->getShareButtonsHTML();
    if (!empty($sharethis_html)) {
      $content_html = '<div class="col-sm-16">' . $breadcrumb_html . '</div>';
      $content_html .= '<div class="col-sm-8 padding-top-5">' . $sharethis_html . '</div>';
    }

    return <<<EOHTML
    <section{$this->getAttributes('breadcrumbs')}>
      <div{$this->getAttributes('breadcrumbs-container')}>
        <h3 class="sr-only">Breadcrumbs</h3>
        <div class="row">
          {$content_html}
        </div>
      </div>
    </section> <!-- /#breadcrumb -->
EOHTML;

  }

  /**
   * Set $Breadcrumb
   *
   * @param Breadcrumb $Breadcrumb
   */
  public function setBreadcrumb($Breadcrumb = NULL) {
    if (!$Breadcrumb instanceof Breadcrumb) {
      $App = $this->_getApp();
      if (!class_exists('Breadcrumb')) {
        require_once($App->getBasePath() . '/system/breadcrumbs.class.php');
      }
      $Breadcrumb = new Breadcrumb($this->getPageTitle());
    }
    $this->Breadcrumb = $Breadcrumb;
  }

  /**
   * Build a url based on a path and a set of options
   *
   * @param string $path
   * @param array $options
   *
   * @return string
   */
  public function buildUrl($path = "", $options = array()) {

    if (!empty($options['absolute']) && !filter_var($path, FILTER_VALIDATE_URL)) {
      return $path;
    }

    if (!empty($options['query'])) {
      $path .= (strpos($path, '?') !== FALSE ? '&' : '?') . http_build_query($options['query']);
    }

    return $path;
  }

  /**
   * Get Call For Action Button Html
   *
   * @return string
   */
  public function getCfaButton() {
    $settings = array(
      'hide' => FALSE,
      'html' => '',
      'class' => '',
      'href' => '',
      'text' => ''
    );

    $btn_cfa = $this->getThemeVariables('btn_cfa');
    $Breadcrumb = $this->_getBreadcrumb();
    $crumb1 = $Breadcrumb->getCrumbAt(1)->getText();
    $url_parts = explode('/', str_ireplace(array(
      'http://',
      'https://'
    ), '', $_SERVER['REQUEST_URI']));

    // If we are hidding the CFA Button.
     if ($crumb1 === 'Projects' && strtolower($url_parts[1]) != 'projects') {
      // If the user is not trying to override this button, let's change
      // it for all of our project websites.
      if (empty($btn_cfa['text']) && empty($btn_cfa['url'])) {
        $btn = array();
        $btn['btn_cfa']['text'] = '<i class="fa fa-star"></i> Sponsor';
        $btn['btn_cfa']['href'] = 'https://www.eclipse.org/sponsor/';
        $btn['btn_cfa']['class'] = 'btn btn-huge btn-info';
        $theme_variables = $this->setThemeVariables($btn);
        $btn_cfa = $theme_variables['btn_cfa'];
        $this->setAttributes('main-container', 'legacy-page');
      }
    }

    if (!$btn_cfa) {
      $btn_cfa = array();
    }
    foreach ($btn_cfa as $key => $setting) {
      $type = 'string';
      if ($key == 'hide') {
        $type = 'bool';
      }
      $settings[$key] = $this->is_var($setting, $type);
    }

    $btn_cfa = array_merge($btn_cfa, $settings);

    if ($btn_cfa['hide']) {
      return "";
    }
    $cfa_default = $this->_getCfaButtonDefault();
    if (empty($btn_cfa['class'])) {
      $btn_cfa['class'] = $cfa_default['class'];
    }

    if (empty($btn_cfa['href'])) {
      $btn_cfa['href'] = $cfa_default['href'];
    }

    if (empty($btn_cfa['text'])) {
      $btn_cfa['text'] = $cfa_default['text'];
    }

    if (!empty($btn_cfa['html'])) {
      return $btn_cfa['html'];
    }

    $html = '<div' . $this->getAttributes('btn-call-for-action') . '><a href="' . $btn_cfa['href'] . '" class="' . $btn_cfa['class'] . '">';
    $html .= $btn_cfa['text'];
    $html .= '</a></div>';

    return $html;
  }

  /**
   * Get default variables for CFA
   *
   * @return array
   */
  protected function _getCfaButtonDefault() {
    $default['class'] = 'btn btn-huge btn-warning';
    $default['href'] = '/downloads/';
    $default['text'] = '<i class="fa fa-download"></i> Download';
    return $default;
  }

  /**
   * Get Copyright Notice
   *
   * @return string
   */
  public function getCopyrightNotice() {
    return 'Copyright &copy; Eclipse Foundation AISBL. All Rights Reserved.';
  }

  /**
   * Get $Breadcrumb
   *
   * @return $Breadcrumb
   */
  protected function _getBreadcrumb() {
    if (!$this->Breadcrumb instanceof Breadcrumb) {
      $this->setBreadcrumb();
    }
    return $this->Breadcrumb;
  }

  /**
   * Get HTML for deprecated messages
   *
   * @return string
   */
  public function getDeprecatedMessage() {
    // Deprecated message
    $deprecated = "";
    $App = $this->_getApp();
    if ($App->getOutDated()) {
      $classes[] = "deprecated";
      $deprecated = '<div class="alert alert-danger" role="alert">';
      $deprecated .= $App->getOutDatedMessage();
      $deprecated .= '</div>';
    }
    return $deprecated;
  }

  /**
   * Get $diplay_more
   */
  public function getDisplayMore() {
    return $this->display_more;
  }


  /**
   * Set $diplay_more
   *
   * @param string $display
   */
  public function setDisplayMore($display = TRUE) {
    if ($display !== FALSE) {
      $display = TRUE;
    }
    $this->display_more = $display;
  }

  /**
   * Get $display_footer_prefix
   *
   * @return bool
   */
  public function getDisplayFooterPrefix() {
    return $this->display_footer_prefix;
  }

  /**
   * Set $display_footer_prefix
   *
   * @param bool $display
   */
  public function setDisplayFooterPrefix($display = TRUE) {
    if ($display !== FALSE) {
      $display = TRUE;
    }

    // Remove the footer offset class when we hide the footer prefix
    if ($display === FALSE) {
      $main_container_classes = str_replace(' footer-offset', '', $this->getThemeVariables('main_container_classes'));
      $App = $this->_getApp();
      $App->setThemeVariables(array('main_container_classes' => $main_container_classes));
      $this->resetAttributes('main-container', 'class');
    }
    $this->display_footer_prefix = $display;
  }

  /**
   * Get $display_google_search
   */
  public function getDisplayGoogleSearch() {
    return $this->display_google_search;
  }

  /**
   * Set $display_google_search
   *
   * @param bool $display
   */
  public function setDisplayGoogleSearch($display = TRUE) {
    if ($display !== FALSE) {
      $display = TRUE;
    }
    $this->display_google_search = $display;
  }

  /**
   * Get $display_header_right
   */
  public function getDisplayHeaderRight() {
    return $this->display_header_right;
  }

  /**
   * Set $display_header_right
   *
   * @param bool $display
   */
  public function setDisplayHeaderRight($display = TRUE) {
    if ($display !== FALSE) {
      $display = TRUE;
    }
    $this->display_header_right = $display;
  }

  /**
   * Get $display_header_right
   */
  public function getDisplayHeaderTitle() {
    return $this->display_header_title;
  }

  /**
   * Set $display_header_title
   *
   * @param bool $display
   */
  public function setDisplayHeaderTitle($display = TRUE) {
    if ($display !== FALSE) {
      $display = TRUE;
    }
    $this->display_header_title = $display;
  }

  /**
   * Get $display_toolbar
   */
  public function getDisplayToolbar() {
    return $this->display_toolbar;
  }

  /**
   * Set $display_toolbar
   *
   * @param bool $display
   */
  public function setDisplayToolbar($display = TRUE) {
    if ($display !== FALSE) {
      $display = TRUE;
    }
    $this->display_toolbar = $display;
  }

  /**
   * Get Eclipse.org base URL
   *
   * @return string
   */
  public function getEclipseUrl() {
    $App = $this->_getApp();
    return $App->getWWWPrefix();
  }

  /**
   * Set Metatags
   *
   * @param string $key
   * @param array $body
   * @return boolean
   */
  public function setMetatags($key = '', $body = array()) {
    if (empty($key) || empty($body) || !is_array($body)) {
      return FALSE;
    }
    $this->metatags[$key] = $body;
    return TRUE;
  }

  /**
   * Get Metatags
   */
  public function getMetatags(){
    return $this->metatags;
  }

  /**
   * Get metatag by key
   *
   * @param string $property
   * @return boolean|mixed
   */
  public function getMetatagByKey($property = '') {
    if (!isset($this->metatags[$property])) {
      return FALSE;
    }
    return $this->metatags[$property];
  }

  /**
   * Get metatags HTML
   * @return string
   */
  public function getMetatagsHTML(){
    $metatags = $this->getMetatags();
    $html = "";
    foreach ($metatags as $key => $body) {
      $html .= '<meta';
      foreach ($body as $property => $value) {
        $html .= ' ' . $property . '="' . $value . '"';
      }
      $html .= '/>' . PHP_EOL;
    }
    return $html;
  }

  /**
   * Get $extra_headers output
   *
   * @return string
   */
  public function getExtraHeaders() {
    $App = $this->_getApp();
    $this->setMetaTitle($this->getPageTitle() . ' | The Eclipse Foundation');

    $styles_name = 'styles';
    switch ($this->getTheme()) {
      case 'quicksilver':
        $styles_name = 'quicksilver';
        break;

      case 'jakarta':
        $styles_name = 'jakarta';
        break;

      case 'eclipse_ide':
        $styles_name = 'eclipse-ide';
        break;

      case 'astro':
        $styles_name = 'astro';
        break;
    }

    $return = '<link rel="preconnect stylesheet" href="' . $this->getThemeUrl('solstice') . 'public/stylesheets/' . $styles_name . '.min.css?v0.0.272"/>' . PHP_EOL;

    // Add og:metatags if they haven't been set.
    // @todo: deprecated og functions in App().
    if (!$this->getMetatagByKey('description')) {
      $this->setMetatags('description', array(
        'name' => 'description',
        'content' => $this->getMetaDescription(),
      ));
    }

    if (!$this->getMetatagByKey('og:description')) {
      $this->setMetatags('og:description', array(
        'property' => 'og:description',
        'content' => $this->getMetaDescription(),
      ));
    }

    if (!$this->getMetatagByKey('og:image')) {
      $this->setMetatags('og:image', array(
        'property' => 'og:image',
        'content' => $this->getMetaImage(),
      ));
    }

    if (!$this->getMetatagByKey('og:title')) {
      $this->setMetatags('og:title', array(
        'property' => 'og:title',
        'content' => $this->getMetaTitle(),
      ));
    }

    if (!$this->getMetatagByKey('og:image:width')) {
      $this->setMetatags('og:image:width', array(
        'property' => 'og:image:width',
        'content' => $this->getMetaImageWidth(),
      ));
    }

    if (!$this->getMetatagByKey('og:image:height')) {
      $this->setMetatags('og:image:height', array(
        'property' => 'og:image:height',
        'content' => $this->getMetaImageHeight(),
      ));
    }

    $image = 'https://www.eclipse.org/eclipse.org-common/themes/solstice/public/images/logo/eclipse-foundation-400x400.png';

    // Schema.org markup for Google+
    if (!$this->getMetatagByKey('itemprop:name')) {
      $this->setMetatags('itemprop:name', array(
        'itemprop' => 'name',
        'content' => $this->getMetaTitle(),
      ));
    }

    if (!$this->getMetatagByKey('itemprop:description')) {
      $this->setMetatags('itemprop:description', array(
        'itemprop' => 'description',
        'content' => $this->getMetaDescription(),
      ));
    }

   if (!$this->getMetatagByKey('itemprop:image')) {
     $this->setMetatags('itemprop:image', array(
        'itemprop' => 'image',
        'content' => $image,
      ));
   }

    // Twitter Card data
   if (!$this->getMetatagByKey('twitter:site')) {
      $this->setMetatags('twitter:site', array(
        'name' => 'twitter:site',
        'content' => '@EclipseFdn',
      ));
    }

    if (!$this->getMetatagByKey('twitter:card')) {
      $this->setMetatags('twitter:card', array(
        'name' => 'twitter:card',
        'content' => 'summary',
      ));
    }

    if (!$this->getMetatagByKey('twitter:title')) {
      $this->setMetatags('twitter:title', array(
        'name' => 'twitter:title',
        'content' => $this->getMetaTitle(),
      ));
    }

    if (!$this->getMetatagByKey('twitter:url')) {
      $this->setMetatags('twitter:url', array(
        'name' => 'twitter:url',
        'content' => $this->App->getCurrentURL(),
      ));
    }

    if (!$this->getMetatagByKey('twitter:description')) {
      $this->setMetatags('twitter:description', array(
        'name' => 'twitter:description',
        'content' => $this->getMetaDescription(),
      ));
    }

    if (!$this->getMetatagByKey('twitter:image')) {
      $this->setMetatags('twitter:image', array(
        'name' => 'twitter:image',
        'content' => $image,
      ));
    }

    if ($App->getOutDated() && !$this->getMetatagByKey('robots')) {
      $this->setMetatags('robots', array(
        'name' => 'robots',
        'content' => 'noindex',
      ));
    }

    $return .= $this->getMetatagsHTML();
    $return .= $this->extra_headers;
    $return .= $App->ExtraHtmlHeaders;

    // page-specific RSS feed
    if ($App->PageRSS != "") {
      if ($App->PageRSSTitle != "") {
        $App->PageRSSTitle = "Eclipse RSS Feed";
      }
      $return .= '<link rel="alternate" title="' . $App->PageRSSTitle . '" href="' . $App->PageRSS . '" type="application/rss+xml"/>' . PHP_EOL;
    }

    // Load proper font for each theme
    switch ($this->getTheme()) {
      case 'solstice':
        $return .= '<link href="//fonts.googleapis.com/css?family=Open+Sans:400,700,300,600,100" rel="preconnect stylesheet" type="text/css"/>';
        break;
      default:
        $return .= '<link href="https://fonts.googleapis.com/css2?family=Libre+Franklin:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="preconnect stylesheet" type="text/css"/>';
    }

    return $return. PHP_EOL;
  }

  /**
   * Set $extra_headers
   *
   * @param string $headers
   */
  public function setExtraHeaders($headers = "") {
    $this->extra_headers .= $headers;
  }

  /**
   * Get links for the footer
   *
   * @param string $region
   *
   * @return string
   */
  public function getFooterLinks($region) {

    $accepted_regions = array("region_1", "region_2", "region_3", "region_4", "region_5");

    if (empty($region) || !in_array($region, $accepted_regions)) {
      return "";
    }

    if (!function_exists("sortByWeight")) {
      function sortByWeight($a, $b) {
        $a = $a['weight'];
        $b = $b['weight'];
        if ($a == $b) return 0;
        return ($a < $b) ? -1 : 1;
      }
    }
    usort($this->footer_links, "sortByWeight");

    $footer_links = '';
    foreach ($this->footer_links as $footer_link) {
      if ($footer_link['region'] !== $region) {
        continue;
      }
      $footer_links .= '<li><a href="'. $footer_link['url'] .'">'. $footer_link['title'] .'</a></li>';
    }

    return '<ul class="nav">' . $footer_links . '</ul>';
  }

  /**
   * Set Links for the footer
   *
   * @param string $title
   * @param string $url
   * @param string $region
   * @param int $weight
   */
  public function setFooterLinks($element = "", $title = "", $url = "", $region = "", $weight = 0) {

    $accepted_regions = array("region_1", "region_2", "region_3", "region_4", "region_5");

    if (empty($element) || empty($title) || empty($url) || empty($region) || !in_array($region, $accepted_regions) || !is_numeric($weight)) {
      return FALSE;
    }

    $this->footer_links[$element] = array(
        'title' => $title,
        'url' => $url,
        'region' => $region,
        'weight' => $weight
    );
  }

  /**
   * Remove Footer links
   *
   * @param string $element
   */
  public function removeFooterLinks($element) {

    if (empty($element)) {
      return FALSE;
    }

    foreach ($this->footer_links as $key => $footer_link) {
      if ($key !== $element) {
        continue;
      }
      unset($this->footer_links[$element]);
    }
  }

  /**
   * Get Html of Footer prexix
   *
   * This is a way for sub-themes to inject
   * html before the footer.
   */
  public function getFooterPrexfix() {
    return "";
  }

  /**
   * Get Html of Footer content prefix
   *
   * This is a way for sub-themes to inject
   * html in the footer.
   */
  public function getFooterContentPrefix() {
    return $this->footer_content_prefix;
  }

  /**
   * Get Html of Footer content prefix
   *
   * This is a way for sub-themes to inject
   * html in the footer.
   */
  public function setFooterContentPrefix($content) {
    if (!empty($content)) {
      $this->footer_content_prefix = $content;
    }
  }

  /**
   * Get Html of Footer Region 1
   */
  public function getFooterRegion1() {
    return "";
  }

  /**
   * Get Html of Footer Region 2
   */
  public function getFooterRegion2() {
    return "";
  }

  /**
   * Get Html of Footer Region 3
   */
  public function getFooterRegion3() {
    return "";
  }

  /**
   * Get Html of Footer Region 4
   */
  public function getFooterRegion4() {
    return "";
  }

  /**
   * Get Html of Footer Region 5
   */
  public function getFooterRegion5() {
    return "";
  }

  /**
   * Get footer javascript code
   *
   * @return string
   */
  public function getExtraJsFooter() {
    $App = $this->_getApp();
    $return = $App->ExtraJSFooter . PHP_EOL;
    return $return;
  }

  /**
   * Get extra html for the #header-wrapper element
   */
  public function getExtraHeaderHtml() {
    return $this->extra_header_html;
  }

  /**
   * Set extra html for the #header-wrapper element
   *
   * @param string $html
   */
  public function setExtraHeaderHtml($html) {
    if (!empty($html)) {
      $this->extra_header_html .= $html;
    }
  }

  /**
   * Set title
   *
   * @param string $title
   */
  public function setTitle($title) {
    if (!empty($title) && is_string($title)) {
      $this->title = $title;
    }
  }

  /**
   * Get title
   *
   * @return string
   */
  public function getTitle() {
    if (empty($this->title)) {
      return $this->getPageTitle();
    }
    return $this->title;
  }

  /**
   * Get HeaderRight
   *
   * This section is usually reserved for the google search (solstice),
   * and our Call for Action link.
   *
   * @return string
   */
  public function getHeaderRight() {
    if (!$this->getDisplayHeaderRight()) {
      return "";
    }
    return <<<EOHTML
      <div{$this->getAttributes('header-right')}>
        {$this->getGoogleSearch()}
        {$this->getCfaButton()}
      </div>
EOHTML;
  }

  public function getHeaderLeft(){
    return <<<EOHTML
      <div{$this->getAttributes('header-left')}>
        {$this->getLogo('default', TRUE)}
      </div>
EOHTML;
  }

  /**
   * Get Project Navigation html
   *
   * More information: https://bugs.eclipse.org/bugs/show_bug.cgi?id=436108
   *
   * @return string
   */
  public function getHeaderNav() {
    $header_nav = $this->_getHeaderNavDefaultLogo();

    if (!$header_nav) {
      return "";
    }

    $html = "";
    $html .= '<div class="header_nav">';
    $html .= '<div class="col-xs-24 col-md-10 vcenter">';
    if (!empty($header_nav['logo']['src'])) {
      $logo = '<img src="' . $header_nav['logo']['src'] . '" alt="' . $header_nav['logo']['alt'] . '" width="' . $header_nav['logo']['width'] . '" height="' . $header_nav['logo']['height'] . '" class="img-responsive  header_nav_logo"/>';

      if (!empty($header_nav['logo']['url'])) {
        $html .= '<a href="' . $header_nav['logo']['url'] . '" title="' . $header_nav['logo']['alt'] . '" target="' . $header_nav['logo']['target'] . '">';
        $html .= $logo;
        $html .= '</a>';
      }
      else {
        $html .= $logo;
      }
    }

    $html .= '</div>';
    $html .= '<div class="col-xs-24 col-md-14 vcenter">';
    $html .= '<ul class="clearfix">';

    foreach ($header_nav['links'] as $l) {
      $html .= '<li class="col-xs-24 col-md-12">';
      $html .= '<a class="row" href="' . $l['url'] . '" title="' . $l['link_title'] . '" target="' . $l['target'] . '">';
      $html .= '<i class="col-xs-3 col-md-6 fa ' . $l['icon'] . '"></i>';
      $html .= '<span class="col-xs-21 c col-md-17">';
      $html .= $l['title'];
      $html .= '<p>' . $l['text'] . '</p>';
      $html .= '</span>';
      $html .= '</a>';
      $html .= '</li>';
    }

    $html .= '</ul>';
    $html .= '</div>';
    $html .= '</div>';
    return $html;
  }

  /**
   * Add default values for the links
   *
   * Return FALSE if requirements are not met.
   *
   * @param array $l
   * @return boolean|array
   */
  private function _getHeaderNavDefaultLinks($l) {

    foreach ($l as &$link) {
      $link = $this->is_var($link);
    }

    if (empty($l['url']) || empty($l['title']) || empty($l['icon'])) {
      return FALSE;
    }

    $l['link_title'] = $l['title'];
    if (!empty($l['text'])) {
      $l['link_title'] .= ': ' . $l['text'];
    }

    $default = array(
      'icon' => '',
      'url' => '',
      'title' => '',
      'target' => '_self',
      'text' => '',
      'link_title' => ''
    );

    return array_merge($default, $l);
  }

  /**
   * Add default values for the logo
   *
   * Return FALSE if requirements are not met.
   *
   * @return boolean|array
   */
  private function _getHeaderNavDefaultLogo() {
    $h = $this->getThemeVariables('header_nav');

    if (!is_array($h) || empty($h)) {
      return FALSE;
    }

    $links = array();
    $count = 1;
    $default = array(
      'links' => array(),
      'logo' => array(
        'src' => '',
        'alt' => '',
        'url' => '',
        'target' => '_self',
        'width' => '100%',
        'height' => 'auto'
      )
    );

    if (!empty($h['logo'])) {
      foreach ($h['logo'] as &$logo) {
        $logo = $this->is_var($logo);
      }

      $h['logo'] = array_merge($default['logo'], $h['logo']);

      if (empty($h['logo']['src']) || empty($h['links']) || !is_array($h['links'])) {
        return FALSE;
      }
    }

    foreach ($h['links'] as $l) {
      $link = $this->_getHeaderNavDefaultLinks($l);
      if ($link && $count <= 6) {
        $count++;
        $links[] = $link;
      }
    }

    $h['links'] = $links;
    if (empty($h['links'])) {
      return FALSE;
    }

    return $h;
  }

  /**
   * Get Google Analytics JS code
   *
   * @return string
   * @deprecated
   */
  public function getGoogleAnalytics() {
    trigger_error("Deprecated function called.", E_USER_NOTICE);
    return "";
  }

  /**
   * Set google analytics id code
   *
   * @param string $code
   * @deprecated
   */
  public function setGoogleAnalytics($code = "") {
    trigger_error("Deprecated function called.", E_USER_NOTICE);
  }

  /**
   * Get Google Search HTML
   */
  public function getGoogleSearch() {
    if (!$this->getDisplayGoogleSearch()) {
      return "";
    }

    return <<<EOHTML
    <form action="https://www.eclipse.org/home/search" method="get">
      <div class="form-group">
        <input class="form-control margin-bottom-10" type="textfield" name="q" placeholder="Search">
        <input class="btn btn-primary" type="submit" value="Submit">
      </div>
    </form>
EOHTML;
  }

  /**
   * Set page Html
   *
   * @param string $html
   */
  public function setHtml($html = "") {
    if (is_string($html)) {
      $this->html = $html;
    }
  }

  /**
   * Set Nav Position
   *
   * @param string $position
   * @return string
   */
  public function setNavPosition ($position = 'default') {
    $valid_position = array('default', 'left', 'disabled');
    $position = strtolower($position);
    if (in_array($position, $valid_position)) {
      $this->nav_position = $position;
    }
    return $this->nav_position;
  }

  /**
   * Get Nav Position
   *
   * @return string
   */
  public function getNavPosition () {
    return $this->nav_position;
  }

  /**
   * Get page $html
   */
  public function getHtml() {
    $nav_position = $this->getNavPosition();
    $nav_position = strtolower($nav_position);
    $content_col_classes = 'col-md-24';
    $nav_col_classes = '';
    if ($this->getThemeFile('nav') && $nav_position !== 'disabled') {
      $content_col_classes = 'col-md-18';
      $nav_col_classes = 'col-md-6';
    }
    if ($nav_position === 'left') {
      $content_col_classes .= ' col-md-push-6';
      $nav_col_classes .= ' col-md-pull-18';
    }
    // Define the body content
    $body = $this->getDeprecatedMessage();
    $body .= $this->getHeaderNav();
    $body .= $this->getSystemMessages();
    $body .= $this->getThemeVariables('main_container_html');
    $body .= $this->html;

    // set a different body if there's a sidebar
    if ($nav = $this->getThemeFile('nav')) {
      $body_content = $body;
      $body = '<div class="row">';
      $body .= '<div class="' . $content_col_classes . ' main-col-content">' . $body_content . '</div>';
      if ($nav_position !== 'disabled') {
        $body .= '<div class="' . $nav_col_classes . ' main-col-sidebar-nav">' . $nav . '</div>';
      }
      $body .= '</div>';
    }

    // Define the html
    return <<<EOHTML
      {$this->getBreadcrumbHtml()}
      <main{$this->getAttributes('main')}>
        <div{$this->getAttributes('main-container')}>
          {$body}
        </div>
      </main>
EOHTML;
  }

  /**
   * Get $layout
   */
  public function getLayout() {
    if (empty($this->layout)) {
      $this->setLayout();
    }
    return $this->layout;
  }

  /**
   * Set $layout
   *
   * @param string $layout
   */
  public function setLayout($layout = "") {
    $acceptable_layouts = array(
      'default',
      'default-header',
      'default-footer',
      'default-fluid',
      'barebone',
      'thin',
      'thin-header',
      'default-with-footer-min',
      'thin-with-footer-min',
    );
    $this->layout = 'default';
    if (in_array($layout, $acceptable_layouts)) {
      $this->layout = $layout;
    }
  }

  /**
   * Get logo
   *
   * Fetch a specfic logo from $logos
   *
   * @param string $id
   *
   * @return string
   */
  public function getLogo($id = '', $link = FALSE) {
    // Logos
    $link_logo = $this->getAttributes('link_logo_' . $id);
    $img_logo = $this->getAttributes('img_logo_' . $id);
    $return = "";
    if (!empty($img_logo)) {
      $att_id = str_replace('_', '-', 'logo-' . $id);
      $this->setAttributes($att_id, 'wrapper-' . $att_id);
      //$logo['white_link'] = '<a href="' . $base_url . '">' . $logo['white'] . '</a>';
      $return = '<div' . $this->getAttributes($att_id) . '>';

      if ($link) {
        $url = $this->getBaseUrl();
        if (is_string($link)) {
          $url =  $link;
          $this->setAttributes('link_logo_' . $id, $url, 'href');
          $logo_updated = TRUE;
        }
        $link_logo_href = $this->getAttributes('link_logo_' . $id, 'href');
        if (empty($link_logo_href)) {
          $this->setAttributes('link_logo_' . $id, $url, 'href');
          $logo_updated = TRUE;
        }
        $return .= '<a'. $this->getAttributes('link_logo_' . $id) . '>';
      }


      $return .= '<img' . $this->getAttributes('img_logo_' . $id). '/>';
      if (isset($logo_updated) && $logo_updated === TRUE) {
        $return .= '</a>';
      }
      $return .= '</div>';
    }
    return $return;
  }

  /**
   * Add associative array of logos
   *
   * @param array $logos
   */
  public function setLogo($logos = array()) {
    $this->logos = array_merge($this->logos, $logos);
  }

  /**
   * Get $Menu
   */
  protected function _getMenu() {
    if (!$this->Menu instanceof Menu) {
      $this->setMenu();
    }
    return $this->Menu;
  }

  /**
   * Set $Menu
   *
   * @param unknown $Menu
   */
  public function setMenu($Menu = NULL) {
    if (!$Menu instanceof Menu) {
      $App = $this->_getApp();
      if (!class_exists('Menu')) {
        require_once($App->getBasePath() . '/system/menu.class.php');
      }
      $Menu = new Menu();
    }
    $this->Menu = $Menu;
  }

  /**
   * Get main-menu html output
   *
   * @return string
   */
  public function getMenu() {
    $Menu = $this->_getMenu();
    $main_menu = $Menu->getMenuArray();
    $variables = array();
    $DefaultMenu = new Menu();
    $default_menu_flag = FALSE;
    if ($DefaultMenu->getMenuArray() == $main_menu) {
      // Menu did not change, let's set the default Solstice menu.
      $Menu = $this->_getMenuDefault();
      $main_menu = $Menu->getMenuArray();
      $default_menu_flag = TRUE;
    }

    // Main-menu
    foreach ($main_menu as $item) {
      $menu_li_classes = "";
      $caption = $item->getText();
      if ($default_menu_flag && $caption == 'Download') {
        $menu_li_classes = ' class="visible-thin"';
      }
      $items[] = '<li' . $menu_li_classes . '><a href="' . $item->getURL() . '" target="' . $item->getTarget() . '">' . $caption . '</a></li>';
    }

    return implode($items, '');
  }

  /**
   * Get Default solstice Menu()
   *
   * @return Menu
   */
  protected function _getMenuDefault() {
    $base_url = $this->getBaseUrl();
    $App = $this->_getApp();
    if (!class_exists('Menu')) {
      require_once ($App->getBasePath() . '/system/menu.class.php');
    }
    $Menu = new Menu();
    $Menu->setMenuItemList(array());
    $Menu->addMenuItem("Projects", $base_url . "projects/", "_self");
    $Menu->addMenuItem("Working Groups", $base_url . "org/workinggroups/", "_self");
    $Menu->addMenuItem("Members", $base_url . "membership/", "_self");
    return $Menu;
  }

  /**
   * Get the "More Menu"
   *
   * @param string $id
   *
   * @return string
   */
  public function getMoreMenu($id = 'desktop') {
    $allowed_menu = array(
      'desktop',
      'mobile'
    );
    if (!in_array($id, $allowed_menu)) {
      return '';
    }

    $more_menu = $this->_getMoreMenu();
    $variables['mobile'] = "";
    $variables['desktop'] = '';
    foreach ($more_menu as $key => $value) {
      $first = TRUE;
      foreach ($value as $link) {
        if ($first) {
          $first = FALSE;
          $variables['desktop'] .= '<ul class="col-sm-8 list-unstyled"><li><p><strong>' . $key . '</strong></p></li>';
          $variables['mobile'] .= '<li class="dropdown visible-xs"><a href="#" data-toggle="dropdown" class="dropdown-toggle">' . $key . ' <b class="caret"></b></a><ul class="dropdown-menu">';
        }
        $l = '<li><a href="' . $link['url'] . '">' . $link['caption'] . '</a></li>';
        $variables['desktop'] .= $l;
        $variables['mobile'] .= $l;
      }
      $variables['mobile'] .= '</ul></li>';
      $variables['desktop'] .= '</ul>';
    }
    return $variables[$id];
  }

  /**
   * Get more menu array
   *
   * @return @array
   */
  protected function _getMoreMenu() {
    $variables = array();
    $base_url = $this->getBaseUrl();
    $variables['Community'][] = array(
      'url' => 'http://marketplace.eclipse.org',
      'caption' => 'Marketplace'
    );

    $variables['Community'][] = array(
      'url' => 'http://events.eclipse.org',
      'caption' => 'Events'
    );

    $variables['Community'][] = array(
      'url' => 'http://www.planeteclipse.org/',
      'caption' => 'Planet Eclipse'
    );

    $variables['Community'][] = array(
      'url' => $base_url . 'community/eclipse_newsletter/',
      'caption' => 'Newsletter'
    );

    $variables['Community'][] = array(
      'url' => 'https://www.youtube.com/user/EclipseFdn',
      'caption' => 'Videos'
    );

    $variables['Community'][] = array(
      'url' => 'https://blogs.eclipse.org',
      'caption' => 'Blogs'
    );

    $variables['Participate'][] = array(
      'url' => 'https://bugs.eclipse.org/bugs/',
      'caption' => 'Report a Bug'
    );

    $variables['Participate'][] = array(
      'url' => $base_url . 'forums/',
      'caption' => 'Forums'
    );

    $variables['Participate'][] = array(
      'url' => $base_url . 'mail/',
      'caption' => 'Mailing Lists'
    );

    $variables['Participate'][] = array(
      'url' => 'https://wiki.eclipse.org/',
      'caption' => 'Wiki'
    );

    $variables['Participate'][] = array(
      'url' => 'https://wiki.eclipse.org/IRC',
      'caption' => 'IRC'
    );

    $variables['Participate'][] = array(
      'url' => 'https://www.eclipse.org/org/research/',
      'caption' => 'Research'
    );

    $variables['Eclipse IDE'][] = array(
      'url' => $base_url . 'downloads',
      'caption' => 'Download'
    );

    $variables['Eclipse IDE'][] = array(
      'url' => $base_url . 'eclipseide',
      'caption' => 'Learn More'
    );

    $variables['Eclipse IDE'][] = array(
      'url' => 'https://help.eclipse.org',
      'caption' => 'Documentation'
    );

    $variables['Eclipse IDE'][] = array(
      'url' => $base_url . 'getting_started',
      'caption' => 'Getting Started / Support'
    );

    $variables['Eclipse IDE'][] = array(
      'url' => $base_url . 'contribute/',
      'caption' => 'How to Contribute'
    );

    $variables['Eclipse IDE'][] = array(
      'url' => $base_url . 'ide/',
      'caption' => 'IDE and Tools'
    );

    $variables['Eclipse IDE'][] = array(
      'url' => 'https://www.eclipse.org/forums/index.php/f/89/',
      'caption' => 'Newcomer Forum'
    );

    return $variables;
  }

  /**
   * Get Menu Prefix
   *
   * @return string
   */
  public function getMainMenuPrefix() {
    return "";
  }

  /**
   * Get Menu Suffix
   *
   * @return string
   */
  public function getMenuSuffix(){
    return "";
  }


  /**
   * Get Navigation variables
   *
   * @return array
   */
  public function getNav() {
    // Nav menu
    $base_url = $this->getBaseUrl();
    $variables = array(
      '#items' => array(),
      'link_count' => 0,
      'img_separator' => '<img src="' . $base_url . 'public/images/template/separator.png"/>',
      'html_block' => '',
      'html_block_suffix' => '',
    );
    if ($this->Nav instanceof Nav) {
      // add faux class to #novaContent
      $variables['link_count'] = $this->Nav->getLinkCount();
      $variables['html_block'] = $this->Nav->getHTMLBlock();
      $variables['html_block_suffix'] = $this->Nav->getHTMLBlockSuffix();
      $parent_item = 0;
      for ($i = 0; $i < $variables['link_count']; $i++) {

        $link = $this->Nav->getLinkAt($i);

        if ($link->getTarget() === "__SEPARATOR") {
          $variables['#items'][] = array(
              'item' => $link
          );
          continue;
        }

        $type = $this->Nav->getType();
        $level = $link->getLevel();

        // Bug 572287 - Making sure sidebar nav doesn't go further then 2 levels
        if ($type !== "collapse" || ((int)$level !== 1 && (int)$level !== 2)) {
          $level = 1;
        }

        if (is_numeric($level) && (int)$level === 1) {
          $parent_item = $i;
          $variables['#items'][$parent_item]['item'] = $link;
          $variables['#items'][$parent_item]['children'] = array();
        }
        else {
          $variables['#items'][$parent_item]['children'][] = $link;
        }

        // Removing trailing slashes
        $uri = $_SERVER['REQUEST_URI'];
        if(substr($uri, -1) == '/') {
            $uri = substr($uri, 0, -1);
        }
        $nav_url = $link->getUrl();
        if(substr($nav_url, -1) == '/') {
            $nav_url = substr($nav_url, 0, -1);
        }

        if ($uri === $nav_url) {
          $variables['#items'][$parent_item]['classes'] = "in";
        }
      }
    }

    return $variables;
  }

  /**
   * Set $Nav
   *
   * @param Nav $Nav
   */
  public function setNav($Nav = NULL) {
    if ($Nav instanceof Nav) {
      $this->Nav = $Nav;
    }
  }

  /**
   * Get $page_author
   *
   * @return string
   */
  public function getPageAuthor() {
    if (empty($this->page_author)) {
      $this->page_author = '';
    }
    return $this->page_author;
  }

  /**
   * Set $page_author
   *
   * @param string $author
   */
  public function setPageAuthor($author) {
    $this->page_author = $author;
  }

  /**
   * Get $page_keywords
   *
   * @return string
   */
  public function getPageKeywords() {
    if (empty($this->page_keywords)) {
      $this->page_keywords = 'eclipse,project,plug-ins,plugins,java,ide,swt,refactoring,free java ide,tools,platform,open source,development environment,development,ide';
    }
    return $this->page_keywords;
  }

  /**
   * Set $page_keywords
   *
   * @param string $page_keywords
   */
  public function setPageKeywords($page_keywords) {
    $this->page_keywords = $page_keywords;
  }

  /**
   * Get $page_title
   *
   * @return string
   */
  public function getPageTitle() {
    if (empty($this->page_title)) {
      $this->page_title = 'Eclipse - The Eclipse Foundation open source community website';
    }
    return $this->page_title;
  }

  /**
   * Set $page_title
   *
   * @param string $title
   */
  public function setPageTitle($title) {
    $this->page_title = strip_tags($title);
  }

  /**
   * Get $Session
   *
   * @return Session
   */
  protected function _getSession() {
    if (!$this->Session instanceof Session) {
      $this->_setSession();
    }
    return $this->Session;
  }

  /**
   * Set $Session
   *
   * @param Session $Session
   */
  protected function _setSession($Session = NULL) {
    if (!$Session instanceof Session) {
      $App = $this->_getApp();
      $Session = $App->useSession();
    }
    $this->Session = $Session;
    $this->session_variables = array();
  }

  /**
   * Returns a Take me back
   *
   * @return string
   */
  private function _getTakeMeBack() {
    // Return an empty string if we're on the dev.eclipse.org website
    if (strpos($_SERVER['SERVER_NAME'], "dev.eclipse") !== FALSE) {
      return "";
    }

    $path = parse_url($this->App->getCurrentURL(), PHP_URL_PATH);
    if (substr($path, 0, 1) == "/") {
      $path = substr($path, 1);
    }
    $url = urlencode($this->getBaseUrl() . $path);
    return "?takemeback=" . $url;
  }

  /**
   * Get $ession_variables
   *
   * @param string $id
   *
   * @return string
   */
  public function getSessionVariables($id = "") {
    if (empty($this->session_variables)) {
      // Define the default toolbar links
      $toolbar_links = array(
        'user_login' => '<li><a class="toolbar-link" href="' . $this->getBaseUrlLogin() . '/user/login/' . $this->_getTakeMeBack() . '"><i class="fa fa-sign-in"></i> Log in</a></li>',
        'manage_cookies' => '<a class="toolbar-link toolbar-manage-cookies dropdown-toggle"><i class="fa fa-wrench"></i> Manage Cookies</a>',
        'dropdown' => '',
        'logout' => ''
      );

      // Add the default toolbar links to the session variables
      $this->session_variables = $toolbar_links;

      if ($this->hasCookieConsent()) {

        // Get the user session and reset the session_variables
        $Session = $this->_getSession();

        // Add the toolbar links back to the session variables
        $this->session_variables = $toolbar_links;

        if ($Session->isLoggedIn()) {
          // Get friends
          $Friend = $Session->getFriend();
          $this->session_variables['user_login'] = "";
          $user_name = 'Anonymous';
          if (!$first_name = $Friend->getFirstName() && !$last_name = $Friend->getLastName()) {
            $user_name = $Friend->getFirstName() . ' ' . $Friend->getLastName();
            $user_name = htmlspecialchars($user_name, ENT_QUOTES, 'UTF-8');
          }
          $this->session_variables['dropdown'] = 'Welcome, ' . $user_name;
          $this->session_variables['manage_account'] = '<a href="https://www.eclipse.org/user/' . $Friend->getUID() . '"><i class="fa fa-user"></i> View Profile</a>';
          $this->session_variables['view_account'] = '<a href="' . $this->getBaseUrlLogin() . '/user/edit" class="" data-tab-destination="tab-profile"><i class="fa fa-edit"></i> Edit Profile</a>';
          $this->session_variables['manage_cookies'] = '<a class="toolbar-manage-cookies dropdown-toggle"><i class="fa fa-wrench"></i> Manage Cookies</a>';
          // Adding <li> with logout because we only display
          // two options if the user is not logged in.
          $this->session_variables['logout'] = '<li class="divider"></li><li><a href="' . $this->getBaseUrlLogin() . '/user/logout"><i class="fa fa-sign-out"></i> Log out</a></li>';
        }
      }
    }

    if (!empty($this->session_variables[$id])) {
      return $this->session_variables[$id];
    }
    return '';
  }

  /**
   * Get HTML for System Messages
   *
   * @return string
   */
  public function getSystemMessages() {
    // System messages
    $variables['sys_messages'] = "";

    if (!$this->hasCookieConsent()) {
       return $variables['sys_messages'];
    }
    $App = $this->_getApp();
    if ($sys_messages = $App->getSystemMessage()) {
      $main_container_classes = $this->getAttributes('main_container_classes', 'class');
      $container_classes_array = explode(' ', $main_container_classes);
      $sys_classes = 'clearfix';
      // Verify if the system message is included in a .container class.
      // If not, wrap the system message in a container.
      if (!in_array('container', $container_classes_array)) {
        $sys_classes .= ' container';
      }
      $variables['sys_messages'] = '<div id="sys_message" class="' . $sys_classes . '">';
      $variables['sys_messages'] .= '<div class="row"><div class="col-md-24">' . $sys_messages . '</div></div>';
      $variables['sys_messages'] .= '</div>';
    }

    return $variables['sys_messages'];
  }

  /**
   * Get $theme
   *
   * @return string
   */
  protected function getTheme() {
    return $this->theme;
  }

  /**
   * Set $theme
   *
   * @param string $theme
   */
  protected function setTheme($theme) {
    $this->theme = $theme;
  }

  /**
   * Get array of theme files if they exist
   */
  public function getThemeFiles() {
    $App = $this->_getApp();
    $eclipse_org_common_root = $App->getBasePath();

    $files = array();
    $files['header'] = $eclipse_org_common_root . '/themes/solstice/header.php';
    $files['menu'] = $eclipse_org_common_root . '/themes/solstice/menu.php';
    $files['nav'] = $eclipse_org_common_root . '/themes/solstice/nav.php';
    $files['body'] = $eclipse_org_common_root . '/themes/solstice/body.php';
    $files['main_menu'] = $eclipse_org_common_root . '/themes/solstice/main_menu.php';
    $files['footer'] = $eclipse_org_common_root . '/themes/solstice/footer.php';
    $files['footer-min'] = $eclipse_org_common_root . '/themes/solstice/footer-min.php';

    // Validate theme files
    foreach ($files as $key => $template_files) {
      if (!file_exists($template_files)) {
        unset($files[$key]);
      }
    }

    return $files;
  }

  /**
   * Generate page with theme
   */
  public function generatePage() {
    $btn_cfa = $this->getThemeVariables('btn_cfa');
    if (!empty($btn_cfa['hide']) && $btn_cfa['hide'] === TRUE) {
      $this->setAttributes('body', 'hidden-cfa-button');
    }

    // Generate caching headers
    if ($this->App->getPreventCaching()) {
      $ts = gmdate("D, d M Y H:i:s") . " GMT";
      header("Cache-Control: no-cache, must-revalidate");
      header("Pragma: no-cache");
      header("Last-Modified: ". $ts);
      header("Expires:" . $ts);
    }
    else{
      // 15 minute caching for html php pages
      $caching_seconds = 900;
      $ts = gmdate("D, d M Y H:i:s", time() + $caching_seconds) . " GMT";
      header("Expires:" . $ts);
      header("Pragma: cache");
      header("Cache-Control: max-age=" . $caching_seconds);
    }

    ob_start();
    switch ($this->getLayout()) {
      case 'barebone':
        $this->setAttributes('header-wrapper', 'barebone-layout');
        $this->setAttributes('header-wrapper', 'thin-header');
        $this->setAttributes('header-row', 'header-row', 'id');
        $this->resetAttributes('header-row', 'class');
        $this->setAttributes('header-row', 'row-fluid');
        $this->setDisplayToolbar(FALSE);
        $this->setDisplayGoogleSearch(FALSE);
        $this->resetAttributes('header-left', 'class');
        $this->setAttributes('header-left', 'col-sm-8 col-md-6 col-lg-4');
        $this->resetAttributes('header-container', 'class');
        $this->setAttributes('header-container', 'container-fluid');
        $this->resetAttributes('main-menu-wrapper', 'class');
        $this->setAttributes('main-menu-wrapper', 'col-sm-16 col-md-18 col-lg-20');
        $this->setAttributes('main-menu-ul-navbar', 'navbar-right');
        $this->setDisplayHeaderRight(FALSE);
        $this->setAlternateLayout(TRUE);
        print $this->getThemeFile('menu');
        break;

      case 'thin':
        $this->setAttributes('header-wrapper', 'thin-header');
        $this->resetAttributes('header-left', 'class');
        $this->setAttributes('header-left', 'col-sm-6 col-md-6 col-lg-5');
        $this->resetAttributes('main-menu-wrapper', 'class');
        $this->setAttributes('main-menu-wrapper', 'col-sm-18 col-md-18 col-lg-19');
        $this->setAttributes('main-menu-ul-navbar', 'navbar-right');
        $this->setAttributes('header-row', 'row');

        $this->setDisplayHeaderRight(FALSE);
        print $this->getThemeFile('header');
        print $this->getThemeFile('menu');
        print $this->getHtml();
        print $this->getThemeFile('footer');
        break;

      case 'thin-header':
        $this->setAttributes('header-wrapper', 'thin-header');
        $this->resetAttributes('header-left', 'class');
        $this->setAttributes('header-left', 'col-sm-6 col-md-6 col-lg-5');
        $this->resetAttributes('main-menu-wrapper', 'class');
        $this->setAttributes('main-menu-wrapper', 'col-sm-18 col-md-18 col-lg-19');
        $this->setAttributes('main-menu', 'navbar-right');
        $this->setAttributes('header-row', 'row');
        $this->setDisplayHeaderRight(FALSE);
        print $this->getThemeFile('header');
        print $this->getThemeFile('menu');
        break;

      case 'thin-with-footer-min':
        $this->setAttributes('header-wrapper', 'thin-header');
        $this->resetAttributes('header-left', 'class');
        $this->setAttributes('header-left', 'col-sm-6 col-md-6 col-lg-5');
        $this->resetAttributes('main-menu-wrapper', 'class');
        $this->setAttributes('main-menu-wrapper', 'col-sm-18 col-md-18 col-lg-19');
        $this->setAttributes('main-menu', 'navbar-right');
        $this->setAttributes('header-row', 'row');
        $this->setDisplayHeaderRight(FALSE);
        print $this->getThemeFile('header');
        print $this->getThemeFile('menu');
        print $this->getHtml();
        print $this->getThemeFile('footer-min');
        break;

      case 'default-fluid':

        // Reduce size of logo for fluid layout
        $this->resetAttributes('header-left', 'class');
        $this->setAttributes('header-left', 'col-sm-8 col-md-6 col-lg-4');

       // Override main_container_classes for this layout
        $this->resetAttributes('main-container', 'class');
       // $this->setAttributes('main-container', 'container-fluid');
        $this->setThemeVariables(array('main_container_classes' => 'container-fluid'));

        // reset header container
        $this->resetAttributes('header-container', 'class');
        $this->setAttributes('header-container', 'container-fluid');

        // reset toolbar container
        $this->resetAttributes('toolbar-container', 'class');
        $this->setAttributes('toolbar-container', 'container-fluid');

        // reset breadcrumbs container
        $this->resetAttributes('breadcrumbs-container', 'class');
        $this->setAttributes('breadcrumbs-container', 'container-fluid');

        // reset footer container
        $this->resetAttributes('footer-container', 'class');
        $this->setAttributes('footer-container', 'container-fluid');

        print $this->getThemeFile('header');
        print $this->getThemeFile('menu');
        print $this->getHtml();
        print $this->getThemeFile('footer');
        break;

      case 'default-header':
        print $this->getThemeFile('header');
        print $this->getThemeFile('menu');
        break;

      case 'default-with-footer-min':
        print $this->getThemeFile('header');
        print $this->getThemeFile('menu');
        print $this->getHtml();
        print $this->getThemeFile('footer-min');
        break;

      case 'default':
        print $this->getThemeFile('header');
        print $this->getThemeFile('menu');
        print $this->getHtml();
        print $this->getThemeFile('footer');
        break;

      case 'default-footer':
        print $this->getThemeFile('footer');
        break;

    }
    return ob_end_flush();
  }

  /**
   * Get HTML of theme file
   *
   * @param string $id
   */
  public function getThemeFile($id = "") {
    $files = $this->getThemeFiles();

    ob_start();
    if (!empty($files[$id])) {
      include ($files[$id]);
    }
    $html = ob_get_clean();

    if ($html) {
      return $html;
    }
    return "";
  }

  /**
   * Get absolute path of theme
   *
   * @param string $theme
   *
   * @return string
   */
  public function getThemeUrl($theme = '') {
    if (empty($theme)) {
      $theme = $this->getTheme();
    }
    return '/eclipse.org-common/themes/' . $theme . '/';
  }

  /**
   * Get $theme_varaibles
   *
   * @param string $id
   *
   * @return string
   */
  public function getThemeVariables($id = '') {
    $App = $this->_getApp();
    $this->theme_variables = $App->getThemeVariables();

    $this->setAttributes('main-container', $this->theme_variables['main_container_classes']);

    $this->setAttributes('body', $this->theme_variables['body_classes']);

    if (!empty($id) && isset($this->theme_variables[$id])) {
      return $this->theme_variables[$id];
    }
    return '';
  }

  /**
   * Set $theme_variables
   *
   * @param array $variables
   *
   * @return array
   */
  public function setThemeVariables($variables = array()) {
    $App = $this->_getApp();
    $App->setThemeVariables($variables);
    $this->theme_variables = $App->getThemeVariables();

    return $this->theme_variables;
  }

  /**
   * Set the toolbar left content div element
   *
   * @param string $text
   */
  public function setToolbarLeftContent($text){

    // Set the proper attributes
    $this->setAttributes('toolbar-left-content', 'text-left col-md-12 col-md-pull-12 row-toolbar-col toolbar-left-content');
    $this->resetAttributes('toolbar-user-links', 'class');
    $this->setAttributes('toolbar-user-links', 'col-md-12 col-md-push-12 row-toolbar-col');

    // Add the text to the container
    $left_content_attr = $this->getAttributes("toolbar-left-content");
    if (!empty($text) && !empty($left_content_attr)) {
      $this->toolbar_left_content = '<div' . $left_content_attr . '>
            <span>' . $text . '</span></div>';
    }
  }

  /**
   * Get the toolbar left content div element
   *
   * @return string
   */
  public function getToolbarLeftContent(){
    return $this->toolbar_left_content;
  }

  public function getToolbarHtml() {
    if (!$this->getDisplayToolbar()) {
      return "";
    }

    $more_links = '<li>'. $this->getSessionVariables('manage_cookies') .'</li>';
    $dropdown = $this->getSessionVariables('dropdown');
    if (!empty($dropdown)) {
      $more_links = '<li class="dropdown">
                <a href="#" class="dropdown-toggle" type="button" id="dropdownMenu2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">'. $this->getSessionVariables('dropdown') .' <span class="caret"></span></a>
                <ul class="dropdown-menu toolbar-dropdown-menu" aria-labelledby="dropdownMenu1">
                  <li>'. $this->getSessionVariables('manage_account') .'</li>
                  <li>'. $this->getSessionVariables('view_account') .'</li>
                  <li class="divider"></li>
                  <li>'. $this->getSessionVariables('manage_cookies') .'</li>
                  '.$this->getSessionVariables('logout').'
                </ul>
              </li>';
    }

    return <<<EOHTML
    <div{$this->getAttributes("toolbar-container-wrapper")}>
      <div{$this->getAttributes("toolbar-container")}>
        <div{$this->getAttributes("toolbar-row")}>
          <div{$this->getAttributes("toolbar-user-links")}>
            <ul class="list-inline">
              {$this->getSessionVariables('user_login')}
              {$more_links}
            </ul>
          </div>
          {$this->getToolbarLeftContent()}
        </div>
      </div>
    </div>
EOHTML;
  }

  /**
   * Validate variable
   *
   * Return an empty variable if argument is empty or
   * wrong type.
   *
   * @param mixed $var
   * @param string $type
   *
   * @return string
   */
  public function is_var($var, $type = 'string') {
    switch ($type) {
      case 'string':
        if (!empty($var) && is_string($var)) {
          return $var;
        }
        return "";
        break;

      case 'array':
        if (!empty($var) && is_array($var)) {
          return $var;
        }
        return array();
        break;

      case 'bool':
        if (!empty($var) && is_bool($var)) {
          return $var;
        }
        return FALSE;
        break;
    }
  }

  /**
   * Get Html of Header Top
   */
  public function getHeaderTop() {
    return "";
  }

  /**
   * JS Script Settings
   * @return string
   */
  public function getScriptSettings() {

    $cookie_name = 'eclipse_settings';

    // Keep only the majob and minor version
    $php_version = substr(phpversion(), 0, 3);

    // Remove the dot separating the major and minor version
    $php_version = str_replace(".", "", $php_version);

    // The Cookie class is enabled by default
    $cookie_enabled = 1;

    // If the PHP version is lower than 5.3
    // We need to disable the cookie class
    if ($php_version < "53") {
      $cookie_enabled = 0;
    }

    $script_array = array(
      "settings" => array(
        "cookies_class" => array(
          "name" => $cookie_name,
          "enabled" => $cookie_enabled,
        ),
      ),
    );

    return "<script> var eclipse_org_common = ". json_encode($script_array) ."</script>";
  }

  /**
   * Get $OGTitle output
   *
   * @return string
   */
  public function getMetaTitle() {
    if (empty($this->MetaTitle)) {
      $App = $this->_getApp();
      return $App->getOGTitle();
    }
    return $this->MetaTitle;
  }

  /**
   * Set $MetaTitle
   *
   * @param unknown $title
   */
  public function setMetaTitle($title) {
    $this->MetaTitle = $title;
  }

  /**
   * Get $MetaDescription output
   *
   * @return string
   */
  public function getMetaDescription() {
    if (empty($this->MetaDescription)) {
      $App = $this->_getApp();
      return $App->getOGDescription();
    }
    return $this->MetaDescription;
  }

  /**
   * Set $MetaDescription
   *
   * @param unknown $description
   */
  public function setMetaDescription($description) {
    $this->MetaDescription = $description;
  }

  /**
   * Get $MetaImage output
   *
   * @return string
   */
  public function getMetaImage() {
    if (empty($this->MetaImage)) {
      $App = $this->_getApp();
      return $App->getOGImage();
    }
    return $this->MetaImage;
  }

  /**
   * Set $MetaImage
   *
   * @param unknown $image
   */
  public function setMetaImage($image) {
    $this->MetaImage = $image;
  }

  /**
   * Get $MetaImageWidth output
   */
  public function getMetaImageWidth() {
    if (empty($this->MetaImageWidth)) {
      $App = $this->_getApp();
      return $App->getOGImageWidth();
    }
    return $this->MetaImageWidth;
  }

  /**
   * Set $MetaImageWidth
   *
   * @param string $width
   */
  public function setMetaImageWidth($width) {
    if (is_numeric($width)) {
      $this->MetaImageWidth = $width;
    }
  }

  /**
   * Get $MetaImageHeight output
   */
  public function getMetaImageHeight() {
    if (empty($this->MetaImageHeight)) {
      $App = $this->_getApp();
      return $App->getOGImageHeight();
    }
    return $this->MetaImageHeight;
  }

  /**
   * Set $MetaImageHeight
   *
   * @param string $height
   */
  public function setMetaImageHeight($height) {
    if (is_numeric($height)) {
      $this->MetaImageHeight = $height;
    }
  }

  /**
   * Get random promo ad
   *
   * @deprecated
   * @return string
   */
  public function getRandomPromo($frontpage = FALSE){
    return "";
  }

  /**
   * Prevent page caching
   *
   * @return boolean
   */
  function preventCaching() {
    $this->App->preventCaching();
    return TRUE;
  }

  /**
   * Fetch EF google banner ad
   *
   * @return string
   */
  function getGoogleBannerAd(){
    return <<<EOHTML
<script type="text/javascript">
<!--
google_ad_client = "pub-6797025590085056";
/* 728x90, created 4/17/09 */
google_ad_slot = "9174493316";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
 <script type="text/javascript" src="//pagead2.googlesyndication.com/pagead/show_ads.js"></script>
EOHTML;
  }
}
