<?php
/**
 * Copyright (c) 2005, 2017, 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
 *
 * SPDX-License-Identifier: EPL-2.0
 */

require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once ("./scripts/lookup_exceptions.php");

$App = new App();
$Theme = $App->getThemeClass();

$pageTitle = "Eclipse Member Logos";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords("eclipse membership, become a member, membership faq, membership expire");
$Theme->setPageAuthor("Christopher Guindon");

// WTB: Modified to exclude organizations that have not provided a small logo.
$selectall = "SELECT ORGI.OrganizationID, ORG.name1, ORGI.short_description, ORG.member_type, ORGI.company_url IS NULL AS COMPLETE
  from OrganizationInformation as ORGI
  RIGHT JOIN organizations as ORG on ORGI.OrganizationID = ORG.organization_id
  WHERE ORG.member_type in ('SD', 'SC', 'AP', 'AS', 'ENTRP') and ORGI.small_logo is not NULL
  ORDER BY ORG.name1";

$result = $App->eclipse_sql($selectall);

$html = '<h1>' . $pageTitle . '</h1><div class="row padding-top-20">';
while ($org = mysql_fetch_array($result)) {
  $html .= '<div class="col-md-3 col-sm-6 col-xs-8 margin-bottom-20" style="height:120px;"><img class="img-responsive" src="./scripts/get_image.php?id=' . $org[0] . '&size=small" title="' . $org[1] . '" alt="' . $org[1] . '"></div>';
}
$html .= '</div>';
$Theme->setHtml($html);

// Generate the web page
$Theme->generatePage();