<?php
namespace TYPO3\CMS\Aboutmodules\Utility;

/***************************************************************
 *  Copyright notice
 *
 *  (c) 1999-2009 Kasper Skårhøj (kasperYYYY@typo3.com)
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *  A copy is found in the textfile GPL.txt and important notices to the license
 *  from the author is found in LICENSE.txt distributed with these scripts.
 *
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/
/**
 * This class is deprecated and unmaintained. It was once used to render the main
 * menus of the backend for alt_main.php and friends, but is unused now.
 *
 * Class for generation of the module menu.
 * Will make the vertical, horizontal, selectorbox based menus AND the "about modules" display.
 * Basically it traverses the module structure and generates output based on that.
 *
 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
 * @deprecated since 4.7, will be removed in 6.1
 */
class FunctionsUtility {

	// Internal
	/**
	 * @todo Define visibility
	 */
	public $fsMod = array();

	/**
	 * Default constructor throws deprecation warning
	 */
	public function __construct() {
		\TYPO3\CMS\Core\Utility\GeneralUtility::deprecationLog('class TYPO3\\CMS\\Aboutmodules\\Utility\\FunctionsUtility is deprecated, unused in core since 4.3 and unmaintained. It will be removed in 6.1.');
	}

	/**
	 * Creates the menu of modules.
	 *
	 * $descr determines the type of menu made:
	 * 0 = Ordinary vertical menu
	 * 1 = Descriptions for 'About modules' display
	 * 2 = selector-box menu
	 * 3 = topmenu - horizontal line of icons!
	 * 4 = part of JavaScript switch contruct for alt_main.php frameset.
	 *
	 * @param 	array		$theModules is the output from load_modules class ($this->loadModules->modules)
	 * @param 	boolean		$dontLink == TRUE will prevent the output from being linked with A-tags (used in the 'beuser' extension)
	 * @param 	string		$backPath must be the 'backPath' to PATH_typo3 from where the menu is displayed.
	 * @param 	integer		$descr determines the type of menu made (see above)
	 * @return 	string		The menu HTML
	 * @todo Define visibility
	 */
	public function topMenu($theModules, $dontLink = 0, $backPath = '', $descr = 0) {
		// By default module sections are collapsable, only if they are explicitly turned off via TSconfig, they are not:
		$tmpArr = $GLOBALS['BE_USER']->getTSConfig('options.moduleMenuCollapsable');
		$collapsable = isset($tmpArr['value']) && $tmpArr['value'] == 0 ? 0 : 1;
		unset($tmpArr);
		// Initialize vars:
		$final = '';
		$menuCode = '';
		$descrCode = '';
		$collection = array();
		$menuCode_sub = '';
		$selectItems = array();
		$mIcons = array();
		$mJScmds = array();
		$onBlur = $GLOBALS['CLIENT']['FORMSTYLE'] ? 'this.blur();' : '';
		$selectItems[] = '<option value="">[ ' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:buttons.selMenu_modules', 1) . ' ]</option>';
		$mC = 0;
		// Get collapsed configuration
		if ($collapsable == 1) {
			$config = is_array($GLOBALS['BE_USER']->uc['moduleData']['alt_menu.php']) ? $GLOBALS['BE_USER']->uc['moduleData']['alt_menu.php'] : array();
			$collapsedOverride = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('collapsedOverride');
			if (is_array($collapsedOverride)) {
				$config = array_merge($config, $collapsedOverride);
			}
			if (\TYPO3\CMS\Core\Utility\GeneralUtility::_GP('collapsableExpandAll') == 1) {
				$config['expandAll'] = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('expandAll');
			}
			if ($config['expandAll'] && is_array($collapsedOverride)) {
				$config = $collapsedOverride;
			}
			$GLOBALS['BE_USER']->uc['moduleData']['alt_menu.php'] = $config;
			$GLOBALS['BE_USER']->writeUC($GLOBALS['BE_USER']->uc);
			// all items have to be expanded when expandAll is set
			if ($config['expandAll'] == 1) {
				foreach ($config as $key => $value) {
					if ($key != 'expandAll') {
						$config[$key] = 0;
					}
				}
			}
		}
		// Traverse array with modules
		foreach ($theModules as $moduleName => $moduleInfo) {
			$mC++;
			$prefix = $this->getNavFramePrefix($moduleInfo);
			if ($prefix) {
				$this->fsMod[] = 'fsMod.recentIds["' . $moduleName . '"]="";';
			}
			// If there are submodules:
			if (is_array($moduleInfo['sub'])) {
				// Finding the default module to display
				if ($moduleInfo['defaultMod']) {
					$link = $moduleInfo['sub'][$moduleInfo['defaultMod']]['script'];
				} else {
					$subTemp = reset($moduleInfo['sub']);
					$link = $subTemp['script'];
				}
				$link_sub = 1;
				// Tells that the main modules links to a submodule
				$link = '';
			} else {
				$link = $moduleInfo['script'];
				$link_sub = 0;
			}
			$link = \TYPO3\CMS\Core\Utility\GeneralUtility::resolveBackPath($link);
			$moduleKey = $moduleName . '_tab';
			$moduleCSSId = 'ID_' . \TYPO3\CMS\Core\Utility\GeneralUtility::md5int($moduleName);
			$collection[$moduleKey] = array(
				'moduleName' => $moduleName,
				'title' => $GLOBALS['LANG']->moduleLabels['tabs'][$moduleKey],
				'onclick' => 'top.goToModule(\'' . $moduleName . '\');'
			);
			// Creating image icon
			$image = @getimagesize($this->mIconFile($GLOBALS['LANG']->moduleLabels['tabs_images'][$moduleKey], $backPath));
			$imageCode = '';
			$descr3_title = $GLOBALS['LANG']->moduleLabels['tabs'][$moduleKey] . ' ';
			if ($image) {
				$Ifilename = $this->mIconFilename($GLOBALS['LANG']->moduleLabels['tabs_images'][$moduleKey], $backPath);
				$collection[$moduleKey]['icon'] = array($Ifilename, $image[3]);
				$imageCode = '<img src="' . $Ifilename . '" ' . $image[3] . ' alt="" />';
				$descr3_imageCode = '<img src="' . $Ifilename . '" ' . $image[3] . ' title="' . htmlspecialchars($descr3_title) . '" alt="" />';
			} else {
				$descr3_imageCode = '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($backPath, 'gfx/dummy_module.gif', 'width="14" height="12"') . ' title="' . htmlspecialchars($descr3_title) . '" alt="" />';
			}
			// Creating the various links:
			$label = $GLOBALS['LANG']->moduleLabels['tabs'][$moduleKey];
			if ($link && $prefix) {
				$link = $prefix . rawurlencode($link);
			}
			if ($link && !$dontLink) {
				$label = '<a href="#" onclick="top.goToModule(\'' . $moduleName . '\');' . $onBlur . 'return false;">' . $label . '</a>';
				$mIcons[] = '<a href="#" onclick="top.goToModule(\'' . $moduleName . '\');' . $onBlur . 'return false;" class="c-mainitem" id="' . $moduleCSSId . '">' . $descr3_imageCode . '</a>';
				$JScmd = '
						top.content.location=top.getModuleUrl(top.TS.PATH_typo3+"' . $this->wrapLinkWithAB($link) . '"+additionalGetVariables);
						top.highlightModuleMenuItem("' . $moduleCSSId . '",1);';
				$mJScmds[] = 'case \'' . $moduleName . '\':
 ' . $JScmd . '
 break;';
			}
			$selectItems[] = '<option value="top.goToModule(\'' . $moduleName . '\');">' . htmlspecialchars($GLOBALS['LANG']->moduleLabels['tabs'][$moduleKey]) . '</option>';
			$label = '&nbsp;<strong>' . $label . '</strong>&nbsp;';
			// make menu collapsable
			if ($collapsable == 1 && is_array($moduleInfo['sub'])) {
				$collapseJS = 'onclick="window.location.href=\'alt_menu.php?collapsedOverride[' . $moduleName . ']=' . ($config[$moduleName] ? '0' : '1') . '\'"';
				$collapseIcon = \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('actions-view-table-' . ($config[$moduleName] ? 'expand' : 'collapse'), array('class' => 'c-iconCollapse'));
			} else {
				$collapseJS = ($collapseIcon = '');
			}
			// Creating a main item for the vertical menu (descr=0)
			$menuCode .= '
						<tr class="c-mainitem" id="' . $moduleCSSId . '">
							<td colspan="3" ' . $collapseJS . ' >' . $imageCode . '<span class="c-label">' . $label . '</span>' . $collapseIcon . '</td>
						</tr>';
			// Code for "About modules"
			$descrCode .= '
						<tr class="c-mainitem">
							<td colspan="3">' . $imageCode . $label . '</td>
						</tr>';
			// Hide submodules when collapsed:
			if ($collapsable == 1 && $config[$moduleName] == 1 && $descr == 0 && $config['expandAll'] != 1) {
				unset($moduleInfo['sub']);
			}
			// Traversing submodules
			$subCode = '';
			if (is_array($moduleInfo['sub'])) {
				$collection[$moduleKey]['subitems'] = array();
				$c = 0;
				foreach ($moduleInfo['sub'] as $subName => $subInfo) {
					if ($c == 0) {
						$subCode .= '
								<tr class="c-first">
									<td colspan="3"></td>
								</tr>';
						$descrCode .= '
								<tr class="c-first">
									<td colspan="3"></td>
								</tr>';
					}
					$link = \TYPO3\CMS\Core\Utility\GeneralUtility::resolveBackPath($subInfo['script']);
					$prefix = $this->getNavFramePrefix($moduleInfo, $subInfo);
					$subKey = $moduleName . '_' . $subName . '_tab';
					$moduleCSSId = 'ID_' . \TYPO3\CMS\Core\Utility\GeneralUtility::md5int(($moduleName . '_' . $subName));
					$collection[$moduleKey]['subitems'][$subKey] = array(
						'moduleName' => $moduleName . '_' . $subName,
						'title' => $GLOBALS['LANG']->moduleLabels['tabs'][$subKey],
						'onclick' => 'top.goToModule(\'' . $moduleName . '_' . $subName . '\');'
					);
					// Creating image icon
					$image = @getimagesize($this->mIconFile($GLOBALS['LANG']->moduleLabels['tabs_images'][$subKey], $backPath));
					$imageCode = '';
					$descr3_title = $GLOBALS['LANG']->moduleLabels['tabs'][$subKey] . ': ' . $GLOBALS['LANG']->moduleLabels['labels'][($subKey . 'label')];
					if ($image) {
						$Ifilename = $this->mIconFilename($GLOBALS['LANG']->moduleLabels['tabs_images'][$subKey], $backPath);
						$collection[$moduleKey]['subitems'][$subKey]['icon'] = array($Ifilename, $image[3]);
						$imageCode = '<img src="' . $Ifilename . '" ' . $image[3] . ' title="' . htmlspecialchars($GLOBALS['LANG']->moduleLabels['labels'][($subKey . 'label')]) . '" alt="" />';
						$descr3_imageCode = '<img src="' . $Ifilename . '" ' . $image[3] . ' title="' . htmlspecialchars($descr3_title) . '" alt="" />';
					} else {
						$descr3_imageCode = '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($backPath, 'gfx/dummy_module.gif', 'width="14" height="12"') . ' title="' . htmlspecialchars($descr3_title) . '" alt="" />';
					}
					// Label for submodule:
					$label = $GLOBALS['LANG']->moduleLabels['tabs'][$subKey];
					$label_descr = ' title="' . htmlspecialchars($GLOBALS['LANG']->moduleLabels['labels'][($subKey . 'label')]) . '"';
					$flabel = htmlspecialchars($label);
					$origLink = $link;
					if ($link && $prefix) {
						$link = $prefix . rawurlencode($link);
					}
					// Setting additional JavaScript if frameset script:
					$addJS = '';
					if ($moduleInfo['navFrameScript']) {
						$addJS = '+\'&id=\'+top.rawurlencodeAndRemoveSiteUrl(top.fsMod.recentIds[\'' . $moduleName . '\'])';
					}
					// If there is a script to link to (and linking is not disabled.
					if ($link && !$dontLink) {
						// For condensed mode, send &cMR parameter to frameset script.
						if ($addJS && $GLOBALS['BE_USER']->uc['condensedMode']) {
							$addJS .= '+(cMR?\'&cMR=1\':\'\')';
						}
						// Command for the selector box:
						$JScmd = '
								top.content.location=top.getModuleUrl(top.TS.PATH_typo3+"' . $this->wrapLinkWithAB($link) . '"' . $addJS . '+additionalGetVariables);
								top.fsMod.currentMainLoaded="' . $moduleName . '";
								';
						if ($subInfo['navFrameScript']) {
							$JScmd .= '
								top.currentSubScript="' . $origLink . '";';
						}
						// If there is a frameset script in place:
						if (!$GLOBALS['BE_USER']->uc['condensedMode'] && $moduleInfo['navFrameScript']) {
							// use special nav script from sub module, otherwise from the main module
							$subNavFrameScript = $subInfo['navFrameScript'] ? $subInfo['navFrameScript'] : $moduleInfo['navFrameScript'];
							$subNavFrameScript = \TYPO3\CMS\Core\Utility\GeneralUtility::resolveBackPath($subNavFrameScript);
							// add GET params for sub module to the nav script
							$subNavFrameScript = $this->wrapLinkWithAB($subNavFrameScript) . $subInfo['navFrameScriptParam'];
							$JScmd = '
								if (top.content.list_frame && top.fsMod.currentMainLoaded=="' . $moduleName . '") {
									top.currentSubScript="' . $origLink . '";
									top.content.list_frame.location=top.getModuleUrl(top.TS.PATH_typo3+"' . $this->wrapLinkWithAB($origLink) . '"' . $addJS . '+additionalGetVariables);
									if(top.currentSubNavScript!="' . $subNavFrameScript . '") {
										top.currentSubNavScript="' . $subNavFrameScript . '";
										top.content.nav_frame.location=top.getModuleUrl(top.TS.PATH_typo3+"' . $subNavFrameScript . '");
									}
								} else {
									top.content.location=top.TS.PATH_typo3+(
										top.nextLoadModuleUrl?
										"' . ($prefix ? $this->wrapLinkWithAB($link) . '&exScript=' : '') . 'listframe_loader.php":
										"' . $this->wrapLinkWithAB($link) . '"' . $addJS . '+additionalGetVariables
									);
									top.fsMod.currentMainLoaded="' . $moduleName . '";
									top.currentSubScript="' . $origLink . '";
								}
								';
						}
						$selectItems[] = '<option value="top.goToModule(\'' . $moduleName . '_' . $subName . '\');">' . htmlspecialchars(('- ' . $label)) . '</option>';
						$onClickString = htmlspecialchars('top.goToModule(\'' . $moduleName . '_' . $subName . '\');' . $onBlur . 'return false;');
						$flabel = '<a href="#" onclick="' . $onClickString . '"' . $label_descr . '>' . htmlspecialchars($label) . '</a>';
						$mIcons[] = '<a href="#" onclick="' . $onClickString . '"' . $label_descr . ' class="c-subitem" id="' . $moduleCSSId . '">' . $descr3_imageCode . '</a>';
						$JScmd .= '
								top.highlightModuleMenuItem("' . $moduleCSSId . '");';
						$mJScmds[] = 'case \'' . $moduleName . '_' . $subName . '\':
 ' . $JScmd . '
 break;';
					}
					$subCode .= '
							<tr class="c-subitem-row" id="' . $moduleCSSId . '">
								<td></td>
								<td align="center">' . (!$GLOBALS['BE_USER']->uc['hideSubmoduleIcons'] ? $imageCode : '') . '</td>
								<td class="c-subitem-label">' . $flabel . '</td>
							</tr>';
					// For "About modules":
					$moduleLabel = htmlspecialchars($GLOBALS['LANG']->moduleLabels['labels'][$subKey . 'label']);
					$moduleLabelHtml = !empty($moduleLabel) ? '<strong>' . $moduleLabel . '</strong><br />' : '';
					$moduleDescription = $GLOBALS['LANG']->moduleLabels['labels'][$subKey . 'descr'];
					$descrCode .= '
							<tr class="c-subitem-row">
								<td align="center">' . $imageCode . '</td>
								<td>' . $flabel . '&nbsp;&nbsp;</td>';
					if (!empty($moduleLabel) || !empty($moduleDescription)) {
						$descrCode .= '
								<td class="module-description">' . $moduleLabelHtml . $moduleDescription . '</td>';
					} else {
						$descrCode .= '
								<td>&nbsp;</td>';
					}
					$descrCode .= '
							</tr>';
					// Possibly adding a divider line
					$c++;
					if ($c < count($moduleInfo['sub'])) {
						// Divider
						$subCode .= '
							<tr class="c-divrow">
								<td colspan="3"><img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($backPath, 'gfx/altmenuline.gif', 'width="105" height="3"') . ' alt="" /></td>
							</tr>';
					}
				}
				// Spacer gif for top menu:
				if (count($theModules) > $mC) {
					$mIcons[] = '<img src="' . $backPath . 'gfx/acm_spacer2.gif" width="8" height="12" hspace="3" alt="" />';
				}
			}
			if (!empty($subCode)) {
				// Add spacers after each main section:
				$subCode .= '
						<tr class="c-endrow">
							<td colspan="3"></td>
						</tr>';
				$descrCode .= '
						<tr class="c-endrow">
							<td colspan="3"></td>
						</tr>';
				// Add sub-code:
				$menuCode .= $subCode;
			}
		}
		// $descr==0:	Ordinary vertical menu
		if ($menuCode) {
			if ($collapsable == 1 || $config['expandAll'] == 1) {
				$collapseAllHTML = '<tr class="c-endrow">
						<td></td>
						<td align="center">
								<form action="alt_menu.php" method="get">
									<input type="hidden" name="collapsableExpandAll" value="1" />
									<input type="checkbox" name="expandAll" id="expandall" value="1" onclick="this.form.submit();" ' . ($config['expandAll'] ? 'checked="checked"' : '') . ' />
								</form>
						</td>
						<td class="c-subitem-label"><label for="expandall">' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.expandAll', 1) . '</label></td>
					</tr>';
			} else {
				$collapseAllHTML = '';
			}
			$final = '


				<!--
					Vertical module menu, shown in left frame of backend.
				-->
				<table border="0" cellpadding="0" cellspacing="0" id="typo3-vmenu">
					' . $menuCode . '
					<tr class="c-endrow">
						<td colspan="3">' . \TYPO3\CMS\Backend\Utility\BackendUtility::cshItem('xMOD_csh_corebe', 'menu_modules', $GLOBALS['BACK_PATH']) . '</td></tr>
					' . $collapseAllHTML . '
				</table>';
		}
		// Output for the "About modules" module
		if ($descr == 1) {
			$descrCode = '


				<!--
					Listing of modules, for Help > About modules
				-->
				<table border="0" cellpadding="0" cellspacing="0" id="typo3-about-modules">
					' . $descrCode . '
				</table>';
			$final = $descrCode;
		}
		// selector-box menu
		if ($descr == 2) {
			// Add admin-functions for clearing caches:
			if ($GLOBALS['BE_USER']->isAdmin()) {
				$functionArray = $this->adminFunctions($backPath);
				if (count($functionArray)) {
					$selectItems[] = '<option value=""></option>';
					foreach ($functionArray as $fAoptions) {
						$selectItems[] = '<option value="' . htmlspecialchars(('window.location.href=\'' . $fAoptions['href'] . '\';')) . '">[ ' . htmlspecialchars($fAoptions['title']) . ' ]</option>';
					}
				}
			}
			// Logout item:
			$selectItems[] = '<option value=""></option>';
			$selectItems[] = '<option value="' . htmlspecialchars('top.location=\'logout.php\';') . '">[ ' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:buttons.logout', 1) . ' ]</option>';
			$final = '
				<select name="menuselector" onchange="eval(this.options[this.selectedIndex].value);">
					' . implode('
					', $selectItems) . '
				</select>';
		}
		// topmenu - horizontal line of icons!
		if ($descr == 3) {
			$final = '' . implode('', $mIcons) . '';
		}
		// Output for the goToModules() function in main frameset.
		if ($descr == 4) {
			$final = chr(10) . implode(chr(10), $mJScmds) . chr(10);
		}
		// Output for TOPMENU BAR drop downs (but basically this is an array with which you can do many interesting things...)
		if ($descr == 5) {
			$final = $collection;
		}
		// Return result:
		return $final;
	}

	/**
	 * Returns a prefix used to call the navframe with parameters to call the scripts defined in the modules info array.
	 *
	 * @param 	string		Module info array
	 * @param 	string		Submodule info array
	 * @return 	string		Result url string
	 * @todo Define visibility
	 */
	public function getNavFramePrefix($moduleInfo, $subModuleInfo = array()) {
		$prefix = '';
		$navFrameScript = $subModuleInfo['navFrameScript'] ? $subModuleInfo['navFrameScript'] : $moduleInfo['navFrameScript'];
		$navFrameScriptParam = isset($subModuleInfo['navFrameScriptParam']) ? $subModuleInfo['navFrameScriptParam'] : $moduleInfo['navFrameScriptParam'];
		if ($navFrameScript) {
			$navFrameScript = \TYPO3\CMS\Core\Utility\GeneralUtility::resolveBackPath($navFrameScript);
			$navFrameScript = $this->wrapLinkWithAB($navFrameScript);
			if ($GLOBALS['BE_USER']->uc['condensedMode']) {
				$prefix = $navFrameScript . $navFrameScriptParam . '&currentSubScript=';
			} else {
				$prefix = 'alt_mod_frameset.php?' . 'fW="+top.TS.navFrameWidth+"' . '&nav="+top.TS.PATH_typo3+"' . rawurlencode(($navFrameScript . $navFrameScriptParam)) . '&script=';
			}
		}
		return $prefix;
	}

	/**
	 * Returns $Ifilename readable for script in PATH_typo3.
	 * That means absolute names are just returned while relative names are prepended with $backPath (pointing back to typo3/ dir)
	 *
	 * @param 	string		Icon filename
	 * @param 	string		Back path
	 * @return 	string		Result
	 * @see mIconFilename()
	 * @todo Define visibility
	 */
	public function mIconFile($Ifilename, $backPath) {
		if (\TYPO3\CMS\Core\Utility\GeneralUtility::isAbsPath($Ifilename)) {
			return $Ifilename;
		}
		return $backPath . $Ifilename;
	}

	/**
	 * Returns relative filename to the $Ifilename (for use in img-tags)
	 *
	 * @param 	string		Icon filename
	 * @param 	string		Back path
	 * @return 	string		Result
	 * @see mIconFile()
	 * @todo Define visibility
	 */
	public function mIconFilename($Ifilename, $backPath) {
		if (\TYPO3\CMS\Core\Utility\GeneralUtility::isAbsPath($Ifilename)) {
			$Ifilename = '../' . substr($Ifilename, strlen(PATH_site));
		}
		return $backPath . $Ifilename;
	}

	/**
	 * Returns logout button.
	 *
	 * @return 	string
	 * @todo Define visibility
	 */
	public function topButtons() {
		$label = $GLOBALS['BE_USER']->user['ses_backuserid'] ? 'LLL:EXT:lang/locallang_core.php:buttons.exit' : 'LLL:EXT:lang/locallang_core.php:buttons.logout';
		$out = '<form action="logout.php" target="_top"><input type="submit" value="' . $GLOBALS['LANG']->sL($label, 1) . '" /></form>';
		return $out;
	}

	/**
	 * Returns logout button.
	 *
	 * @return 	string
	 * @todo Define visibility
	 */
	public function adminButtons() {
		$functionArray = $this->adminFunctions('');
		$icons = array();
		foreach ($functionArray as $fAoptions) {
			$icons[] = '<a href="' . htmlspecialchars($fAoptions['href']) . '">' . $fAoptions['icon'] . '</a>';
		}
		return implode('', $icons);
	}

	/**
	 * Returns array with parts from which the admin functions can be constructed.
	 *
	 * @param 	string		Backpath.
	 * @return 	array
	 * @todo Define visibility
	 */
	public function adminFunctions($backPath) {
		$functions = array();
		// Clearing of cache-files in typo3conf/ + menu
		$title = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.clearCache_allTypo3Conf');
		$functions[] = array(
			'id' => 'temp_CACHED',
			'title' => $title,
			'href' => $backPath . 'tce_db.php?vC=' . $GLOBALS['BE_USER']->veriCode() . '&redirect=' . rawurlencode(\TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('TYPO3_REQUEST_SCRIPT')) . '&cacheCmd=temp_CACHED' . \TYPO3\CMS\Backend\Utility\BackendUtility::getUrlToken('tceAction'),
			'icon' => '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($backPath, 'gfx/clear_cache_files_in_typo3c.gif', 'width="21" height="18"') . ' title="' . htmlspecialchars($title) . '" alt="" />'
		);
		// Clear all page cache
		$title = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.clearCache_all');
		$functions[] = array(
			'id' => 'all',
			'title' => $title,
			'href' => $backPath . 'tce_db.php?vC=' . $GLOBALS['BE_USER']->veriCode() . '&redirect=' . rawurlencode(\TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('TYPO3_REQUEST_SCRIPT')) . '&cacheCmd=all' . \TYPO3\CMS\Backend\Utility\BackendUtility::getUrlToken('tceAction'),
			'icon' => '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($backPath, 'gfx/clear_all_cache.gif', 'width="21" height="18"') . ' title="' . htmlspecialchars($title) . '" alt="" />'
		);
		// Return functions
		return $functions;
	}

	/**
	 * Appends a '?' if there is none in the string already
	 *
	 * @param 	string		Link URL
	 * @return 	string
	 * @todo Define visibility
	 */
	public function wrapLinkWithAB($link) {
		if (!strstr($link, '?')) {
			return $link . '?';
		} else {
			return $link;
		}
	}

	/**
	 * Generates some JavaScript code for the frame.
	 *
	 * @return 	string	goToModule javascript function
	 * @todo Define visibility
	 */
	public function generateMenuJScode($loadedModules, $menuType = 4) {
		$goToModuleSwitch = $this->topMenu($loadedModules, 0, '', $menuType);
		$jsCode = '
	/**
	 * Function used to switch switch module.
	 */
	var currentModuleLoaded = "";
	function goToModule(modName,cMR_flag,addGetVars) {	//
		var additionalGetVariables = "";
		if (addGetVars)	additionalGetVariables = addGetVars;

		var cMR = 0;
		if (cMR_flag)	cMR = 1;

		currentModuleLoaded = modName;

		switch(modName)	{' . $goToModuleSwitch . '
		}
	}';
		return $jsCode;
	}

}


?>