<?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
 * *****************************************************************************
 */

require_once ('baseTheme.class.php');

class Locationtech extends baseTheme {

  /**
   * Constructor
   */
  public function __construct($App = NULL) {
    $this->setTheme('locationtech');
    parent::__construct($App);

    $this->setBaseUrl('https://www.locationtech.org');
    $image_path = $this->getThemeUrl('solstice') . 'public/images/locationtech/';

    // LocationTech logos
    $this->setAttributes('img_logo_default', $image_path . 'logo.png', 'src');
    $this->setAttributes('img_logo_default', 'Locationtech.org logo', 'alt');

    $this->setAttributes('img_logo_mobile', $image_path . 'logo.png', 'src');
    $this->setAttributes('img_logo_mobile', 'Locationtech.org logo', 'alt');

    // Set default options
    $this->setDisplayMore(FALSE);

    // Set toolbar attributes
    $this->setAttributes('toolbar-container-wrapper', 'toolbar-contrast');

    // Set header attributes
    $this->setAttributes('header-container', 'no-border');
    $this->setAttributes('header-wrapper', 'page-header-logo-bordered');
    $this->setAttributes('header-left', 'hidden-xs col-sm-8');
    $this->setAttributes('header-right', 'hidden-xs col-md-6 col-sm-8 pull-right');

    // Set attributes for main-menu
    $this->setAttributes('main-menu-wrapper', 'col-sm-24');
    $this->setAttributes('main-menu-ul-navbar', 'navbar-right');

    // Set attributes for footer
    $this->setAttributes('footer1', 'col-xs-offset-1 col-xs-11 col-sm-7 col-md-4 col-md-offset-0 hidden-print');
    $this->setAttributes('footer2', 'col-xs-offset-1 col-xs-11 col-sm-7 col-md-4 col-md-offset-0 hidden-print');
    $this->setAttributes('footer3', 'col-xs-offset-1 col-xs-11 col-sm-7 col-md-4 col-md-offset-0 hidden-print');
    $this->setAttributes('footer4','col-xs-24 col-md-11 footer-other-working-groups col-md-offset-1 hidden-print');
  }

  /**
   * Hook for making changes to $App when using setApp()
   *
   * @param App $App
   */
  public function _hookSetApp($App) {
    $App->setGoogleAnalyticsTrackingCode('UA-910670-10');
  }

  /**
   * Set $Breadcrumb
   *
   * @param Breadcrumb $Breadcrumb
   */
  public function setBreadcrumb($Breadcrumb = NULL) {
    if (!$Breadcrumb instanceof Breadcrumb) {
      $App = $this->_getApp();
      require_once ($App->getBasePath() . '/system/breadcrumbs.class.php');
      $Breadcrumb = new Breadcrumb();
    }
    $Breadcrumb->insertCrumbAt('1', 'Eclipse Working Groups', 'https://www.eclipse.org/org/workinggroups', NULL);
    $Breadcrumb->insertCrumbAt('2', 'Locationtech', 'https://www.locationtech.org', NULL);
    $this->Breadcrumb = $Breadcrumb;
  }

  /**
   * Get default variables for CFA
   *
   * @return array
   */
  protected function _getCfaButtonDefault() {
    $default['class'] = 'btn btn-huge btn-warning';
    $default['href'] = 'https://locationtech.org/mailman/listinfo/location-iwg';
    $default['text'] = '<i class="fa fa-users"></i> Getting Started';
    return $default;
  }
  /**
   * 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) {
      $App = $this->_getApp();
      ob_start();
      include($App->getBasePath() . '/themes/' . $this->getTheme() . '/_menu_links.php');
      return ob_get_clean();
    }

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

    return implode($items, '');
  }

  /**
   * Get $ession_variables
   *
   * @param string $id
   *
   * @return string
   */
  public function getSessionVariables($id = "") {
    $Session = $this->_getSession();
    if ($id == "my_account_link" && !$Session->isLoggedIn()) {
      return '<a href="https://www.locationtech.org/user/login/"><i class="fa fa-sign-in fa-fw"></i> Log in</a>';
    }
    return parent::getSessionVariables($id);
  }

  /**
   * Get Html of Footer Region 1
   */
  public function getFooterRegion1() {
    return <<<EOHTML
      <h2 class="block-title">LocationTech</h2>
        <ul class="menu nav">
          <li class="first leaf"><a href="{$this->getBaseUrl()}/about" title="">About Us</a></li>
          <li class="leaf"><a href="{$this->getBaseUrl()}/contact" title="">Contact us</a></li>
          <li class="leaf"><a href="{$this->getBaseUrl()}/charter" title="">Governance</a></li>
          <li class="leaf"><a href="{$this->getBaseUrl()}>/steeringcommittee" title="">Steering Committee</a></li>
          <li class="last leaf"><a href="{$this->getBaseUrl()}>/jobs" title="">Jobs</a></li>
        </ul>
EOHTML;
  }

  /**
   * Get Html of Footer Region 2
   */
  public function getFooterRegion2() {
    return <<<EOHTML
      <h2 class="block-title">Legal</h2>
      <ul class="menu nav">
        <li class="first leaf"><a href="https://www.eclipse.org/legal/copyright.php" title="">Copyright Agent</a></li>
        <li class="leaf"><a href="https://www.eclipse.org/legal/privacy.php" title="">Privacy Policy</a></li>
        <li class="leaf"><a href="https://www.eclipse.org/legal/termsofuse.php" title="">Terms of Use</a></li>
        <li class="last leaf"><a href="https://www.eclipse.org/legal/" title="">Legal Resources</a></li>
      </ul>
EOHTML;
  }

  /**
   * Get Html of Footer Region 3
   */
  public function getFooterRegion3() {
    return <<<EOHTML
      <h2 class="block-title">Useful Links</h2>
      <ul class="menu nav">
        <li class="first leaf"><a href="https://locationtech.org/mailman/listinfo" title="">Discussion lists</a></li>
        <li class="leaf"><a href="https://github.com/LocationTech" title="">Github</a></li>
        <li class="leaf"><a href="https://locationtech.org/wiki" title="">Wiki</a></li>
        <li class="leaf"><a href="http://foss4g-na.org" title="">FOSS4G NA</a></li>
        <li class="leaf"><a href="http://tour.locationtech.org" title="">Tour</a></li>
        <li class="last leaf"><a href="http://fedgeoday.org" title="">FedGeoDay</a></li>
      </ul>
EOHTML;
  }

  /**
   * Get Html of Footer Region 4
   */
  public function getFooterRegion4() {
    return <<<EOHTML
      <div id="footer-working-group-left" class="col-sm-10 col-xs-offset-1 col-md-11 col-md-offset-1 footer-working-group-col">
        {$this->getLogo('default', TRUE)}<br/>
        <h2 class="section-title sr-only">Other</h2>
        <ul class="list-inline social-media">
          <li class="link_twitter first"><a href="//twitter.com/locationtech"><i class="fa fa-twitter-square"></i></a></li>
          <li class="link_facebook last"><a href="//www.facebook.com/groups/401867609865450/"><i class="fa fa-facebook-square"></i></a></li>
        </ul>
      </div>
      <div  id="footer-working-group-right" class="col-sm-10 col-xs-offset-1 col-sm-offset-3 col-md-11 col-md-offset-1 footer-working-group-col">
       <span class="hidden-print">{$this->getLogo('eclipse_white', $this->getEclipseUrl())}</span>
        <p class="padding-top-15">LocationTech is a Working Group of The Eclipse Foundation.</p>
        <p>{$this->getCopyrightNotice()}</p>
      </div>
EOHTML;
  }

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

}
