home *** CD-ROM | disk | FTP | other *** search
- <?php
- /**
- * HTML loading bar with only PHP and JS interface.
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category HTML
- * @package HTML_Progress
- * @subpackage Progress_UI
- * @author Laurent Laville <pear@laurent-laville.org>
- * @copyright 1997-2005 The PHP Group
- * @license http://www.php.net/license/3_0.txt PHP License 3.0
- * @version CVS: $Id: UI.php,v 1.10 2005/09/14 08:32:30 farell Exp $
- * @link http://pear.php.net/package/HTML_Progress
- * @since File available since Release 1.0
- */
-
- require_once 'HTML/Common.php';
-
- /**
- * HTML loading bar with only PHP and JS interface.
- *
- * The HTML_Progress_UI class provides a basic look and feel
- * implementation of a progress bar.
- *
- * @category HTML
- * @package HTML_Progress
- * @subpackage Progress_UI
- * @author Laurent Laville <pear@laurent-laville.org>
- * @copyright 1997-2005 The PHP Group
- * @license http://www.php.net/license/3_0.txt PHP License 3.0
- * @version Release: @package_version@
- * @link http://pear.php.net/package/HTML_Progress2
- * @since Class available since Release 1.0
- */
-
- class HTML_Progress_UI extends HTML_Common
- {
- /**
- * Whether the progress bar is horizontal, vertical, polygonal or circle.
- * The default is horizontal.
- *
- * @var integer
- * @since 1.0
- * @access private
- * @see getOrientation(), setOrientation()
- */
- var $_orientation;
-
- /**
- * Whether the progress bar is filled in 'natural' or 'reverse' way.
- * The default fill way is 'natural'.
- *
- * <ul>
- * <li>since 0.5 : 'way' = bar fill way
- * <ul>
- * <li>with Progress Bar Horizontal,
- * natural way is : left to right
- * <br />reverse way is : right to left
- * <li>with Progress Bar Vertical,
- * natural way is : down to up
- * <br />reverse way is : up to down
- * <li>with Progress Circle or Polygonal,
- * natural way is : clockwise
- * <br />reverse way is : anticlockwise
- * </ul>
- * </ul>
- *
- * @var string
- * @since 1.0
- * @access private
- * @see getFillWay(), setFillWay()
- */
- var $_fillWay;
-
- /**
- * The cell count of the progress bar. The default is 10.
- *
- * @var integer
- * @since 1.0
- * @access private
- * @see getCellCount(), setCellCount()
- */
- var $_cellCount;
-
- /**
- * The cell coordinates for a progress polygonal shape.
- *
- * @var array
- * @since 1.2.0
- * @access private
- * @see getCellCoordinates(), setCellCoordinates()
- */
- var $_coordinates;
-
- /**
- * The width of grid in cell-size of the polygonal shape.
- *
- * @var integer
- * @since 1.2.0
- * @access private
- * @see getCellCoordinates(), setCellCoordinates()
- */
- var $_xgrid;
-
- /**
- * The height of grid in cell-size of the polygonal shape.
- *
- * @var integer
- * @since 1.2.0
- * @access private
- * @see getCellCoordinates(), setCellCoordinates()
- */
- var $_ygrid;
-
- /**
- * The progress bar's structure
- *
- * <ul>
- * <li>['cell']
- * <ul>
- * <li>since 1.0 : 'id' = cell identifier mask
- * <li>since 1.0 : 'class' = css class selector
- * <li>since 0.1 : 'width' = cell width
- * <li>since 0.1 : 'height' = cell height
- * <li>since 0.1 : 'active-color' = active color
- * <li>since 0.1 : 'inactive-color' = inactive color
- * <li>since 0.1 : 'spacing' = cell spacing
- * <li>since 0.6 : 'color' = foreground color
- * <li>since 0.6 : 'font-size' = font size
- * <li>since 0.6 : 'font-family' = font family
- * <li>since 1.2 : 'background-color' = background color
- * </ul>
- * <li>['border']
- * <ul>
- * <li>since 1.0 : 'class' = css class selector
- * <li>since 0.1 : 'width' = border width
- * <li>since 0.1 : 'style' = border style
- * <li>since 0.1 : 'color' = border color
- * </ul>
- * <li>['string']
- * <ul>
- * <li>sicne 1.0 : 'id' = string identifier
- * <li>since 0.6 : 'width' = with of progress string
- * <li>since 0.6 : 'height' = height of progress string
- * <li>since 0.1 : 'font-family' = font family
- * <li>since 0.1 : 'font-size' = font size
- * <li>since 0.1 : 'color' = font color
- * <li>since 0.6 : 'background-color' = background color
- * <li>since 0.6 : 'align' = horizontal align (left, center, right, justify)
- * <li>since 0.6 : 'valign' = vertical align (top, bottom, left, right)
- * </ul>
- * <li>['progress']
- * <ul>
- * <li>since 1.0 : 'class' = css class selector
- * <li>since 0.1 : 'background-color' = bar background color
- * <li>since 1.0 : 'auto-size' = compute best progress size
- * <li>since 0.1 : 'width' = bar width
- * <li>since 0.1 : 'height' = bar height
- * </ul>
- * </ul>
- *
- * @var array
- * @since 1.0
- * @access private
- * @see HTML_Progress::toArray()
- */
- var $_progress = array();
-
- /**
- * External Javascript file to override internal default code
- *
- * @var string
- * @since 1.0
- * @access private
- * @see getScript(), setScript()
- */
- var $_script;
-
-
- /**
- * The progress bar's UI model class constructor
- *
- * Constructor Summary
- *
- * o Creates a natural horizontal progress bar that displays ten cells/units.
- * <code>
- * $html = new HTML_Progress_UI();
- * </code>
- *
- * o Creates a natural horizontal progress bar with the specified cell count,
- * which cannot be less than 1 (minimum), but has no maximum limit.
- * <code>
- * $html = new HTML_Progress_UI($cell);
- * </code>
- *
- * @param int $cell (optional) Cell count
- *
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- */
- function HTML_Progress_UI()
- {
- // if you've not yet created an instance of html_progress
- if (!$GLOBALS['_HTML_PROGRESS_CALLBACK_ERRORHANDLER']) {
- // init default error handling system,
- HTML_Progress::_initErrorHandler();
- }
-
- $args = func_get_args();
-
- switch (count($args)) {
- case 1:
- /* int cell */
- if (!is_int($args[0])) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$cell',
- 'was' => $args[0],
- 'expected' => 'integer',
- 'paramnum' => 1));
-
- } elseif ($args[0] < 1) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$cell',
- 'was' => $args[0],
- 'expected' => 'greater or equal 1',
- 'paramnum' => 1));
- }
- $this->_cellCount = $args[0];
- break;
- default:
- $this->_cellCount = 10;
- break;
- }
- $this->_orientation = HTML_PROGRESS_BAR_HORIZONTAL;
- $this->_fillWay = 'natural';
- $this->_script = null; // uses internal javascript code
-
- $this->_progress = array(
- 'cell' =>
- array(
- 'id' => "progressCell%01s",
- 'class' => "cell",
- 'active-color' => "#006600",
- 'inactive-color' => "#CCCCCC",
- 'font-family' => "Courier, Verdana",
- 'font-size' => 8,
- 'color' => "#000000",
- 'background-color' => "#FFFFFF",
- 'width' => 15,
- 'height' => 20,
- 'spacing' => 2
- ),
- 'border' =>
- array(
- 'class' => "progressBarBorder",
- 'width' => 0,
- 'style' => "solid",
- 'color' => "#000000"
- ),
- 'string' =>
- array(
- 'id' => "installationProgress",
- 'width' => 50,
- 'font-family' => "Verdana, Arial, Helvetica, sans-serif",
- 'font-size' => 12,
- 'color' => "#000000",
- 'background-color' => "#FFFFFF",
- 'align' => "right",
- 'valign' => "right"
- ),
- 'progress' =>
- array(
- 'class' => "progressBar",
- 'background-color' => "#FFFFFF",
- 'auto-size' => true
- )
- );
- $this->_updateProgressSize(); // updates the new size of progress bar
- }
-
- /**
- * Returns HTML_PROGRESS_BAR_HORIZONTAL or HTML_PROGRESS_BAR_VERTICAL,
- * depending on the orientation of the progress bar.
- * The default orientation is HTML_PROGRESS_BAR_HORIZONTAL.
- *
- * @return integer
- * @since 1.0
- * @access public
- * @see setOrientation()
- */
- function getOrientation()
- {
- return $this->_orientation;
- }
-
- /**
- * Sets the progress bar's orientation, which must be HTML_PROGRESS_BAR_HORIZONTAL
- * or HTML_PROGRESS_BAR_VERTICAL.
- * The default orientation is HTML_PROGRESS_BAR_HORIZONTAL.
- *
- * @param integer $orient Orientation (horizontal or vertical)
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see getOrientation()
- */
- function setOrientation($orient)
- {
- if (!is_int($orient)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$orient',
- 'was' => gettype($orient),
- 'expected' => 'integer',
- 'paramnum' => 1));
-
- } elseif (($orient != HTML_PROGRESS_BAR_HORIZONTAL) &&
- ($orient != HTML_PROGRESS_BAR_VERTICAL) &&
- ($orient != HTML_PROGRESS_POLYGONAL) &&
- ($orient != HTML_PROGRESS_CIRCLE)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$orient',
- 'was' => $orient,
- 'expected' => HTML_PROGRESS_BAR_HORIZONTAL.' | '.
- HTML_PROGRESS_BAR_VERTICAL.' | '.
- HTML_PROGRESS_POLYGONAL.' | '.
- HTML_PROGRESS_CIRCLE,
- 'paramnum' => 1));
- }
-
- $previous = $this->_orientation; // gets previous orientation
- $this->_orientation = $orient; // sets the new orientation
-
- if ($previous != $orient) {
- // if orientation has changed, we need to swap cell width and height
- $w = $this->_progress['cell']['width'];
- $h = $this->_progress['cell']['height'];
-
- $this->_progress['cell']['width'] = $h;
- $this->_progress['cell']['height'] = $w;
-
- $this->_updateProgressSize(); // updates the new size of progress bar
- }
- }
-
- /**
- * Returns 'natural' or 'reverse', depending of the fill way of progress bar.
- * For horizontal progress bar, natural way is from left to right, and reverse
- * way is from right to left.
- * For vertical progress bar, natural way is from down to up, and reverse
- * way is from up to down.
- * The default fill way is 'natural'.
- *
- * @return string
- * @since 1.0
- * @access public
- * @see setFillWay()
- */
- function getFillWay()
- {
- return $this->_fillWay;
- }
-
- /**
- * Sets the progress bar's fill way, which must be 'natural' or 'reverse'.
- * The default fill way is 'natural'.
- *
- * @param string $way fill direction (natural or reverse)
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see getFillWay()
- */
- function setFillWay($way)
- {
- if (!is_string($way)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$way',
- 'was' => gettype($way),
- 'expected' => 'string',
- 'paramnum' => 1));
-
- } elseif ((strtolower($way) != 'natural') && (strtolower($way) != 'reverse')) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$way',
- 'was' => $way,
- 'expected' => 'natural | reverse',
- 'paramnum' => 1));
- }
- $this->_fillWay = strtolower($way);
- }
-
- /**
- * Returns the number of cell in the progress bar. The default value is 10.
- *
- * @return integer
- * @since 1.0
- * @access public
- * @see setCellCount()
- */
- function getCellCount()
- {
- return $this->_cellCount;
- }
-
- /**
- * Sets the number of cell in the progress bar
- *
- * @param integer $cells Cell count on progress bar
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see getCellCount()
- */
- function setCellCount($cells)
- {
- if (!is_int($cells)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$cells',
- 'was' => gettype($cells),
- 'expected' => 'integer',
- 'paramnum' => 1));
-
- } elseif ($cells < 1) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$cells',
- 'was' => $cells,
- 'expected' => 'greater or equal 1',
- 'paramnum' => 1));
- }
- $this->_cellCount = $cells;
-
- $this->_updateProgressSize(); // updates the new size of progress bar
- }
-
- /**
- * Returns the common and private cell attributes. Assoc array (defaut) or string
- *
- * @param bool $asString (optional) whether to return the attributes as string
- *
- * @return mixed
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see setCellAttributes()
- */
- function getCellAttributes($asString = false)
- {
- if (!is_bool($asString)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$asString',
- 'was' => gettype($asString),
- 'expected' => 'boolean',
- 'paramnum' => 1));
- }
-
- $attr = $this->_progress['cell'];
-
- if ($asString) {
- return $this->_getAttrString($attr);
- } else {
- return $attr;
- }
- }
-
- /**
- * Sets the cell attributes for an existing cell.
- *
- * Defaults are:
- * <ul>
- * <li>Common :
- * <ul>
- * <li>id = progressCell%01s
- * <li>class = cell
- * <li>spacing = 2
- * <li>active-color = #006600
- * <li>inactive-color = #CCCCCC
- * <li>font-family = Courier, Verdana
- * <li>font-size = lowest value from cell width, cell height, and font size
- * <li>color = #000000
- * <li>background-color = #FFFFFF (added for progress circle shape on release 1.2.0)
- * <li>Horizontal Bar :
- * <ul>
- * <li>width = 15
- * <li>height = 20
- * </ul>
- * <li>Vertical Bar :
- * <ul>
- * <li>width = 20
- * <li>height = 15
- * </ul>
- * </ul>
- * </ul>
- *
- * @param mixed $attributes Associative array or string of HTML tag attributes
- * @param int $cell (optional) Cell index
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see getCellAttributes(), getCellCount()
- */
- function setCellAttributes($attributes, $cell = null)
- {
- if (!is_null($cell)) {
- if (!is_int($cell)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$cell',
- 'was' => gettype($cell),
- 'expected' => 'integer',
- 'paramnum' => 2));
-
- } elseif ($cell < 0) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$cell',
- 'was' => $cell,
- 'expected' => 'positive',
- 'paramnum' => 2));
-
- } elseif ($cell > $this->getCellCount()) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$cell',
- 'was' => $cell,
- 'expected' => 'less or equal '.$this->getCellCount(),
- 'paramnum' => 2));
- }
-
- $this->_updateAttrArray($this->_progress['cell'][$cell], $this->_parseAttributes($attributes));
- } else {
- $this->_updateAttrArray($this->_progress['cell'], $this->_parseAttributes($attributes));
- }
-
- $font_size = $this->_progress['cell']['font-size'];
- $cell_width = $this->_progress['cell']['width'];
- $cell_height = $this->_progress['cell']['height'];
- $margin = ($this->getOrientation() == HTML_PROGRESS_BAR_HORIZONTAL) ? 0 : 3;
-
- $font_size = min(min($cell_width, $cell_height) - $margin, $font_size);
- $this->_progress['cell']['font-size'] = $font_size;
-
- $this->_updateProgressSize(); // updates the new size of progress bar
- }
-
- /**
- * Returns the coordinates of each cell for a polygonal progress shape.
- *
- * @return array list of cell coordinates
- * @since 1.2.0
- * @access public
- * @see setCellCoordinates()
- */
- function getCellCoordinates()
- {
- return isset($this->_coordinates) ? $this->_coordinates : array();
- }
-
- /**
- * Set the coordinates of each cell for a polygonal progress shape.
- *
- * @param integer $xgrid The grid width in cell size
- * @param integer $ygrid The grid height in cell size
- * @param array $coord (optional) Coordinates (x,y) in the grid, of each cell
- *
- * @return void
- * @since 1.2.0
- * @access public
- * @see getCellCoordinates()
- */
- function setCellCoordinates($xgrid, $ygrid, $coord = array())
- {
- if (!is_int($xgrid)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$xgrid',
- 'was' => gettype($xgrid),
- 'expected' => 'integer',
- 'paramnum' => 1));
-
- } elseif ($xgrid < 3) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$xgrid',
- 'was' => $xgrid,
- 'expected' => 'greater than 2',
- 'paramnum' => 1));
-
- } elseif (!is_int($ygrid)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$ygrid',
- 'was' => gettype($ygrid),
- 'expected' => 'integer',
- 'paramnum' => 2));
-
- } elseif ($ygrid < 3) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$ygrid',
- 'was' => $ygrid,
- 'expected' => 'greater than 2',
- 'paramnum' => 2));
-
- } elseif (!is_array($coord)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$coord',
- 'was' => gettype($coord),
- 'expected' => 'array',
- 'paramnum' => 3));
- }
-
- if (count($coord) == 0) {
- // Computes all coordinates of a standard polygon (square or rectangle)
- $coord = $this->_computeCoordinates($xgrid, $ygrid);
- } else {
- foreach ($coord as $id => $pos) {
- if (!is_array($pos)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$coord[,$pos]',
- 'was' => gettype($pos),
- 'expected' => 'array',
- 'paramnum' => 3));
- }
- if ($pos[0] >= $ygrid) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$pos[0]',
- 'was' => $pos[0],
- 'expected' => 'coordinate less than grid height',
- 'paramnum' => 3));
- }
- if ($pos[1] >= $xgrid) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$pos[1]',
- 'was' => $pos[1],
- 'expected' => 'coordinate less than grid width',
- 'paramnum' => 3));
- }
- }
- }
- $this->_coordinates = $coord;
- $this->_xgrid = $xgrid;
- $this->_ygrid = $ygrid;
-
- // auto-compute cell count
- $this->_cellCount = count($coord);
-
- $this->_updateProgressSize(); // updates the new size of progress bar
- }
-
- /**
- * Returns the progress bar's border attributes. Assoc array (defaut) or string.
- *
- * @param bool $asString (optional) whether to return the attributes as string
- *
- * @return mixed
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see setBorderAttributes()
- */
- function getBorderAttributes($asString = false)
- {
- if (!is_bool($asString)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$asString',
- 'was' => gettype($asString),
- 'expected' => 'boolean',
- 'paramnum' => 1));
- }
-
- $attr = $this->_progress['border'];
-
- if ($asString) {
- return $this->_getAttrString($attr);
- } else {
- return $attr;
- }
- }
-
- /**
- * Sets the progress bar's border attributes.
- *
- * Defaults are:
- * <ul>
- * <li>class = progressBarBorder
- * <li>width = 0
- * <li>style = solid
- * <li>color = #000000
- * </ul>
- *
- * @param mixed $attributes Associative array or string of HTML tag attributes
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getBorderAttributes(), HTML_Progress::setBorderPainted()
- */
- function setBorderAttributes($attributes)
- {
- $this->_updateAttrArray($this->_progress['border'], $this->_parseAttributes($attributes));
-
- $this->_updateProgressSize(); // updates the new size of progress bar
- }
-
- /**
- * Returns the string attributes. Assoc array (defaut) or string.
- *
- * @param bool $asString (optional) whether to return the attributes as string
- *
- * @return mixed
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see setStringAttributes()
- */
- function getStringAttributes($asString = false)
- {
- if (!is_bool($asString)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$asString',
- 'was' => gettype($asString),
- 'expected' => 'boolean',
- 'paramnum' => 1));
- }
-
- $attr = $this->_progress['string'];
-
- if ($asString) {
- return $this->_getAttrString($attr);
- } else {
- return $attr;
- }
- }
-
- /**
- * Sets the string attributes.
- *
- * Defaults are:
- * <ul>
- * <li>id = installationProgress
- * <li>width = 50
- * <li>font-family = Verdana, Arial, Helvetica, sans-serif
- * <li>font-size = 12
- * <li>color = #000000
- * <li>background-color = #FFFFFF
- * <li>align = right
- * <li>Horizontal Bar :
- * <ul>
- * <li>valign = right
- * </ul>
- * <li>Vertical Bar :
- * <ul>
- * <li>valign = bottom
- * </ul>
- * </ul>
- *
- * @param mixed $attributes Associative array or string of HTML tag attributes
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getStringAttributes(), HTML_Progress::setStringPainted()
- */
- function setStringAttributes($attributes)
- {
- $this->_updateAttrArray($this->_progress['string'], $this->_parseAttributes($attributes));
- }
-
- /**
- * Returns the progress attributes. Assoc array (defaut) or string.
- *
- * @param bool $asString (optional) whether to return the attributes as string
- *
- * @return mixed
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see setProgressAttributes()
- */
- function getProgressAttributes($asString = false)
- {
- if (!is_bool($asString)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$asString',
- 'was' => gettype($asString),
- 'expected' => 'boolean',
- 'paramnum' => 1));
- }
-
- $attr = $this->_progress['progress'];
-
- if ($asString) {
- return $this->_getAttrString($attr);
- } else {
- return $attr;
- }
- }
-
- /**
- * Sets the common progress bar attributes.
- *
- * Defaults are:
- * <ul>
- * <li>class = progressBar
- * <li>background-color = #FFFFFF
- * <li>auto-size = true
- * <li>Horizontal Bar :
- * <ul>
- * <li>width = (cell_count * (cell_width + cell_spacing)) + cell_spacing
- * <li>height = cell_height + (2 * cell_spacing)
- * </ul>
- * <li>Vertical Bar :
- * <ul>
- * <li>width = cell_width + (2 * cell_spacing)
- * <li>height = (cell_count * (cell_height + cell_spacing)) + cell_spacing
- * </ul>
- * </ul>
- *
- * @param mixed $attributes Associative array or string of HTML tag attributes
- *
- * @return void
- * @since 1.0
- * @access public
- * @see getProgressAttributes()
- */
- function setProgressAttributes($attributes)
- {
- $this->_updateAttrArray($this->_progress['progress'], $this->_parseAttributes($attributes));
- }
-
- /**
- * Get the javascript code to manage progress bar.
- *
- * @return string JavaScript URL or inline code to manage progress bar
- * @since 0.5
- * @access public
- * @see setScript()
- * @author Stefan Neufeind <pear.neufeind@speedpartner.de> Contributor.
- * See details on thanks section of README file.
- * @author Christian Wenz <wenz@php.net> Helper.
- * See details on thanks section of README file.
- */
- function getScript()
- {
- if (!is_null($this->_script)) {
- return $this->_script; // URL to the linked Progress JavaScript
- }
-
- $js = <<< JS
- var isDom = document.getElementById?true:false;
- var isIE = document.all?true:false;
- var isNS4 = document.layers?true:false;
- var cellCount = %cellCount%;
-
- function setprogress(pIdent, pValue, pString, pDeterminate)
- {
- if (isDom) {
- prog = document.getElementById(pIdent+'%installationProgress%');
- } else if (isIE) {
- prog = document.all[pIdent+'%installationProgress%'];
- } else if (isNS4) {
- prog = document.layers[pIdent+'%installationProgress%'];
- }
- if (prog != null) {
- prog.innerHTML = pString;
- }
- if (pValue == pDeterminate) {
- for (i=0; i < cellCount; i++) {
- showCell(i, pIdent, "hidden");
- }
- }
- if ((pDeterminate > 0) && (pValue > 0)) {
- i = (pValue-1) % cellCount;
- showCell(i, pIdent, "visible");
- } else {
- for (i=pValue-1; i >=0; i--) {
- showCell(i, pIdent, "visible");
- }
- }
- }
-
- function setVisibility(pElement, pVisibility)
- {
- if (isDom) {
- document.getElementById(pElement).style.visibility = pVisibility;
- } else if (isIE) {
- document.all[pElement].style.visibility = pVisibility;
- } else if (isNS4) {
- document.layers[pElement].style.visibility = pVisibility;
- }
- }
-
- function showCell(pCell, pIdent, pVisibility)
- {
- setVisibility(pIdent+'%progressCell%'+pCell+'A', pVisibility);
- }
-
- function hideProgress(pIdent)
- {
- setVisibility(pIdent+'progress', 'hidden');
-
- for (i=0; i < cellCount; i++) {
- showCell(i, pIdent, "hidden");
- }
- }
-
- JS;
- $cellAttr = $this->getCellAttributes();
- $attr = trim(sprintf($cellAttr['id'], ' '));
- $stringAttr = $this->getStringAttributes();
-
- $placeHolders = array('%cellCount%', '%installationProgress%', '%progressCell%');
- $jsElement = array($this->getCellCount(), $stringAttr['id'], $attr);
-
- $js = str_replace($placeHolders, $jsElement, $js);
-
- return $js;
- }
-
- /**
- * Set the external JavaScript code (file) to manage progress element.
- *
- * @param string $url URL to the linked Progress JavaScript
- *
- * @return void
- * @since 1.0
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- * @see getScript()
- */
- function setScript($url)
- {
- if (!is_null($url)) {
- if (!is_string($url)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$url',
- 'was' => gettype($url),
- 'expected' => 'string',
- 'paramnum' => 1));
-
- } elseif (!is_file($url) || $url == '.' || $url == '..') {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'error',
- array('var' => '$url',
- 'was' => $url.' file does not exists',
- 'expected' => 'javascript file exists',
- 'paramnum' => 1));
- }
- }
-
- /*
- - since version 0.5.0,
- - default javascript code comes from getScript() method
- - but may be overrided by external file.
- */
- $this->_script = $url;
- }
-
- /**
- * Get the cascading style sheet to put inline on HTML document
- *
- * @return string
- * @since 0.2
- * @access public
- * @author Stefan Neufeind <pear.neufeind@speedpartner.de> Contributor.
- * See details on thanks section of README file.
- */
- function getStyle()
- {
- $tab = $this->_getTab();
- $lnEnd = $this->_getLineEnd();
- $progressAttr = $this->getProgressAttributes();
- $borderAttr = $this->getBorderAttributes();
- $stringAttr = $this->getStringAttributes();
- $cellAttr = $this->getCellAttributes();
- $orient = $this->getOrientation();
-
- $css = '{%pIdent%} .' . $progressAttr['class'] . ', {%pIdent%} .' . $borderAttr['class'] . ' {' . $lnEnd;
- $css .= $tab . 'background-color: '. $progressAttr['background-color'] .';'. $lnEnd;
- $css .= $tab . 'width: '. $progressAttr['width'] .'px;'. $lnEnd;
- $css .= $tab . 'height: '. $progressAttr['height'] .'px;'. $lnEnd;
- $css .= $tab . 'position: relative;'. $lnEnd;
- $css .= $tab . 'left: 0;'. $lnEnd;
- $css .= $tab . 'top: 0;'. $lnEnd;
- $css .= '}'. $lnEnd . $lnEnd;
-
- $css .= '{%pIdent%} .' . $borderAttr['class'] . ' {' . $lnEnd;
- $css .= $tab . 'border-width: '. $borderAttr['width'] .'px;'. $lnEnd;
- $css .= $tab . 'border-style: '. $borderAttr['style'] .';'. $lnEnd;
- $css .= $tab . 'border-color: '. $borderAttr['color'] .';'. $lnEnd;
- $css .= '}'. $lnEnd . $lnEnd;
-
- $css .= '{%pIdent%} .' . $stringAttr['id'] . ' {' . $lnEnd;
- $css .= $tab . 'width: '. $stringAttr['width'] .'px;'. $lnEnd;
- if (isset($stringAttr['height'])) {
- $css .= $tab . 'height: '. $stringAttr['height'] .'px;'. $lnEnd;
- }
- $css .= $tab . 'text-align: '. $stringAttr['align'] .';'. $lnEnd;
- $css .= $tab . 'font-family: '. $stringAttr['font-family'] .';'. $lnEnd;
- $css .= $tab . 'font-size: '. $stringAttr['font-size'] .'px;'. $lnEnd;
- $css .= $tab . 'color: '. $stringAttr['color'] .';'. $lnEnd;
- $css .= $tab . 'background-color: '. $stringAttr['background-color'] .';'. $lnEnd;
- $css .= '}'. $lnEnd . $lnEnd;
-
- $css .= '{%pIdent%} .' . $cellAttr['class'] . 'I, {%pIdent%} .' . $cellAttr['class'] . 'A {' . $lnEnd;
- $css .= $tab . 'width: '. $cellAttr['width'] .'px;'. $lnEnd;
- $css .= $tab . 'height: '. $cellAttr['height'] .'px;'. $lnEnd;
- $css .= $tab . 'font-family: '. $cellAttr['font-family'] .';'. $lnEnd;
- $css .= $tab . 'font-size: '. $cellAttr['font-size'] .'px;'. $lnEnd;
- if ($orient == HTML_PROGRESS_BAR_HORIZONTAL) {
- $css .= $tab . 'float: left;'. $lnEnd;
- }
- if ($orient == HTML_PROGRESS_BAR_VERTICAL) {
- $css .= $tab . 'float: none;'. $lnEnd;
- }
- $css .= '}'. $lnEnd . $lnEnd;
-
- $css .= '{%pIdent%} .' . $cellAttr['class'] . 'I {' . $lnEnd;
- if ($orient !== HTML_PROGRESS_CIRCLE) {
- $css .= $tab . 'background-color: '. $cellAttr['inactive-color'] .';'. $lnEnd;
- }
- if ($orient == HTML_PROGRESS_CIRCLE) {
- $css .= $tab . 'background-image: url("'. $cellAttr[0]['background-image'] .'");'. $lnEnd;
- $css .= $tab . 'background-repeat: no-repeat;'. $lnEnd;
- }
- $css .= '}'. $lnEnd . $lnEnd;
-
- $css .= '{%pIdent%} .' . $cellAttr['class'] . 'A {' . $lnEnd;
- if ($orient !== HTML_PROGRESS_CIRCLE) {
- $css .= $tab . 'background-color: '. $cellAttr['active-color'] .';'. $lnEnd;
- }
- $css .= $tab . 'visibility: hidden;'. $lnEnd;
- if (isset($cellAttr['background-image'])) {
- $css .= $tab . 'background-image: url("'. $cellAttr['background-image'] .'");'. $lnEnd;
- $css .= $tab . 'background-repeat: no-repeat;'. $lnEnd;
- }
- $css .= '}'. $lnEnd . $lnEnd;
-
- return $css;
- }
-
- /**
- * Draw all circle segment pictures
- *
- * @param string $dir (optional) Directory where pictures should be created
- * @param string $fileMask (optional) sprintf format for pictures filename
- *
- * @return array
- * @since 1.2.0RC1
- * @access public
- * @throws HTML_PROGRESS_ERROR_INVALID_INPUT
- */
- function drawCircleSegments($dir = '.', $fileMask = 'c%s.png')
- {
- if (!is_string($dir)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$dir',
- 'was' => gettype($dir),
- 'expected' => 'string',
- 'paramnum' => 1));
-
- } elseif (!is_string($fileMask)) {
- return HTML_Progress::raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
- array('var' => '$fileMask',
- 'was' => gettype($fileMask),
- 'expected' => 'string',
- 'paramnum' => 2));
- }
-
- include_once 'Image/Color.php';
-
- $cellAttr = $this->getCellAttributes();
- $cellCount = $this->getCellCount();
- $w = $cellAttr['width'];
- $h = $cellAttr['height'];
- $s = $cellAttr['spacing'];
- $c = intval(360 / $cellCount);
- $cx = floor($w / 2);
- if (fmod($w,2) == 0) {
- $cx = $cx - 0.5;
- }
- $cy = floor($h / 2);
- if (fmod($h,2) == 0) {
- $cy = $cy - 0.5;
- }
-
- $image = imagecreate($w, $h);
-
- $bg = Image_Color::allocateColor($image,$cellAttr['background-color']);
- $colorA = Image_Color::allocateColor($image,$cellAttr['active-color']);
- $colorI = Image_Color::allocateColor($image,$cellAttr['inactive-color']);
-
- imagefilledarc($image, $cx, $cy, $w, $h, 0, 360, $colorI, IMG_ARC_EDGED);
- $filename = $dir . DIRECTORY_SEPARATOR . sprintf($fileMask,0);
- imagepng($image, $filename);
- $this->setCellAttributes(array('background-image' => $filename),0);
-
- for ($i=0; $i<$cellCount; $i++) {
- if ($this->getFillWay() == 'natural') {
- $sA = $i*$c;
- $eA = ($i+1)*$c;
- $sI = ($i+1)*$c;
- $eI = 360;
- } else {
- $sA = 360-(($i+1)*$c);
- $eA = 360-($i*$c);
- $sI = 0;
- $eI = 360-(($i+1)*$c);
- }
- if ($s > 0) {
- imagefilledarc($image, $cx, $cy, $w, $h, 0, $sA, $colorI, IMG_ARC_EDGED);
- }
- imagefilledarc($image, $cx, $cy, $w, $h, $sA, $eA, $colorA, IMG_ARC_EDGED);
- imagefilledarc($image, $cx, $cy, $w, $h, $sI, $eI, $colorI, IMG_ARC_EDGED);
- $filename = $dir . DIRECTORY_SEPARATOR . sprintf($fileMask,$i+1);
- imagepng($image, $filename);
-
- $this->setCellAttributes(array('background-image' => $filename),$i+1);
- }
- imagedestroy($image);
- }
-
- /**
- * Updates the new size of progress bar, depending of cell size, cell count
- * and border width.
- *
- * @since 1.0
- * @access private
- * @see setOrientation(), setCellCount(), setCellAttributes(),
- * setBorderAttributes()
- */
- function _updateProgressSize()
- {
- if (!$this->_progress['progress']['auto-size']) {
- return;
- }
-
- $cell_width = $this->_progress['cell']['width'];
- $cell_height = $this->_progress['cell']['height'];
- $cell_spacing = $this->_progress['cell']['spacing'];
-
- $border_width = $this->_progress['border']['width'];
-
- $cell_count = $this->_cellCount;
-
- if ($this->getOrientation() == HTML_PROGRESS_BAR_HORIZONTAL) {
- $w = ($cell_count * ($cell_width + $cell_spacing)) + $cell_spacing;
- $h = $cell_height + (2 * $cell_spacing);
- }
- if ($this->getOrientation() == HTML_PROGRESS_BAR_VERTICAL) {
- $w = $cell_width + (2 * $cell_spacing);
- $h = ($cell_count * ($cell_height + $cell_spacing)) + $cell_spacing;
- }
- if ($this->getOrientation() == HTML_PROGRESS_POLYGONAL) {
- $w = $cell_width * $this->_xgrid;
- $h = $cell_height * $this->_ygrid;
- }
- if ($this->getOrientation() == HTML_PROGRESS_CIRCLE) {
- $w = $cell_width;
- $h = $cell_height;
- }
-
- $attr = array ('width' => $w, 'height' => $h);
-
- $this->_updateAttrArray($this->_progress['progress'], $attr);
- }
-
- /**
- * Computes all coordinates of a standard polygon (square or rectangle).
- *
- * @param integer $w Polygon width
- * @param integer $h Polygon height
- *
- * @return array
- * @since 1.2.0
- * @access private
- * @see setCellCoordinates()
- */
- function _computeCoordinates($w, $h)
- {
- $coord = array();
-
- for ($y=0; $y<$h; $y++) {
- if ($y == 0) {
- // creates top side line
- for ($x=0; $x<$w; $x++) {
- $coord[] = array($y, $x);
- }
- } elseif ($y == ($h-1)) {
- // creates bottom side line
- for ($x=($w-1); $x>0; $x--) {
- $coord[] = array($y, $x);
- }
- // creates left side line
- for ($i=($h-1); $i>0; $i--) {
- $coord[] = array($i, 0);
- }
- } else {
- // creates right side line
- $coord[] = array($y, $w - 1);
- }
- }
- return $coord;
- }
- }
-
- ?>