<?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 {

  /**
   * Version of App()
   *
   * @var string
   */
  private $APPVERSION = "1.0";

  /**
   * Name of App()
   *
   * @var string
   */
  private $APPNAME = "Eclipse.org";

  /**
   * Base path of eclipse.org-common
   *
   * @var string
   */
  private $eclipse_org_common_base_path = "";

  /**
   * Default row height
   *
   * @var int
   */
  private $DEFAULT_ROW_HEIGHT = 20;

  /**
   * Max post size
   *
   * @var int
   */
  private $POST_MAX_SIZE = 262144;

  /**
   * Our download URL
   *
   * @var string
   */
  private $OUR_DOWNLOAD_URL = "http://download1.eclipse.org";

  /**
   * Public download URL
   *
   * @var string
   */
  private $PUB_DOWNLOAD_URL = "http://download.eclipse.org";

  /**
   * Download base path
   *
   * @var string
   */
  private $DOWNLOAD_BASE_PATH = "/home/data2/httpd/download.eclipse.org";

  /**
   * Database class path
   * ends with '/'
   *
   * @var unknown
   */
  private $DB_CLASS_PATH = "/home/data/httpd/eclipse-php-classes/system/";

  /**
   * Current domain url
   *
   * @var string
   */
  private $WWW_PREFIX = ""; // default is relative

  /**
   * Http prefix
   *
   * @var string
   */
  private $HTTP_PREFIX = "http"; // default is http

  /**
   * String to include in <head>
   *
   * @var string
   */
  public $ExtraHtmlHeaders = "";

  /**
   * JS to include in footer
   *
   * @var string
   */
  public $ExtraJSFooter = "";

  /**
   * Page RSS feed Url
   *
   * @var string
   */
  public $PageRSS = "";

  /**
   * Page RSS feed TITLE
   *
   * @var string
   */
  public $PageRSSTitle = "";

  /**
   * Promotion flag
   *
   * @var bool
   */
  public $Promotion = FALSE;

  /**
   * Custom Promotion Path
   *
   * @var string
   */
  public $CustomPromotionPath = "";

  /**
   * Valid eclipse.org-common themes
   *
   * @var array
   */
  private $valid_themes = array(
    "Nova",
    "solstice",
    "polarsys",
    "locationtech",
    "Nova"
  );

  /**
   * Open Graph Protocol title
   *
   * @var string
   */
  private $OGTitle = "";

  /**
   * Open Graph Protocol description
   *
   * @var string
   */
  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.";

  /**
   * Open Graph Protocol image
   *
   * @var string
   */
  private $OGImage = "https://www.eclipse.org/eclipse.org-common/themes/solstice/public/images/logo/eclipse-200x200.png";

  /**
   * Open Graph Protocol image width
   *
   * @var string
   */
  private $OGImageWidth = "200";

  /**
   * Open Graph Protocol image height
   *
   * @var string
   */
  private $OGImageHeight = "200";

  /**
   * Doctype
   *
   * @var string
   */
  private $doctype = '';

  /**
   * Google analytics id code
   *
   * @var string
   */
  private $projectGoogleAnalyticsCode = "";

  /**
   * Jquery Version
   *
   * @var string
   */
  private $jQueryVersion = FALSE;

  /**
   * Twitter script flag
   *
   * @var bool
   */
  private $twitterScriptInserted = FALSE;

  /**
   * Variables to customize solstice
   *
   * @var unknown
   */
  private $theme_variables = array();

  /**
   * Disable all database operations
   *
   * @var unknown
   */
  private $DB_READ_ONLY = FALSE;

  /**
   * Database config and handle cache
   *
   * @var unknown
   */
  private $databases;

  /**
   * "Deprecated" flag
   *
   * @var bool
   */
  private $OutDated = FALSE;

  /**
   * "Deprecated" message
   *
   * @var string
   */
  private $OutDatedMsg = "";

  /**
   * Development mode flag
   *
   * Flag to determine whether this is development mode or not (for databases)
   *
   * @var bool
   */
  public $devmode = FALSE;

  /**
   * Flag to log SQL even on production systems
   *
   * @var bool
   */
  public $logsql = FALSE;

  /**
   * Arbitrary storage hash
   *
   * @var unknown
   */
  private $hash;

  /**
   * SQL Backtrace storage
   *
   * @var unknown
   */
  public $query_btrace = array();

  /**
   * Messages variable
   */
  private $Messages = NULL;

  // Default constructor
  function App() {

    $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($this->getBasePath() . '/system/app-config.php')) {
          include_once ($this->getBasePath() . '/system/app-config.php');
          app_config($this);
        }
    }

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

  /**
   * Returns the Webmaster object
   *
   * @return object
   */
  public function getWebmaster($action = '') {
    switch ($action) {
      case "webmaster":
        require_once ($this->getBasePath() . "/classes/webmaster/webmaster.class.php");
        return new Webmaster($this);
        break;
      case "mirrors":
        require_once ($this->getBasePath() . "/classes/webmaster/mirrors.class.php");
        return new Mirrors($this);
        break;
      case "jobs":
        require_once ($this->getBasePath() . "/classes/webmaster/jobs.class.php");
        return new Jobs($this);
        break;
      case "committers":
        require_once ($this->getBasePath() . "/classes/webmaster/committers.class.php");
        return new Committers($this);
        break;
      case "firewall":
        require_once ($this->getBasePath() . "/classes/webmaster/firewall.class.php");
        return new Firewall($this);
        break;
      case "mailinglists":
        require_once ($this->getBasePath() . "/classes/webmaster/mailinglists.class.php");
        return new MailingLists($this);
        break;
    }
  }

  /**
   * Returns the Subscriptions object
   *
   * @return object
   */
  public function getSubscriptions() {
    require_once ($this->getBasePath() . "/classes/subscriptions/subscriptions.class.php");
    return new Subscriptions($this);
  }

  /**
   * Returns the CLA object
   *
   * @return object
   */
  public function getCla() {
    require_once ($this->getBasePath() . "/classes/users/cla.class.php");
    return new Cla($this);
  }

  /**
   * This function sets System Messages
   *
   * @param $name string
   *        containing the name of the message
   * @param $msg string
   *        containing the message itself
   * @param $type string
   *        containing the type of the message
   *
   */
  public function setSystemMessage($name, $msg, $type) {
    if (get_class($this->Messages) !== 'Messages') {
      require_once ($this->getBasePath() . "/system/messages.class.php");
      $this->Messages = new Messages();
    }
    $this->Messages->setMessages($name, $msg, $type);
  }

  /**
   * Return system messages
   *
   * @return array
   */
  public function getSystemMessage() {
    if (get_class($this->Messages) !== 'Messages') {
      require_once ($this->getBasePath() . "/system/messages.class.php");
      $this->Messages = new Messages();
    }
    return $this->Messages->getMessages();
  }

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

  /**
   * Get eclipse.org-common base path
   *
   * Use this function for includes/requires.
   */
  public function getBasePath() {
    if (empty($this->eclipse_org_common_base_path)) {
      $this->eclipse_org_common_base_path = realpath(dirname(__FILE__) . '/../');
    }

    return $this->eclipse_org_common_base_path;
  }

  /**
   * Get header path
   *
   * @param string $_theme
   * @return string
   */
  function getHeaderPath($_theme) {
    return $this->getBasePath() . "/themes/" . $_theme . "/header.php";
  }

  /**
   * Get menu path
   *
   * @param string $_theme
   *
   * @return string
   */
  function getMenuPath($_theme) {
    return $this->getBasePath() . "/themes/" . $_theme . "/menu.php";
  }

  /**
   * Get template nav path
   *
   * @param string $_theme
   *
   * @return string
   */
  function getNavPath($_theme) {
    return $this->getBasePath() . "/themes/" . $_theme . "/nav.php";
  }

  /**
   * Get template footer path
   *
   * @param string $_theme
   * @return string
   */
  function getFooterPath($_theme) {
    return $this->getBasePath() . "/themes/" . $_theme . "/footer.php";
  }

  /**
   * Get Eclipse promo path
   *
   * @param string $_theme
   * @return string
   */
  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(){
    if (!class_exists('EclipseEnv')) {
      require_once('eclipseenv.class.php');
    }
    $EclipseEnv = new EclipseEnv($this);
    return $EclipseEnv->getEclipseEnv();
  }

  /**
   * Get $APPNAME
   *
   * @return string
   */
  function getAppName() {
    return $this->APPNAME;
  }

  /**
   * Get $POST_MAX_SIZE
   *
   * @return number
   */
  function getPostMaxSize() {
    return $this->POST_MAX_SIZE;
  }

  /**
   * Get $DB_READ_ONLY
   *
   * @return boolean
   */
  function getDBReadOnly() {
    return $this->DB_READ_ONLY;
  }

  /**
   * Set XML header
   *
   * @return string
   */
  function sendXMLHeader() {
    header("Content-type: text/xml");
  }

  /**
   * Get $DEFAULT_ROW_HEIGHT
   *
   * @return number
   */
  function getDefaultRowHeight() {
    return $this->DEFAULT_ROW_HEIGHT;
  }

  /**
   * Get $OUR_DOWNLOAD_URL
   *
   * @return string
   */
  function getOurDownloadServerUrl() {
    return $this->OUR_DOWNLOAD_URL;
  }

  /**
   * Get $DOWNLOAD_BASE_PATH
   *
   * @return string
   */
  function getDownloadBasePath() {
    return $this->DOWNLOAD_BASE_PATH;
  }

  /**
   * Get $PUB_DOWNLOAD_URL
   *
   * @return string
   */
  function getPubDownloadServerUrl() {
    return $this->PUB_DOWNLOAD_URL;
  }

  /**
   * Get $WWW_PREFIX
   *
   * @return string|unknown
   */
  function getWWWPrefix() {
    // Set value for WWW_PREFIX
    if (empty($this->WWW_PREFIX)) {
      $valid_domains = array(
        'www.eclipse.org',
        'eclipse.org',
        'staging.eclipse.org',
        'eclipse.local',
        'www.eclipse.local',
        'dev.eclipse.local',
        'dev.eclipse.org'
      );
      $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';
      }
    }
    return $this->WWW_PREFIX;
  }

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

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

    $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;
    }
  }

  /**
   * Get Local Content file
   *
   * Return the content/xx_filename.php filename,
   * according to availability of the file
   *
   * @return : String
   *
   *         2006-06-28: droy
   */
  function getLocalizedContentFilename() {
    $language = $this->getUserLanguage();
    $filename = "content/" . $language . "_" . $this->getScriptName();

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

    return $filename;
  }

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

  /**
   * Find the closest _projectCommon.php file
   *
   * Walk up the directory structure to find the closest
   * _projectCommon.php file.
   *
   * @return : String
   */
  function getProjectCommon() {
    $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;
  }

  /**
   * Getting the IP address of the user
   *
   * @return string
   */
  function getRemoteIPAddress() {
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
      return $_SERVER['HTTP_CLIENT_IP'];
    }
    else
      if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
      }
    return $_SERVER['REMOTE_ADDR'];
  }

  /**
   * Getting the subnet the user is in right now.
   *
   * @return string
   */
  function getSubnet() {
    $ip_address = $this->getRemoteIPAddress();
    $subnet = preg_replace('~(\d+)\.(\d+)\.(\d+)\.(\d+)~', "$1.$2.$3", $ip_address);
    return $subnet;
  }

  /**
   * This function look for the word staging in the URL
   *
   * @return boolean
   */
  function is_staging() {
    if (strpos($_SERVER['HTTP_HOST'], 'staging')) {
      return TRUE;
    }
    return FALSE;
  }

  /**
   * Sets the headers to prevent caching for the different browsers.
   *
   * @deprecated Please use preventCaching() instead.
   */
  function runStdWebAppCacheable() {
    trigger_error("Deprecated function called.", E_USER_NOTICE);
    $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");
  }

  /**
   * Get Alpha code
   *
   * @param unknown $_NumChars
   * @return string
   */
  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;
  }

  /**
   * Get the current date
   *
   * @return string
   */
  function getCURDATE() {
    return date("Y-m-d");
  }

  /**
   * Add " OR " if string is not empty
   *
   * @param unknown $_String
   *
   * @return string
   */
  function addOrIfNotNull($_String) {
    // Accept: String - String to be AND'ed
    // return: string - AND'ed String

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

    return $_String;
  }

  /**
   * Add " AND " if string is not empty
   *
   * @param unknown $_String
   *
   * @return string
   */
  function addAndIfNotNull($_String) {
    // Accept: String - String to be AND'ed
    // return: string - AND'ed String

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

    return $_String;
  }

  /**
   * Get random numeric Code
   *
   * @param string $_NumChars
   * @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;
  }

  /**
   * Replace part of string X number of times
   *
   * @param unknown $find
   * @param unknown $replace
   * @param unknown $subject
   * @param unknown $count
   *
   * @return string|unknown
   */
  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;
  }

  /**
   * Return Quoated String
   *
   * @param string $_String
   *
   * @return string
   */
  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 . "\"";
  }

  /**
   * Return Safe HTML string
   *
   * @param string $_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;
  }

  /**
   * Return safe JS string
   *
   * @param string $_String
   *
   * @return string
   */
  function returnJSSAfeString($_String) {
    // Accept: String - String to be quoted
    // return: string - Quoted String

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

    return $_String;
  }

  /**
   * Replace Enter with <br/>
   *
   * @param string $_String
   *
   * @return string
   */
  function replaceEnterWithBR($_String) {
    return str_replace("\n", "<br />", $_String);
  }

  /**
   * Generate HTML page
   *
   * @param unknown $theme
   * @param unknown $Menu
   * @param unknown $Nav
   * @param unknown $pageAuthor
   * @param unknown $pageKeywords
   * @param unknown $pageTitle
   * @param unknown $html
   * @param unknown $Breadcrumb
   */
  function generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html, $Breadcrumb = NULL) {
    if ($theme === "Nova") {
      return $this->_generateNovaPage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html, $Breadcrumb = NULL);
    }
    $Theme = $this->getThemeClass($theme);
    $Theme->setNav($Nav);
    $Theme->setMenu($Menu);
    $Theme->setPageAuthor($pageAuthor);
    $Theme->setPageKeywords($pageKeywords);
    $Theme->setPageTitle($pageTitle);
    $Theme->setHtml($html);
    $Theme->setBreadcrumb($Breadcrumb);
    $Theme->generatePage();
  }

  private function _generateNovaPage($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 ($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->getGoogleAnalyticsTrackingCode();
    if (!is_null($gaCode)) {
      $gaCode = ($gaCode == "") ? 'UA-910670-2' : $gaCode;
      // first lets insert the sitewide Analytics
      $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 === "Nova" && isset($googleJavaScript)) {
      echo $googleJavaScript;
    }

    include ($this->getFooterPath($theme));
  }

  /**
   * Add addionnal elements in <head>
   *
   * @param unknown $string
   */
  function AddExtraHtmlHeader($string) {
    $this->ExtraHtmlHeaders .= $string;
  }

  /**
   * Add Extra Javascript in the footer
   *
   * @param string $string
   */
  function AddExtraJSFooter($string) {
    $this->ExtraJSFooter .= $string;
  }

  /**
   * Get Theme URL
   *
   * @param unknown $_theme
   * @return string
   */
  function getThemeURL($_theme) {
    if (!$this->isValidTheme($_theme)) {
      $_theme = "solstice";
    }
    return "/eclipse.org-common/themes/" . $_theme;
  }

  /**
   * Get Theme Class
   *
   * @param strinb $_theme
   *
   * @return BaseTheme
   */
  function getThemeClass($_theme = "solstice") {
    $themes = array(
      'locationtech',
      'solstice',
      'polarsys'
    );

    if (!in_array($_theme, $themes)) {
      $_theme = "solstice";
    }

    require_once (realpath(dirname(__FILE__) . '/../classes/themes/' . $_theme . '.class.php'));
    $theme = ucfirst($_theme);
    return new $theme($this);
  }

  /**
   * Get HTTP parameter
   *
   * @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
   */
  function getHTTPParameter($_param_name, $_method = "") {

    $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($_FILES[$_param_name]) && $_method == "FILES") {
      $rValue = $_FILES[$_param_name];
    }
    if ((isset($_POST[$_param_name])) && ($_method != "GET" || $_method != "FILES")) {
      $rValue = $_POST[$_param_name];
    }
    return $rValue;
  }

  /**
   * Get client OS
   *
   * @return string|unknown
   */
  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');
      }
    }
  }

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

  /**
   * Returns theme name in a browser cookie, or the Empty String
   *
   * @deprecated 2005-12-07: droy
   * @return : String
   */
  function getUserPreferedTheme() {
    trigger_error("Deprecated function called.", E_USER_NOTICE);
    return "";
  }

  /**
   * Get Facebook like button
   *
   * @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;
  }

  /**
   * Get current URL
   *
   * @author droy
   * @since 2011-05-18
   * @return string URL of the current PHP page
   */
  function getCurrentURL() {
    return "http" . ((empty($_SERVER['HTTPS']) && $_SERVER['SERVER_PORT'] != 443) ? "" : "s") . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  }

  /**
   * Return Poll()
   */
  function usePolls() {
    require_once ($this->getBasePath() . "/classes/polls/poll.php");
  }

  /**
   * Return Services_JSON()
   */
  function useJSON() {
    require_once ($this->getBasePath() . "/json/JSON.php");
  }

  /**
   * Returns a new REST client
   *
   * @return RestClient
   * @since 2015-06-24
   * @author droy
   */
  function RESTClient() {
    require_once ($this->getBasePath() . "/classes/rest/lib/restclient.class.php");
    return new RestClient();
  }

  /**
   * Return projectInfoList()
   */
  function useProjectInfo() {
    require_once ($this->getBasePath() . "/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);
    }
  }

  /**
   * Standard formatting to a date range
   *
   * 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);
        }
    }
  }

  /**
   * Validate if dates are the same year
   *
   * 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);
  }

  /**
   * Validate if dates are the same month
   *
   * 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 $required
   *        optional' or 'required'
   *
   * @return Session object
   */
  function useSession($required = "") {
    require_once ($this->getBasePath() . "/system/session.class.php");
    $ssn = new Session(); // constructor calls validate
    if ($ssn->getGID() == "" && $required == "required") {
      $ssn->redirectToLogin();
    }
    return $ssn;
  }

  /**
   * Validate if valid caller
   *
   * @param unknown $_pathArray
   *
   * @return boolean
   */
  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;
  }

  /**
   * Sanitize incoming value to prevent SQL injections
   *
   * @param
   *        string
   *        Value to sanitize
   * @param
   *        dbh database
   *        Resource to use
   *
   * @return string santized string
   */
  function sqlSanitize($_value, $_dbh = NULL) {
    if ($_dbh == NULL) {
      $_dbh = $this->database("eclipse", "");
    }
    $_value = mysql_real_escape_string($_value, $_dbh);
    return $_value;
  }

  /**
   * Get $OGTitle output
   *
   * @return string
   */
  function getOGTitle() {
    return $this->OGTitle;
  }

  /**
   * Set $OGTitle
   *
   * @param unknown $title
   */
  function setOGTitle($title) {
    $this->OGTitle = $title;
  }

  /**
   * Get $OGDescription output
   *
   * @return string
   */
  function getOGDescription() {
    return $this->OGDescription;
  }

  /**
   * Set $OGDescription
   *
   * @param unknown $description
   */
  function setOGDescription($description) {
    $this->OGDescription = $description;
  }

  /**
   * Get $OGImage output
   *
   * @return string
   */
  function getOGImage() {
    return $this->OGImage;
  }

  /**
   * Set $OGImage
   *
   * @param unknown $image
   */
  function setOGImage($image) {
    $this->OGImage = $image;
  }

  /**
   * Get $OGImageWidth output
   */
  function getOGImageWidth() {
    return $this->OGImageWidth;
  }

  /**
   * Set $OGImageWidth
   *
   * @param string $width
   */
  function setOGImageWidth($width) {
    if (is_numeric($width)) {
      $this->OGImageWidth = $width;
    }
  }

  /**
   * Get $OGImageHeight output
   */
  function getOGImageHeight() {
    return $this->OGImageHeight;
  }

  /**
   * Set $OGImageHeight
   *
   * @param string $height
   */
  function setOGImageHeight($height) {
  if (is_numeric($height)) {
      $this->OGImageHeight = $height;
    }
  }

  /**
   * Set Doctype
   *
   * @param unknown $doctype
   */
  function setDoctype($doctype) {
    $accepted = array(
      'html5',
      'xhtml'
    );
    if (in_array($doctype, $accepted)) {
      $this->doctype = $doctype;
    }
    return;
  }

  /**
   * Get HTML document doctype
   *
   * @return string
   */
  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;
  }

  /**
   * Get Twitter Follow widget
   *
   * @param unknown $_twitterhandle
   */
  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;

  }

  /**
   * Get Google Search HTML
   * @deprecated
   *
   * @return string
   */
  function getGoogleSearchHTML() {
    trigger_error("Deprecated function called.", E_USER_NOTICE);
    return '';
  }

  /**
   * Set Google Analytics Tracking code
   *
   * Setting $gaUniqueID to NULL will remove Google Analytics
   * from the page.
   *
   * @param string/NULL $gaUniqueID
   */
  function setGoogleAnalyticsTrackingCode($code = 'UA-910670-2') {
    if (!is_null($this->projectGoogleAnalyticsCode)) {
      $this->projectGoogleAnalyticsCode = $code;
    }
  }

  /**
   * Get Google Analytics Tracking code
   *
   * @param string/NULL $gaUniqueID
   */
  function getGoogleAnalyticsTrackingCode() {
    if (empty($this->projectGoogleAnalyticsCode) && !is_null($this->projectGoogleAnalyticsCode)) {
      $this->setGoogleAnalyticsTrackingCode();
    }
    return $this->projectGoogleAnalyticsCode;
  }

  /**
   * Set Promotion Path
   *
   * @param unknown $_path
   */
  function setPromotionPath($_path) {
    $this->CustomPromotionPath = $_SERVER['DOCUMENT_ROOT'] . $_path;
  }

  /**
   * Use reCAPTCHA service
   *
   * @param bool $ssl
   *
   * @return Captcha
   */
  public function useCaptcha($ssl = true) {
    include_once ($this->getBasePath() . '/classes/captcha/captcha.class.php');
    return new Captcha($ssl);
  }

  /**
   * Record a database record
   *
   * @param unknown $key
   * @param unknown $host
   * @param unknown $user
   * @param unknown $pwd
   * @param unknown $db
   */
  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;
      // Try to use read-only when possible. Blank queries occur when we call
      // sqlSanitize
      if ((strtoupper(substr(trim($query), 0, 6)) == 'SELECT' && strtoupper(substr(trim($query), 0, 23)) != "SELECT /* USE MASTER */") || $query == "") {

        $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
   *
   * @param unknown $dbh
   */
  public function databaseNameForHandle($dbh) {
    return $this->get('DBHANDLEMAP ' . $dbh);
  }

  /**
   * Storage functions for arbitraray hash
   *
   * @param unknown $key
   */
  public function get($key) {
    if (isset($this->hash[$key])) {
      return $this->hash[$key];
    }
  }

  /**
   * Storage functions for arbitraray hash
   *
   * @param unknown $key
   * @param unknown $value
   */
  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.
   *
   * Bugzilla
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function bugzilla_sql($statement) {
    return $this->sql($statement, "bugzilla");
  }

  /**
   * Conferences
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function conference_sql($statement) {
    return $this->sql($statement, "conferences");
  }

  /**
   * Dash
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function dashboard_sql($statement) {
    return $this->sql($statement, "dashboard");
  }

  /**
   * Downloads
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function downloads_sql($statement) {
    return $this->sql($statement, "downloads");
  }

  /**
   * Whole Eclipse database
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function eclipse_sql($statement) {
    return $this->sql($statement, "eclipse");
  }

  /**
   * EPIC (read-only!)
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function epic_sql($statement) {
    return $this->sql($statement, "epic");
  }

  /**
   * Foundation (internal database)
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function foundation_sql($statement) {
    return $this->sql($statement, "foundation");
  }

  /**
   * Gerrit
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function gerrit_sql($statement) {
    return $this->sql($statement, "gerrit");
  }

  /**
   * IPZilla
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function ipzilla_sql($statement) {
    return $this->sql($statement, "ipzilla");
  }

  /**
   * Infra
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function infra_sql($statement) {
    return $this->sql($statement, "infra");
  }

  /**
   * IPZilla (test database)
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function ipzillatest_sql($statement) {
    return $this->sql($statement, "ipzillatest");
  }

  /**
   * Eclipse Live (read-only!)
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function live_sql($statement) {
    return $this->sql($statement, "live");
  }

  /**
   * Polls
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function polls_sql($statement) {
    return $this->sql($statement, "polls");
  }

  /**
   * MyFoundation Portal
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function portal_sql($statement) {
    return $this->sql($statement, "myfoundation");
  }

  /**
   * ProjectInfo tables only (read-only!)
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function projectinfo_sql($statement) {
    return $this->sql($statement, "projectinfo");
  }

  /**
   * Packaging Database
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function packaging_sql($statement) {
    return $this->sql($statement, "packaging");
  }

  /**
   * Marketplace (read-only)
   *
   * @param string $statement
   *
   * @return mysql_query()
   */
  function marketplace_sql($statement) {
    return $this->sql($statement, "marketplace");
  }

}
