<?php
/**
 * Copyright (c) 2014, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Christopher Guindon (Eclipse Foundation) - initial API and implementation
 *    Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>

<!-- Featured story and ad -->
<div class="featured-story featured-ece">
  <div class="container">
    <div class="row">
      <div class="col-sm-12 col-sm-offset-2 col-md-16 col-md-offset-0 featured-story-block" style="background-color:transparent;">
        <p class="featured-story-description">Recommended</p>
        <h2><strong>Call for Papers now open</strong></h2>
        <p><a href="https://www.eclipsecon.org/europe2018"><img class="ece-logo" src="/home/images/ece-osgi-logo.png"></a></p>
        <h3><strong>Submissions close July 16!</strong></h3>
        <p><a class="btn btn-secondary btn-lg" href="https://www.eclipsecon.org/europe2018/cfp">Submit a proposal</a></p>
      </div>
      <div class="col-sm-9 col-md-8 featured-ad featured-story-block">
        <div class="featured-ad-content">
          <?php print $Theme->getRandomPromo(TRUE);?>
          <p class="featured-story-description">Sponsored Ad</p>
        </div>
      </div>
    </div>
  </div>
</div>

<!-- Announcements and Community news -->
<div class="news-list news-list-match-height news-list-top-shape">
  <div class="container">
    <div class="row">
      <div class="col-lg-10 col-lg-offset-2 col-md-12 news-list-col padding-bottom-50">
        <div class="news-list-icon text-center"><i data-feather="activity" stroke-width="1"></i></div>
        <h2 class="text-center">Announcements</h2>
        <?php
          $Announcements = new FeedParser();
          $Announcements->addPath($_SERVER['DOCUMENT_ROOT'] . "/community/news/2005newsarchive.rss");
          $Announcements->setViewMoreLink('/community/news/eclipsenews.php');
          $Announcements->setRssLink('http://feeds.feedburner.com/eclipse/fnews');
          $Announcements->setLimit(120);
          print $Announcements->output();
        ?>
        <ul class="list-inline news-list-links">
          <li class="news-list-links-view-all"><a href="/community/news/eclipsenews.php?archive=true">View all</a></li>
          <li class="news-list-links-rss"><a href="http://feeds.feedburner.com/eclipse/fnews" title="Subscribe to our RSS-feed">Subscribe to our RSS-feed <i class="fa fa-rss"></i></a></li>
        </ul>
      </div>
      <div class="col-lg-10 col-md-12 news-list-col padding-bottom-50">
        <div class="news-list-icon text-center"><i data-feather="tv" stroke-width="1"></i></div>
        <h2 class="text-center">Community News</h2>
        <?php
          $Community = new FeedParser();
          $Community->addPath($_SERVER['DOCUMENT_ROOT'] . "/community/news/2005inthenewsarchive.rss");
          $Community->setViewMoreLink('/community/news/eclipseinthenews.php');
          $Community->setRssLink('http://feeds.feedburner.com/eclipse/cnews');
          $Community->setLimit(120);
          print $Community->output();
        ?>
        <ul class="list-inline news-list-links">
          <li class="news-list-links-view-all"><a href="/community/news/eclipseinthenews.php?archive=true">View all</a></li>
          <li class="news-list-links-rss"><a href="http://feeds.feedburner.com/eclipse/cnews" title="Subscribe to our RSS-feed">Subscribe to our RSS-feed <i class="fa fa-rss"></i></a></li>
        </ul>
      </div>
    </div>
  </div>
</div>