value) * @param boolean $restricted If true then no buttons will be displayed * @param integer $tabindex Start value of tabulator index for input fields * @param string $scope Account type * @return array List of input field names and their type (name => type) */ abstract function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope); /** * Returns the HTML attributes for the alignment. * * @return String alignment HTML attributes (e.g. align="right" valign="top") */ public function getAlignmentString() { $align = ''; if ($this->alignment !== null) { switch ($this->alignment) { case htmlElement::ALIGN_BOTTOM: $align = 'valign="bottom"'; break; case htmlElement::ALIGN_TOP: $align = 'valign="top"'; break; case htmlElement::ALIGN_LEFT: $align = 'align="left"'; break; case htmlElement::ALIGN_RIGHT: $align = 'align="right"'; break; case htmlElement::ALIGN_CENTER: $align = 'align="center"'; break; } } return $align; } /** * Returns the HTML attribute for the colspan. * * @return String colspan HTML attribute (e.g. colspan=3) */ public function getColspanString() { if ($this->colspan == null) { return ''; } else return 'colspan="' . $this->colspan . '"'; } /** * Returns the HTML attribute for the rowspan. * * @return String rowspan HTML attribute (e.g. rowspan=3) */ public function getRowspanString() { if ($this->rowspan == null) { return ''; } else return 'rowspan="' . $this->rowspan . '"'; } /** * Adds CSS classes to this element. * * @param array $classes CSS class names */ public function setCSSClasses($classes) { $this->cssClasses = $classes; } /** * Adds CSS classes to the surrounding table cell for this element. * * @param array $classes CSS class names */ public function setTableCellCSSClasses($classes) { $this->tableCellCssClasses = $classes; } /** * Returns the CSS classes of the surrounding table cell for this element. * * @return array CSS classes */ public function getTableCellCSSClasses() { return $this->tableCellCssClasses; } /** * Adds a data attribute. * * @param string $key attribute name (without "data-") * @param string $value attribute value */ public function addDataAttribute($key, $value) { $this->dataAttributes[$key] = $value; } /** * Returns the data attributes as rendered string. * * @return string data attributes */ protected function getDataAttributesAsString() { $result = ''; foreach ($this->dataAttributes as $key => $value) { $result .= ' data-' . htmlspecialchars($key) . '="' . htmlspecialchars($value) . '"'; } return $result; } } /** * Structures elements using a table. * * @package metaHTML */ class htmlTable extends htmlElement { /** table footer */ const footer = "\n"; /** new line */ const newLine = "
\n"; $types = array_merge($types, $this->cells[$i]->generateHTML($module, $input, $values, $restricted, $tabindex, $scope)); echo " | \n"; } echo "\n"; // print input field $return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope); // print help link if ($this->helpID != null) { echo "\n | \n\n";
$helpLink = new htmlHelpLink($this->helpID);
$helpLink->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
return $return;
}
}
/**
* Renders a help link.
*
* @package metaHTML
*/
class htmlHelpLink extends htmlElement {
/** help ID */
private $helpID;
/** module name if it should be forced */
private $module;
/** account type if it should be forced */
private $scope;
/**
* Constructor
*
* @param String $helpID help ID
* @param String $module module name (optional, only if value from generateHTML() should be overwritten)
* @param String $scope account type (e.g. user) (optional, only if value from generateHTML() should be overwritten)
*/
function __construct($helpID, $module = null, $scope = null) {
$this->helpID = $helpID;
$this->module = $module;
$this->scope = $scope;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
// overwrite module and scope if needed
if ($this->module != null) {
$module = $this->module;
}
if ($this->scope != null) {
$scope = $this->scope;
}
// print link
$helpEntry = getHelp($module, $this->helpID, $scope);
if (empty($helpEntry)) {
return array();
}
printHelpLink($helpEntry, $this->helpID, $module, $scope, $this->cssClasses);
return array();
}
}
/**
* Simple button.
*
* @package metaHTML
*/
class htmlButton extends htmlElement {
/** button name */
protected $name;
/** button text or image */
protected $value;
/** image button or text button */
protected $isImageButton;
/** title */
private $title = null;
/** enabled or disabled */
private $isEnabled = true;
/** icon class (CSS) for buttons with icon + text */
private $iconClass = null;
/** onclick event */
private $onClick = null;
/** button type (default: "submit" if no onClick and "button" with onClick) */
private $type = null;
/**
* Constructor.
*
* @param String $name button name
* @param String $value button text or image (16x16px, relative to graphics folder)
* @param String $isImageButton image or text button (default text)
*/
function __construct($name, $value, $isImageButton = false) {
$this->name = htmlspecialchars($name);
$this->value = htmlspecialchars($value);
$this->isImageButton = $isImageButton;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if ($restricted) {
// no buttons in restricted mode
logNewMessage(LOG_ERR, 'Meta HTML: Requested button in restricted mode.');
return array();
}
$fieldTabIndex = ' tabindex="' . $tabindex . '"';
$tabindex++;
$style = '';
$classList = $this->cssClasses;
$class = '';
$title = '';
$name = ' name="' . $this->name . '"';
// image button
if ($this->isImageButton) {
$classList[] = 'smallImageButton';
$classList[] = 'align-middle';
$style = ' style="background-image: url(../../graphics/' . $this->value . '); background-color: transparent;"';
}
// text button
elseif ($this->iconClass == null) {
$classList[] = 'smallPadding';
}
// button with text and icon
else {
$classList[] = 'margin5';
}
if (sizeof($classList) > 0) {
$class = ' class="' . implode(' ', $classList) . '"';
}
if ($this->title != null) {
$title = ' title="' . $this->title . '"';
}
$disabled = '';
if (!$this->isEnabled) {
$disabled = ' disabled';
}
if ($this->type == null) {
$type = ' type="submit"';
}
else {
$type = ' type="' . $this->type . '"';
}
$onClick = '';
if ($this->onClick != null) {
if ($this->type == null) {
$type = ' type="button"';
}
$onClick = ' onclick="' . $this->onClick . '"';
}
$id = ' id="btn_' . preg_replace('/[^a-zA-Z0-9_-]/', '', $this->name) . '"';
if ($this->isImageButton) {
echo '';
}
else {
echo '';
// text buttons get JQuery style
$icon = '';
if ($this->iconClass != null) {
$icon = '{ icons: { primary: \'' . $this->iconClass . '\' } }';
}
echo '';
}
return array($this->name => 'submit');
}
/**
* Sets the button title (tooltip).
*
* @param String $title title
*/
public function setTitle($title) {
$this->title = htmlspecialchars($title);
}
/**
* Specifies if this component is enabled and accepts user modification.
*
* @param boolean $isEnabled enabled if true
*/
public function setIsEnabled($isEnabled) {
$this->isEnabled = $isEnabled;
}
/**
* Sets an additional icon for a text button.
* The icon class is a CSS class that specifies the icon image (e.g. "deleteButton" in layout.css).
*
* @param String $iconClass icon class
*/
public function setIconClass($iconClass) {
$this->iconClass = htmlspecialchars($iconClass);
}
/**
* Sets the onclick event code.
* This makes this button a simple button that does not submit a form.
*
* @param String $onClick JS code
*/
public function setOnClick($onClick) {
$this->onClick = $onClick;
}
/**
* Allows to override the default button type ("submit" if no onClick and "button" with onClick).
*/
public function setType($type) {
$this->type = $type;
}
}
/**
* Prints a button for the account pages.
*
* @package metaHTML
*/
class htmlAccountPageButton extends htmlButton {
/**
* Constructor
*
* @param String $targetModule module name which renders next page
* @param String $targetPage name of next page
* @param String $identifier identifier for button
* @param String $value button text or image (16x16px, relative to graphics folder)
* @param String $isImageButton image or text button (default text)
* @param String $title title to show
*/
function __construct($targetModule, $targetPage, $identifier, $value, $isImageButton = false, $title = null) {
$this->name = htmlspecialchars('form_subpage_' . $targetModule . '_' . $targetPage . '_' . $identifier);
$this->value = $value;
$this->isImageButton = $isImageButton;
if ($title != null) {
$this->setTitle($title);
}
}
}
/**
* Represents a select box.
*
* @package metaHTML
*/
class htmlSelect extends htmlElement {
/** name of select field */
private $name;
/** size */
private $size;
/** allows multi-selection */
private $multiSelect = false;
/** elements */
private $elements;
/** selected elements */
private $selectedElements = array();
/** descriptive elements */
private $hasDescriptiveElements = false;
/** contains optgroups */
private $containsOptgroups = false;
/** sorting enabled */
private $sortElements = true;
/** right to left text direction */
private $rightToLeftTextDirection = false;
/** enabled or disabled */
private $isEnabled = true;
/** width of input element */
private $width = '';
/** transform select boxes with one element to text */
private $transformSingleSelect = true;
/** onchange event */
private $onchangeEvent = null;
/** indicates that this field should not automatically be saved in the self service or server profile */
private $transient = false;
/** list of enclosing table rows to hide when checked */
protected $tableRowsToHide = array();
/** list of enclosing table rows to show when checked */
protected $tableRowsToShow = array();
/**
* Constructor.
*
* Examples: * * $select = new htmlSelect('myName', array('value1', 'value2'), array('value1')); * * $select = new htmlSelect('myName', array('label1' => 'value1', 'label2' => 'value2'), array('value1')); * $select->setHasDescriptiveElements(true); * * $select = new htmlSelect('myName', array('optgroupLabel' => array('value1', 'value2')), array('value1')); * $select->setHasDescriptiveElements(true); * $select->setContainsOptgroups(true); * * @param String $name element name * @param array $elements list of elements array(label => value) or array(value1, value2) or array('optgroup' => array(...)) * @param array $selectedElements list of selected elements (optional, default none) * @param int $size size (optional, default = 1) */ function __construct($name, $elements, $selectedElements = array(), $size = 1) { $this->name = htmlspecialchars($name); $this->elements = $elements; if ($selectedElements != null) { $this->selectedElements = $selectedElements; } $this->size = htmlspecialchars($size); } /** * Prints the HTML code for this element. * * @param string $module Name of account module * @param array $input List of meta-HTML elements * @param array $values List of values which override the defaults in $input (name => value) * @param boolean $restricted If true then no buttons will be displayed * @param integer $tabindex Start value of tabulator index for input fields * @param string $scope Account type * @return array List of input field names and their type (name => type) */ function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) { $this->cssClasses[] = 'ui-corner-all'; if (isset($values[$this->name])) { $this->selectedElements = $values[$this->name]; } $multi = ''; $name = ' name="' . $this->name . '" id="' . $this->name . '"'; if ($this->multiSelect) { $multi = ' multiple'; $name = ' name="' . $this->name . '[]" id="' . $this->name . '"'; } $size = ' size="' . $this->size . '"'; $class = ''; $classList = $this->cssClasses; if ($this->rightToLeftTextDirection) { $classList[] = 'rightToLeftText'; } $class = ' class="' . implode(' ', $classList) . '"'; $disabled = ''; if (!$this->isEnabled) { $disabled = ' disabled'; } $style = ''; if ($this->width != '') { $style = ' style="width: ' . $this->width . '"'; } $onchange = ''; if ($this->onchangeEvent != null) { $onchange = $this->onchangeEvent; } if (($this->tableRowsToHide != null) || ($this->tableRowsToShow != null)) { $this->printCodeForShowHideTableRows($onchange); } if ($onchange != '') { $onchange = ' onchange="' . $onchange . '"'; } // hide select boxes that contain less than 2 elements if ((sizeof($this->elements) < 2) && !$this->multiSelect && $this->transformSingleSelect) { echo ' ';
}
// print select box
echo '\n";
// if select box has only one element then show it as text
if ((sizeof($this->elements) == 1) && !$this->multiSelect && $this->transformSingleSelect) {
echo ' ';
if ($this->hasDescriptiveElements) {
$keys = array_keys($this->elements);
echo $keys[0];
}
else {
echo $this->elements[0];
}
echo ' ';
}
elseif (sizeof($this->elements) == 0) {
echo '';
}
if ($this->transient) {
return array();
}
if ($this->multiSelect) {
return array($this->name => 'multiselect');
}
else {
return array($this->name => 'select');
}
}
/**
* Prints the HTML code of the option tags.
*
* @param array $elements list of options
*/
private function printOptionsHTML($elements) {
// sorting
if ($this->sortElements) {
if ($this->hasDescriptiveElements) {
$labels = array_keys($elements);
natcasesort($labels);
$newElements = array();
foreach ($labels as $label) {
$newElements[$label] = $elements[$label];
}
$elements = $newElements;
}
else {
natcasesort($elements);
}
}
foreach ($elements as $key => $value) {
$selected = '';
if ($this->hasDescriptiveElements) {
if (in_array($value, $this->selectedElements) || (empty($this->selectedElements) && empty($value))) {
$selected = ' selected';
}
echo "\n";
}
else {
if (in_array($value, $this->selectedElements) || (empty($this->selectedElements) && empty($value))) {
$selected = ' selected';
}
echo "\n";
}
}
}
/**
* Specifies if the elements are just a simple list or an assoziative array (default: simple list).
*
* @param boolean $hasDescriptiveElements activates descriptive elements
*/
public function setHasDescriptiveElements($hasDescriptiveElements) {
$this->hasDescriptiveElements = $hasDescriptiveElements;
}
/**
* Specifies if the elements are divided into optgroups.
* In this case the provided options are an array where the key is the optgroup label and the value is an array containing the options for the optgroup.
*
* @param boolean $containsOptgroups activates optgroups
*/
public function setContainsOptgroups($containsOptgroups) {
$this->containsOptgroups = $containsOptgroups;
}
/**
* Specifies if multi-selection is enabled (default: disabled).
*
* @param boolean $multiSelect allows multi-selection
*/
public function setMultiSelect($multiSelect) {
$this->multiSelect = $multiSelect;
}
/**
* Specifies if the elemets should be sorted (default: sort).
*
* @param boolean $sortElements sort elements
*/
public function setSortElements($sortElements) {
$this->sortElements = $sortElements;
}
/**
* Specifies if the text direction should be set to right to left.
*
* @param boolean $rightToLeftTextDirection if true use right to left direction
*/
public function setRightToLeftTextDirection($rightToLeftTextDirection) {
$this->rightToLeftTextDirection = $rightToLeftTextDirection;
}
/**
* Specifies if this component is enabled and accepts user modification.
*
* @param boolean $isEnabled enabled if true
*/
public function setIsEnabled($isEnabled) {
$this->isEnabled = $isEnabled;
}
/**
* Specifies the width of this selection box.
*
* @param String $width width (e.g. 20em)
*/
public function setWidth($width) {
$this->width = htmlspecialchars($width);
}
/**
* Specifies if select boxes that contain only a single element should be transformed to a simple text field.
*
* @param boolean $transformSingleSelect transform single options to text
*/
public function setTransformSingleSelect($transformSingleSelect) {
$this->transformSingleSelect = $transformSingleSelect;
}
/**
* Sets the JavaScript code for the onchange event.
*
* @param String $onchangeEvent onchange event code (e.g. myfunction();)
*/
public function setOnchangeEvent($onchangeEvent) {
$this->onchangeEvent = htmlspecialchars($onchangeEvent);
}
/**
* Specifies that the value should not be automatically saved when used in self service or server profile (default: false).
*
* @param boolean $transient transient field
*/
public function setTransient($transient) {
$this->transient = $transient;
}
/**
* This will hide the given table rows when the select is changed to the specified value.
* The given IDs can be of any e.g. input element. Starting from this element
* the first parent " |
\n"; $return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope); // print help link if ($this->helpID != null) { echo "\n | \n\n";
$helpLink = new htmlHelpLink($this->helpID);
$helpLink->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
return $return;
}
}
/**
* Represents a radio selection.
*
* @package metaHTML
*/
class htmlRadio extends htmlElement {
/** name of select field */
private $name;
/** elements */
private $elements;
/** selected element */
private $selectedElement = null;
/** enabled or disabled */
private $isEnabled = true;
/** on change code */
private $onchangeEvent = null;
/** list of enclosing table rows to hide when checked */
protected $tableRowsToHide = array();
/** list of enclosing table rows to show when checked */
protected $tableRowsToShow = array();
/**
* Constructor.
*
* Examples: * * $radio = new htmlRadio('myName', array('label1' => 'value1', 'label2' => 'value2'), array('value1')); * * @param String $name element name * @param array $elements list of elements array(label => value) * @param String $selectedElement value of selected element (optional, default none) */ function __construct($name, $elements, $selectedElement = null) { $this->name = htmlspecialchars($name); $this->elements = $elements; if ($selectedElement != null) { $this->selectedElement = $selectedElement; } } /** * Prints the HTML code for this element. * * @param string $module Name of account module * @param array $input List of meta-HTML elements * @param array $values List of values which override the defaults in $input (name => value) * @param boolean $restricted If true then no buttons will be displayed * @param integer $tabindex Start value of tabulator index for input fields * @param string $scope Account type * @return array List of input field names and their type (name => type) */ function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) { if (isset($values[$this->name][0])) { $this->selectedElement = $values[$this->name][0]; } $name = ' name="' . $this->name . '"'; $disabled = ''; if (!$this->isEnabled) { $disabled = ' disabled'; } if (($this->tableRowsToHide != null) || ($this->tableRowsToShow != null)) { $this->printInitialState(); } // print radio list $counter = 0; foreach ($this->elements as $label => $value) { $showHideOnchange = ''; if (($this->tableRowsToHide != null) || ($this->tableRowsToShow != null)) { $showHideOnchange = $this->getOnchangeCodeForShowHideTableRows($counter); } $onchange = ''; if ($this->onchangeEvent != null) { $onchange = ' onchange="' . $this->onchangeEvent . '"'; } elseif (!empty($showHideOnchange)) { $onchange = ' onchange="' . $showHideOnchange . '"'; } $onClick = 'onClick=" jQuery(\'input[name=' . $this->name . ']\').prop(\'checked\', false); jQuery(\'#' . $this->name . $counter . '\').prop(\'checked\', true); jQuery(\'#' . $this->name . $counter . '\').trigger(\'change\'); "'; if ($this->isEnabled === false) { $onClick = ''; } echo ' ';
$selected = '';
if ($value == $this->selectedElement) {
$selected = ' checked';
}
echo ' ' . $label;
echo ' ';
$tabindex++;
$counter++;
}
return array($this->name => 'select');
}
/**
* Specifies if this component is enabled and accepts user modification.
*
* @param boolean $isEnabled enabled if true
*/
public function setIsEnabled($isEnabled) {
$this->isEnabled = $isEnabled;
}
/**
* Sets the JavaScript code for the onchange event.
*
* @param String $onchangeEvent onchange event code (e.g. myfunction();)
*/
public function setOnchangeEvent($onchangeEvent) {
$this->onchangeEvent = htmlspecialchars($onchangeEvent);
}
/**
* Returns the selector to use to find the show/hide elements.
*
* @return string selector
*/
protected function getShowHideSelector() {
return 'tr';
}
/**
* Creates the JavaScript code to hide/show table rows based on the select value.
*
* @param int $counter index
* @return String onChange code
*/
private function getOnchangeCodeForShowHideTableRows($counter) {
$onChange = '';
if ((sizeof($this->tableRowsToHide) == 0) && (sizeof($this->tableRowsToShow) == 0)) {
return;
}
$values = array();
if (!empty($this->tableRowsToHide)) {
$values = array_merge($values, array_keys($this->tableRowsToHide));
}
if (!empty($this->tableRowsToShow)) {
$values = array_merge($values, array_keys($this->tableRowsToShow));
}
$values = array_unique($values);
$selector = $this->getShowHideSelector();
// build Java script to show/hide depending fields
foreach ($values as $val) {
// build onChange listener
$onChange .= 'if (jQuery(\'#' . $this->name . $counter . '\').val() == \'' . $val . '\') {';
if (isset($this->tableRowsToShow[$val])) {
for ($i = 0; $i < sizeof($this->tableRowsToShow[$val]); $i++) {
$onChange .= 'jQuery(\'#' . $this->tableRowsToShow[$val][$i] . '\').closest(\'' . $selector . '\').removeClass(\'hidden\');';
}
}
if (isset($this->tableRowsToHide[$val])) {
for ($i = 0; $i < sizeof($this->tableRowsToHide[$val]); $i++) {
$onChange .= 'jQuery(\'#' . $this->tableRowsToHide[$val][$i] . '\').closest(\'' . $selector . '\').addClass(\'hidden\');';
}
}
$onChange .= '};';
}
return $onChange;
}
private function printInitialState() {
$selector = $this->getShowHideSelector();
// build script to set initial state
$script = '';
echo $script;
}
/**
* This will hide the given table rows when the radio is changed to the specified value.
* The given IDs can be of any e.g. input element. Starting from this element
* the first parent " |
\n"; } $return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope); // print help link if ($this->helpID != null) { echo "\n | \n\n";
$helpLink = new htmlHelpLink($this->helpID);
$helpLink->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
return $return;
}
}
/**
* Prints the text and escapes contained HTML code by default.
*
* @package metaHTML
*/
class htmlOutputText extends htmlElement {
/** the text to print */
private $string;
/** specifies if HTML code should be escaped */
private $escapeHTML;
/** bold text */
private $isBold = false;
/** mark as required */
private $markAsRequired = false;
/** no wrap */
private $noWrap = false;
/** preformatted */
private $isPreformatted = false;
/**
* Constructor.
*
* @param String $string output text
* @param boolean $escapeHTML escape HTML code (default yes)
* @param boolean $markAsRequired mark text like a required field
*/
function __construct($string, $escapeHTML = true, $markAsRequired = false) {
$this->string = $string;
$this->escapeHTML = $escapeHTML;
$this->markAsRequired = $markAsRequired;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$cssClasses = empty($this->cssClasses) ? '' : 'class="' . implode(' ', $this->cssClasses) . '"';
if ($this->noWrap) {
echo " ";
}
if ($this->isBold) {
echo "";
}
if ($this->isPreformatted) {
echo " ";
}
return array();
}
/**
* Specifies if the whole text should be printed in bold.
*
* @param boolean $isBold bold text
*/
public function setIsBold($isBold) {
$this->isBold = $isBold;
}
/**
* Adds a marker that indicates a required field.
*
* @param boolean $markAsRequired add marker
*/
public function setMarkAsRequired($markAsRequired) {
$this->markAsRequired = $markAsRequired;
}
/**
* Specifies if word wrap is allowed for this text.
*
* @param boolean $noWrap no wrapping if set to true (default false)
*/
public function setNoWrap($noWrap) {
$this->noWrap = $noWrap;
}
/**
* Sets if the text is preformatted.
*
* @param boolean $preformatted is preformatted (default true)
*/
public function setPreformatted($preformatted = true) {
$this->isPreformatted = $preformatted;
}
}
/**
* Prints the HTML code for a checkbox.
*
* @package metaHTML
*/
class htmlInputCheckbox extends htmlElement {
/** unique name of input element */
protected $name;
/** value */
protected $checked;
/** enabled or disabled */
protected $isEnabled = true;
/** list of enclosing table rows to hide when checked */
protected $tableRowsToHide = array();
/** list of enclosing table rows to show when checked */
protected $tableRowsToShow = array();
/** indicates that this field should not automatically be saved in the self service or server profile */
private $transient = false;
/** list of input elements to enable when checked */
protected $elementsToEnable = array();
/** list of input elements to disable when checked */
protected $elementsToDisable = array();
/**
* Constructor.
*
* @param String $name unique name
* @param boolean $checked checked
*/
function __construct($name, $checked) {
$this->name = htmlspecialchars($name);
$this->checked = $checked;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if (isset($values[$this->name])) {
if ($values[$this->name][0] == 'true') {
$this->checked = true;
}
else {
$this->checked = false;
}
}
$checked = '';
if ($this->checked) {
$checked = ' checked';
}
$tabindexValue = ' tabindex="' . $tabindex . '"';
$tabindex++;
$disabled = '';
if (!$this->isEnabled) {
$disabled = ' disabled';
}
$classes = ' ';
if (!empty($this->cssClasses)) {
$classes = ' class="' . implode(' ', $this->cssClasses) . '"';
}
// build Java script to show/hide depending fields
$onChange = '';
$script = '';
$selector = $this->getShowHideSelector();
if ((sizeof($this->tableRowsToShow) > 0) || (sizeof($this->tableRowsToHide) > 0)) {
// build onChange listener
$onChange .= 'if (jQuery(\'#' . $this->name . ':checked\').val() !== undefined) {';
for ($i = 0; $i < sizeof($this->tableRowsToShow); $i++) {
$onChange .= 'jQuery(\'#' . $this->tableRowsToShow[$i] . '\').closest(\'' . $selector . '\').removeClass(\'hidden\');';
}
for ($i = 0; $i < sizeof($this->tableRowsToHide); $i++) {
$onChange .= 'jQuery(\'#' . $this->tableRowsToHide[$i] . '\').closest(\'' . $selector . '\').addClass(\'hidden\');';
}
$onChange .= '}';
$onChange .= 'else {';
for ($i = 0; $i < sizeof($this->tableRowsToShow); $i++) {
$onChange .= 'jQuery(\'#' . $this->tableRowsToShow[$i] . '\').closest(\'' . $selector . '\').addClass(\'hidden\');';
}
for ($i = 0; $i < sizeof($this->tableRowsToHide); $i++) {
$onChange .= 'jQuery(\'#' . $this->tableRowsToHide[$i] . '\').closest(\'' . $selector . '\').removeClass(\'hidden\');';
}
$onChange .= '};';
// build script to set initial state
$script = '';
}
// build Java script to enable/disable elements
if ((sizeof($this->elementsToEnable) > 0) || (sizeof($this->elementsToDisable) > 0)) {
// build onChange listener
$onChange .= 'if (jQuery(\'#' . $this->name . ':checked\').val() !== undefined) {';
for ($i = 0; $i < sizeof($this->elementsToEnable); $i++) {
$onChange .= 'jQuery(\'#' . $this->elementsToEnable[$i] . '\').prop(\'disabled\', false);';
}
for ($i = 0; $i < sizeof($this->elementsToDisable); $i++) {
$onChange .= 'jQuery(\'#' . $this->elementsToDisable[$i] . '\').prop(\'disabled\', true);';
}
$onChange .= '}';
$onChange .= 'else {';
for ($i = 0; $i < sizeof($this->elementsToEnable); $i++) {
$onChange .= 'jQuery(\'#' . $this->elementsToEnable[$i] . '\').prop(\'disabled\', true);';
}
for ($i = 0; $i < sizeof($this->elementsToDisable); $i++) {
$onChange .= 'jQuery(\'#' . $this->elementsToDisable[$i] . '\').prop(\'disabled\', false);';
}
$onChange .= '};';
// build script to set initial state
$script = '';
}
if (!empty($onChange)) {
$onChange = ' onChange="' . $onChange . '"';
}
echo '';
echo $script;
if ($this->transient) {
return array();
}
return array($this->name => 'checkbox');
}
/**
* Specifies if this component is enabled and accepts user modification.
*
* @param boolean $isEnabled enabled if true
*/
public function setIsEnabled($isEnabled) {
$this->isEnabled = $isEnabled;
}
/**
* This will hide the given table rows when the checkbox is checked.
* The given IDs can be of any e.g. input element. Starting from this element
* the first parent ""; } if ($this->escapeHTML) { echo htmlspecialchars($this->string); } else { echo $this->string; } if ($this->markAsRequired) { $graphicsPath = "../../graphics"; if (is_dir("../graphics")) $graphicsPath = "../graphics"; echo ''; } if ($this->isPreformatted) { echo ""; } if ($this->isBold) { echo ""; } if ($this->noWrap) { echo " |
\n"; $return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope); } else { $return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope); echo "\n | \n\n";
echo ' ';
echo $this->label;
echo ' ';
}
// print help link
if ($this->helpID != null) {
echo "\n | \n\n";
$helpLink = new htmlHelpLink($this->helpID);
$helpLink->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
return $return;
}
}
/**
* Checkbox with descriptive label and help link.
*
* @package metaHTML
*/
class htmlLabeledInputCheckbox extends htmlInputCheckbox {
/** descriptive label */
private $label;
/** help ID */
private $helpID;
/** specifies if label is printed before the checkbox */
private $labelFirst;
/**
* Constructor.
*
* @param String $name unique name
* @param boolean $checked checked
* @param String $label descriptive label
* @param String $helpID help ID
* @param boolean $labelFirst specifies if the label is at the beginning or at the end (optional, default beginning)
*/
function __construct($name, $checked, $label, $helpID = null, $labelFirst = true) {
parent::__construct($name, $checked);
$this->label = htmlspecialchars($label);
$this->helpID = $helpID;
$this->labelFirst = $labelFirst;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$onClick = 'onClick="jQuery(\'#' . $this->name . '\').prop(\'checked\',!jQuery(\'#' . $this->name . '\').prop(\'checked\')); jQuery(\'#' . $this->name . '\').change();"';
if ($this->labelFirst) {
echo '';
echo $this->label;
echo '';
$return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
else {
$return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
echo '';
echo $this->label;
echo '';
}
// print help link
if ($this->helpID != null) {
$helpLink = new htmlHelpLink($this->helpID);
$helpLink->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
return $return;
}
}
/**
* Prints the HTML code for a file upload field.
*
* @package metaHTML
*/
class htmlInputFileUpload extends htmlElement {
/** unique name of input element */
private $name;
/** enabled or disabled */
private $isEnabled = true;
/**
* Constructor.
*
* @param String $name unique name
*/
function __construct($name) {
$this->name = htmlspecialchars($name);
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$tabindexValue = ' tabindex="' . $tabindex . '"';
$tabindex++;
$disabled = '';
if (!$this->isEnabled) {
$disabled = ' disabled';
}
echo '';
return array($this->name => 'file');
}
/**
* Specifies if this component is enabled and accepts user modification.
*
* @param boolean $isEnabled enabled if true
*/
public function setIsEnabled($isEnabled) {
$this->isEnabled = $isEnabled;
}
}
/**
* File upload with descriptive label and help link.
*
* @package metaHTML
*/
class htmlTableExtendedInputFileUpload extends htmlInputFileUpload {
/** descriptive label */
private $label;
/** help ID */
private $helpID;
/**
* Constructor.
*
* @param String $name unique name
* @param String $label descriptive label
* @param String $helpID help ID
*/
function __construct($name, $label, $helpID = null) {
parent::__construct($name);
$this->label = htmlspecialchars($label);
$this->helpID = $helpID;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
echo ' ';
echo $this->label;
echo ' ';
echo "\n | \n\n"; $return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope); // print help link if ($this->helpID != null) { echo "\n | \n\n";
$helpLink = new htmlHelpLink($this->helpID);
$helpLink->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
return $return;
}
}
/**
* Prints the HTML code for a textarea.
*
* @package metaHTML
*/
class htmlInputTextarea extends htmlElement {
/** unique name of input element */
private $name;
/** value */
private $value;
/** column count */
private $colCount;
/** row count */
private $rowCount;
/** enabled or disabled */
private $isEnabled = true;
/** specifies if LAM should display this field whith a WYSIWYG editor */
protected $richEdit = false;
/**
* Constructor.
*
* @param String $name unique name
* @param String $value value
* @param int $colCount number of characters per line
* @param int $rowCount number of rows
*/
function __construct($name, $value, $colCount, $rowCount) {
$this->name = htmlspecialchars($name);
$this->value = htmlspecialchars($value);
$this->colCount = htmlspecialchars($colCount);
$this->rowCount = htmlspecialchars($rowCount);
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$this->cssClasses[] = 'ui-corner-all';
if (isset($values[$this->name])) {
$this->value = implode("\r\n", $values[$this->name]);
}
$colCount = ($this->colCount != null) ? ' cols="' . $this->colCount . '"' : '';
$rowCount = ($this->rowCount != null) ? ' rows="' . $this->rowCount . '"' : '';
$tabindexValue = ' tabindex="' . $tabindex . '"';
$tabindex++;
$disabled = '';
if (!$this->isEnabled) {
$disabled = ' disabled';
}
$classList = $this->cssClasses;
$classes = '';
if ($this->richEdit) {
$classList[] = 'ckeditor';
}
$classes = ' class="' . implode(' ', $classList) . '"';
echo '';
return array($this->name => 'textarea');
}
/**
* Specifies if this component is enabled and accepts user modification.
*
* @param boolean $isEnabled enabled if true
*/
public function setIsEnabled($isEnabled) {
$this->isEnabled = $isEnabled;
}
/**
* Specifies if the textarea should be displayed whith a WYSIWYG editor.
* This requires that the page which displays the textarea also includes the ckeditor JS. * Rich editing is disabled by default. * * @param boolean $richEdit rich edit or standard */ public function setIsRichEdit($richEdit) { $this->richEdit = $richEdit; } } /** * Text area with label and help link. * * @package metaHTML */ class htmlTableExtendedInputTextarea extends htmlInputTextarea { /** descriptive label */ private $label; /** help ID */ private $helpID; /** required field */ private $required = false; /** * Constructor. * * @param String $name unique name * @param String $value value * @param int $colCount number of characters per line * @param int $rowCount number of rows * @param String $label descriptive label * @param String $helpID help ID */ function __construct($name, $value, $colCount, $rowCount, $label, $helpID = null) { parent::__construct($name, $value, $colCount, $rowCount); $this->label = htmlspecialchars($label); $this->helpID = $helpID; $this->alignment = htmlElement::ALIGN_TOP; } /** * Prints the HTML code for this element. * * @param string $module Name of account module * @param array $input List of meta-HTML elements * @param array $values List of values which override the defaults in $input (name => value) * @param boolean $restricted If true then no buttons will be displayed * @param integer $tabindex Start value of tabulator index for input fields * @param string $scope Account type * @return array List of input field names and their type (name => type) */ function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) { echo ' ';
echo $this->label;
if ($this->required) {
$graphicsPath = "../../graphics";
if (is_dir("../graphics")) $graphicsPath = "../graphics";
echo '';
}
echo ' ';
echo "\n | \n\n"; $return = parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope); // print help link if ($this->helpID != null) { echo "\n | \n\n";
$helpLink = new htmlHelpLink($this->helpID);
$helpLink->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
return $return;
}
/**
* Specifies if this input field must be filled.
*
* @param boolean $required required or not
*/
public function setRequired($required) {
$this->required = $required;
}
}
/**
* Prints the HTML code for an image.
*
* @package metaHTML
*/
class htmlImage extends htmlElement {
/** path to image */
private $path;
/** width */
private $width;
/** height */
private $height;
/** alt text */
private $alt;
/** title */
private $title;
/** onClick event */
private $onClick = null;
/** enable cropping */
private $crop = false;
/**
* Constructor.
*
* @param String $path image location
* @param int $width image width (optional, default original size)
* @param int $height image height (optional, default original size)
* @param String $alt alt text (optional)
* @param String $onClick onClick code (optional)
*/
public function __construct($path, $width = null, $height = null, $alt = ' ', $title = null, $onClick = null) {
$this->path = htmlspecialchars($path);
$this->width = $width;
$this->height = $height;
$this->alt = htmlspecialchars($alt);
$this->title = $title;
$this->onClick = $onClick;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
public function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$path = ' src="' . $this->path . '"';
$width = '';
if ($this->width != null) {
$width = ' width="' . $this->width . '"';
}
$height = '';
if ($this->height != null) {
$height = ' height="' . $this->height . '"';
}
$alt = ' alt="' . $this->alt . '"';
$title = '';
if (!empty($this->title)) {
$title = ' title="' . $this->title . '"';
}
if ($this->crop) {
$this->cssClasses[] = 'cropperjsImage';
}
$classes = '';
if (!empty($this->cssClasses)) {
$classes = 'class="' . implode(' ', $this->cssClasses) . '"';
}
$onClick = '';
if ($this->onClick != null) {
$onClick = ' onclick="' . $this->onClick . '"';
}
echo '";
if ($this->crop) {
$cropJsPath = 'templates/lib/extra/cropperjs/cropper.js';
if (is_file('../../templates/login.php')) {
$cropJsPath = '../../' . $cropJsPath;
}
else {
$cropJsPath = '../' . $cropJsPath;
}
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
}
return array();
}
/**
* Enables cropping feature.
* This will display a cropping box on the image. The cropping data
* can be found in POST data (croppingDataX, croppingDataY, croppingDataWidth, croppingDataHeight).
*/
public function enableCropping() {
$this->crop = true;
}
}
/**
* Adds an empty space with given width and height.
*
* @package metaHTML
*/
class htmlSpacer extends htmlElement {
/** width of spacer in px */
private $width;
/** height of spacer in px */
private $height;
/**
* Constructor.
*
* @param String $width width (e.g. 10px)
* @param String $height height (e.g. 10px)
*/
function __construct($width, $height) {
$this->width = htmlspecialchars($width);
$this->height = htmlspecialchars($height);
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$width = '';
if ($this->width != null) {
$width = 'width: ' . $this->width . ';';
}
$height = '';
if ($this->height != null) {
$height = 'height: ' . $this->height . ';';
}
echo "\n";
return array();
}
}
/**
* Prints a status message (e.g. error message).
*
* @package metaHTML
*/
class htmlStatusMessage extends htmlElement {
/** message type (e.g. ERROR) */
private $type;
/** message title */
private $title;
/** message text */
private $text;
/** message parameters */
private $params;
/**
* Constructor.
*
* @param String $type message type (e.g. ERROR)
* @param String $title message title
* @param String $text message (optional)
* @param array $params additional message parameters
*/
function __construct($type, $title, $text = null, $params = null) {
$this->type = $type;
$this->title = $title;
$this->text = $text;
$this->params = $params;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
StatusMessage($this->type, $this->title, $this->text, $this->params);
return array();
}
}
/**
* Generates a fieldset.
*
* @package metaHTML
*/
class htmlFieldset extends htmlElement {
/** fieldset content */
private $content;
/** descriptive label */
private $label = null;
/** label image */
private $labelImage = null;
/**
* Constructor.
*
* @param htmlElement $content content to display inside fieldset
* @param String $label label
* @param String $labelImage image to put before label
*/
function __construct($content, $label = null, $labelImage = null) {
$this->content = $content;
$this->label = htmlspecialchars($label);
$this->labelImage = htmlspecialchars($labelImage);
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$classes = $this->cssClasses;
$classes[] = 'ui-corner-all';
if ($scope != null) {
$classes[] = $scope . '-border';
$classes[] = $scope . '-bright';
}
$class = implode(' ', $classes);
echo "\n";
return $return;
}
}
/**
* Generates a title line. This is used for page titles.
*
* @package metaHTML
*/
class htmlTitle extends htmlElement {
/** descriptive label */
private $label = null;
/**
* Constructor.
*
* @param String $label label
*/
function __construct($label) {
$this->label = htmlspecialchars($label);
// the title should not end at a table cell
$this->colspan = 100;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
echo " \n";
echo " \n";
return array();
}
}
/**
* Generates a subtitle line. This is used to group multiple fields.
*
* @package metaHTML
*/
class htmlSubTitle extends htmlElement {
/** descriptive label */
private $label = null;
/** optional image */
private $image = null;
/** optional ID for this element (e.g. to use for JavaScript) */
private $id = null;
/** show large icon */
private $largeIcon = false;
/** help ID */
private $helpId = null;
/**
* Constructor.
*
* @param String $label label
* @param String $image optional image
* @param String $id optional ID for this element (e.g. to use for JavaScript)
* @param bool $largeIcon show large (32x32px) icon instead of small one (16x16px)
*/
public function __construct($label, $image = null, $id = null, $largeIcon = false) {
$this->label = htmlspecialchars($label);
$this->image = htmlspecialchars($image);
$this->id = htmlspecialchars($id);
// the title should not end at a table cell
$this->colspan = 100;
$this->largeIcon = $largeIcon;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
public function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$idValue = '';
if ($this->id != null) {
$idValue = ' id="' . $this->id . '"';
}
echo "\n"; echo $this->label; echo "\n"; echo "\n";
echo " \n";
return array();
}
/**
* Sets an additional help id.
*
* @param string|array $helpId
*/
public function setHelpId($helpId) {
$this->helpId = $helpId;
}
}
/**
* Generates a hidden input field.
*
* @package metaHTML
*/
class htmlHiddenInput extends htmlElement {
/** field name */
private $name = null;
/** field value */
private $value = null;
/**
* Constructor.
*
* @param String $name input name
* @param String $value input value
*/
function __construct($name, $value) {
$this->name = htmlspecialchars($name);
$this->value = htmlspecialchars($value);
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
echo '';
return array($this->name => 'hidden');
}
}
/**
* Generates a link.
* The link can include an optional image in front of the link text.
*
* @package metaHTML
*/
class htmlLink extends htmlElement {
/** link text */
private $text = null;
/** link target */
protected $target = null;
/** optional image */
private $image = null;
/** title */
private $title = null;
/** target window */
private $targetWindow = null;
/** onClick event */
private $onClick = null;
/** show as button */
private $showAsButton = false;
/**
* Constructor.
*
* @param String $text label
* @param String $target target URL
* @param String $image URL of optional image
* @param boolean $showAsButton shows this like as a button
*/
function __construct($text, $target, $image = null, $showAsButton = false) {
$this->text = htmlspecialchars($text);
$this->target = htmlspecialchars($target);
$this->image = htmlspecialchars($image);
$this->showAsButton = $showAsButton;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$image = '';
if ($this->image != null) {
$image = ' ';
}
$title = '';
if ($this->title != null) {
$title = ' title="' . $this->title . '"';
}
$targetWindow = '';
if ($this->targetWindow != null) {
$targetWindow = ' target="' . $this->targetWindow . '"';
}
$onClick = '';
if ($this->onClick != null) {
$onClick = ' onclick="' . $this->onClick . '"';
}
$idAttr = '';
if ($this->showAsButton) {
$id = 'a_' . preg_replace('/[^a-zA-Z0-9_]+/', '_', $this->target);
$idAttr = ' id="' . $id . '"';
}
$classAttr = '';
if (sizeof($this->cssClasses) > 0) {
$classAttr = ' class="' . implode(' ', $this->cssClasses) . '"';
}
echo '' . $image . $this->getContent() . '';
if ($this->showAsButton) {
echo '';
}
return array();
}
/**
* Returns the value for the alt attribute.
*
* @return string alt value
*/
protected function getAlt() {
return $this->text;
}
/**
* Returns the value for the link content.
*
* @return string content
*/
protected function getContent() {
return $this->text;
}
/**
* Sets the link title.
*
* @param String $title title
*/
public function setTitle($title) {
$this->title = htmlspecialchars($title);
}
/**
* Sets the target window (e.g. _blank).
*
* @param String $window target window (e.g. _blank)
*/
public function setTargetWindow($window) {
$this->targetWindow = htmlspecialchars($window);
}
/**
* Sets the onClick event.
*
* @param String $event JavaScript code
*/
public function setOnClick($event) {
$this->onClick = htmlspecialchars($event);
}
}
/**
* Generates a link arround a htmlElement.
*
* @package metaHTML
*/
class htmlContentLink extends htmlLink {
private $content = null;
private $contentText = '';
/**
* Constructor
*
* @param htmlElement $content content to link
* @param String $target link target
* @param boolean $highlightOnHover higlight content on hover
*/
function __construct($content, $target) {
$this->content = $content;
$this->target = htmlspecialchars($target);
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
ob_start();
parseHtml($module, $this->content, $values, $restricted, $tabindex, $scope);
$this->contentText = ob_get_contents();
ob_end_clean();
return parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
/**
* Returns the value for the alt attribute.
*
* @return string alt value
*/
protected function getAlt() {
return '';
}
/**
* Returns the value for the link content.
*
* @return string content
*/
protected function getContent() {
return $this->contentText;
}
}
/**
* Groups multiple htmlElements.
* This is useful if multiple elements should be included in a single table cell.
* The HTML code of the subelements is printed in the order they were added. No additional code is added.
*
* @package metaHTML
*/
class htmlGroup extends htmlElement {
/** link text */
private $subelements = array();
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$return = array();
for ($i = 0; $i < sizeof($this->subelements); $i++) {
$return = array_merge($return, $this->subelements[$i]->generateHTML($module, $input, $values, $restricted, $tabindex, $scope));
}
return $return;
}
/**
* Adds a subelement.
*
* @param htmlElement $sub subelement
*/
public function addElement($sub) {
$this->subelements[] = $sub;
}
}
/**
* Prints a horizontal line.
*
* @package metaHTML
*/
class htmlHorizontalLine extends htmlElement {
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$return = array();
echo "\n"; if ($this->image != null) { $size = $this->largeIcon ? 32 : 16; echo ' '; } echo $this->label; if ($this->helpId !== null) { $spacer = new htmlSpacer('0.5rem', null); $spacer->generateHTML($module, $input, $values, $restricted, $tabindex, $scope); $helpLink = new htmlHelpLink($this->helpId); $helpLink->generateHTML($module, $input, $values, $restricted, $tabindex, $scope); } echo "\n"; echo ""; return $return; } } /** * Creates a simple DIV element. * * @package metaHTML */ class htmlDiv extends htmlElement { /** unique ID */ private $id = null; /** htmlElement that generates inner content */ private $content = null; /** * Constructor. * * @param String $id unique ID * @param htmlElement $content inner content * @param array $classes CSS classes * @param string[] $cssClasses CSS classes */ function __construct($id, $content, $cssClasses = null) { $this->id = htmlspecialchars($id); $this->content = $content; $this->cssClasses = $cssClasses; } /** * Prints the HTML code for this element. * * @param string $module Name of account module * @param array $input List of meta-HTML elements * @param array $values List of values which override the defaults in $input (name => value) * @param boolean $restricted If true then no buttons will be displayed * @param integer $tabindex Start value of tabulator index for input fields * @param string $scope Account type * @return array List of input field names and their type (name => type) */ function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) { $return = array(); $idValue = ''; if ($this->id != null) { $idValue = ' id="' . $this->id . '"'; } $classesValue = ''; if (($this->cssClasses != null) && (sizeof($this->cssClasses) > 0)) { $classesValue = ' class="' . implode(' ', $this->cssClasses) . '"'; } echo ' ';
if ($this->content != null) {
$return = $this->content->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
echo ' ';
return $return;
}
}
/**
* Creates a simple SPAN element.
*
* @package metaHTML
*/
class htmlSpan extends htmlElement {
/** htmlElement that generates inner content */
private $content = null;
/**
* Constructor.
*
* @param htmlElement $content inner content
* @param array $classes CSS classes
* @param string[] $cssClasses CSS classes
*/
function __construct($content, $cssClasses = null) {
$this->content = $content;
$this->cssClasses = $cssClasses;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$return = array();
$classesValue = '';
if (($this->cssClasses != null) && (sizeof($this->cssClasses) > 0)) {
$classesValue = ' class="' . implode(' ', $this->cssClasses) . '"';
}
echo '';
if ($this->content != null) {
$return = $this->content->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
echo '';
return $return;
}
}
/**
* Creates a JavaScript element.
*
* @package metaHTML
*/
class htmlJavaScript extends htmlElement {
/** htmlElement that generates inner content */
private $content = null;
/**
* Constructor.
*
* @param String $content script
*/
function __construct($content) {
$this->content = $content;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$return = array();
echo '';
return $return;
}
}
/**
* Creates a Script element to integrate external JavaScript files.
*
* @package metaHTML
*/
class htmlScript extends htmlElement {
/** src value */
private $src = null;
/** is async */
private $async = false;
/** execute after page is parsed */
private $defer = false;
/**
* Constructor.
*
* @param String $src script path
* @param boolean $isAsync script will be executed while the page continues the parsing (default true)
* @param boolean $isDeferred script is executed when the page has finished parsing (default true)
*/
function __construct($src, $isAsync = true, $isDeferred = true) {
$this->src = $src;
$this->async = $isAsync;
$this->defer = $isDeferred;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$return = array();
$async = $this->async ? ' async' : '';
$defer = $this->defer ? ' defer="defer"' : '';
echo '';
return $return;
}
}
/**
* Sets all given elements to the same width.
*
* @package metaHTML
*/
class htmlEqualWidth extends htmlElement {
/** list of element IDs */
private $elements = array();
/**
* Constructor.
*
* @param array $elements list of element IDs
*/
function __construct($elements) {
foreach ($elements as $element) {
$this->elements[] = htmlspecialchars($element);
}
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if (sizeof($this->elements) == 0) {
return array();
}
$return = array();
$listContent = "'#" . $this->elements[0] . "'";
for ($i = 1; $i < sizeof($this->elements); $i++) {
$listContent .= ", '#" . $this->elements[$i] . "'";
}
echo '';
return $return;
}
}
/**
* Sets all given elements to the same height.
*
* @package metaHTML
*/
class htmlEqualHeight extends htmlElement {
/** list of element IDs */
private $elements = array();
/**
* Constructor.
*
* @param array $elements list of element IDs
*/
function __construct($elements) {
foreach ($elements as $element) {
$this->elements[] = htmlspecialchars($element);
}
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if (sizeof($this->elements) == 0) {
return array();
}
$return = array();
$listContent = "'#" . $this->elements[0] . "'";
for ($i = 1; $i < sizeof($this->elements); $i++) {
$listContent .= ", '#" . $this->elements[$i] . "'";
}
echo '';
return $return;
}
}
/**
* Creates a list of elements that can be sorted by the user via drag'n'drop.
*
* @package metaHTML
*/
class htmlSortableList extends htmlElement {
/** list of elements */
private $elements = array();
/** HTML ID */
private $id = '';
/** element width */
private $elementWidth = '';
/** on update event */
private $onUpdate = null;
/**
* Constructor.
*
* @param array $elements list of elements as text (HTML special chars must be escaped already) or htmlElement
* @param String HTML ID
* @param String $elementWidth width of elements (default 250px)
*/
function __construct($elements, $id, $elementWidth='250px') {
$this->elements = $elements;
$this->id = htmlspecialchars($id);
$this->elementWidth = $elementWidth;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if (sizeof($this->elements) == 0) {
return array();
}
$return = array();
echo '
';
foreach ($this->elements as $label => $content) {
echo ' ';
$script = 'jQuery(function() {
$( "#' . $this->id . '" ).accordion({
collapsible: ' . $collapsible . ',
active: ' . $active . '
});
});';
$js = new htmlJavaScript($script);
$js->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
return $result;
}
}
/**
* Creates a Google reCAPTCHA element.
*
* @package metaHTML
*/
class htmlReCAPTCHA extends htmlElement {
/** site key */
private $key = null;
/**
* Constructor.
*
* @param String $key site key
*/
function __construct($key) {
$this->key = htmlspecialchars($key);
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$script = new htmlScript('https://www.google.com/recaptcha/api.js');
$script->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
echo '';
return array();
}
}
/**
* Responsive row with 12 column layout.
*/
class htmlResponsiveRow extends htmlElement {
/** @var htmlResponsiveCell[] cells */
private $cells = array();
/** HTML ID */
private $id = null;
/**
* Creates a new responsive row.
*
* @param htmlElement $label label element if this is a simple label+field row
* @param htmlElement $field field element if this is a simple label+field row
*/
public function __construct($label = null, $field = null) {
$this->cells = array();
if ($label != null) {
$this->addLabel($label);
}
if ($field != null) {
$this->addField($field);
}
}
/**
* Sets the HTML id.
*
* @param string $id ID
*/
public function setId($id) {
$this->id = $id;
}
/**
* Adds a responsive cell to the row.
*
* @param htmlResponsiveCell $cell cell
*/
public function addCell($cell) {
$this->cells[] = $cell;
}
/**
* Adds a cell with the given content and column counts.
*
* @param htmlElement $content content inside cell
* @param int $numMobile number of columns for mobile view
* @param int $numTablet number of columns for tablet view (set to mobile if null)
* @param int $numDesktop number of columns for desktop view (set to tablet if null)
* @param String $classes CSS classes separated by space
*/
public function add($content, $numMobile, $numTablet = null, $numDesktop = null, $classes = '') {
$tabletCols = ($numTablet === null) ? $numMobile : $numTablet;
$desktopCols = ($numDesktop === null) ? $tabletCols : $numDesktop;
$this->addCell(new htmlResponsiveCell($content, $numMobile, $tabletCols, $desktopCols, $classes));
}
/**
* Adds the content as a typical label with 12/6/6 columns and CSS class "responsiveLabel".
*
* @param htmlElement $content label
* @param string $cssClasses additional CSS classes
*/
public function addLabel($content, $cssClasses = '') {
$this->add($content, 12, 6, 6, 'responsiveLabel nowrap ' . $cssClasses);
}
/**
* Adds the content as a typical field with 12/6/6 columns and CSS class "responsiveField".
*
* @param htmlElement $content field
* @param string $cssClasses CSS class names separated by space
*/
public function addField($content, $cssClasses = '') {
$this->add($content, 12, 6, 6, 'responsiveField ' . $cssClasses);
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
public function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$return = array();
$cssClasses = implode(' ', $this->cssClasses);
$idParam = '';
if ($this->id !== null) {
$idParam = ' id="' . $this->id . '"';
}
echo '' . $label . ''; echo '';
$result = array_merge($result, $content->generateHTML($module, $input, $values, $restricted, $tabindex, $scope));
echo ' ';
}
echo '';
foreach ($this->cells as $cell) {
$return = array_merge($return, $cell->generateHTML($module, $input, $values, $restricted, $tabindex, $scope));
}
echo ' ';
return $return;
}
/**
* Adds a vertical spacer with 12 columns.
*
* @param string $space space in px or rem
*/
public function addVerticalSpacer($space) {
$this->add(new htmlSpacer(null, $space), 12);
}
}
/**
* Responsive cell inside htmlResponsiveRow with 12 column layout.
*/
class htmlResponsiveCell extends htmlElement {
private $content = null;
private $mobile = null;
private $tablet = null;
private $desktop = null;
private $classes = '';
/**
* Constructs a cell inside a responsive row with 12 columns.
*
* @param htmlElement $content content inside cell
* @param int $numMobile number of columns for mobile view
* @param int $numTablet number of columns for tablet view
* @param int $numDesktop number of columns for desktop view
* @param String $classes CSS classes separated by space
*/
public function __construct($content, $numMobile, $numTablet, $numDesktop, $classes = '') {
$this->content = $content;
$this->mobile = $numMobile;
$this->tablet = $numTablet;
$this->desktop = $numDesktop;
$this->classes = $classes;
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
public function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$clMobile = ($this->mobile > 0) ? 'small-' . $this->mobile : 'hide-for-small-only';
$clTablet = ($this->tablet > 0) ? 'medium-' . $this->tablet : 'hide-for-medium-only';
$clDesktop = ($this->desktop > 0) ? 'large-' . $this->desktop : 'hide-for-large-only';
echo '';
$return = $this->content->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
echo ' ';
return $return;
}
}
/**
* A responsive input field that combines label, input field and help.
*
* @package metaHTML
*/
class htmlResponsiveInputField extends htmlInputField {
/** Descriptive label */
private $label;
/** help ID */
private $helpID;
/** help module name */
private $helpModule = null;
/** render HTML of parent class */
private $renderParentHtml = false;
/**
* Constructor
*
* @param String $label descriptive label
* @param String $fieldName unique field name
* @param String $fieldValue value of input field (optional)
* @param String|array $helpID help ID or array of help ID + module name (optional)
* @param bool $required field is required
*/
function __construct($label, $fieldName, $fieldValue = null, $helpID = null, $required = false) {
parent::__construct($fieldName, $fieldValue);
$this->label = $label;
if (is_string($helpID)) {
$this->helpID = $helpID;
}
elseif (is_array($helpID)) {
$this->helpID = $helpID[0];
$this->helpModule = $helpID[1];
}
$this->fieldSize = null;
$this->required = $required;
}
/**
* {@inheritDoc}
* @see htmlInputField::generateHTML()
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if ($this->renderParentHtml) {
return parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
// HTML of parent class is rendered on second call (done by htmlResponsiveRow)
$this->renderParentHtml = true;
$row = new htmlResponsiveRow();
// label text
$labelGroup = new htmlGroup();
$labelGroup->addElement(new htmlOutputText($this->label));
if ($this->required) {
$graphicsPath = "../../graphics";
if (is_dir("../graphics")) $graphicsPath = "../graphics";
$labelGroup->addElement(new htmlImage($graphicsPath . '/required.png', 16, 16, _('required'), _('required')));
}
if (!empty($this->helpID)) {
$helpLinkLabel = new htmlHelpLink($this->helpID, $this->helpModule);
$helpLinkLabel->setCSSClasses(array('hide-on-tablet', 'margin-left5'));
$labelGroup->addElement($helpLinkLabel);
}
$row->add($labelGroup, 12, 6, 6, 'responsiveLabel');
// input field
$fieldGroup = new htmlGroup();
$fieldGroup->addElement($this);
if (!empty($this->helpID)) {
$helpLinkField = new htmlHelpLink($this->helpID, $this->helpModule);
$helpLinkField->setCSSClasses(array('hide-on-mobile'));
$fieldGroup->addElement($helpLinkField);
}
$row->add($fieldGroup, 12, 6, 6, 'responsiveField nowrap');
return $row->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
}
/**
* File upload with descriptive label and help link.
*
* @package metaHTML
*/
class htmlResponsiveInputFileUpload extends htmlInputFileUpload {
/** descriptive label */
private $label;
/** help ID */
private $helpID;
/** help module */
private $helpModule = null;
/** render HTML of parent class */
private $renderParentHtml = false;
/**
* Constructor.
*
* @param String $name unique name
* @param String $label descriptive label
* @param String $helpID help ID
*/
function __construct($name, $label, $helpID = null) {
parent::__construct($name);
$this->label = htmlspecialchars($label);
if (is_string($helpID)) {
$this->helpID = $helpID;
}
elseif (is_array($helpID)) {
$this->helpID = $helpID[0];
$this->helpModule = $helpID[1];
}
}
/**
* Prints the HTML code for this element.
*
* @param string $module Name of account module
* @param array $input List of meta-HTML elements
* @param array $values List of values which override the defaults in $input (name => value)
* @param boolean $restricted If true then no buttons will be displayed
* @param integer $tabindex Start value of tabulator index for input fields
* @param string $scope Account type
* @return array List of input field names and their type (name => type)
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if ($this->renderParentHtml) {
return parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
// HTML of parent class is rendered on second call (done by htmlResponsiveRow)
$this->renderParentHtml = true;
$row = new htmlResponsiveRow();
// label text
$labelGroup = new htmlGroup();
$labelGroup->addElement(new htmlOutputText($this->label));
if (!empty($this->helpID)) {
$helpLinkLabel = new htmlHelpLink($this->helpID, $this->helpModule);
$helpLinkLabel->setCSSClasses(array('hide-on-tablet', 'margin-left5'));
$labelGroup->addElement($helpLinkLabel);
}
$row->add($labelGroup, 12, 6, 6, 'responsiveLabel');
// input field
$fieldGroup = new htmlGroup();
$fieldGroup->addElement($this);
if (!empty($this->helpID)) {
$helpLinkField = new htmlHelpLink($this->helpID, $this->helpModule);
$helpLinkField->setCSSClasses(array('hide-on-mobile'));
$fieldGroup->addElement($helpLinkField);
}
$row->add($fieldGroup, 12, 6, 6, 'responsiveField nowrap');
return $row->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
}
/**
* Responsive text area with label and help link.
*
* @package metaHTML
*/
class htmlResponsiveInputTextarea extends htmlInputTextarea {
/** descriptive label */
private $label;
/** help ID */
private $helpID;
/** help module */
private $helpModule = null;
/** required field */
private $required = false;
/** render HTML of parent class */
private $renderParentHtml = false;
/**
* Constructor.
*
* @param String $name unique name
* @param String $value value
* @param int $colCount number of characters per line
* @param int $rowCount number of rows
* @param String $label descriptive label
* @param String|array $helpID help ID
*/
function __construct($name, $value, $colCount, $rowCount, $label, $helpID = null) {
parent::__construct($name, $value, $colCount, $rowCount);
$this->label = htmlspecialchars($label);
if (is_string($helpID)) {
$this->helpID = $helpID;
}
elseif (is_array($helpID)) {
$this->helpID = $helpID[0];
$this->helpModule = $helpID[1];
}
$this->alignment = htmlElement::ALIGN_TOP;
}
/**
* {@inheritDoc}
* @see htmlInputField::generateHTML()
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if ($this->renderParentHtml) {
return parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
// HTML of parent class is rendered on second call (done by htmlResponsiveRow)
$this->renderParentHtml = true;
$row = new htmlResponsiveRow();
// label text
$labelGroup = new htmlGroup();
$labelGroup->addElement(new htmlOutputText($this->label));
if ($this->required) {
$graphicsPath = "../../graphics";
if (is_dir("../graphics")) $graphicsPath = "../graphics";
$labelGroup->addElement(new htmlImage($graphicsPath . '/required.png', 16, 16, _('required'), _('required')));
}
if (!empty($this->helpID)) {
$helpLinkLabel = new htmlHelpLink($this->helpID, $this->helpModule);
$helpCssClasses = array('margin-left5');
if (!$this->richEdit) {
$helpCssClasses[] = 'hide-on-tablet';
}
$helpLinkLabel->setCSSClasses($helpCssClasses);
$labelGroup->addElement($helpLinkLabel);
}
$row->add($labelGroup, 12, 6, 6, 'responsiveLabel');
// input field
$fieldGroup = new htmlGroup();
$fieldGroup->addElement($this);
if (!empty($this->helpID) && !$this->richEdit) {
$helpLink = new htmlHelpLink($this->helpID, $this->helpModule);
$helpLink->setCSSClasses(array('align-top', 'hide-on-mobile'));
$fieldGroup->addElement($helpLink);
}
$row->add($fieldGroup, 12, 6, 6, 'responsiveField nowrap');
return $row->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
/**
* Specifies if this input field must be filled.
*
* @param boolean $required required or not
*/
public function setRequired($required = true) {
$this->required = $required;
}
}
/**
* Responsive select with label and help link.
*
* @package metaHTML
*/
class htmlResponsiveSelect extends htmlSelect {
/** descriptive label */
private $label;
/** help ID */
private $helpID;
/** help module name */
private $helpModule = null;
/** render HTML of parent class */
private $renderParentHtml = false;
/**
* Constructor.
*
* @param String $name element name
* @param array $elements list of elememts
* @param array $selectedElements list of selected elements
* @param String $label descriptive label
* @param String|array $helpID help ID or array of help ID + module name (optional)
* @param int $size size (optional, default = 1)
*/
function __construct($name, $elements, $selectedElements, $label, $helpID = null, $size = 1) {
parent::__construct($name, $elements, $selectedElements, $size);
$this->label = $label;
if (is_string($helpID)) {
$this->helpID = $helpID;
}
elseif (is_array($helpID)) {
$this->helpID = $helpID[0];
$this->helpModule = $helpID[1];
}
}
/**
* {@inheritDoc}
* @see htmlInputField::generateHTML()
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if ($this->renderParentHtml) {
return parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
// HTML of parent class is rendered on second call (done by htmlResponsiveRow)
$this->renderParentHtml = true;
$row = new htmlResponsiveRow();
// label text
$labelGroup = new htmlGroup();
$labelGroup->addElement(new htmlOutputText($this->label));
if (!empty($this->helpID)) {
$helpLinkLabel = new htmlHelpLink($this->helpID, $this->helpModule);
$helpLinkLabel->setCSSClasses(array('hide-on-tablet', 'margin-left5'));
$labelGroup->addElement($helpLinkLabel);
}
$row->add($labelGroup, 12, 6, 6, 'responsiveLabel');
// input field
$fieldGroup = new htmlGroup();
$fieldGroup->addElement($this);
if (!empty($this->helpID)) {
$helpLink = new htmlHelpLink($this->helpID, $this->helpModule);
$helpLink->setCSSClasses(array('hide-on-mobile'));
$fieldGroup->addElement($helpLink);
}
$row->add($fieldGroup, 12, 6, 6, 'responsiveField nowrap');
return $row->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
/**
* {@inheritDoc}
* @see htmlSelect::getShowHideSelector()
*/
protected function getShowHideSelector() {
return '.row';
}
}
/**
* Responsive select with label and help link.
*
* @package metaHTML
*/
class htmlResponsiveRadio extends htmlRadio {
/** descriptive label */
private $label;
/** help ID */
private $helpID;
/** render HTML of parent class */
private $renderParentHtml = false;
/**
* Constructor.
*
* @param String $name element name
* @param array $elements list of elememts
* @param array $selectedElements list of selected elements
* @param String $label descriptive label
* @param String $helpID help ID (optional, default none)
* @param int $size size (optional, default = 1)
*/
function __construct($label, $name, $elements, $selectedElement = null, $helpID = null) {
parent::__construct($name, $elements, $selectedElement);
$this->label = htmlspecialchars($label);
$this->helpID = $helpID;
}
/**
* {@inheritDoc}
* @see htmlInputField::generateHTML()
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if ($this->renderParentHtml) {
return parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
// HTML of parent class is rendered on second call (done by htmlResponsiveRow)
$this->renderParentHtml = true;
$row = new htmlResponsiveRow();
// label text
$labelGroup = new htmlGroup();
$labelGroup->addElement(new htmlOutputText($this->label));
if (!empty($this->helpID)) {
$helpLinkLabel = new htmlHelpLink($this->helpID);
$helpLinkLabel->setCSSClasses(array('hide-on-tablet', 'margin-left5'));
$labelGroup->addElement($helpLinkLabel);
}
$row->add($labelGroup, 12, 6, 6, 'responsiveLabel');
// input field
$fieldGroup = new htmlGroup();
$fieldGroup->addElement(new htmlDiv(null, $this, array('float-left')));
if (!empty($this->helpID)) {
$helpLink = new htmlHelpLink($this->helpID);
$helpLink->setCSSClasses(array('hide-on-mobile'));
$fieldGroup->addElement(new htmlDiv(null, $helpLink));
}
$row->add($fieldGroup, 12, 6, 6, 'responsiveField nowrap');
return $row->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
/**
* Returns the selector to use to find the show/hide elements.
*
* @return string selector
*/
protected function getShowHideSelector() {
return '.row';
}
}
/**
* Responsive checkbox with descriptive label and help link.
*
* @package metaHTML
*/
class htmlResponsiveInputCheckbox extends htmlInputCheckbox {
/** descriptive label */
private $label;
/** help ID */
private $helpID;
/** help module name */
private $helpModule = null;
/** render HTML of parent class */
private $renderParentHtml = false;
/** long label */
private $longLabel = false;
/**
* Constructor.
*
* @param String $name unique name
* @param boolean $checked checked
* @param String $label descriptive label
* @param String|array $helpID help ID or array of help ID + module name (optional)
* @param bool $longLabel more space for label (default: false)
*/
function __construct($name, $checked, $label, $helpID = null, $longLabel = false) {
parent::__construct($name, $checked);
$this->label = $label;
if (is_string($helpID)) {
$this->helpID = $helpID;
}
elseif (is_array($helpID)) {
$this->helpID = $helpID[0];
$this->helpModule = $helpID[1];
}
$this->longLabel = $longLabel;
}
/**
* {@inheritDoc}
* @see htmlInputField::generateHTML()
*/
function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
if ($this->renderParentHtml) {
return parent::generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
// HTML of parent class is rendered on second call (done by htmlResponsiveRow)
$this->renderParentHtml = true;
$row = new htmlResponsiveRow();
$tabletColumnsLabel = 6;
$tabletColumnsBox = 6;
if ($this->longLabel) {
$tabletColumnsLabel = 10;
$tabletColumnsBox = 2;
}
// label text
$labelGroup = new htmlGroup();
$labelGroup->addElement(new htmlOutputText($this->label));
$row->add($labelGroup, 10, $tabletColumnsLabel, $tabletColumnsLabel, 'responsiveLabel');
// input field
$fieldGroup = new htmlGroup();
$fieldGroup->addElement($this);
if (!empty($this->helpID)) {
$helpLink = new htmlHelpLink($this->helpID, $this->helpModule);
$helpLink->setCSSClasses(array('margin-left5 align-unset-img'));
$fieldGroup->addElement($helpLink);
}
$row->add($fieldGroup, 2, $tabletColumnsBox, $tabletColumnsBox, 'responsiveField nowrap');
return $row->generateHTML($module, $input, $values, $restricted, $tabindex, $scope);
}
/**
* {@inheritDoc}
* @see htmlInputCheckbox::getShowHideSelector()
*/
protected function getShowHideSelector() {
return '.row';
}
}
/**
* Responsive table.
*
* @author roland Gruber
*/
class htmlResponsiveTable extends htmlElement {
/** @var string[] row titles */
private $titles;
/** htmlElement[][] data rows */
private $data;
/** widthes of the columns */
private $widths = array();
/** highlighted rows */
private $highlighted = array();
/**
* Creates the table.
*
* @param string[] $titles row titles
* @param htmlElement[][] $data data rows
* @param int[] $highlighted list of row numbers that should be highlighted (starting at 0)
*/
public function __construct($titles, $data, $highlighted = null) {
$this->titles = $titles;
$this->data = $data;
if (!empty($highlighted) && is_array($highlighted)) {
$this->highlighted = $highlighted;
}
}
/**
* {@inheritDoc}
* @see htmlElement::generateHTML()
*/
public function generateHTML($module, $input, $values, $restricted, &$tabindex, $scope) {
$return = array();
$classes = $this->cssClasses;
$classes[] = 'responsive-table';
echo '
|