<?php

require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/membership/membershipImage.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/membership/promo/impression.class.php");

function buildStrategic($array) {
  $retVal = "";
  $mimg   = new MemberImage();
  $mimg->setdebug(1);

  $strategicPreamble  = '<div class="sideitem"><h6>Featured Member</h6><div style="text-align:center;">';
  $strategicPostamble = '</div></div>';

  list($width, $height) = $mimg->getsmall_image($array['memberID']);

  //check for errors ( -1 in both means something bad happened getting the image details)
  if ($width >= 1 && $height >= 1) {
    $heightText = 'height="' . $height . '" ';
    $retVal     = $strategicPreamble . '<a href="/membership/showMember.php?member_id=' . $array['memberID'] . '" rel="nofollow">' . '<img width="120" ' . $heightText . ' src="/membership/scripts/get_image.php?size=small&id=' . $array['memberID'] . '"' . ' style="padding:5px;" alt="' . $array['memberName'] . '" title="' . $array['memberName'] . '"></a>' . $strategicPostamble . "
";
  }

  return $retVal;
}

function buildStrategicFrontPage($array) {
  $retVal             = "";
  $mimg               = new MemberImage();
  $strategicPreamble  = '<div><div style="text-align:center;">';
  $strategicPostamble = '</div></div>';

  list($width, $height) = $mimg->getsmall_image($array['memberID']);

  //check for errors ( -1 in both means something bad happened getting the image details)
  if ($width >= 1 && $height >= 1) {
    $heightText = 'height="' . $height . '" ';
    $retVal     = $strategicPreamble . '<a href="/membership/showMember.php?member_id=' . $array['memberID'] . '" rel="nofollow">' . '<img width="120" ' . $heightText . ' src="/membership/scripts/get_image.php?size=small&id=' . $array['memberID'] . '"' . ' style="padding:5px;" alt="' . $array['memberName'] . '" title="' . $array['memberName'] . '"></a>' . $strategicPostamble . "
";
  }

  return $retVal;
}

function buildStrategicAd($array) {
  $strat_ad_preamble  = '<div style="text-align:center;padding-bottom:20px;">';
  $strat_ad_postamble = '</div>';
  $retVal             = $strat_ad_preamble . '<a href="/go/' . $array['url'] . '" rel="nofollow"><img width="200" height="200" src="' . $array['imageurl'] . '" alt="' . $array['memberName'] . '" title="' . $array['memberName'] . '"/></a>' . $strat_ad_postamble;
  return $retVal;

}

// Strategic Member Ads for Download Page only
function buildDownloadAd($array) {
  ob_start(); ?>
  <div style="text-align:center;">
    <a href="/go/<?php print $array['url'];?>" rel="nofollow">
    <img width="200" height="200" src="<?php print $array['imageurl'];?>" alt="<?php print $array['memberName'];?>" title="<?php print $array['memberName'];?>"/></a>
  </div>
  <?php
  $impression = new CampaignImpression($array['url'], 'Download Page', @gethostbyaddr($_SERVER['REMOTE_ADDR']));
  $impression->recordImpression();
  return ob_get_clean();
}


function buildGoogleAd() {
  $ad_preamble  = '<div style="width:200px;" align="center">';
  $ad_postamble = '<br><img width="200" height="1" src="/membership/promo/images/200spacer.gif"></div>';
  $retVal       = $ad_preamble . '<script type="text/javascript"><!--
      google_ad_client = "pub-6797025590085056";
      /* 200x200, created 2/22/08 */
      google_ad_slot = "2659366666";
      google_ad_width = 200;
      google_ad_height = 200;
      //-->
      </script>
      <script type="text/javascript"
      src="//pagead2.googlesyndication.com/pagead/show_ads.js">
      </script>' . $ad_postamble;
  return $retVal;
}

function buildDonateAd() {
  $ad_preamble  = '<div width="200" align="center">';
  $ad_postamble = '<br><img src="/membership/promo/images/200spacer.gif"></div>';
  $retVal       = $ad_preamble . '<a href="http://eclipse.org/donate/"><img src="/donate/images/donate.jpg" rel="nofollow"></a>' . $ad_postamble;
  return $retVal;
}

function buildDownloadHtmlAd($array) {

  $urls = array(
    'url1' => $array['url1'],
    'url2' => $array['url2'],
    'url3' => $array['url3'],
  );

  ob_start();
  ?>
  <div class="ad-eclipsecon-schedule">
    <h3 class="header-short-underline">Upcoming Events</h3>
    <a href="/go/<?php print $array['url1']; ?>">
      <img src="/membership/promo/images/eclipsecon-ad-converge2017.png" alt="Eclipse Converge 2017">
    </a>
    <div class="row">
      <div class="col-xs-12">
        <a href="/go/<?php print $array['url2']; ?>">
          <img src="/membership/promo/images/eclipsecon-ad-devoxx2017.png" alt="Devoxx US 2017">
        </a>
      </div>
      <div class="col-xs-12">
        <a href="/go/<?php print $array['url3']; ?>">
          <img src="/membership/promo/images/eclipsecon-ad-ecf2017.png" alt="Eclipsecon France 2017">
        </a>
      </div>
    </div>
  </div>
  <?php

  foreach ($urls as $url) {
    $impression = new CampaignImpression($url, 'Download Page', @gethostbyaddr($_SERVER['REMOTE_ADDR']));
    $impression->recordImpression();
  }

  return ob_get_clean();
}

/**
 * Eclipse Advertisements
 *
 * 1. Paid ads should split 40% of the total impressions
 * 2. EclipseCon should take 10% of the total impressions
 * 3. Members ads should split the remaning 50%.
 *
 * @return array $retVal
 */
function allPromos() {

  $retVal = array();

  /**
   * IMPORTANT:
   * Total weight should result to 100
   * */

  /**
   * PAID ads (30%)
   * */
  $retVal[] = array(
    'url' => 'PAID_FROGLOGIC',
    'imageurl' => '/membership/promo/images/froglogic.gif',
    'memberName' => 'FrogLogic',
    'type' => 'paid',
    'weight' => 8
  );

  $retVal[] = array(
    'url' => 'PAID_JREBEL_A',
    'imageurl' => '/membership/promo/images/O4E-200x200-banner-1.jpg',
    'memberName' => 'JREBEL',
    'type' => 'paid',
    'weight' => 8
  );

  $retVal[] = array(
    'url' => 'PAID_YATTA',
    'imageurl' => '/membership/promo/images/yatta-200x200_1.gif',
    'memberName' => 'YATTA',
    'type' => 'paid',
    'weight' => 4
  );

  $retVal[] = array(
    'url' => 'PAID_YATTA_2',
    'imageurl' => '/membership/promo/images/yatta-200x200_2.gif',
    'memberName' => 'YATTA',
    'type' => 'paid',
    'weight' => 4
  );

  $retVal[] = array(
    'url' => 'PAID_XDEV',
    'imageurl' => '/membership/promo/images/XdevAddBanner.gif',
    'memberName' => 'XDEV',
    'type' => 'paid',
    'weight' => 8,
  );

  $retVal[] = array(
    'url' => 'PAID_OPENTEXT1',
    'imageurl' => '/membership/promo/images/opentext-1-200x200.jpg',
    'memberName' => 'OPENTEXT',
    'type' => 'paid',
    'weight' => 4,
  );

  $retVal[] = array(
    'url' => 'PAID_OPENTEXT2',
    'imageurl' => '/membership/promo/images/opentext-2-200x200.jpg',
    'memberName' => 'OPENTEXT',
    'type' => 'paid',
    'weight' => 4,
  );

  /**
   * Other Ads (70%)
   * */

  // Strategic Members
  $retVal[] = array(
    'memberID' => 655,
    'memberName' => 'CA',
    'type' => 'strategic',
    'weight' => 7
  );

  // Strategic Member Ads
  $retVal[] = array(
    'url' => 'PROMO_ORACLE',
    'imageurl' => '/membership/promo/images/oepe_ad_200x200.jpg',
    'memberName' => 'Oracle',
    'type' => 'strat_ad',
    'weight' => 7
  );

  $retVal[] = array(
    'url' => 'IBM_JAZZ',
    'imageurl' => '/membership/promo/images/ibm200x200-eclipse_orion.png',
    'memberName' => 'IBM',
    'type' => 'strat_ad',
    'weight' => 7
  );
  $retVal[] = array(
    'url' => 'PROMO_SAP',
    'imageurl' => '/membership/promo/images/sap200x200.jpg',
    'memberName' => 'SAP',
    'type' => 'strat_ad',
    'weight' => 7
  );
  $retVal[] = array(
    'url' => 'PROMO_ITEMIS',
    'imageurl' => '/membership/promo/images/xtext_200x200.gif',
    'memberName' => 'Itemis',
    'type' => 'strat_ad',
    'weight' => 6.25
  );
  $retVal[] = array(
    'url' => 'PROMO_OBEO',
    'imageurl' => '/membership/promo/images/Sirius_ad_200.png',
    'memberName' => 'Obeo',
    'type' => 'strat_ad',
    'weight' => 5.5
  );

  /**
   * HTML AD
   */

  // Check if the ECE2016 banner ad should be displayed
  $display_ece = FALSE;
  if ((date("Y/m/d") >= "2016/09/06" && date("Y/m/d") < "2016/10/05") ||
      (date("Y/m/d") >= "2016/10/11" && date("Y/m/d") < "2016/10/25")) {
    $display_ece = TRUE;
  }

  // If the ECE banner is not displayed,
  // then we should show the Eclipsecon Schedule Ad
  if (!$display_ece) {
    $retVal[] = array(
      'memberName' => 'Eclipsecon',
      'url1' => 'PROMO_ECLIPSECON_NA2017',
      'url2' => 'PROMO_ECLIPSECON_DEVOXX2017',
      'url3' => 'PROMO_ECLIPSECON_FRANCE2017',
      'format' => 'html',
      'type' => 'strat_ad',
      'weight' => 20.25
    );
  }

  // If the ECE banner ad should be displayed
  if ($display_ece) {

    // Set the proper image depending on the date
    if (date("Y/m/d") >= "2016/09/06" && date("Y/m/d") < "2016/09/20") {
      $ece_image_url = "/membership/promo/images/ece2016-now.png";
    }
    if (date("Y/m/d") >= "2016/09/20" && date("Y/m/d") < "2016/10/05") {
      $ece_image_url = "/membership/promo/images/ece2016-early.png";
    }
    if (date("Y/m/d") >= "2016/10/11" && date("Y/m/d") < "2016/10/18") {
      $ece_image_url = "/membership/promo/images/ece2016-two-weeks.png";
    }
    if (date("Y/m/d") >= "2016/10/18" && date("Y/m/d") < "2016/10/25") {
      $ece_image_url = "/membership/promo/images/ece2016-one-week.png";
    }

    $retVal[] = array(
      'memberName' => 'ECE2016',
      'type' => 'strat_ad',
      'weight' => 22.5,
      'imageurl' => $ece_image_url,
      'url' => 'PROMO_ECE_2016',
    );
  }


  return $retVal;

}


function chooseRandomPromo($adNo = NULL, $frontPage = NULL) {

  $promos = allPromos();

  if ($adNo != null) {
    $selectedAd = $promos[$adNo];
  } else {
    $selectedAd = array_rand_weighted($promos);
  }

  // If the selected Ad is in HTML
  if (!empty($selectedAd['format']) && $selectedAd['format'] == "html") {
    return buildDownloadHtmlAd($selectedAd);
  }

  switch ($selectedAd['type']) {
    case 'paid':
    // THERE IS NO BREAK HERE ON PURPOSE WE WANT STRAT_AD CASE CODE TO RUN
    case 'strat_ad':
      $impression = new CampaignImpression($selectedAd['url'], $_SERVER['REQUEST_URI'], @gethostbyaddr($_SERVER['REMOTE_ADDR']));
      $impression->recordImpression();
      return buildStrategicAd($selectedAd);
      break;
    case 'strategic':
      if ($frontPage != NULL)
        return buildStrategicFrontPage($selectedAd);
      else
        return buildStrategic($selectedAd);
      break;
    case 'google_ad':
      return buildGoogleAd($selectedAd);
      break;
    case 'donate_ad':
      return buildDonateAd($selectedAd);
      break;
  }
}

function array_rand_weighted($values) {
  $totalWeight = 0;
  foreach ($values as $rr) {
    $totalWeight += $rr['weight'];
  }
  $r = mt_rand(1, $totalWeight);
  foreach ($values as $item) {
    if ($r <= $item['weight'])
      return $item;
    $r -= $item['weight'];
  }
}

function strategicAds() {
  $promos = allPromos();
  $retVal = array();
  foreach ($promos as $promo) {
    if ($promo['type'] == 'strat_ad' || $promo['type'] == 'paid') {
      $retVal[] = $promo;
    }
  }
  return $retVal;
}

function chooseDownloadAd($adNo = NULL) {
  $promos = strategicAds();

  if ($adNo != null) {
    $selectedAd = $promos[$adNo];
  } else {
    $selectedAd = array_rand_weighted($promos);
  }

  // If the selected Ad is in HTML
  if (!empty($selectedAd['format']) && $selectedAd['format'] == "html") {
    return buildDownloadHtmlAd($selectedAd);
  }
  return buildDownloadAd($selectedAd);
}

