install/includes/ui.php
author Dan
Wed, 26 Mar 2008 02:56:23 -0400
changeset 509 175df10e0b56
parent 354 979d99a0b00e
child 536 218a627eb53e
permissions -rw-r--r--
Added a copy of Firebug Lite for debugging purposes. License is uncertain but being treated as MPL. (If is is not MPL then it is under something more permissive that permits relicensing anyway)

<?php

/*
 * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
 * Version 1.1.1
 * Copyright (C) 2006-2007 Dan Fuhry
 * Installation package
 * ui.php - User interface for installations and upgrades
 *
 * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
 */

/**
 * The class for drawing and managing UI components.
 * @package Enano
 * @subpackage Installer
 * @author Dan Fuhry
 */

class Enano_Installer_UI
{
  /**
   * The list of installer stages.
   * @var array
   */
  
  var $stages = array();
  
  /**
   * The GUID of the active stage
   * @var string
   */
  
  var $current_stage = '';
  
  /**
   * The application name, or the name displayed after the stage name in the title bar. Should be localized.
   * @var string
   */
  
  var $app_name = '';
  
  /**
   * If the header should be simplified (stripped of the Enano logo and top heading), this will be true.
   * @var bool
   */
  
  var $simple = false;
  
  /**
   * Text inserted into the header on the right.
   * @var string
   */
  
  var $step = '';
  
  /**
   * Extra text to add to the HTML <head> section
   * @var array Will be implode()'ed
   */
  
  var $additional_headers = array();
  
  /**
   * Constructor.
   * @param string The name displayed in the <title> tag
   * @param bool If true, the simplified header format is displayed.
   */
  
  function __construct($app_name, $simple_header)
  {
    $this->stages = array(
        'main' => array(),
        'hide' => array()
      );
    $this->app_name = $app_name;
    $this->simple = ( $simple_header ) ? true : false;
  }
  
  /**
   * Adds more text to the HTML header.
   * @param string
   */
  
  function add_header($html)
  {
    $this->additional_headers[] = $html;
  }
  
  /**
   * Adds a stage to the installer.
   * @param string Title of the stage, should be already put through $lang->get()
   * @param bool If true, the stage is shown among possible stages at the top of the window. If false, acts as a hidden stage
   * @return string Unique identifier for stage, used later on set_visible_stage()
   */
  
  function add_stage($stage, $visible = true)
  {
    $key = ( $visible ) ? 'main' : 'hide';
    $guid = md5(microtime() . mt_rand());
    $this->stages[$key][$guid] = $stage;
    if ( empty($this->current_stage) )
      $this->current_stage = $guid;
    return $guid;
  }
  
  /**
   * Resets the active stage of installation. This is for the UI only; it doesn't actually change how the backend works.
   * @param string GUID of stage, returned from add_stage()
   * @return bool true on success, false if stage GUID not found
   */
  
  function set_visible_stage($guid)
  {
    foreach ( $this->stages['main'] as $key => $stage_name )
    {
      if ( $key == $guid )
      {
        $this->current_stage = $guid;
        return true;
      }
    }
    foreach ( $this->stages['hide'] as $key => $stage_name )
    {
      if ( $key == $guid )
      {
        $this->current_stage = $guid;
        return true;
      }
    }
    return false;
  }
  
  /**
   * Outputs the HTML headers and start of the <body>, including stage indicator
   */
  
  function show_header()
  {
    // Determine the name of the current stage
    $stage_name = false;
    
    if ( isset($this->stages['main'][$this->current_stage]) )
      $stage_name = $this->stages['main'][$this->current_stage];
    else if ( isset($this->stages['hide'][$this->current_stage]) )
      $stage_name = $this->stages['hide'][$this->current_stage];
    else
      // Can't determine name of stage
      return false;
      
    $this->app_name = htmlspecialchars($this->app_name);
    $stage_name = htmlspecialchars($stage_name);
    
    global $lang;
    if ( is_object($lang) && isset($GLOBALS['lang_uri']) )
    {
      $lang_uri = sprintf($GLOBALS['lang_uri'], $lang->lang_code);
      $this->add_header('<script type="text/javascript" src="' . $lang_uri . '"></script>');
    }
    
    $additional_headers = implode("\n    ", $this->additional_headers);
    $title = addslashes(str_replace(' ', '_', $stage_name));
    $js_dynamic = '<script type="text/javascript">
        var title="' . $title . '";
        var scriptPath="'.scriptPath.'";
        var ENANO_SID="";
        var AES_BITS='.AES_BITS.';
        var AES_BLOCKSIZE=' . AES_BLOCKSIZE . ';
        var pagepass=\'\';
        var ENANO_LANG_ID = 1;
        var DISABLE_MCE = true;
      </script>';
    
    echo <<<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>{$stage_name} &bull; {$this->app_name}</title>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" type="text/css" href="../includes/clientside/css/enano-shared.css" />
    <link rel="stylesheet" type="text/css" href="images/css/installer.css" id="mdgCss" />
    $js_dynamic
    <script type="text/javascript" src="../includes/clientside/static/enano-lib-basic.js"></script>
    $additional_headers
  </head>
  <body>
    <div id="enano">

EOF;
    if ( !$this->simple )
    {
      $step = ( !empty($this->step) ) ? '<div id="step">' . htmlspecialchars($this->step) . '</div>' : '';
      echo <<<EOF
      <div id="header">
        $step
        <img alt="Enano logo" src="images/enano-artwork/installer-header-blue.png" />
      </div>

EOF;
    }
    $stages_class = ( $this->simple ) ? 'stages' : 'stages stages-fixed';
    echo <<<EOF
      <div class="stages-holder">
        <ul class="$stages_class">
    
EOF;
    foreach ( $this->stages['main'] as $guid => $stage )
    {
      $class = ( $guid == $this->current_stage ) ? 'stage stage-active' : 'stage';
      $stage = htmlspecialchars($stage);
      echo "      <li class=\"$class\">$stage</li>\n    ";
    }
    echo "    </ul>\n      <div style=\"clear: both;\"></div>\n      </div>\n";
    echo "      <div id=\"enano-fill\">\n      ";
    echo "  <div id=\"enano-body\">\n            ";
  }
  
  /**
   * Displays the page footer.
   */
  
  function show_footer()
  {
    echo <<<EOF
          <div id="copyright">
            Enano and its various components, related documentation, and artwork are copyright &copy; 2006-2008 Dan Fuhry.<br />
            This program is Free Software; see the file "GPL" included with this package for details.
          </div>
        </div> <!-- div#enano-body -->
      </div> <!-- div#enano-fill -->
    </div> <!-- div#enano -->
  </body>
</html>
EOF;
  }
  
}
 
?>