<?php
/*******************************************************************************
 * Copyright (c) 2006-2014 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:
 *    Denis Roy (Eclipse Foundation)- initial API and implementation
 *    Karl Matthias (Eclipse Foundation) - Database access management
 *    Christopher Guindon (Eclipse Foundation)
 *******************************************************************************/
class App {
  private $APPVERSION   = "1.0";
  private $APPNAME    = "Eclipse.org";


  private $DEFAULT_ROW_HEIGHT  = 20;

  private $POST_MAX_SIZE    = 262144;   # 256KB Max post
  private $OUR_DOWNLOAD_URL   = "http://download1.eclipse.org";
  private $PUB_DOWNLOAD_URL   = "http://download.eclipse.org";
  private $DOWNLOAD_BASE_PATH = "/home/data2/httpd/download.eclipse.org";
  private $DB_CLASS_PATH    = "/home/data/httpd/eclipse-php-classes/system/"; # ends with '/'

  private $WWW_PREFIX      = "";  # default is relative
  private $HTTP_PREFIX    = "http"; #default is http

  # Additional page-related variables
  public  $ExtraHtmlHeaders   = "";
  public  $ExtraJSFooter   = "";
  public  $PageRSS      = "";
  public  $PageRSSTitle    = "";
  public  $Promotion      = FALSE;
  public  $CustomPromotionPath = "";
  private $THEME_LIST     =  array("", "Nova", "solstice", "polarsys");

  #Open Graph Protocol Variables
  private $OGTitle            = "";
  private $OGDescription      = "Eclipse is probably best known as a Java IDE, but it is more: it is an IDE framework, a tools framework, an open source project, a community, an eco-system, and a foundation.";
  private $OGImage            = "https://www.eclipse.org/eclipse.org-common/themes/Nova/images/eclipse.png";

  #Doctype
  private $doctype       = FALSE;

  #Google Analytics Variables
  private $projectGoogleAnalyticsCode = "";
  private $googleJavaScript = "";

  #jQuery Variables
  private $jQueryVersion = FALSE;

  # Twitter Follow Widget Variables
  private $twitterScriptInserted = FALSE;

  # Variables for theme customization (Solstice and up).
  private $theme_variables = array();

  # Set to TRUE to disable all database operations
  private $DB_READ_ONLY    = false;

  # Database config and handle cache
  private $databases;

  # Flag to determine whether the "deprecated" theme should be loaded.
  private $OutDated      = false;

  # Deprecated theme message.
  private $OutDatedMsg  = "";

  # Flag to determine whether this is development mode or not (for databases)
  public $devmode       = false;

  # Flag to log SQL even on production systems
  public $logsql        = false;

  # Arbitrary storage hash
  private $hash;

  # SQL Backtrace storage
  public $query_btrace;

  # Default constructor
  function App() {
    # Set value for WWW_PREFIX
    $valid_domains = array(
      'www.eclipse.org',
      'eclipse.org',
      'staging.eclipse.org',
      'eclipse.local',
      'www.eclipse.local'
    );

    $http_protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https://' : 'http://';
    // Force http://www.eclipse.org if the serve_name is not whitelisted.
    if (in_array($_SERVER['SERVER_NAME'], $valid_domains)) {
      $this->WWW_PREFIX = $http_protocol;
      $this->WWW_PREFIX .= isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : getenv('HTTP_HOST');
    }
    else {
      $this->WWW_PREFIX = $http_protocol . 'www.eclipse.org';
    }

    $this->databases = array();

    # Figure out if we're in devmode by whether the classes are installed or not
    if(!file_exists($this->DB_CLASS_PATH)) {
      $this->devmode = true;
    }

    # Configure databases (not connected)
    $this->configureDatabases();

    # Make it easy to override database and other settings (don't check app-config.php in to CVS!)
    if($this->devmode) {
      if(file_exists(getcwd() . '/app-config.php')) {
        include_once(getcwd() . '/app-config.php');
        # We call a function inside app-config.php and pass it a reference to ourselves because
        # this class is still in the constructor and might not be available externally by name.
        # File just contains a function called app_config() which is called.  Nothing more is needed.
        app_config($this);
      }
      else if(file_exists($_SERVER['DOCUMENT_ROOT'] . '/eclipse.org-common/system/app-config.php'))
      {
        include_once($_SERVER['DOCUMENT_ROOT'] . '/eclipse.org-common/system/app-config.php');
        app_config($this);
      }
    }

    # Initialize backtrace storage
    $this->query_btrace = array();

    # Set server timezone
    date_default_timezone_set("America/Montreal");
  }


  function getAppVersion() {
    return $this->APPVERSION;
  }

  function getHeaderPath($_theme) {
    return $_SERVER["DOCUMENT_ROOT"] . "/eclipse.org-common/themes/" . $_theme . "/header.php";
  }
  function getMenuPath($_theme) {
    return $_SERVER["DOCUMENT_ROOT"] . "/eclipse.org-common/themes/" . $_theme . "/menu.php";
  }
  function getNavPath($_theme) {
    return $_SERVER["DOCUMENT_ROOT"] . "/eclipse.org-common/themes/" . $_theme . "/nav.php";
  }
  function getFooterPath($_theme) {
    return $_SERVER["DOCUMENT_ROOT"] . "/eclipse.org-common/themes/" . $_theme . "/footer.php";
  }
  function getPromotionPath($_theme) {
    return $_SERVER["DOCUMENT_ROOT"] . "/home/promotions/promotion.php";
  }

  /**
   * Get eclipse.org cookie domain and prefix based off the current environment
   *
   * @return array
   */
  public function getEclipseDomain(){

    $server['dev'] = array(
      'cookie' => '.eclipse.local',
      'domain' => 'www.eclipse.local',
      'dev_domain' => 'dev.eclipse.local',
      'allowed_hosts' => array(
        'eclipse.local',
        'www.eclipse.local',
        'dev.eclipse.local',
        'docker.local'
      ),
    );

    $server['staging'] = array(
      'cookie' => '.eclipse.org',
      'domain' => 'staging.eclipse.org',
      // We currently dont have a staging server for dev.eclipse.org
      'dev_domain' => 'dev.eclipse.org',
      'allowed_hosts' => array(
        'staging.eclipse.org'
      ),
    );

    $server['prod'] = array(
      'cookie' => '.eclipse.org',
      'domain' => 'www.eclipse.org',
      'dev_domain' => 'dev.eclipse.org',
      'allowed_hosts' => array(
        // Empty, since it's the default.
      ),
    );

    // It should not matter if we are on http or https here.
    $host = parse_url('http://' . $_SERVER['HTTP_HOST'], PHP_URL_HOST);
    if (!empty($host)) {
      foreach ($server as $type) {
        if (in_array($host, $type['allowed_hosts'])) {
          return $type;
        }
      }
    }
    return $server['prod'];
  }

  function getAppName() {
    return $this->APPNAME;
  }
  function getPostMaxSize() {
    return $this->POST_MAX_SIZE;
  }
  function getDefaultRowHeight() {
    return $this->DEFAULT_ROW_HEIGHT;
  }
  function getDBReadOnly() {
    return $this->DB_READ_ONLY;
  }

  function sendXMLHeader() {
    header("Content-type: text/xml");
  }

  function getOurDownloadServerUrl() {
    return $this->OUR_DOWNLOAD_URL;
  }

  function getDownloadBasePath() {
    return $this->DOWNLOAD_BASE_PATH;
  }

  function getPubDownloadServerUrl() {
    return $this->PUB_DOWNLOAD_URL;
  }

  function getWWWPrefix() {
    return $this->WWW_PREFIX;
  }

  /**
   * @return: a string
   *
   * return https if $_SERVER['HTTPS'] exist otherwise this function returns http
   */
  function getHTTPPrefix() {
    $protocol = $this->HTTP_PREFIX;
    if(isset($_SERVER['HTTPS'])) {
      if($_SERVER['HTTPS']){
        $protocol = "https";
      }
    }
    $this->HTTP_PREFIX = $protocol;
    return $this->HTTP_PREFIX ;
  }

  function getUserLanguage() {
    /* @return: String
     *
     * Check the browser's default language and return
     *
     * 2006-06-28: droy
     *
     */

    $validLanguages = array('en', 'de', 'fr');
    $defaultLanguage = "en";

    # get the default browser language (first one reported)
    $language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

    if(array_search($language, $validLanguages)) {
        return $language;
    }
    else {
      return $defaultLanguage;
    }
  }

  function getLocalizedContentFilename() {
    /* @return: String
     *
     * return the content/xx_filename.php filename, according to availability of the file
     *
     * 2006-06-28: droy
     *
     */

    $language = $this->getUserLanguage();
    $filename = "content/" . $language . "_" . $this->getScriptName();

    if(!file_exists($filename)) {
      $filename = "content/en_" . $this->getScriptName();
    }

    return $filename;
  }


  function getScriptName() {
    # returns only the filename portion of a script
    return substr($_SERVER['SCRIPT_NAME'], strrpos($_SERVER['SCRIPT_NAME'], "/") + 1);
  }

  function getProjectCommon() {
    /** @return: String
     *
     * Walk up the directory structure to find the closest _projectCommon.php file
     *
     * 2005-12-06: droy
     * - created basic code to walk up all the way to the DocumentRoot
     *
     */

    $currentScript   = $_SERVER['SCRIPT_FILENAME'];
    $strLen     = strlen($currentScript);
    $found       = false;
    $antiLooper    = 0;

    # default to /home/_projectCommon.php
    $rValue     = $_SERVER['DOCUMENT_ROOT'] . "/home/_projectCommon.php";


    while($strLen > 1 && ! $found) {
      $currentScript   = substr($_SERVER['SCRIPT_FILENAME'], 0, strrpos($currentScript, "/"));
      $testPath     = $currentScript . "/_projectCommon.php";

      if(file_exists($testPath)) {
        $found   = true;
        $rValue = $testPath;
      }
      $strLen = strlen($currentScript);

      # break free from endless loops
      $antiLooper++;
      if($antiLooper > 20) {
        $found = true;
      }
    }
    return $rValue;
  }

  /**
   *  Sets the headers to prevent caching for the different browsers.
   *
   *  *** Deprecated function ***
   *  Please use preventCaching() instead.
   */
  function runStdWebAppCacheable() {
    $this->preventCaching();
  }

  /**
   *  Sets the headers to prevent caching for the different browsers.
   */
  function preventCaching() {
     session_start();
     header("Cache-Control: no-store, no-cache, private, must-revalidate, max-age=0, max-stale=0");
     header("Cache-Control: post-check=0, pre-check=0", FALSE);
     header("Pragma: no-cache");
     header("Expires: 0");
  }

  function getAlphaCode($_NumChars)
  {
    # Accept: int - number of chars
    # return: string - random alphanumeric code


    # Generate alpha code
    $addstring = "";
    for ($i = 1; $i <= $_NumChars; $i++) {
      if(rand(0,1) == 1) {
        # generate character
        $addstring = $addstring . chr(rand(0,5) + 97);
      }
      else {
        $addstring = $addstring . rand(0,9);
      }
    }
    return $addstring;
  }

  function getCURDATE() {
    return date("Y-m-d");
  }

  function addOrIfNotNull($_String) {
    # Accept: String - String to be AND'ed
    # return: string - AND'ed String

    if($_String != "") {
      $_String = $_String . " OR ";
    }

    return $_String;
  }

  function addAndIfNotNull($_String) {
    # Accept: String - String to be AND'ed
    # return: string - AND'ed String

    if($_String != "") {
      $_String = $_String . " AND ";
    }

    return $_String;
  }

  function getNumCode($_NumChars)
  {
    # Accept: int - number of chars
    # return: int - random numeric code


    # Generate code
    $addstring = "";
    for ($i = 1; $i <= $_NumChars; $i++) {
      if($i > 1) {
        # generate first digit
        $addstring = $addstring . rand(1,9);
      }
      else {
        $addstring = $addstring . rand(0,9);
      }
    }
    return $addstring;
  }

  function str_replace_count($find, $replace,$subject, $count) {
    # Replaces $find with $replace in $subnect $count times only

    $nC = 0;

    $subjectnew = $subject;
    $pos = strpos($subject, $find);
    if ($pos !== FALSE)   {
      while ($pos !== FALSE) {
        $nC++;
        $temp = substr($subjectnew, $pos+strlen($find));
        $subjectnew = substr($subjectnew, 0, $pos) . $replace . $temp;
        if ($nC >= $count)   {
          break;
        }
            $pos = strpos($subjectnew, $find);
      }
    }
    return $subjectnew;
  }

  function returnQuotedString($_String)
  {
    # Accept: String - String to be quoted
    # return: string - Quoted String

    // replace " with '
    # $_String = str_replace('"', "'", $_String);
    # https://bugs.eclipse.org/bugs/show_bug.cgi?id=299682#c1
    $_String = addslashes($_String);

    return "\"" . $_String . "\"";
  }

  function returnHTMLSafeString($_String)
  {
    # Accept: String - String to be HTMLSafified
    # return: string

    // replace " with '
    $_String = str_replace('<', "&lt;", $_String);
    $_String = str_replace('<', "&gt;", $_String);
    $_String = str_replace("\n", "<br />", $_String);

    return $_String;
  }

  function returnJSSAfeString($_String)
  {
    # Accept: String - String to be quoted
    # return: string - Quoted String

    // replace " with '
    $_String = str_replace("'", "\\'", $_String);

    return $_String;
  }

  function replaceEnterWithBR($_String) {
    return str_replace("\n", "<br />", $_String);
  }

  function generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html, $Breadcrumb = NULL) {
    # Strip html tags from the page title.
    $pageTitle = strip_tags($pageTitle);

    # Breadcrumbs for the new solstice theme.
    if ($Breadcrumb == NULL || !is_object($Breadcrumb)) {
      require_once('breadcrumbs.class.php');
      $Breadcrumb = new Breadcrumb();
    }

    if ($theme != "solstice" && $theme != "Nova" && $theme != "polarsys" ) {
      $theme = "solstice";
    }

    if($pageTitle == "") {
      $pageTitle = "eclipse.org page";
    }

    # page-specific RSS feed
    if($this->PageRSS != "") {
      if ($this->PageRSSTitle != "") {
        $this->PageRSSTitle = "Eclipse RSS Feed";
      }
      $this->ExtraHtmlHeaders .= '<link rel="alternate" title="' . $this->PageRSSTitle . '" href="' . $this->PageRSS . '" type="application/rss+xml"/>';
    }

    $extraHtmlHeaders = $this->ExtraHtmlHeaders;

    include($this->getHeaderPath($theme));

    if ($Menu != NULL)
    include($this->getMenuPath($theme));

    if ($Nav != NULL)
    include($this->getNavPath($theme));

    echo $html;

    $gaCode = $this->projectGoogleAnalyticsCode;
    if (!is_null($gaCode)) {
      $gaCode = ($gaCode == "") ? 'UA-910670-2' : $gaCode;
      #first lets insert the sitewide Analytics
      $this->googleJavaScript  = <<<EOHTML
      <script type="text/javascript">

        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', '$gaCode']);
        _gaq.push(['_trackPageview']);

        (function() {
          var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
          ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        })();

      </script>
EOHTML;

    }

    if ($theme != "solstice")  {
      echo $this->googleJavaScript;
    }

    $google_javascript = $this->googleJavaScript;
    include($this->getFooterPath($theme));
  }

  function AddExtraHtmlHeader( $string ) {
    $this->ExtraHtmlHeaders .= $string;
  }

  function AddExtraJSFooter( $string ) {
    $this->ExtraJSFooter.= $string;
  }

  function getThemeURL($_theme) {
  	if ($_theme != "solstice" || $_theme != "Nova" || $_theme != "polarsys" ) {
      $theme = "solstice";
    }

    return "/eclipse.org-common/themes/" . $_theme;

  }

  function getHTTPParameter($_param_name, $_method="") {
    /** @author droy
     * @since version - Oct 19, 2006
     * @param String _param_name name of the HTTP GET/POST parameter
     * @param String _method GET or POST, or the empty string for POST,GET order
     * @return String HTTP GET/POST parameter value, or the empty string
     *
     * Fetch the HTTP parameter
     *
     */

    $rValue = "";
    $_method = strtoupper($_method);

    # Always fetch the GET VALUE, override with POST unless a GET was specifically requested
    if(isset($_GET[$_param_name])) {
      $rValue = $_GET[$_param_name];
    }
    if(isset($_POST[$_param_name]) && $_method != "GET") {
      $rValue = $_POST[$_param_name];
    }
    return $rValue;
  }


  function getClientOS() {

        $UserAgent = $_SERVER['HTTP_USER_AGENT'];

        $regex_windows  = '/([^dar]win[dows]*)[\s]?([0-9a-z]*)[\w\s]?([a-z0-9.]*)/i';
        $regex_mac      = '/(68[k0]{1,3})|(mac os x)|(darwin)/i';
        $regex_os2      = '/os\/2|ibm-webexplorer/i';
        $regex_sunos    = '/(sun|i86)[os\s]*([0-9]*)/i';
        $regex_irix     = '/(irix)[\s]*([0-9]*)/i';
        $regex_hpux     = '/(hp-ux)[\s]*([0-9]*)/i';
        $regex_aix      = '/aix([0-9]*)/i';
        $regex_dec      = '/dec|osfl|alphaserver|ultrix|alphastation/i';
        $regex_vms      = '/vax|openvms/i';
        $regex_sco      = '/sco|unix_sv/i';
        $regex_linux    = '/x11|inux/i';
        $regex_bsd      = '/(free)?(bsd)/i';
        $regex_amiga    = '/amiga[os]?/i';
        $regex_ppc    = '/ppc/i';

        $regex_x86_64   = "/x86_64/i";

        // look for Windows Box
        if(preg_match_all($regex_windows,$UserAgent,$match))  {


      $v  = $match[2][count($match[0])-1];
            $v2 = $match[3][count($match[0])-1];

      // Establish NT 6.0 as Vista
      if(stristr($v,'NT') && $v2 == 6.0) $v = 'win32';

      // Establish NT 5.1 as Windows XP
      elseif(stristr($v,'NT') && $v2 == 5.1) $v = 'win32';

      // Establish NT 5.0 and Windows 2000 as win2k
            elseif($v == '2000') $v = '2k';
      elseif(stristr($v,'NT') && $v2 == 5.0) $v = 'win32';

      // Establish 9x 4.90 as Windows 98
            elseif(stristr($v,'9x') && $v2 == 4.9) $v = 'win32';
      // See if we're running windows 3.1
            elseif($v.$v2 == '16bit') $v = 'win16';
                // otherwise display as is (31,95,98,NT,ME,XP)
      else $v .= $v2;
      // update browser info container array
      if(empty($v)) $v = 'win32';
      return (strtolower($v));
    }

                //  look for amiga OS
                elseif(preg_match($regex_amiga,$UserAgent,$match))  {
                        if(stristr($UserAgent,'morphos')) {
                        // checking for MorphOS
                                return ('morphos');
                                }
                }
                        elseif(stristr($UserAgent,'mc680x0')) {
                        // checking for MC680x0
                        return ('mc680x0');
                        }
                        elseif(preg_match('/(AmigaOS [\.1-9]?)/i',$UserAgent,$match)) {
                              // checking for AmigaOS version string
                                return ($match[1]);
                        }
                // look for OS2
                elseif( preg_match($regex_os2,$UserAgent))  {
                        return ('os2');
                }
                // look for mac
                // sets: platform = mac ; os = 68k or ppc
                elseif( preg_match($regex_mac,$UserAgent,$match) )
                {
                    $os = !empty($match[1]) ? 'mac68k' : '';
                    $os = !empty($match[2]) ? 'macosx' : $os;
                    $os = !empty($match[3]) ? 'macppc' : $os;
                    $os = !empty($match[4]) ? 'macosx' : $os;
                    return ('macosx');
                }
                //  look for *nix boxes
                //  sunos sets: platform = *nix ; os = sun|sun4|sun5|suni86
                elseif(preg_match($regex_sunos,$UserAgent,$match))
                {
                    if(!stristr('sun',$match[1])) $match[1] = 'sun'.$match[1];
                    return ('solaris');
                }
                //  irix sets: platform = *nix ; os = irix|irix5|irix6|...
                elseif(preg_match($regex_irix,$UserAgent,$match))
                {
                    return ($match[1].$match[2]);
                }
                //  hp-ux sets: platform = *nix ; os = hpux9|hpux10|...
                elseif(preg_match($regex_hpux,$UserAgent,$match))
                {
                    $match[1] = str_replace('-','',$match[1]);
                    $match[2] = (int) $match[2];
                    return ('hpux');
                }
                //  aix sets: platform = *nix ; os = aix|aix1|aix2|aix3|...
                elseif(preg_match($regex_aix,$UserAgent,$match))
                {
                    return ('aix');
                }
                //  dec sets: platform = *nix ; os = dec
                elseif(preg_match($regex_dec,$UserAgent,$match))
                {
                    return ('dec');
                }
                //  vms sets: platform = *nix ; os = vms
                elseif(preg_match($regex_vms,$UserAgent,$match))
                {
                    return ('vms');
                }
                //  dec sets: platform = *nix ; os = dec
                elseif(preg_match($regex_dec,$UserAgent,$match))
                {
                    return ('dec');
                }
                //  vms sets: platform = *nix ; os = vms
                elseif(preg_match($regex_vms,$UserAgent,$match))
                {
                    return ('vms');
                }
                //  sco sets: platform = *nix ; os = sco
                elseif(preg_match($regex_sco,$UserAgent,$match))
                {
                    return ('sco');
                }
                //  unixware sets: platform = *nix ; os = unixware
                elseif(stristr($UserAgent,'unix_system_v'))
               {
                    return ('unixware');
                }
                //  mpras sets: platform = *nix ; os = mpras
                elseif(stristr($UserAgent,'ncr'))
                {
                    return ('mpras');
                }
                //  reliant sets: platform = *nix ; os = reliant
                elseif(stristr($UserAgent,'reliantunix'))
                {
                    return ('reliant');
                }
                //  sinix sets: platform = *nix ; os = sinix
                elseif(stristr($UserAgent,'sinix'))
                {
                    return ('sinix');
                }
                //  bsd sets: platform = *nix ; os = bsd|freebsd
                elseif(preg_match($regex_bsd,$UserAgent,$match))
                {
                    return ($match[1].$match[2]);
                }
                //  last one to look for
                //  linux sets: platform = *nix ; os = linux
                elseif(preg_match($regex_linux,$UserAgent,$match))
                {

                        if(preg_match($regex_x86_64,$UserAgent,$match)) {
                                return "linux-x64";
                        }
                        elseif(preg_match($regex_ppc,$UserAgent,$match)) {
                                return "linux-ppc";
                        }
                        else {
                                return ('linux');
                        }
                }
        }



        function isValidTheme($_theme) {
    /* @return: bool
     *
     * returns true if supplied theme is in the array of valid themes
     *
     * 2005-12-07: droy
     *
     */
          return array_search($_theme, $this->THEME_LIST);
        }


        function getUserPreferedTheme() {
    /* @return: String
     *
     * returns theme name in a browser cookie, or the Empty String
     *
     * 2005-12-07: droy
     *
     */
          if(isset($_COOKIE["theme"])) {
        $theme = $_COOKIE["theme"];

        if($this->isValidTheme($theme)) {
          return $theme;
        }
        else {
          return "";
        }
          }
        }

        /**
         * @param layout string Button layout (standard, condensed)
         * @param showfaces bool
         * @author droy
         * @since 2011-05-18
         * @return: HTML string for facebook like
         * Generate HTML string for facebook like button
         */
        function getFacebookLikeButtonHTML($_layout="standard", $_showfaces=false) {

          $width   = 450;
          $height  =  22;

          if($_layout == "condensed") {
            $width = 90;
            $_layout = "button_count";
          }
          else {
            $_layout = "standard";
          }

          if($_showfaces) {
            $height = 82;
          }
          $str = "<iframe src='//www.facebook.com/plugins/like.php?href=" . $this->getCurrentURL() . "&layout=" . $_layout . "&" . ($_showfaces ? "show_faces=true" : "") . "&width=$width&action=like' style='border: medium none; overflow: hidden; width: " . $width . "px; height: " . $height . "px;' frameborder='0' scrolling='no'></iframe>";
          return $str;
        }
        /**
         * @author droy
         * @since 2011-05-18
         * @return URL of the current PHP page
         * Construct and return URL of the current script
         */
        function getCurrentURL() {
          return "http" . ((empty($_SERVER['HTTPS']) && $_SERVER['SERVER_PORT']!=443) ? "" : "s") . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        }

        function usePolls() {
          require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/polls/poll.php");
        }
        function useJSON() {
          require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/json/JSON.php");
        }

        /**
         * Returns a new REST client
         * @return RestClient
         * @since 2015-06-24
         * @author droy
         */
        function RESTClient() {
          require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/rest/restclient.class.php");
          return new RestClient();
        }

        function useProjectInfo() {
          require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/projects/projectInfoList.class.php");
        }
        /*
         * This function applies standard formatting to a date.
         *
         * The first parameter is either a string or a number representing a date.
         * If it's a string, it must be in a format that is parseable by the
         * strtotime() function. If it is a number, it must be an integer representing
         * a UNIX timestamp (number of seconds since January 1 1970 00:00:00 GMT)
         * which, conveniently, is the output of the strtotime() function.
         *
         * The second (optional) parameter is the format for the result. This must
         * one of 'short', or 'long'.
         */
        function getFormattedDate($date, $format = 'long') {
          if (is_string($date)) $date = strtotime($date);
          switch ($format) {
            case 'long' : return date("F j, Y", $date);
            case 'short' : return date("d M y", $date);
          }
        }

        /*
         * This function applies standard formatting to a date range.
         *
         * See the comments for getFormattedDate($date, $format) for information
         * concerning what's expected in the parameters of this method).
         */
        function getFormattedDateRange($start_date, $end_date, $format) {
          if (is_string($start_date)) $start_date = strtotime($start_date);
          if (is_string($end_date)) $end_date = strtotime($end_date);
          switch ($format) {
            case 'long' :
              if ($this->same_year($start_date, $end_date)) {
            if ($this->same_month($start_date, $end_date)) {
              return date("F", $start_date)
                . date(" d", $start_date)
                . date("-d, Y", $end_date);
            } else {
              return date("F d", $start_date)
                . date("-F d, Y", $end_date);
            }
          } else {
            return date("F d, Y", $start_date)
              . date("-F d, Y", $end_date);
          }
            case 'short' :
              if ($this->same_year($start_date, $end_date)) {
            if ($this->same_month($start_date, $end_date)) {
              return date("d", $start_date)
                . date ("-d", $end_date)
                . date(" M", $start_date)
                . date(" y", $end_date);
            } else {
              return date("d M", $start_date)
                . date("-d M y", $end_date);
            }
          } else {
            return date("d M y", $start_date)
              . date("-d M y", $end_date);
          }
          }
        }

        /*
         * This method answers true if the two provided values represent
         * dates that occur in the same year.
         */
    function same_year($a, $b) {
      return date("Y", $a) == date("Y", $b);
    }

        /*
         * This method answers true if the two provided values represent
         * dates that occur in the same month.
         */
    function same_month($a, $b) {
      return date("F", $a) == date("F", $b);
    }

    /**
     * Returns a string representing the size of a file in the downloads area
     * @author droy
     * @since Jun 7, 2007
     * @param string file File name relative to http://download.eclipse.org (the &file= parameter used)
     * @return string Returns a string in the format of XX MB
     */
    function getDownloadFileSizeString($_file) {
      $fileSize = "N/A";
      $filesizebytes  = filesize($this->getDownloadBasePath() . $_file);
      if($filesizebytes > 0) {
        $fileSize = floor($filesizebytes / 1048576) . " MB";
      }
      return $fileSize;
    }

    /**
     * useSession(String) - use auth sessions
     * @author droy
     * @since Jun 7, 2007
     * @param string 'optional' or 'required'
     * @return Session object
     */
    function useSession($required="") {
      require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/session.class.php");
          $ssn = new Session();  # constructor calls validate
          if ($ssn->getGID() == "" && $required == "required") {
            $ssn->redirectToLogin();
      }
          return $ssn;
    }

    function isValidCaller($_pathArray) {
      $a = debug_backtrace();
      $caller = $a[1]['file'];  # Caller 0 is the class that called App();
      $validCaller = false;
      for($i = 0; $i < count($_pathArray); $i++) {
        # TODO: use regexp's to match the leftmost portion for better security
        if(strstr($caller, $_pathArray[$i])) {
          $validCaller = true;
          break;
        }
      }
      return $validCaller;
    }

    function sqlSanitize($_value, $_dbh=NULL) {
     /**
     * Sanitize incoming value to prevent SQL injections
     * @param string value to sanitize
     * @param dbh database resource to use
     * @return string santized string
     */
      if ($_dbh==NULL) {
        $_dbh = $this->database( "eclipse", "" );
      }
      $_value = mysql_real_escape_string($_value, $_dbh);
          return $_value;
    }
  function getOGTitle(){
    return '<meta property="og:title" content="' . $this->OGTitle . '" />' . PHP_EOL;
  }

  function setOGTitle($title){
    $this->OGTitle = $title;
  }

  function getOGDescription(){
    return '<meta property="og:description" content="' . $this->OGDescription . '" />' . PHP_EOL;
  }

  function setOGDescription($description){
    $this->OGDescription = $description;
  }

  function getOGImage(){
    return '<meta property="og:image" content="' . $this->OGImage . '" />' . PHP_EOL;
  }

  function setOGImage($image){
    $this->OGImage = $image;
  }

  function setDoctype($doctype) {
    $accepted = array('html5', 'xhtml');
    if (in_array($doctype, $accepted)) {
      $this->doctype = $doctype;
    }
    return;
  }

  function getDoctype() {
    $doc = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">';
    switch ($this->doctype) {
      case 'html5':
        $doc = '<!DOCTYPE html>
<html>';
        break;
    }
    return $doc;
  }

  /**
   * Get theme Variables
   *
   * Fetch solstice custom variables
   *
   * @return array
   */
  public function getThemeVariables() {
    $v = $this->theme_variables;
    // Set default variables for all themes.
    if (empty($v)) {
      $v['body_classes'] = '';
      $v['breadcrumbs_html'] = "";
      $v['hide_breadcrumbs'] = FALSE;
      $v['leftnav_html'] = '';
      $v['main_container_classes'] = 'container';
      $v['main_container_html'] = '';
      $v['header_nav'] = array();
      $v['btn_cfa'] = array();
      $this->theme_variables = $v;
    }

    return $this->theme_variables;
  }

  /**
   * Set theme Variables
   *
   * This function allow pages to pass extra
   * parameters to the solstice theme.
   */
  public function setThemeVariables($variables) {
    $current_variables = $this->getThemeVariables();
    if (is_array($variables)) {
      $this->theme_variables = array_merge($current_variables, $variables);
    }
  }

  /**
   * Function to validate a date
   * @param string $date
   * @return boolean
   */
  private function validateDateFormat($date) {
    if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $d)) {
      //date validation
      if (checkdate($d[2],$d[3],$d[1])) {
        return TRUE;
      }
    }
    return FALSE;
  }

  /**
   * Function to set the OutDated flag
   * @param string $when.
   *   Accepted formats 'YYYY-MM-DD' or 'now'.
   *
   * @return boolean
   */
  function setOutDated($when = 'now', $msg = "") {
    if (is_string($msg)) {
      $this->OutDatedMsg = $msg;
    }

    if (strtolower($when) == 'now' || ($this->validateDateFormat($when) && time() >= strtotime($when))) {
      $this->OutDated = TRUE;
      return TRUE;
    }
    return FALSE;
  }

  /**
   * Return value of the private property OutDatedMsg.
   */
  function getOutDatedMessage() {
    if (empty($this->OutDatedMsg)) {
      $this->OutDatedMsg = "This page is deprecated and may contain some information that is no longer relevant or accurate.";
    }
    return $this->OutDatedMsg;
  }

  /**
   * Return value of the private property OutDated.
   */
  function getOutDated() {
    return $this->OutDated;
  }

  /**
   * Function to set the version of jQuery
   * @param string $version
   *
   * @return boolean
   */
  function setjQueryVersion($version = FALSE){
    //Only set jQueryVersion if we have a copy on eclipse.org
    $supported = array('1.4.4', '1.5.1', '1.5.2', '1.7.2', '1.9.1', '2.0.0');
    if(in_array($version, $supported)){
      $this->jQueryVersion = $version;
      return TRUE;
    }
    return FALSE;
  }

  /**
   * Return markup needed to load jQuery
   * @return string|boolean
   */
  function getjQuery(){
    if($this->jQueryVersion){
      $strn = <<<EOHTML
  <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/$this->jQueryVersion/jquery.min.js"></script>
  <script type="text/javascript">
  /* <![CDATA[ */
  window.jQuery || document.write('<script src="/eclipse.org-common/lib/jquery/jquery-$this->jQueryVersion.min.js"><\/script>')
  /* ]]> */
  </script>
EOHTML;
      return $strn;
    }
    return FALSE;
  }

  /**
   * Return The Eclipse Foundation Twitter and Facebook badge
   * @return string
   */
  function getSocialBadge(){
    $protocol = $this->getHTTPPrefix();
    $strn = <<<EOHTML
    <script type="text/javascript">
    /* <![CDATA[ */
    document.write('<div id=\"badge_facebook\"><iframe src=\"$protocol:\/\/www.facebook.com\/plugins\/like.php?href=http:\/\/www.facebook.com\/pages\/Eclipse\/259655700571&amp;layout=button_count&amp;show_faces=false&amp;width=90&amp;action=like\" frameborder=\"0\" scrolling=\"no\"><\/iframe><\/div><div id=\"badge_twitter\"><a href=\"https:\/\/twitter.com\/EclipseFdn\" class=\"twitter-follow-button\" data-show-count=\"false\">Follow @EclipseFdn<\/a><script type=\"text\/javascript\">!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"\/\/platform.twitter.com\/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");<\/script><\/div>');
    /* ]]> */
    </script>
EOHTML;
    return $strn;
  }

  function getTwitterFollowWidget($_twitterhandle)
  {
    $output = '';
    $output = '<a href="https://twitter.com/'. $_twitterhandle .'" class="twitter-follow-button" data-show-count="false">Follow @' .$_twitterhandle . '</a>';
    // Only include the script once per page
    if ($this->twitterScriptInserted == FALSE) {
      $this->twitterScriptInserted = TRUE;
      $output .= "<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>";
    }
    return $output;

  }

  function getGoogleSearchHTML() {
    $strn = <<<EOHTML
    <form action="//www.google.com/cse" id="searchbox_017941334893793413703:sqfrdtd112s">
     <input type="hidden" name="cx" value="017941334893793413703:sqfrdtd112s" />
      <input type="text" name="q" size="25" />
      <input type="submit" name="sa" value="Search" />
    </form>
    <script type="text/javascript" src="//www.google.com/coop/cse/brand?form=searchbox_017941334893793413703%3Asqfrdtd112s&lang=en"></script>
EOHTML;
    return $strn;
  }

  /**
   * Set Google Analytics Tracking code
   *
   * @param string OR Null $gaUniqueID
   *
   * Setting $gaUniqueID to NULL will remove Google Analytics
   * from the page.
   */
  function setGoogleAnalyticsTrackingCode($gaUniqueID) {
    $this->projectGoogleAnalyticsCode = $gaUniqueID;
  }

  function setPromotionPath($_path) {
    $this->CustomPromotionPath = $_SERVER['DOCUMENT_ROOT'] . $_path;
  }

  /**
   * Use reCAPTCHA service
   *
   * @param bool $ssl
   *
   * @return Captcha
   */
  public function useCaptcha($ssl = true) {
    include_once($_SERVER['DOCUMENT_ROOT'] . '/eclipse.org-common/classes/captcha/captcha.class.php');
    return new Captcha($ssl);
  }

  # Record a database record
  public function setDatabase( $key, $host, $user, $pwd, $db ) {
    $rec = array() ;
    $rec['HOST'] = $host;
    $rec['USERNAME'] = $user;
    $rec['PASSWORD'] = $pwd;
    $rec['DATABASE'] = $db;
    $rec['CONNECTION'] = null;
    $this->databases[$key] = $rec;
    }

    # Setup the handling of database connections.  On production systems, reference the database connection
    # classes, but on development systems, use the standardized local database distribution.
  private function configureDatabases() {
    #-----------------------------------------------------------------------------------------------------
    # Dev Mode Databases
    $this->setDatabase( "myfoundation", "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
    $this->setDatabase( "foundation",   "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
    $this->setDatabase( "eclipse",      "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
    $this->setDatabase( "bugzilla",     "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
    $this->setDatabase( "downloads",  "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
    $this->setDatabase( "polls",     "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
    $this->setDatabase( "projectinfo",  "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
    $this->setDatabase( "packaging",   "localhost", "dashboard", "draobhsad", "packaging_demo" );
    $this->setDatabase( "infra",     "localhost", "dashboard", "draobhsad", "infra_demo" );
    $this->setDatabase( "ipzilla",     "localhost", "dashboard", "draobhsad", "ipzilla_demo" );
    $this->setDatabase( "ipzillatest",  "localhost", "dashboard", "draobhsad", "ipzilla_demo" );
    $this->setDatabase( "live",      "localhost", "dashboard", "draobhsad", "live_demo" );
    $this->setDatabase( "epic",     "localhost", "dashboard", "draobhsad", "epic_demo" );
    $this->setDatabase( "conferences",  "localhost", "dashboard", "draobhsad", "conferences_demo" );
    $this->setDatabase( "marketplace",   "localhost", "dashboard", "draobhsad", "marketplace_demo" );
    #-----------------------------------------------------------------------------------------------------

    #-----------------------------------------------------------------------------------------------------
    # Production Databases
    $this->set("bugzilla_db_classfile_ro",  'dbconnection_bugs_ro.class.php');
    $this->set("bugzilla_db_class_ro",    'DBConnectionBugs');
    $this->set("bugzilla_db_classfile",     'dbconnection_bugs_rw.class.php');
    $this->set("bugzilla_db_class",       'DBConnectionBugsRW');
    $this->set("dashboard_db_classfile",  'dbconnection_dashboard_rw.class.php');
    $this->set("dashboard_db_class",     'DBConnectionDashboard');
    $this->set("downloads_db_classfile_ro",  'dbconnection_downloads_ro.class.php');
    $this->set("downloads_db_class_ro",     'DBConnectionDownloads');
    $this->set("epic_db_classfile_ro",     'dbconnection_epic_ro.class.php');
    $this->set("epic_db_class_ro",        'DBConnectionEPIC');
    $this->set("packaging_db_classfile_ro",  'dbconnection_packaging_ro.class.php');
    $this->set("packaging_db_class_ro",    'DBConnectionPackaging');
    $this->set("foundation_db_classfile",  'dbconnection_workaround.class.php');
    $this->set("foundation_db_class",     'FoundationDBConnectionRW');
    $this->set("foundation_db_classfile_ro",'dbconnection_foundation_ro.class.php');
    $this->set("foundation_db_class_ro",   'DBConnectionFoundation');
    $this->set("gerrit_db_classfile_ro",  'dbconnection_gerrit_ro.class.php');
    $this->set("gerrit_db_class_ro",    'DBConnectionGerrit');
    $this->set("infra_db_classfile",     'dbconnection_infra_ro.class.php');
    $this->set("infra_db_class",        'DBConnectionInfraRO');
    $this->set("ipzilla_db_classfile_ro",  'dbconnection_ipzilla_ro.class.php');
    $this->set("ipzilla_db_class_ro",     'DBConnectionIPZillaRO');
    $this->set("ipzilla_db_classfile",     'dbconnection_ipzilla_rw.class.php');
    $this->set("ipzilla_db_class",        'DBConnectionIPZillaRW');
    $this->set("ipzillatest_db_classfile",  'dbconnection_ipzillatest_rw.class.php');
    $this->set("ipzillatest_db_class",     'DBConnectionIPZillaRW');
    $this->set("live_db_classfile",        'dbconnection_live_rw.class.php');
    $this->set("live_db_class",          'DBConnectionLIVE');
    $this->set("polls_db_classfile",     'dbconnection_polls_rw.class.php');
    $this->set("polls_db_class",       'DBConnectionPollsRW');
    $this->set("myfoundation_db_classfile",  'dbconnection_portal_rw.class.php');
    $this->set("myfoundation_db_class",     'DBConnectionPortalRW');
    $this->set("projectinfo_db_classfile_ro",'dbconnection_projectinfo_ro.class.php');
    $this->set("projectinfo_db_class_ro",   'DBConnectionProjectInfo');
    $this->set("eclipse_db_classfile",     'dbconnection_rw.class.php');
    $this->set("eclipse_db_class",       'DBConnectionRW');
    $this->set("eclipse_db_classfile_ro",  'dbconnection.class.php');
    $this->set("eclipse_db_class_ro",     'DBConnection');
    $this->set("conferences_db_classfile",  'dbconnection.conferences_rw.class.php');
    $this->set("conferences_db_class",      'DBConnectionConferencesRW');
    $this->set("marketplace_db_classfile_ro",     'dbconnection_marketplace_ro.class.php');
    $this->set("marketplace_db_class_ro",      'DBConnectionMarket');
    #-----------------------------------------------------------------------------------------------------
  }

  # Open a database and store the record
  public function database( $key, $query ) {
    $rec = $this->databases[$key];
    $dbh = null;
    if($this->devmode) {   # For DEV machines
        $dbh = $rec['CONNECTION'];
        if( $dbh == null ) {
          $dbh = mysql_connect( $rec['HOST'], $rec['USERNAME'], $rec['PASSWORD']);
           mysql_select_db($rec['DATABASE'], $dbh);
        }
        if(get_magic_quotes_gpc())
        {
          trigger_error("magic_quotes_gpc is currently set to ON in your php.ini. This is highly DISCOURAGED.  Please change your setting or comment out this line.");
        }
    } else {         # For PRODUCTION machines
      $class = null;
      if( (strtoupper(substr(trim($query), 0, 6)) == 'SELECT' && strtoupper(substr(trim($query), 0, 23)) != "SELECT /* USE MASTER */")
        || $query == "") {  // Try to use read-only when possible. Blank queries occur when we call sqlSanitize.

        $classfile = $this->get($key . '_db_classfile_ro');
        $class = $this->get($key . '_db_class_ro');
      }

      if($class == null) {
        $classfile = $this->get($key . '_db_classfile');
        $class = $this->get($key . '_db_class');
      }

      require_once($this->DB_CLASS_PATH . $classfile);
      $dbc = new $class();
      $dbh = $dbc->connect();
    }
    $this->databases[$key]['CONNECTION'] = $dbh;
    $this->set('DBHANDLEMAP ' . $dbh, $key);
    return $dbh;
  }

  # Return a record for a database by name
  public function databaseName( $key ) {
    $rec = $this->databases[$key];
    return $rec['DATABASE'];
  }

  # Return the name of a database by database handle
  public function databaseNameForHandle($dbh) {
    return $this->get('DBHANDLEMAP ' . $dbh);
  }

  # Storage functions for arbitraray hash
  public function get( $key ) {
    if(isset($this->hash[$key])) {
      return $this->hash[$key];
    }
  }

  # Storage functions for arbitraray hash
  public function set( $key, $value ) {
    $this->hash[$key] = $value;
  }

  # Storage functions for arbitraray hash
  public function ifEmptyThenSet( $key, $value ) {
    if( !isset($this->hash[$key])) {
      $this->hash[$key] = $value;
    }
  }

  # Display a backtrace of all the SQL queries run in this session.  Only available when devmode == true or logsql == true.
  function SQLBacktrace () {
    if(($this->devmode && (count($this->query_btrace) > 0)) || $this->logsql){
        $row = 1;
        echo "<p><table cellpadding=10 width=800 bgcolor=#ffcccc><tr><td>";
        echo "<p><font size=\"+2\">Query Trace: </font> In ascending order from oldest to newest";
        echo "<div style=\"font-family: courier;\">";
        foreach ($this->query_btrace as $query) {
          echo "&nbsp;&nbsp;&nbsp;&nbsp;<b>$row.) " .
            $query{0} ." (" . $query{2} . ")rows:</b> " . $query{1} . "<br>\n";
          $row++;
        }
        echo "</div>";
        echo "</p>\n";
        echo "</table></p>\n";
      }
  }

  # Check if a MySQL error occurred and display it.  If $this->devmode then an
  # SQL backtrace is shown as well.
  function mysqlErrorCheck () {
    $error = mysql_error();
    if ($error) {
      echo "<p><table cellpadding=10 width=400 bgcolor=#ffcccc><tr><td><font size=+2>SQL Trouble: </font>";
      echo "<font color=red>";
      echo htmlspecialchars ($error);
      echo "</font>\n";
      if($this->devmode || $this->logsql) {
        $backtrace = debug_backtrace();
        $file = $backtrace[2]['file'];
        $line = $backtrace[2]['line'];
        $function = $backtrace[2]['function'];
        echo "<br/>file: $file<br/>line: $line<br/>function: $function<br/>";
      }
    echo "</table></p>\n";
    if($this->devmode || $this->logsql) {
      $this->SQLBacktrace();
    }
    exit();
    }
  }

  # All in one query function
  function sql ($statement, $dbname, $logstring = null) {
    $dbh = $this->database( $dbname, $statement );

    $result = mysql_query($statement, $dbh);
    $rowcount = 0;

    # Only keep information in devmode so we don't waste RAM
    if($this->devmode || $this->logsql) {
      # Report on the number of rows affected by the query
      if(($result !== TRUE) && ($result !== FALSE)) {
        $rowcount = mysql_num_rows($result);
      } else {
        $rowcount = mysql_affected_rows($dbh);
      }

      if($logstring) {
        # This is used when inserting binary blobs so that the blob does not appear in the log
        $this->query_btrace[] = array($this->databaseNameForHandle($dbh), $logstring, $rowcount);
      } else {
        $this->query_btrace[] = array($this->databaseNameForHandle($dbh), $statement, $rowcount);
      }
    }

    $this->mysqlErrorCheck();
    return $result;
  }

  # These don't match the naming convention in $App but are used in the portal and submissions systems like this
  # so we'll leave them alone for consistency.
  function bugzilla_sql ($statement)   { return $this->sql ($statement, "bugzilla"); }     // Bugzilla
  function conference_sql ($statement){ return $this->sql ($statement, "conferences"); }    // Conferences
  function dashboard_sql ($statement) { return $this->sql ($statement, "dashboard"); }    // Dash
  function downloads_sql ($statement) { return $this->sql ($statement, "downloads"); }    // Downloads
  function eclipse_sql ($statement)   { return $this->sql ($statement, "eclipse"); }      // Whole Eclipse database
  function epic_sql ($statement)     { return $this->sql ($statement, "epic"); }        // EPIC (read-only!)
  function foundation_sql($statement) { return $this->sql ($statement, "foundation"); }    // Foundation internal database
  function gerrit_sql($statement)   { return $this->sql ($statement, "gerrit"); }      // Gerrit
  function ipzilla_sql ($statement)   { return $this->sql ($statement, "ipzilla"); }      // IPZilla
  function infra_sql ($statement)   { return $this->sql ($statement, "infra"); }      // Infra
  function ipzillatest_sql ($statement) { return $this->sql ($statement, "ipzillatest"); }  // IPZilla test database
  function live_sql ($statement)     { return $this->sql ($statement, "live"); }        // Eclipse Live (read-only!)
  function polls_sql ($statement)   { return $this->sql ($statement, "polls"); }      // Polls
  function portal_sql  ($statement)   { return $this->sql ($statement, "myfoundation"); }    // MyFoundation Portal
  function projectinfo_sql ($statement) { return $this->sql ($statement, "projectinfo"); }  // ProjectInfo tables only (read-only!)
  function packaging_sql ($statement)  { return $this->sql ($statement, "packaging"); }     // Packaging Database
  function marketplace_sql ($statement) { return $this->sql ($statement, "marketplace"); }   // Marketplace (read-only)
}
