<?php
/*******************************************************************************
 * Copyright (c) 2014,2015 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://eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Denis Roy (Eclipse Foundation) - Initial implementation
 *    Christopher Guindon (Eclipse Foundation)
 *******************************************************************************/

  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");

  $App   = new App();
  $Nav  = new Nav();
  $Menu = new Menu();

  include($App->getProjectCommon());

  # Begin: page-specific settings.  Change these.
  $pageTitle     = "Membership Benefits";
  $pageKeywords  = "Membership benefits";
  $pageAuthor    = "Christopher Guindon";

  include("benefit.class.php");
  $benefits = array();

  $ben = new benefit();
  $ben->name =  'Advertising space on eclipse.org';
  $ben->description = 'Strategic Members receive advertising space on various eclipse.org web pages.
Strategic, Solution and Enterprise members can purchase advertising space on eclispe.org web pages.
For more information, please send an email to <a href="mailto:membership@eclipse.org">membership@eclipse.org</a>.';
  $ben->how_to_engage = "";
  $ben->addTags("Marketing");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "Member Designation on Eclipse Marketplace";
  $ben->description = 'Strategic, Enterprise and Solution members will receive
  special designation for their listing on <a href="http://marketplace.eclipse.org/">Eclipse Marketplace</a>.
  This designation means their listing will be accessible from the
  Eclipse Marketplace Client, making it easier for Eclipse users to install
  member solutions directly into Eclipse.';
    $ben->how_to_engage = "";
  $ben->addTags("Marketing");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name =  'Link to your Eclipse distros from eclipse.org/downloads';
  $ben->description = 'Members can participate in the <a href="/membership/special_programs/member-downloads-program.php">members distros program</a>.';
  $ben->how_to_engage = "";
  $ben->addTags("Marketing");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name =  'Promote special offers to other members in Foundation Newsletter';
  $ben->description = 'Have a special offer you want to offer other members? Place a short ad in the Foundation Newsletters!';
  $ben->how_to_engage = "";
  $ben->addTags("Networking and Learning");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name =  'Organizational Membership page Eclipse.org Web Site';
  $ben->description = 'Links posted on Eclipse.org are heavily trafficed and well indexed.  Each member is provided the opportunity to
          post their company information, product information and logo on their own <a href="../exploreMembership.php">membership page</a>.';
  $ben->how_to_engage = "";
  $ben->addTags("Marketing");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name =  'News Stories ';
  $ben->description = 'News links posted on Eclipse.org are heavily trafficked and read tens of thousands of times
         each. The <a href="http://eclipse.org">Eclipse.org</a> web site highlights
         members&rsquo; news related stories in the Community section. Interested in submitting a news story, please send an email to <a href="mailto:news@eclipse.org?subject=Request to Post Member News&body=Include URL to news article you would like posted.">
         news@eclipse.org</a>.';
  $ben->how_to_engage = "";
  $ben->addTags("Marketing");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "Support for Press releases";
  $ben->description = 'Eclipse Foundation will provide press assistance and quotes for new member press releases and ongoing member product announcements. Please email <a href="mailto:membership@eclipse.org">membership@eclipse.org</a>.';
  $ben->how_to_engage = "";
  $ben->addTags("Marketing");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "Access to Member Marketing mailing list";
  $ben->description = 'Mailing lists are a key method that the foundation uses to communicate with the
    membership.  Please note some of the <a href="http://www.eclipse.org/mail/index_topic.php"> mailing lists</a> that
    are available.  As members, you will certainly want to sign up for the
    <strong>eclipse.org-member-marketing</strong> mailing list. This list will be useful not only to people marketing Eclipse
    based products and services, but also Engineering managers, directors and
    executives interested in keeping abreast of activities in the Eclipse ecosystem.
    For more information on sending to the member marketing list, please send an email to <a href="mailto:membership@eclipse.org">membership@eclipse.org</a>.';
    $ben->how_to_engage = "";
  $ben->addTags("Marketing");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "Special Promotional Activities";
  $ben->description = 'The size and popularity of Eclipse community presents members unique promotional
      opportunities, ex. advertising supplements, newsletter sponsorships, etc.  Some promotional activities will be limited
      to Strategic, Solutions and Enterprise Members depending on the context.
      For more information on sending to the member marketing list, please send an email to <a href="mailto:membership@eclipse.org">membership@eclipse.org</a>.';
    $ben->how_to_engage = "";
  $ben->addTags("Marketing");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "EclipseCon Discounts";
  $ben->description = 'The Eclipse community host three annual conferences in North American and Europe.
      This is a perfect opportunity
      to meet potential partners and customers. Eclipse members receive
      preferential exhibit space and sponsorship opportunities, show discounts
      and other members only opportunities.';
  $ben->how_to_engage = "";
  $ben->addTags("Networking and Learning");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "Members Meetings and Teleconferences";
  $ben->description = 'Eclipse <a href="http://www.eclipse.org/org/foundation/minutes.php">member meetings </a>
      and committee discussions create many opportunities to network with other
      technical, marketing and business development professionals. Members
      discuss and leverage shared resources to solve Member problems and grow
      the Eclipse community.  There are two face-to-face members meets and two teleconference meetings each year, plus
      many other opportunities and events.';
    $ben->how_to_engage = "";
  $ben->addTags("Networking and Learning");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "Membership At Large Access";
  $ben->description = 'Members will automatically be subscribed to the Eclipse membership-at-large
    mailing list which contains consolidated information regarding the Eclipse ecosystem including notice of
    upcoming members meetings, project reviews, events and other important information.  It represents a single
    feed of information to keep up with the activities of the Eclipse Foundation.';
    $ben->how_to_engage = "";
  $ben->addTags("Consolidated Information");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "Quarterly Director Reports";
  $ben->description = 'Each quarter our members will receive access to important statistics and information
    about the Eclipse Ecosystem.  The
    Executive Directors Report contains a summary of new members, foundation activities and plans, market research and
    other relevant stats, and a general update of the Ecosystem.
    The project update represents a summary of Eclipse project activities including new proposals, release plans
    and other important project information.';
    $ben->how_to_engage = "";
  $ben->addTags("Consolidated Information");
  array_push($benefits, $ben);

  $ben = new benefit();
  $ben->name = "Monthly Member Newsletters";
  $ben->description = 'Each month our members will be emailed the <a href="http://www.eclipse.org/community/newsletter/">Eclipse Member
  Newsletter</a>, which gives  a summary of important news, events and special offers pertaining to members. ';
  $ben->addTags("Consolidated Information");
  array_push($benefits, $ben);

  // Setup tabs.
  $variables = array(
    'content' => array(),
    'tab_pane' => array(),
  );
  foreach ($benefits as $value) {
    foreach($value->tags as $t){
      $variables['content'][$t][] = $value;
    }
  }

  // Setup content.
  foreach ($variables['content'] as $key => $value) {
    $safe_name = strtolower(str_replace(" ", "", $key));
    $tab_pane = '<div class="sideitem background-grey"><h2>' . $key . '</h2><div class="content"><ul class="list-padding">';
    $id = 0;
    foreach ($value as $b) {
      $name = $b->name;
      if (!empty($b->how_to_engage)) {
        $name = '<a href="'.$b->how_to_engage.'">' .$b->name . '</a>';
      }
      $tab_pane .= '<li><h4 class="list-heading">' . $name . '</h4>';
      $tab_pane .= $b->description . '</li>';
      $id++;
    }
    $tab_pane .= '</ul></div></div>';
    $variables['tab_pane'][] = $tab_pane;

  }

  // Place your html content in a file called content/en_pagename.php
  ob_start();
  include("content/en_" . $App->getScriptName());
  $html = ob_get_clean();

  require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/breadcrumbs.class.php");
  $Breadcrumb = new Breadcrumb();
  # remove last crumb since it represents this _projectCommon page.
  $Breadcrumb->removeCrumb($Breadcrumb->getCrumbCount() -1);
  $Breadcrumb->addCrumb("Become a member", "/membership/become_a_member/", "_self");
  $Breadcrumb->addCrumb($pageTitle, NULL, NULL);

  # Generate the web page
  $App->generatePage("solstice", $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html, $Breadcrumb);
