[BUGFIX] Class DependencyResolver_Callback does not exist
authorStefan Froemken <firma@sfroemken.de>
Fri, 24 Aug 2012 23:33:05 +0000 (01:33 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sat, 25 Aug 2012 09:19:37 +0000 (11:19 +0200)
When if saving a template:
Class TYPO3\CMS\Version\Dependency\DependencyResolver_Callback does not exist

New class name is
\TYPO3\CMS\Version\Dependency\EventCallback

Change-Id: Ibb2ed25eec29c9453a9bb2e1e05acf17a327ee91
Fixes: #40153
Related: #40095
Releases: 6.0
Reviewed-on: http://review.typo3.org/14060
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
typo3/sysext/version/Classes/ClickMenu/VersionClickMenu.php
typo3/sysext/version/Classes/Controller/VersionModuleController.php
typo3/sysext/version/Classes/DataHandler/CommandMap.php
typo3/sysext/version/cm1/index.php

index 6871c99..24b2eb6 100644 (file)
@@ -30,7 +30,7 @@ namespace TYPO3\CMS\Version\ClickMenu;
  * @package TYPO3
  * @subpackage core
  */
-class VersionModuleController {
+class VersionClickMenu {
 
        /**
         * Main function, adding the item to input menuItems array
index 6871c99..891a0d3 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-namespace TYPO3\CMS\Version\ClickMenu;
+namespace TYPO3\CMS\Version\Controller;
 
 /***************************************************************
  *  Copyright notice
@@ -23,74 +23,1435 @@ namespace TYPO3\CMS\Version\ClickMenu;
  *
  *  This copyright notice MUST APPEAR in all copies of the script!
  ***************************************************************/
+
 /**
- * "Versioning" item added to click menu of elements.
+ * Versioning module, including workspace management
  *
  * @author     Kasper Skårhøj <kasperYYYY@typo3.com>
  * @package TYPO3
  * @subpackage core
  */
-class VersionModuleController {
-
-       /**
-        * Main function, adding the item to input menuItems array
-        *
-        * @param       object          References to parent clickmenu objects.
-        * @param       array           Array of existing menu items accumulated. New element added to this.
-        * @param       string          Table name of the element
-        * @param       integer         Record UID of the element
-        * @return      array           Modified menuItems array
-        * @todo Define visibility
-        */
-       public function main(&$backRef, $menuItems, $table, $uid) {
-               $localItems = array();
-               if ((!$backRef->cmLevel && $uid > 0) && $GLOBALS['BE_USER']->check('modules', 'web_txversionM1')) {
-                       // Returns directly, because the clicked item was not from the pages table
-                       if ((in_array('versioning', $backRef->disabledItems) || !$GLOBALS['TCA'][$table]) || !$GLOBALS['TCA'][$table]['ctrl']['versioningWS']) {
-                               return $menuItems;
-                       }
-                       // Adds the regular item
-                       $LL = $this->includeLL();
-                       // "Versioning" element added:
-                       $url = (((\TYPO3\CMS\Core\Extension\ExtensionManager::extRelPath('version') . 'cm1/index.php?table=') . rawurlencode($table)) . '&uid=') . $uid;
-                       $localItems[] = $backRef->linkItem($GLOBALS['LANG']->getLLL('title', $LL), $backRef->excludeIcon((('<img src="' . $backRef->backPath) . \TYPO3\CMS\Core\Extension\ExtensionManager::extRelPath('version')) . 'cm1/cm_icon.gif" width="15" height="12" border="0" align="top" alt="" />'), $backRef->urlRefForCM($url), 1);
-                       // "Send to review" element added:
-                       /*
-                       $url = t3lib_extMgm::extRelPath('version').'cm1/index.php?id='.($table=='pages'?$uid:$backRef->rec['pid']).'&table='.rawurlencode($table).'&uid='.$uid.'&sendToReview=1';
-                       $localItems[] = $backRef->linkItem(
-                       $GLOBALS['LANG']->getLLL('title_review', $LL),
-                       $backRef->excludeIcon('<img src="'.$backRef->backPath.t3lib_extMgm::extRelPath('version').'cm1/cm_icon.gif" width="15" height="12" border="0" align="top" alt="" />'),
-                       $backRef->urlRefForCM($url),
-                       1
-                       );
-                        */
-                       // Find position of "delete" element:
-                       $c = 0;
-                       foreach ($menuItems as $k => $value) {
-                               $c++;
-                               if (!strcmp($k, 'delete')) {
+class VersionModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClass {
+
+       // Default variables for backend modules
+       /**
+        * @todo Define visibility
+        */
+       public $MCONF = array();
+
+       // Module configuration
+       /**
+        * @todo Define visibility
+        */
+       public $MOD_MENU = array();
+
+       // Module menu items
+       /**
+        * @todo Define visibility
+        */
+       public $MOD_SETTINGS = array();
+
+       // Module session settings
+       /**
+        * document template object
+        *
+        * @var \TYPO3\CMS\Backend\Template\MediumDocumentTemplate
+        * @todo Define visibility
+        */
+       public $doc;
+
+       /**
+        * @todo Define visibility
+        */
+       public $content;
+
+       // Accumulated content
+       // Internal:
+       /**
+        * @todo Define visibility
+        */
+       public $showWorkspaceCol = 0;
+
+       /**
+        * @todo Define visibility
+        */
+       public $formatWorkspace_cache = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $formatCount_cache = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $targets = array();
+
+       // Accumulation of online targets.
+       /**
+        * @todo Define visibility
+        */
+       public $pageModule = '';
+
+       // Name of page module
+       /**
+        * @todo Define visibility
+        */
+       public $publishAccess = FALSE;
+
+       /**
+        * @todo Define visibility
+        */
+       public $be_user_Array = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $stageIndex = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $recIndex = array();
+
+       protected $showDraftWorkspace = FALSE;
+
+       // Determines whether to show the dummy draft workspace
+       /*********************************
+        *
+        * Standard module initialization
+        *
+        *********************************/
+       /**
+        * Initialize menu configuration
+        *
+        * @return      void
+        * @todo Define visibility
+        */
+       public function menuConfig() {
+               // fetches the configuration of the version extension
+               $versionExtconf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['version']);
+               // show draft workspace only if enabled in the version extensions config
+               if ($versionExtconf['showDraftWorkspace']) {
+                       $this->showDraftWorkspace = TRUE;
+               }
+               // Menu items:
+               $this->MOD_MENU = array(
+                       'filter' => array(
+                               1 => $GLOBALS['LANG']->getLL('filter_drafts'),
+                               2 => $GLOBALS['LANG']->getLL('filter_archive'),
+                               0 => $GLOBALS['LANG']->getLL('filter_all')
+                       ),
+                       'display' => array(
+                               0 => $GLOBALS['LANG']->getLL('liveWorkspace'),
+                               -98 => $GLOBALS['LANG']->getLL('draftWorkspaces'),
+                               -99 => $GLOBALS['LANG']->getLL('filter_all')
+                       ),
+                       'diff' => ''
+               );
+               if ($this->showDraftWorkspace === TRUE) {
+                       $this->MOD_MENU['display'][-1] = $GLOBALS['LANG']->getLL('defaultDraft');
+               }
+               // Add workspaces (only if the live workspace is currently active):
+               if (\t3lib_extMgm::isLoaded('workspaces') && $GLOBALS['BE_USER']->workspace === 0) {
+                       $workspaces = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid,title,adminusers,members,reviewers', 'sys_workspace', 'pid=0' . \t3lib_BEfunc::deleteClause('sys_workspace'), '', 'title');
+                       foreach ($workspaces as $rec) {
+                               if ($GLOBALS['BE_USER']->checkWorkspace($rec)) {
+                                       $this->MOD_MENU['display'][$rec['uid']] = (('[' . $rec['uid']) . '] ') . $rec['title'];
+                               }
+                       }
+               }
+               // CLEANSE SETTINGS
+               $this->MOD_SETTINGS = \t3lib_BEfunc::getModuleData($this->MOD_MENU, \t3lib_div::_GP('SET'), $this->MCONF['name'], 'ses');
+       }
+
+       /**
+        * Main function of the module. Write the content to $this->content
+        *
+        * @return      void
+        * @todo Define visibility
+        */
+       public function main() {
+               // Template markers
+               $markers = array(
+                       'CSH' => '',
+                       'FUNC_MENU' => '',
+                       'WS_MENU' => '',
+                       'CONTENT' => ''
+               );
+               // Setting module configuration:
+               $this->MCONF = $GLOBALS['MCONF'];
+               $this->REQUEST_URI = str_replace('&sendToReview=1', '', \t3lib_div::getIndpEnv('REQUEST_URI'));
+               // Draw the header.
+               $this->doc = \t3lib_div::makeInstance('TYPO3\\CMS\\Backend\\Template\\DocumentTemplate');
+               $this->doc->backPath = $GLOBALS['BACK_PATH'];
+               $this->doc->setModuleTemplate('templates/version.html');
+               // Add styles
+               $this->doc->inDocStylesArray[$GLOBALS['MCONF']['name']] = '
+.version-diff-1 { background-color: green; }
+.version-diff-2 { background-color: red; }
+';
+               // Setting up the context sensitive menu:
+               $this->doc->getContextMenuCode();
+               // Getting input data:
+               $this->id = intval(\t3lib_div::_GP('id'));
+               // Page id. If set, indicates activation from Web>Versioning module
+               if (!$this->id) {
+                       $this->uid = intval(\t3lib_div::_GP('uid'));
+                       // Record uid. Goes with table name to indicate specific record
+                       $this->table = \t3lib_div::_GP('table');
+               } else {
+                       $this->uid = $this->id;
+                       $this->table = 'pages';
+               }
+               $this->details = \t3lib_div::_GP('details');
+               // Page id. If set, indicates activation from Web>Versioning module
+               $this->diffOnly = \t3lib_div::_GP('diffOnly');
+               // Flag. If set, shows only the offline version and with diff-view
+               // Force this setting:
+               $this->MOD_SETTINGS['expandSubElements'] = TRUE;
+               $this->MOD_SETTINGS['diff'] = $this->details || $this->MOD_SETTINGS['diff'] ? 1 : 0;
+               // Reading the record:
+               $record = \t3lib_BEfunc::getRecord($this->table, $this->uid);
+               if ($record['pid'] == -1) {
+                       $record = \t3lib_BEfunc::getRecord($this->table, $record['t3ver_oid']);
+               }
+               $this->recordFound = is_array($record);
+               $pidValue = $this->table === 'pages' ? $this->uid : $record['pid'];
+               // Checking access etc.
+               if ($this->recordFound && $GLOBALS['TCA'][$this->table]['ctrl']['versioningWS']) {
+                       $this->doc->form = '<form action="" method="post">';
+                       $this->uid = $record['uid'];
+                       // Might have changed if new live record was found!
+                       // Access check!
+                       // The page will show only if there is a valid page and if this page may be viewed by the user
+                       $this->pageinfo = \t3lib_BEfunc::readPageAccess($pidValue, $this->perms_clause);
+                       $access = is_array($this->pageinfo) ? 1 : 0;
+                       if ($pidValue && $access || $GLOBALS['BE_USER']->user['admin'] && !$pidValue) {
+                               // JavaScript
+                               $this->doc->JScode .= '
+                                       <script language="javascript" type="text/javascript">
+                                               script_ended = 0;
+                                               function jumpToUrl(URL) {
+                                                       window.location.href = URL;
+                                               }
+
+                                               function hlSubelements(origId, verId, over, diffLayer)  {       //
+                                                       if (over) {
+                                                               document.getElementById(\'orig_\'+origId).attributes.getNamedItem("class").nodeValue = \'typo3-ver-hl\';
+                                                               document.getElementById(\'ver_\'+verId).attributes.getNamedItem("class").nodeValue = \'typo3-ver-hl\';
+                                                               if (diffLayer) {
+                                                                       document.getElementById(\'diff_\'+verId).style.visibility = \'visible\';
+                                                               }
+                                                       } else {
+                                                               document.getElementById(\'orig_\'+origId).attributes.getNamedItem("class").nodeValue = \'typo3-ver\';
+                                                               document.getElementById(\'ver_\'+verId).attributes.getNamedItem("class").nodeValue = \'typo3-ver\';
+                                                               if (diffLayer) {
+                                                                       document.getElementById(\'diff_\'+verId).style.visibility = \'hidden\';
+                                                               }
+                                                       }
+                                               }
+                                       </script>
+                               ';
+                               // If another page module was specified, replace the default Page module with the new one
+                               $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
+                               $this->pageModule = \t3lib_BEfunc::isModuleSetInTBE_MODULES($newPageModule) ? $newPageModule : 'web_layout';
+                               // Setting publish access permission for workspace:
+                               $this->publishAccess = $GLOBALS['BE_USER']->workspacePublishAccess($GLOBALS['BE_USER']->workspace);
+                               // Render content:
+                               if ($this->id) {
+                                       $this->workspaceMgm();
+                               } else {
+                                       $this->versioningMgm();
+                               }
+                       }
+                       $this->content .= $this->doc->spacer(10);
+                       // Setting up the buttons and markers for docheader
+                       $docHeaderButtons = $this->getButtons();
+                       $markers['CSH'] = $docHeaderButtons['csh'];
+                       $markers['FUNC_MENU'] = \t3lib_BEfunc::getFuncMenu($this->id, 'SET[function]', $this->MOD_SETTINGS['function'], $this->MOD_MENU['function']);
+                       $markers['WS_MENU'] = $this->workspaceMenu();
+                       $markers['CONTENT'] = $this->content;
+               } else {
+                       // If no access or id value, create empty document
+                       $this->content = $this->doc->section($GLOBALS['LANG']->getLL('clickAPage_header'), $GLOBALS['LANG']->getLL('clickAPage_content'), 0, 1);
+                       // Setting up the buttons and markers for docheader
+                       $docHeaderButtons = $this->getButtons();
+                       $markers['CONTENT'] = $this->content;
+               }
+               // Build the <body> for the module
+               $this->content = $this->doc->startPage($GLOBALS['LANG']->getLL('title'));
+               $this->content .= $this->doc->moduleBody($this->pageinfo, $docHeaderButtons, $markers);
+               $this->content .= $this->doc->endPage();
+               $this->content = $this->doc->insertStylesAndJS($this->content);
+       }
+
+       /**
+        * Outputs accumulated module content to browser.
+        *
+        * @return      void
+        * @todo Define visibility
+        */
+       public function printContent() {
+               echo $this->content;
+       }
+
+       /**
+        * Create the panel of buttons for submitting the form or otherwise perform operations.
+        *
+        * @return      array   all available buttons as an assoc. array
+        */
+       protected function getButtons() {
+               $buttons = array(
+                       'csh' => '',
+                       'view' => '',
+                       'record_list' => '',
+                       'shortcut' => ''
+               );
+               // CSH
+               //$buttons['csh'] = t3lib_BEfunc::cshItem('_MOD_web_txversionM1', '', $GLOBALS['BACK_PATH']);
+               if ($this->recordFound && $GLOBALS['TCA'][$this->table]['ctrl']['versioningWS']) {
+                       // View page
+                       $buttons['view'] = ((((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($this->pageinfo['uid'], $GLOBALS['BACK_PATH'], \t3lib_BEfunc::BEgetRootLine($this->pageinfo['uid'])))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.showPage', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
+                       // Shortcut
+                       if ($GLOBALS['BE_USER']->mayMakeShortcut()) {
+                               $buttons['shortcut'] = $this->doc->makeShortcutIcon('id, edit_record, pointer, new_unique_uid, search_field, search_levels, showLimit', implode(',', array_keys($this->MOD_MENU)), $this->MCONF['name']);
+                       }
+                       // If access to Web>List for user, then link to that module.
+                       $buttons['record_list'] = \t3lib_BEfunc::getListViewLink(array(
+                               'id' => $this->pageinfo['uid'],
+                               'returnUrl' => \t3lib_div::getIndpEnv('REQUEST_URI')
+                       ), '', $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.showList'));
+               }
+               return $buttons;
+       }
+
+       /******************************
+        *
+        * Versioning management
+        *
+        ******************************/
+       /**
+        * Management of versions for record
+        *
+        * @return      void
+        * @todo Define visibility
+        */
+       public function versioningMgm() {
+               // Diffing:
+               $diff_1 = \t3lib_div::_POST('diff_1');
+               $diff_2 = \t3lib_div::_POST('diff_2');
+               if (\t3lib_div::_POST('do_diff')) {
+                       $content = '';
+                       $content .= ('<h3>' . $GLOBALS['LANG']->getLL('diffing')) . ':</h3>';
+                       if ($diff_1 && $diff_2) {
+                               $diff_1_record = \t3lib_BEfunc::getRecord($this->table, $diff_1);
+                               $diff_2_record = \t3lib_BEfunc::getRecord($this->table, $diff_2);
+                               if (is_array($diff_1_record) && is_array($diff_2_record)) {
+                                       \t3lib_div::loadTCA($this->table);
+                                       $t3lib_diff_Obj = \t3lib_div::makeInstance('TYPO3\\CMS\\Core\\Utility\\DiffUtility');
+                                       $tRows = array();
+                                       $tRows[] = ((('
+                                                                       <tr class="bgColor5 tableheader">
+                                                                               <td>' . $GLOBALS['LANG']->getLL('fieldname')) . '</td>
+                                                                               <td width="98%">') . $GLOBALS['LANG']->getLL('coloredDiffView')) . ':</td>
+                                                                       </tr>
+                                                               ';
+                                       foreach ($diff_1_record as $fN => $fV) {
+                                               if (($GLOBALS['TCA'][$this->table]['columns'][$fN] && $GLOBALS['TCA'][$this->table]['columns'][$fN]['config']['type'] !== 'passthrough') && !\t3lib_div::inList('t3ver_label', $fN)) {
+                                                       if (strcmp($diff_1_record[$fN], $diff_2_record[$fN])) {
+                                                               $diffres = $t3lib_diff_Obj->makeDiffDisplay(\t3lib_BEfunc::getProcessedValue($this->table, $fN, $diff_2_record[$fN], 0, 1), \t3lib_BEfunc::getProcessedValue($this->table, $fN, $diff_1_record[$fN], 0, 1));
+                                                               $tRows[] = ((('
+                                                                       <tr class="bgColor4">
+                                                                               <td>' . $fN) . '</td>
+                                                                               <td width="98%">') . $diffres) . '</td>
+                                                                       </tr>
+                                                               ';
+                                                       }
+                                               }
+                                       }
+                                       if (count($tRows) > 1) {
+                                               $content .= ('<table border="0" cellpadding="1" cellspacing="1" width="100%">' . implode('', $tRows)) . '</table><br /><br />';
+                                       } else {
+                                               $content .= $GLOBALS['LANG']->getLL('recordsMatchesCompletely');
+                                       }
+                               } else {
+                                       $content .= $GLOBALS['LANG']->getLL('errorRecordsNotFound');
+                               }
+                       } else {
+                               $content .= $GLOBALS['LANG']->getLL('errorDiffSources');
+                       }
+               }
+               // Element:
+               $record = \t3lib_BEfunc::getRecord($this->table, $this->uid);
+               $recordIcon = \t3lib_iconWorks::getSpriteIconForRecord($this->table, $record);
+               $recTitle = \t3lib_BEfunc::getRecordTitle($this->table, $record, TRUE);
+               // Display versions:
+               $content .= (((('
+                       ' . $recordIcon) . $recTitle) . '
+                       <form name="theform" action="') . str_replace('&sendToReview=1', '', $this->REQUEST_URI)) . '" method="post">
+                       <table border="0" cellspacing="1" cellpadding="1">';
+               $content .= ((((((((((((((((((((((((((((((((((((((((('
+                               <tr class="bgColor5 tableheader">
+                                       <td>&nbsp;</td>
+                                       <td>&nbsp;</td>
+                                       <td title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_title')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_title')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_uid')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_uid')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_oid')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_oid')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_id')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_id')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_wsid')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_wsid')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_state')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_state')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_stage')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_stage')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_count')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_count')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_pid')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_pid')) . '</td>
+                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_label')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_label')) . '</td>
+                                       <td colspan="2"><input type="submit" name="do_diff" value="') . $GLOBALS['LANG']->getLL('diff')) . '" /></td>
+                               </tr>';
+               $versions = \t3lib_BEfunc::selectVersionsOfRecord($this->table, $this->uid, '*', $GLOBALS['BE_USER']->workspace);
+               foreach ($versions as $row) {
+                       $adminLinks = $this->adminLinks($this->table, $row);
+                       $content .= ((((((((((((((((((((((((((((((((((((((('
+                               <tr class="' . ($row['uid'] != $this->uid ? 'bgColor4' : 'bgColor2 tableheader')) . '">
+                                       <td>') . ($row['uid'] != $this->uid ? ((((('<a href="' . $this->doc->issueCommand((((((((((('&cmd[' . $this->table) . '][') . $this->uid) . '][version][swapWith]=') . $row['uid']) . '&cmd[') . $this->table) . '][') . $this->uid) . '][version][action]=swap'))) . '" title="') . $GLOBALS['LANG']->getLL('swapWithCurrent', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-swap-version')) . '</a>' : \t3lib_iconWorks::getSpriteIcon('status-status-current', array('title' => $GLOBALS['LANG']->getLL('currentOnlineVersion', TRUE))))) . '</td>
+                                       <td nowrap="nowrap">') . $adminLinks) . '</td>
+                                       <td nowrap="nowrap">') . \t3lib_BEfunc::getRecordTitle($this->table, $row, TRUE)) . '</td>
+                                       <td>') . $row['uid']) . '</td>
+                                       <td>') . $row['t3ver_oid']) . '</td>
+                                       <td>') . $row['t3ver_id']) . '</td>
+                                       <td>') . $row['t3ver_wsid']) . '</td>
+                                       <td>') . $row['t3ver_state']) . '</td>
+                                       <td>') . $row['t3ver_stage']) . '</td>
+                                       <td>') . $row['t3ver_count']) . '</td>
+                                       <td>') . $row['pid']) . '</td>
+                                       <td nowrap="nowrap"><a href="#" onclick="') . htmlspecialchars(\t3lib_BEfunc::editOnClick((((('&edit[' . $this->table) . '][') . $row['uid']) . ']=edit&columnsOnly=t3ver_label'), $this->doc->backPath))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:cm.edit', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-open')) . '</a>') . htmlspecialchars($row['t3ver_label'])) . '</td>
+                                       <td class="version-diff-1"><input type="radio" name="diff_1" value="') . $row['uid']) . '"') . ($diff_1 == $row['uid'] ? ' checked="checked"' : '')) . '/></td>
+                                       <td class="version-diff-2"><input type="radio" name="diff_2" value="') . $row['uid']) . '"') . ($diff_2 == $row['uid'] ? ' checked="checked"' : '')) . '/></td>
+                               </tr>';
+                       // Show sub-content if the table is pages AND it is not the online branch (because that will mostly render the WHOLE tree below - not smart;)
+                       if ($this->table == 'pages' && $row['uid'] != $this->uid) {
+                               $sub = $this->pageSubContent($row['uid']);
+                               if ($sub) {
+                                       $content .= ('
+                                               <tr>
+                                                       <td></td>
+                                                       <td></td>
+                                                       <td colspan="10">' . $sub) . '</td>
+                                                       <td colspan="2"></td>
+                                               </tr>';
+                               }
+                       }
+               }
+               $content .= '</table></form>';
+               $this->content .= $this->doc->section($GLOBALS['LANG']->getLL('title'), $content, 0, 1);
+               // Create new:
+               $content = ((((((((((((((((('
+
+                       <form action="' . $this->doc->backPath) . 'tce_db.php" method="post">
+                       ') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_label')) . ': <input type="text" name="cmd[') . $this->table) . '][') . $this->uid) . '][version][label]" /><br />
+                       <br /><input type="hidden" name="cmd[') . $this->table) . '][') . $this->uid) . '][version][action]" value="new" />
+                       <input type="hidden" name="prErr" value="1" />
+                       <input type="hidden" name="redirect" value="') . htmlspecialchars($this->REQUEST_URI)) . '" />
+                       <input type="submit" name="_" value="') . $GLOBALS['LANG']->getLL('createNewVersion')) . '" />
+                       ') . \t3lib_TCEforms::getHiddenTokenField('tceAction')) . '
+                       </form>
+
+               ';
+               $this->content .= $this->doc->spacer(15);
+               $this->content .= $this->doc->section($GLOBALS['LANG']->getLL('createNewVersion'), $content, 0, 1);
+       }
+
+       /**
+        * Recursively look for children for page version with $pid
+        *
+        * @param       integer         UID of page record for which to look up sub-elements following that version
+        * @param       integer         Counter, do not set (limits to 100 levels)
+        * @return      string          Table with content if any
+        * @todo Define visibility
+        */
+       public function pageSubContent($pid, $c = 0) {
+               $tableNames = \t3lib_div::removeArrayEntryByValue(array_keys($GLOBALS['TCA']), 'pages');
+               $tableNames[] = 'pages';
+               foreach ($tableNames as $tN) {
+                       // Basically list ALL tables - not only those being copied might be found!
+                       $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $tN, ('pid=' . intval($pid)) . \t3lib_BEfunc::deleteClause($tN), '', $GLOBALS['TCA'][$tN]['ctrl']['sortby'] ? $GLOBALS['TCA'][$tN]['ctrl']['sortby'] : '');
+                       if ($GLOBALS['TYPO3_DB']->sql_num_rows($mres)) {
+                               $content .= ((((('
+                                       <tr>
+                                               <td colspan="4" class="' . ($GLOBALS['TCA'][$tN]['ctrl']['versioning_followPages'] ? 'bgColor6' : ($tN == 'pages' ? 'bgColor5' : 'bgColor-10'))) . '"') . (!$GLOBALS['TCA'][$tN]['ctrl']['versioning_followPages'] && $tN !== 'pages' ? ' style="color: #666666; font-style:italic;"' : '')) . '>') . $tN) . '</td>
+                                       </tr>';
+                               while ($subrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
+                                       $ownVer = $this->lookForOwnVersions($tN, $subrow['uid']);
+                                       $content .= ((((((('
+                                               <tr>
+                                                       <td>' . $this->adminLinks($tN, $subrow)) . '</td>
+                                                       <td>') . $subrow['uid']) . '</td>
+                                                       ') . ($ownVer > 1 ? ((((('<td style="font-weight: bold; background-color: yellow;"><a href="index.php?table=' . rawurlencode($tN)) . '&uid=') . $subrow['uid']) . '">') . ($ownVer - 1)) . '</a></td>' : '<td></td>')) . '
+                                                       <td width="98%">') . \t3lib_BEfunc::getRecordTitle($tN, $subrow, TRUE)) . '</td>
+                                               </tr>';
+                                       if ($tN == 'pages' && $c < 100) {
+                                               $sub = $this->pageSubContent($subrow['uid'], $c + 1);
+                                               if ($sub) {
+                                                       $content .= ('
+                                                               <tr>
+                                                                       <td></td>
+                                                                       <td></td>
+                                                                       <td></td>
+                                                                       <td width="98%">' . $sub) . '</td>
+                                                               </tr>';
+                                               }
+                                       }
+                               }
+                       }
+               }
+               return $content ? ('<table border="1" cellpadding="1" cellspacing="0" width="100%">' . $content) . '</table>' : '';
+       }
+
+       /**
+        * Look for number of versions of a record
+        *
+        * @param       string          Table name
+        * @param       integer         Record uid
+        * @return      integer         Number of versions for record, FALSE if none.
+        * @todo Define visibility
+        */
+       public function lookForOwnVersions($table, $uid) {
+               $versions = \t3lib_BEfunc::selectVersionsOfRecord($table, $uid, 'uid');
+               if (is_array($versions)) {
+                       return count($versions);
+               }
+               return FALSE;
+       }
+
+       /**
+        * Administrative links for a table / record
+        *
+        * @param       string          Table name
+        * @param       array           Record for which administrative links are generated.
+        * @return      string          HTML link tags.
+        * @todo Define visibility
+        */
+       public function adminLinks($table, $row) {
+               // Edit link:
+               $adminLink = ((((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::editOnClick((((('&edit[' . $table) . '][') . $row['uid']) . ']=edit'), $this->doc->backPath))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:cm.edit', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-open')) . '</a>';
+               // Delete link:
+               $adminLink .= ((((('<a href="' . htmlspecialchars($this->doc->issueCommand((((('&cmd[' . $table) . '][') . $row['uid']) . '][delete]=1')))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:cm.delete', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-edit-delete')) . '</a>';
+               if ($table == 'pages') {
+                       // If another page module was specified, replace the default Page module with the new one
+                       $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
+                       $pageModule = \t3lib_BEfunc::isModuleSetInTBE_MODULES($newPageModule) ? $newPageModule : 'web_layout';
+                       // Perform some acccess checks:
+                       $a_wl = $GLOBALS['BE_USER']->check('modules', 'web_list');
+                       $a_wp = \t3lib_extMgm::isLoaded('cms') && $GLOBALS['BE_USER']->check('modules', $pageModule);
+                       $adminLink .= ((((('<a href="#" onclick="top.loadEditId(' . $row['uid']) . ');top.goToModule(\'') . $pageModule) . '\'); return false;">') . \t3lib_iconWorks::getSpriteIcon('actions-page-open')) . '</a>';
+                       $adminLink .= ((('<a href="#" onclick="top.loadEditId(' . $row['uid']) . ');top.goToModule(\'web_list\'); return false;">') . \t3lib_iconWorks::getSpriteIcon('actions-system-list-open')) . '</a>';
+                       // "View page" icon is added:
+                       $adminLink .= ((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($row['uid'], $this->doc->backPath, \t3lib_BEfunc::BEgetRootLine($row['uid'])))) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
+               } else {
+                       if ($row['pid'] == -1) {
+                               $getVars = (('&ADMCMD_vPrev[' . rawurlencode((($table . ':') . $row['t3ver_oid']))) . ']=') . $row['uid'];
+                               // "View page" icon is added:
+                               $adminLink .= ((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($row['_REAL_PID'], $this->doc->backPath, \t3lib_BEfunc::BEgetRootLine($row['_REAL_PID']), '', '', $getVars))) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
+                       }
+               }
+               return $adminLink;
+       }
+
+       /******************************
+        *
+        * Workspace management
+        *
+        ******************************/
+       /**
+        * Management of workspace for page ID
+        * Called when $this->id is set.
+        *
+        * @return      void
+        * @todo Define visibility
+        */
+       public function workspaceMgm() {
+               // Perform workspace publishing action if buttons are pressed:
+               $errors = $this->publishAction();
+               // Generate workspace overview:
+               $WSoverview = $this->displayWorkspaceOverview();
+               // Buttons for publish / swap:
+               $actionLinks = '<br />';
+               if ($GLOBALS['BE_USER']->workspace !== 0) {
+                       if ($this->publishAccess) {
+                               $actionLinks .= ((('<input type="submit" name="_publish" value="' . $GLOBALS['LANG']->getLL('publishPage')) . '" onclick="return confirm(\'') . sprintf($GLOBALS['LANG']->getLL('publishPageQuestion'), ($GLOBALS['BE_USER']->workspaceRec['publish_access'] & 1 ? $GLOBALS['LANG']->getLL('publishPageQuestionStage') : ''))) . '\');"/>';
+                               if ($GLOBALS['BE_USER']->workspaceSwapAccess()) {
+                                       $actionLinks .= ((('<input type="submit" name="_swap" value="' . $GLOBALS['LANG']->getLL('swapPage')) . '" onclick="return confirm(\'') . sprintf($GLOBALS['LANG']->getLL('swapPageQuestion'), ($GLOBALS['BE_USER']->workspaceRec['publish_access'] & 1 ? $GLOBALS['LANG']->getLL('publishPageQuestionStage') : ''))) . '\');" />';
+                               }
+                       } else {
+                               $actionLinks .= $this->doc->icons(1) . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:no_publish_permission');
+                       }
+               }
+               $actionLinks .= ('<input type="submit" name="_" value="' . $GLOBALS['LANG']->getLL('refresh')) . '" />';
+               $actionLinks .= ('<input type="submit" name="_previewLink" value="' . $GLOBALS['LANG']->getLL('previewLink')) . '" />';
+               $actionLinks .= ('<input type="checkbox" class="checkbox" name="_previewLink_wholeWorkspace" id="_previewLink_wholeWorkspace" value="1" /><label for="_previewLink_wholeWorkspace">' . $GLOBALS['LANG']->getLL('allowPreviewOfWholeWorkspace')) . '</label>';
+               $actionLinks .= $this->displayWorkspaceOverview_allStageCmd();
+               if ($actionLinks || count($errors)) {
+                       $this->content .= $this->doc->section('', $actionLinks . (count($errors) ? ((('<h3>' . $GLOBALS['LANG']->getLL('errors')) . '</h3><br />') . implode('<br />', $errors)) . '<hr />' : ''), 0, 1);
+               }
+               if (\t3lib_div::_POST('_previewLink')) {
+                       $ttlHours = intval($GLOBALS['BE_USER']->getTSConfigVal('options.workspaces.previewLinkTTLHours'));
+                       $ttlHours = $ttlHours ? $ttlHours : 24 * 2;
+                       if (\t3lib_div::_POST('_previewLink_wholeWorkspace')) {
+                               $previewUrl = (((\t3lib_BEfunc::getViewDomain($this->id) . '/index.php?ADMCMD_prev=') . \t3lib_BEfunc::compilePreviewKeyword('', $GLOBALS['BE_USER']->user['uid'], (60 * 60) * $ttlHours, $GLOBALS['BE_USER']->workspace)) . '&id=') . intval($this->id);
+                       } else {
+                               $params = (('id=' . $this->id) . '&ADMCMD_previewWS=') . $GLOBALS['BE_USER']->workspace;
+                               $previewUrl = (\t3lib_BEfunc::getViewDomain($this->id) . '/index.php?ADMCMD_prev=') . \t3lib_BEfunc::compilePreviewKeyword($params, $GLOBALS['BE_USER']->user['uid'], (60 * 60) * $ttlHours);
+                       }
+                       $this->content .= $this->doc->section($GLOBALS['LANG']->getLL('previewUrl'), ((((sprintf($GLOBALS['LANG']->getLL('previewInstruction'), $ttlHours) . '<br /><br /><a target="_blank" href="') . htmlspecialchars($previewUrl)) . '">') . $previewUrl) . '</a>', 0, 1);
+               }
+               // Output overview content:
+               $this->content .= $this->doc->spacer(15);
+               $this->content .= $this->doc->section($this->details ? $GLOBALS['LANG']->getLL('versionDetails') : $GLOBALS['LANG']->getLL('wsManagement'), $WSoverview, 0, 1);
+       }
+
+       /**
+        * @todo Define visibility
+        */
+       public function workspaceMenu() {
+               if ($this->id) {
+                       $menu = '';
+                       if ($GLOBALS['BE_USER']->workspace === 0) {
+                               $menu .= \t3lib_BEfunc::getFuncMenu($this->id, 'SET[filter]', $this->MOD_SETTINGS['filter'], $this->MOD_MENU['filter']);
+                               $menu .= \t3lib_BEfunc::getFuncMenu($this->id, 'SET[display]', $this->MOD_SETTINGS['display'], $this->MOD_MENU['display']);
+                       }
+                       if ((!$this->details && $GLOBALS['BE_USER']->workspace) && !$this->diffOnly) {
+                               $menu .= ((\t3lib_BEfunc::getFuncCheck($this->id, 'SET[diff]', $this->MOD_SETTINGS['diff'], '', '', 'id="checkDiff"') . ' <label for="checkDiff">') . $GLOBALS['LANG']->getLL('showDiffView')) . '</label>';
+                       }
+                       if ($menu) {
+                               return $menu;
+                       }
+               }
+       }
+
+       /**
+        * Rendering the overview of versions in the current workspace
+        *
+        * @return      string          HTML (table)
+        * @see ws/index.php for sister function!
+        * @todo Define visibility
+        */
+       public function displayWorkspaceOverview() {
+               // Initialize variables:
+               $this->showWorkspaceCol = $GLOBALS['BE_USER']->workspace === 0 && $this->MOD_SETTINGS['display'] <= -98;
+               // Get usernames and groupnames
+               $be_group_Array = \t3lib_BEfunc::getListGroupNames('title,uid');
+               $groupArray = array_keys($be_group_Array);
+               $this->be_user_Array = \t3lib_BEfunc::getUserNames();
+               if (!$GLOBALS['BE_USER']->isAdmin()) {
+                       $this->be_user_Array = \t3lib_BEfunc::blindUserNames($this->be_user_Array, $groupArray, 1);
+               }
+               // Initialize Workspace ID and filter-value:
+               if ($GLOBALS['BE_USER']->workspace === 0) {
+                       $wsid = $this->details ? -99 : $this->MOD_SETTINGS['display'];
+                       // Set wsid to the value from the menu (displaying content of other workspaces)
+                       $filter = $this->details ? 0 : $this->MOD_SETTINGS['filter'];
+               } else {
+                       $wsid = $GLOBALS['BE_USER']->workspace;
+                       $filter = 0;
+               }
+               // Initialize workspace object and request all pending versions:
+               $wslibObj = \t3lib_div::makeInstance('TYPO3\\CMS\\Version\\Utility\\WorkspacesUtility');
+               // Selecting ALL versions belonging to the workspace:
+               $versions = $wslibObj->selectVersionsInWorkspace($wsid, $filter, -99, $this->uid);
+               // $this->uid is the page id of LIVE record.
+               // Traverse versions and build page-display array:
+               $pArray = array();
+               foreach ($versions as $table => $records) {
+                       foreach ($records as $rec) {
+                               $pageIdField = $table === 'pages' ? 't3ver_oid' : 'realpid';
+                               $this->displayWorkspaceOverview_setInPageArray($pArray, $table, $rec);
+                       }
+               }
+               // Make header of overview:
+               $tableRows = array();
+               if (count($pArray)) {
+                       $tableRows[] = ((((((('
+                               <tr class="bgColor5 tableheader">
+                                       ' . ($this->diffOnly ? '' : ('<td nowrap="nowrap" colspan="2">' . $GLOBALS['LANG']->getLL('liveVersion')) . '</td>')) . '
+                                       <td nowrap="nowrap" colspan="2">') . $GLOBALS['LANG']->getLL('wsVersions')) . '</td>
+                                       <td nowrap="nowrap"') . ($this->diffOnly ? ' colspan="2"' : ' colspan="4"')) . '>') . $GLOBALS['LANG']->getLL('controls')) . '</td>
+                               </tr>';
+                       // Add lines from overview:
+                       $tableRows = array_merge($tableRows, $this->displayWorkspaceOverview_list($pArray));
+                       $table = ('<table border="0" cellpadding="0" cellspacing="1" class="lrPadding workspace-overview">' . implode('', $tableRows)) . '</table>';
+               } else {
+                       $table = '';
+               }
+               $returnUrl = \t3lib_div::sanitizeLocalUrl(\t3lib_div::_GP('returnUrl'));
+               $linkBack = \t3lib_div::_GP('returnUrl') ? (((('<a href="' . htmlspecialchars($returnUrl)) . '" class="typo3-goBack">') . \t3lib_iconWorks::getSpriteIcon('actions-view-go-back')) . $GLOBALS['LANG']->getLL('goBack', TRUE)) . '</a><br /><br />' : '';
+               $resetDiffOnly = $this->diffOnly ? ((('<a href="index.php?id=' . intval($this->id)) . '" class="typo3-goBack">') . $GLOBALS['LANG']->getLL('showAllInformation')) . '</a><br /><br />' : '';
+               $versionSelector = $GLOBALS['BE_USER']->workspace ? $this->doc->getVersionSelector($this->id) : '';
+               return ((($versionSelector . $linkBack) . $resetDiffOnly) . $table) . $this->markupNewOriginals();
+       }
+
+       /**
+        * Rendering the content for the publish / review overview:
+        * (Made for internal recursive calling)
+        *
+        * @param       array           Storage of the elements to display (see displayWorkspaceOverview() / displayWorkspaceOverview_setInPageArray())
+        * @return      array           Table rows, see displayWorkspaceOverview()
+        * @todo Define visibility
+        */
+       public function displayWorkspaceOverview_list($pArray) {
+               // If there ARE elements on this level, print them:
+               $warnAboutVersions_nonPages = FALSE;
+               $warnAboutVersions_page = FALSE;
+               if (is_array($pArray)) {
+                       foreach ($pArray as $table => $oidArray) {
+                               foreach ($oidArray as $oid => $recs) {
+                                       // Get CURRENT online record and icon based on "t3ver_oid":
+                                       $rec_on = \t3lib_BEfunc::getRecord($table, $oid);
+                                       $icon = \t3lib_iconWorks::getSpriteIconForRecord($table, $rec_on, array('title' => \t3lib_BEfunc::getRecordIconAltText($rec_on, $table)));
+                                       if ($GLOBALS['BE_USER']->workspace === 0) {
+                                               // Only edit online records if in ONLINE workspace:
+                                               $icon = $this->doc->wrapClickMenuOnIcon($icon, $table, $rec_on['uid'], 1, '', '+edit,view,info,delete');
+                                       }
+                                       // Online version display:
+                                       // Create the main cells which will span over the number of versions there is.
+                                       $verLinkUrl = $GLOBALS['TCA'][$table]['ctrl']['versioningWS'];
+                                       $origElement = (($icon . ($verLinkUrl ? ('<a href="' . htmlspecialchars(((('index.php?table=' . $table) . '&uid=') . $rec_on['uid']))) . '">' : '')) . \t3lib_BEfunc::getRecordTitle($table, $rec_on, TRUE)) . ($verLinkUrl ? '</a>' : '');
+                                       $mainCell_rowSpan = count($recs) > 1 ? (' rowspan="' . count($recs)) . '"' : '';
+                                       $mainCell = (((((((('
+                                                               <td align="center"' . $mainCell_rowSpan) . '>') . $this->formatVerId($rec_on['t3ver_id'])) . '</td>
+                                                               <td nowrap="nowrap"') . $mainCell_rowSpan) . '>') . $origElement) . '###SUB_ELEMENTS###') . '</td>';
+                                       // Offline versions display:
+                                       // Traverse the versions of the element
+                                       foreach ($recs as $rec) {
+                                               // Get the offline version record and icon:
+                                               $rec_off = \t3lib_BEfunc::getRecord($table, $rec['uid']);
+                                               $vType = 'element';
+                                               // Get icon
+                                               $icon = \t3lib_iconWorks::getSpriteIconForRecord($table, $rec_off, array('title' => \t3lib_BEfunc::getRecordIconAltText($rec_off, $table)));
+                                               $tempUid = ($table != 'pages' || $vType === 'branch') || $GLOBALS['BE_USER']->workspace === 0 ? $rec_off['uid'] : $rec_on['uid'];
+                                               $icon = $this->doc->wrapClickMenuOnIcon($icon, $table, $tempUid, 1, '', ('+edit,' . ($table == 'pages' ? 'view,info,' : '')) . 'delete');
+                                               // Prepare diff-code:
+                                               if ($this->MOD_SETTINGS['diff'] || $this->diffOnly) {
+                                                       $diffCode = '';
+                                                       list($diffHTML, $diffPct) = $this->createDiffView($table, $rec_off, $rec_on);
+                                                       if ($rec_on['t3ver_state'] == 1) {
+                                                               // New record:
+                                                               $diffCode .= ($this->doc->icons(1) . $GLOBALS['LANG']->getLL('newElement')) . '<br />';
+                                                               $diffCode .= $diffHTML;
+                                                       } elseif ($rec_off['t3ver_state'] == 2) {
+                                                               $diffCode .= ($this->doc->icons(2) . $GLOBALS['LANG']->getLL('deletedElement')) . '<br />';
+                                                       } elseif ($rec_on['t3ver_state'] == 3) {
+                                                               $diffCode .= ($this->doc->icons(1) . $GLOBALS['LANG']->getLL('moveToPlaceholder')) . '<br />';
+                                                       } elseif ($rec_off['t3ver_state'] == 4) {
+                                                               $diffCode .= ($this->doc->icons(1) . $GLOBALS['LANG']->getLL('moveToPointer')) . '<br />';
+                                                       } else {
+                                                               $diffCode .= $diffPct < 0 ? $GLOBALS['LANG']->getLL('notAvailable') : ($diffPct ? ($diffPct . '% ') . $GLOBALS['LANG']->getLL('change') : '');
+                                                               $diffCode .= $diffHTML;
+                                                       }
+                                               } else {
+                                                       $diffCode = '';
+                                               }
+                                               switch ($vType) {
+                                               case 'element':
+                                                       $swapLabel = $GLOBALS['LANG']->getLL('element');
+                                                       $swapClass = 'ver-element';
+                                                       $warnAboutVersions_nonPages = $warnAboutVersions_page;
+                                                       // Setting this if sub elements are found with a page+content (must be rendered prior to this of course!)
+                                                       break;
+                                               case 'page':
+                                                       $swapLabel = $GLOBALS['LANG']->getLL('page');
+                                                       $swapClass = 'ver-page';
+                                                       $warnAboutVersions_page = !$this->showWorkspaceCol;
+                                                       // This value is TRUE only if multiple workspaces are shown and we need the opposite here.
+                                                       break;
+                                               case 'branch':
+                                                       $swapLabel = $GLOBALS['LANG']->getLL('branch');
+                                                       $swapClass = 'ver-branch';
+                                                       break;
+                                               }
+                                               // Modify main cell based on first version shown:
+                                               $subElements = array();
+                                               $mainCell = str_replace('###SUB_ELEMENTS###', $subElements['on'], $mainCell);
+                                               // Create version element:
+                                               $versionsInOtherWS = $this->versionsInOtherWS($table, $rec_on['uid']);
+                                               $versionsInOtherWSWarning = $versionsInOtherWS && $GLOBALS['BE_USER']->workspace !== 0 ? (('<br />' . $this->doc->icons(2)) . $GLOBALS['LANG']->getLL('otherVersions')) . $versionsInOtherWS : '';
+                                               $multipleWarning = !$mainCell && $GLOBALS['BE_USER']->workspace !== 0 ? ((('<br />' . $this->doc->icons(3)) . '<strong>') . $GLOBALS['LANG']->getLL('multipleVersions')) . '</strong>' : '';
+                                               $verWarning = $warnAboutVersions || $warnAboutVersions_nonPages && $GLOBALS['TCA'][$table]['ctrl']['versioning_followPages'] ? ((('<br />' . $this->doc->icons(3)) . '<strong>') . $GLOBALS['LANG']->getLL('versionInVersion')) . '</strong>' : '';
+                                               $verElement = ((((($icon . (!$this->details ? ('<a href="' . htmlspecialchars(((((((($this->doc->backPath . \t3lib_extMgm::extRelPath('version')) . 'cm1/index.php?id=') . ($table === 'pages' ? $rec_on['uid'] : $rec_on['pid'])) . '&details=') . rawurlencode((($table . ':') . $rec_off['uid']))) . '&returnUrl=') . rawurlencode($this->REQUEST_URI)))) . '">' : '')) . \t3lib_BEfunc::getRecordTitle($table, $rec_off, TRUE)) . (!$this->details ? '</a>' : '')) . $versionsInOtherWSWarning) . $multipleWarning) . $verWarning;
+                                               $ctrlTable = ((((((('
+                                                               <td nowrap="nowrap">' . $this->showStageChangeLog($table, $rec_off['uid'], $this->displayWorkspaceOverview_stageCmd($table, $rec_off))) . '</td>
+                                                               <td nowrap="nowrap" class="') . $swapClass) . '">') . $this->displayWorkspaceOverview_commandLinks($table, $rec_on, $rec_off, $vType)) . htmlspecialchars($swapLabel)) . '&nbsp;&nbsp;</td>
+                                                               ') . (!$this->diffOnly ? (((('<td nowrap="nowrap"><strong>' . $GLOBALS['LANG']->getLL('lifecycle')) . ':</strong> ') . htmlspecialchars($this->formatCount($rec_off['t3ver_count']))) . '</td>') . ($this->showWorkspaceCol ? ((('
+                                                               <td nowrap="nowrap">&nbsp;&nbsp;<strong>' . $GLOBALS['LANG']->getLL('workspace')) . ':</strong> ') . htmlspecialchars($this->formatWorkspace($rec_off['t3ver_wsid']))) . '</td>' : '') : '');
+                                               if ($diffCode) {
+                                                       $verElement = (((($verElement . '
+                                                       <br /><strong>') . $GLOBALS['LANG']->getLL('diffToLiveElement')) . '</strong>
+                                                       <table border="0" cellpadding="0" cellspacing="0" class="ver-verElement">
+                                                               <tr>
+                                                                       <td class="c-diffCell">') . $diffCode) . '</td>
+                                                               </tr>
+                                                       </table>';
+                                               }
+                                               // Create version cell:
+                                               $verCell = (((('
+                                                               <td align="center">' . $this->formatVerId($rec_off['t3ver_id'])) . '</td>
+                                                               <td nowrap="nowrap">') . $verElement) . $subElements['off']) . '</td>
+                                                               ';
+                                               // Compile table row:
+                                               $tableRows[] = ((('
+                                                       <tr class="bgColor4">
+                                                               ' . ($this->diffOnly ? '' : $mainCell)) . $verCell) . $ctrlTable) . '
+                                                       </tr>';
+                                               // Reset the main cell:
+                                               $mainCell = '';
+                                       }
+                               }
+                       }
+               }
+               return $tableRows;
+       }
+
+       /**
+        * Building up of the $pArray
+        * (Internal)
+        *
+        * @param       array           Array that is built up with the page tree structure
+        * @param       string          Table name
+        * @param       array           Table row
+        * @return      void            $pArray is passed by reference and modified internally
+        * @todo Define visibility
+        */
+       public function displayWorkspaceOverview_setInPageArray(&$pArray, $table, $row) {
+               if (!$this->details || $this->details == ($table . ':') . $row['uid']) {
+                       $pArray[$table][$row['t3ver_oid']][] = $row;
+               }
+       }
+
+       /**
+        * Links to stage change of a version
+        *
+        * @param       string          Table name
+        * @param       array           Offline record (version)
+        * @return      string          HTML content, mainly link tags and images.
+        * @todo Define visibility
+        */
+       public function displayWorkspaceOverview_allStageCmd() {
+               $table = \t3lib_div::_GP('table');
+               if ($table && $table != 'pages') {
+                       $uid = \t3lib_div::_GP('uid');
+                       if ($rec_off = \t3lib_BEfunc::getRecordWSOL($table, $uid)) {
+                               $uid = $rec_off['_ORIG_uid'];
+                       }
+               } else {
+                       $table = '';
+               }
+               if ($table) {
+                       if ($uid && $this->recIndex[$table][$uid]) {
+                               $sId = $this->recIndex[$table][$uid];
+                               switch ($sId) {
+                               case 1:
+                                       $label = $GLOBALS['LANG']->getLL('commentForReviewer');
                                        break;
+                               case 10:
+                                       $label = $GLOBALS['LANG']->getLL('commentForPublisher');
+                                       break;
+                               }
+                       } else {
+                               $sId = 0;
+                       }
+               } else {
+                       // Review:
+                       if (count($this->stageIndex[1])) {
+                               $sId = 1;
+                               $color = '#666666';
+                               $label = $GLOBALS['LANG']->getLL('sendItemsToReview') . $GLOBALS['LANG']->getLL('commentForReviewer');
+                               $titleAttrib = $GLOBALS['LANG']->getLL('sendAllToReview');
+                       } elseif (count($this->stageIndex[10])) {
+                               $sId = 10;
+                               $color = '#6666cc';
+                               $label = $GLOBALS['LANG']->getLL('approveToPublish') . $GLOBALS['LANG']->getLL('commentForPublisher');
+                               $titleAttrib = $GLOBALS['LANG']->getLL('approveAllToPublish');
+                       } else {
+                               $sId = 0;
+                       }
+               }
+               if ($sId > 0) {
+                       $issueCmd = '';
+                       $itemCount = 0;
+                       if (($table && $uid) && $this->recIndex[$table][$uid]) {
+                               $issueCmd .= ((('&cmd[' . $table) . '][') . $uid) . '][version][action]=setStage';
+                               $issueCmd .= (((('&cmd[' . $table) . '][') . $uid) . '][version][stageId]=') . $this->recIndex[$table][$uid];
+                       } else {
+                               foreach ($this->stageIndex[$sId] as $table => $uidArray) {
+                                       $issueCmd .= ((('&cmd[' . $table) . '][') . implode(',', $uidArray)) . '][version][action]=setStage';
+                                       $issueCmd .= (((('&cmd[' . $table) . '][') . implode(',', $uidArray)) . '][version][stageId]=') . $sId;
+                                       $itemCount += count($uidArray);
                                }
                        }
-                       // .. subtract two (delete item + divider line)
-                       $c -= 2;
-                       // ... and insert the items just before the delete element.
-                       array_splice($menuItems, $c, 0, $localItems);
+                       $onClick = ((('var commentTxt=window.prompt("' . sprintf($label, $itemCount)) . '","");
+                               if (commentTxt!=null) {window.location.href="') . $this->doc->issueCommand($issueCmd, $this->REQUEST_URI)) . '&generalComment="+escape(commentTxt);}';
+                       if (\t3lib_div::_GP('sendToReview')) {
+                               $onClick .= (' else {window.location.href = "' . $this->REQUEST_URI) . '"}';
+                               $actionLinks .= $this->doc->wrapScriptTags($onClick);
+                       } else {
+                               $onClick .= ' return false;';
+                               $actionLinks .= ((('<input type="submit" name="_" value="' . htmlspecialchars($titleAttrib)) . '" onclick="') . htmlspecialchars($onClick)) . '" />';
+                       }
+               } elseif (\t3lib_div::_GP('sendToReview')) {
+                       $onClick = ('window.location.href = "' . $this->REQUEST_URI) . '";';
+                       $actionLinks .= $this->doc->wrapScriptTags($onClick);
+               } else {
+                       $actionLinks = '';
+               }
+               return $actionLinks;
+       }
+
+       /**************************************
+        *
+        * Helper functions (REDUNDANT FROM user/ws/index.php - someone could refactor this...)
+        *
+        *************************************/
+       /**
+        * Formatting the version number for HTML output
+        *
+        * @param       integer         Version number
+        * @return      string          Version number for output
+        * @todo Define visibility
+        */
+       public function formatVerId($verId) {
+               return '1.' . $verId;
+       }
+
+       /**
+        * Formatting workspace ID into a visual label
+        *
+        * @param       integer         Workspace ID
+        * @return      string          Workspace title
+        * @todo Define visibility
+        */
+       public function formatWorkspace($wsid) {
+               // Render, if not cached:
+               if (!isset($this->formatWorkspace_cache[$wsid])) {
+                       switch ($wsid) {
+                       case -1:
+                               $this->formatWorkspace_cache[$wsid] = $GLOBALS['LANG']->getLL('offline');
+                               break;
+                       case 0:
+                               $this->formatWorkspace_cache[$wsid] = '';
+                               // Does not output anything for ONLINE because it might confuse people to think that the elemnet IS online which is not the case - only that it exists as an offline version in the online workspace...
+                               break;
+                       default:
+                               $titleRec = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow('title', 'sys_workspace', ('uid=' . intval($wsid)) . \t3lib_BEfunc::deleteClause('sys_workspace'));
+                               $this->formatWorkspace_cache[$wsid] = (('[' . $wsid) . '] ') . $titleRec['title'];
+                               break;
+                       }
                }
-               return $menuItems;
+               return $this->formatWorkspace_cache[$wsid];
        }
 
        /**
-        * Includes the [extDir]/locallang.php and returns the $LOCAL_LANG array found in that file.
+        * Format publishing count for version (lifecycle state)
         *
-        * @return      array           Local lang array
+        * @param       integer         t3ver_count value (number of times it has been online)
+        * @return      string          String translation of count.
         * @todo Define visibility
         */
-       public function includeLL() {
-               return $GLOBALS['LANG']->includeLLFile('EXT:version/locallang.xml', FALSE);
+       public function formatCount($count) {
+               // Render, if not cached:
+               if (!isset($this->formatCount_cache[$count])) {
+                       switch ($count) {
+                       case 0:
+                               $this->formatCount_cache[$count] = $GLOBALS['LANG']->getLL('draft');
+                               break;
+                       case 1:
+                               $this->formatCount_cache[$count] = $GLOBALS['LANG']->getLL('archive');
+                               break;
+                       default:
+                               $this->formatCount_cache[$count] = sprintf($GLOBALS['LANG']->getLL('publishedXTimes'), $count);
+                               break;
+                       }
+               }
+               return $this->formatCount_cache[$count];
        }
 
-}
+       /**
+        * Looking for versions of a record in other workspaces than the current
+        *
+        * @param       string          Table name
+        * @param       integer         Record uid
+        * @return      string          List of other workspace IDs
+        * @todo Define visibility
+        */
+       public function versionsInOtherWS($table, $uid) {
+               // Check for duplicates:
+               // Select all versions of record NOT in this workspace:
+               $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('t3ver_wsid', $table, (((('pid=-1
+                               AND t3ver_oid=' . intval($uid)) . '
+                               AND t3ver_wsid!=') . intval($GLOBALS['BE_USER']->workspace)) . '
+                               AND (t3ver_wsid=-1 OR t3ver_wsid>0)') . \t3lib_BEfunc::deleteClause($table), '', 't3ver_wsid', '', 't3ver_wsid');
+               if (count($rows)) {
+                       return implode(',', array_keys($rows));
+               }
+       }
+
+       /**
+        * Looks up stage changes for version and displays a formatted view on mouseover.
+        *
+        * @param       string          Table name
+        * @param       integer         Record ID
+        * @param       string          HTML string to wrap the mouseover around (should be stage change links)
+        * @return      string          HTML code.
+        * @todo Define visibility
+        */
+       public function showStageChangeLog($table, $id, $stageCommands) {
+               $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('log_data,tstamp,userid', 'sys_log', (('action=6 and details_nr=30
+                               AND tablename=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($table, 'sys_log')) . '
+                               AND recuid=') . intval($id));
+               $entry = array();
+               foreach ($rows as $dat) {
+                       $data = unserialize($dat['log_data']);
+                       $username = $this->be_user_Array[$dat['userid']] ? $this->be_user_Array[$dat['userid']]['username'] : ('[' . $dat['userid']) . ']';
+                       switch ($data['stage']) {
+                       case 1:
+                               $text = $GLOBALS['LANG']->getLL('stage.sentToReview');
+                               break;
+                       case 10:
+                               $text = $GLOBALS['LANG']->getLL('stage.approvedForPublish');
+                               break;
+                       case -1:
+                               $text = $GLOBALS['LANG']->getLL('stage.rejectedElement');
+                               break;
+                       case 0:
+                               $text = $GLOBALS['LANG']->getLL('stage.resetToEdit');
+                               break;
+                       default:
+                               $text = $GLOBALS['LANG']->getLL('stage.undefined');
+                               break;
+                       }
+                       $text = (((\t3lib_BEfunc::dateTime($dat['tstamp']) . ': "') . $username) . '" ') . $text;
+                       $text .= $data['comment'] ? ((('<br />' . $GLOBALS['LANG']->getLL('userComment')) . ': <em>') . htmlspecialchars($data['comment'])) . '</em>' : '';
+                       $entry[] = $text;
+               }
+               return count($entry) ? ((((((((((((((('<span onmouseover="document.getElementById(\'log_' . $table) . $id) . '\').style.visibility = \'visible\';" onmouseout="document.getElementById(\'log_') . $table) . $id) . '\').style.visibility = \'hidden\';">') . $stageCommands) . ' (') . count($entry)) . ')</span>') . '<div class="t3-version-infolayer logLayer" id="log_') . $table) . $id) . '">') . implode('<hr/>', array_reverse($entry))) . '</div>' : $stageCommands;
+       }
+
+       /**
+        * Creates display of sub elements of a page when the swap mode is either "Page" or "Branch" (0 / ALL)
+        *
+        * @param       integer         Page uid (for either online or offline version, but it MUST have swapmode/treeLevel set to >0 (not -1 indicating element versioning)
+        * @param       integer         The treeLevel value, >0 indicates "branch" while 0 means page+content. (-1 would have meant element versioning, but that should never happen for a call to this function!)
+        * @param       integer         For offline versions; This is t3ver_oid, the original ID of the online page.
+        * @return      string          HTML content.
+        * @todo Define visibility
+        */
+       public function subElements($uid, $treeLevel, $origId = 0) {
+               // In online workspace we have a reduced view because otherwise it will bloat the listing:
+               if (!$this->details && ($GLOBALS['BE_USER']->workspace === 0 || !$this->MOD_SETTINGS['expandSubElements'])) {
+                       return (('<br />
+                                       <img' . \t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/ol/joinbottom.gif', 'width="18" height="16"')) . ' align="top" alt="" title="" />') . ($origId ? (((('<a href="' . htmlspecialchars(((((((($this->doc->backPath . \t3lib_extMgm::extRelPath('version')) . 'cm1/index.php?id=') . $uid) . '&details=') . rawurlencode(('pages:' . $uid))) . '&returnUrl=') . rawurlencode($this->REQUEST_URI)))) . '">') . '<span class="typo3-dimmed"><em>') . $GLOBALS['LANG']->getLL('subElementsClick')) . '</em><span></a>' : ('<span class="typo3-dimmed"><em>' . $GLOBALS['LANG']->getLL('subElements')) . '</em><span>');
+               } else {
+                       // For an offline workspace, show sub elements:
+                       $tCell = array();
+                       // Find records that follow pages when swapping versions:
+                       $recList = array();
+                       foreach ($GLOBALS['TCA'] as $tN => $tCfg) {
+                               if ($tN !== 'pages' && ($treeLevel > 0 || $GLOBALS['TCA'][$tN]['ctrl']['versioning_followPages'])) {
+                                       $this->subElements_getNonPageRecords($tN, $uid, $recList);
+                               }
+                       }
+                       // Render records collected above:
+                       $elCount = count($recList) - 1;
+                       foreach ($recList as $c => $comb) {
+                               list($tN, $rec) = $comb;
+                               $this->subElements_renderItem($tCell, $tN, $uid, $rec, $origId, $c == $elCount && $treeLevel == 0 ? 1 : 0, '');
+                       }
+                       // For branch, dive into the subtree:
+                       if ($treeLevel > 0) {
+                               // Drawing tree:
+                               $tree = \t3lib_div::makeInstance('TYPO3\\CMS\\Backend\\Tree\\View\\PageTreeView');
+                               $tree->init('AND ' . $GLOBALS['BE_USER']->getPagePermsClause(1));
+                               $tree->makeHTML = 2;
+                               // 2=Also rendering depth-data into the result array
+                               $tree->getTree($uid, 99, '');
+                               // Traverse page tree:
+                               foreach ($tree->tree as $data) {
+                                       // Render page in table cell:
+                                       $this->subElements_renderItem($tCell, 'pages', $uid, \t3lib_BEfunc::getRecord('pages', $data['row']['uid']), $origId, 2, $data['HTML']);
+                                       // Find all records from page and collect in $recList:
+                                       $recList = array();
+                                       foreach ($GLOBALS['TCA'] as $tN => $tCfg) {
+                                               if ($tN !== 'pages') {
+                                                       $this->subElements_getNonPageRecords($tN, $data['row']['uid'], $recList);
+                                               }
+                                       }
+                                       // Render records collected above:
+                                       $elCount = count($recList) - 1;
+                                       foreach ($recList as $c => $comb) {
+                                               list($tN, $rec) = $comb;
+                                               $this->subElements_renderItem($tCell, $tN, $uid, $rec, $origId, $c == $elCount ? 1 : 0, $data['HTML_depthData']);
+                                       }
+                               }
+                       }
+                       return ('
+                                       <!-- Sub-element tree for versions -->
+                                       <table border="0" cellpadding="0" cellspacing="1" class="ver-subtree">
+                                               ' . implode('', $tCell)) . '
+                                       </table>';
+               }
+       }
+
+       /**
+        * Select records from a table and add them to recList
+        *
+        * @param       string          Table name (from TCA)
+        * @param       integer         PID to select records from
+        * @param       array           Array where records are accumulated, passed by reference
+        * @return      void
+        * @todo Define visibility
+        */
+       public function subElements_getNonPageRecords($tN, $uid, &$recList) {
+               $records = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('*', $tN, (('pid=' . intval($uid)) . ($GLOBALS['TCA'][$tN]['ctrl']['versioningWS'] ? ' AND t3ver_state=0' : '')) . \t3lib_BEfunc::deleteClause($tN), '', $GLOBALS['TCA'][$tN]['ctrl']['sortby'] ? $GLOBALS['TCA'][$tN]['ctrl']['sortby'] : $GLOBALS['TYPO3_DB']->stripOrderBy($GLOBALS['TCA'][$tN]['ctrl']['default_sortby']));
+               foreach ($records as $rec) {
+                       $recList[] = array($tN, $rec);
+               }
+       }
+
+       /**
+        * Render a single item in a subelement list into a table row:
+        *
+        * @param       array           Table rows, passed by reference
+        * @param       string          Table name
+        * @param       integer         Page uid for which the subelements are selected/shown
+        * @param       array           Row of element in list
+        * @param       integer         The uid of the online version of $uid. If zero it means we are drawing a row for the online version itself while a value means we are drawing display for an offline version.
+        * @param       integer         Mode of icon display: 0=not the last, 1= is the last in list (make joinbottom icon then), 2=do not shown icons are all (for pages from the page tree already rendered)
+        * @param       string          Prefix HTML data (icons for tree rendering)
+        * @return      void            (Content accumulated in $tCell!)
+        * @todo Define visibility
+        */
+       public function subElements_renderItem(&$tCell, $tN, $uid, $rec, $origId, $iconMode, $HTMLdata) {
+               // Initialize:
+               $origUidFields = $GLOBALS['TCA'][$tN]['ctrl']['origUid'];
+               $diffCode = '';
+               if ($origUidFields) {
+                       // If there is a field for this table with original uids we will use that to connect records:
+                       if (!$origId) {
+                               // In case we are displaying the online originals:
+                               $this->targets[(((('orig_' . $uid) . '_') . $tN) . '_') . $rec['uid']] = $rec;
+                               // Build up target array (important that
+                               $tdParams = (((((' id="orig_' . $uid) . '_') . $tN) . '_') . $rec['uid']) . '" class="typo3-ver"';
+                       } else {
+                               // Version branch:
+                               if ($this->targets[(((('orig_' . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]]) {
+                                       // If there IS a corresponding original record...:
+                                       // Prepare Table row parameters:
+                                       $tdParams = (((((((((((((((((((((((((((((((((((' onmouseover="hlSubelements(\'' . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]) . '\', \'') . $uid) . '_') . $tN) . '_') . $rec[$origUidFields]) . '\', 1, ') . ($this->MOD_SETTINGS['diff'] == 2 ? 1 : 0)) . ');"') . ' onmouseout="hlSubelements(\'') . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]) . '\', \'') . $uid) . '_') . $tN) . '_') . $rec[$origUidFields]) . '\', 0, ') . ($this->MOD_SETTINGS['diff'] == 2 ? 1 : 0)) . ');"') . ' id="ver_') . $uid) . '_') . $tN) . '_') . $rec[$origUidFields]) . '" class="typo3-ver"';
+                                       // Create diff view:
+                                       if ($this->MOD_SETTINGS['diff']) {
+                                               list($diffHTML, $diffPct) = $this->createDiffView($tN, $rec, $this->targets[(((('orig_' . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]]);
+                                               if ($this->MOD_SETTINGS['diff'] == 2) {
+                                                       $diffCode = ((((((((($diffPct ? ('<span class="nobr">' . $diffPct) . '% change</span>' : '-') . '<div style="visibility: hidden; position: absolute;" id="diff_') . $uid) . '_') . $tN) . '_') . $rec[$origUidFields]) . '" class="diffLayer">') . $diffHTML) . '</div>';
+                                               } else {
+                                                       $diffCode = ($diffPct < 0 ? $GLOBALS['LANG']->getLL('notAvailable') : ($diffPct ? ($diffPct . '% ') . $GLOBALS['LANG']->getLL('change') : '')) . $diffHTML;
+                                               }
+                                       }
+                                       // Unsetting the target fields allows us to mark all originals without a version in the subtree (see ->markupNewOriginals())
+                                       unset($this->targets[(((('orig_' . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]]);
+                               } else {
+                                       // No original record, so must be new:
+                                       $tdParams = ' class="typo3-ver-new"';
+                               }
+                       }
+               } else {
+                       // If no original uid column is supported for this table we are forced NOT to display any diff or highlighting.
+                       $tdParams = ' class="typo3-ver-noComp"';
+               }
+               // Compile the cell:
+               $tCell[] = ((((((((('
+                                               <tr' . $tdParams) . '>
+                                                       <td class="iconTitle">') . $HTMLdata) . ($iconMode < 2 ? (('<img' . \t3lib_iconWorks::skinImg($this->doc->backPath, (('gfx/ol/join' . ($iconMode ? 'bottom' : '')) . '.gif'), 'width="18" height="16"')) . ' alt="" />') . \t3lib_iconWorks::getSpriteIconForRecord($tN, $rec) : '')) . \t3lib_BEfunc::getRecordTitle($tN, $rec, TRUE)) . '</td>
+                                                       <td class="cmdCell">') . $this->displayWorkspaceOverview_commandLinksSub($tN, $rec, $origId)) . '</td>') . ($origId ? ('<td class="diffCell">' . $diffCode) . '</td>' : '')) . '
+                                               </tr>';
+       }
+
+       /**
+        * JavaScript code to mark up new records that are online (in sub element lists)
+        *
+        * @return      string          HTML javascript section
+        * @todo Define visibility
+        */
+       public function markupNewOriginals() {
+               if (count($this->targets)) {
+                       $scriptCode = '';
+                       foreach ($this->targets as $key => $rec) {
+                               $scriptCode .= ('
+                                       document.getElementById(\'' . $key) . '\').attributes.getNamedItem("class").nodeValue = \'typo3-ver-new\';
+                               ';
+                       }
+                       return $this->doc->wrapScriptTags($scriptCode);
+               }
+       }
+
+       /**
+        * Create visual difference view of two records. Using t3lib_diff library
+        *
+        * @param       string          Table name
+        * @param       array           New version record (green)
+        * @param       array           Old version record (red)
+        * @return      array           Array with two keys (0/1) with HTML content / percentage integer (if -1, then it means N/A) indicating amount of change
+        * @todo Define visibility
+        */
+       public function createDiffView($table, $diff_1_record, $diff_2_record) {
+               // Initialize:
+               $pctChange = 'N/A';
+               // Check that records are arrays:
+               if (is_array($diff_1_record) && is_array($diff_2_record)) {
+                       // Load full table description and initialize diff-object:
+                       \t3lib_div::loadTCA($table);
+                       $t3lib_diff_Obj = \t3lib_div::makeInstance('TYPO3\\CMS\\Core\\Utility\\DiffUtility');
+                       // Add header row:
+                       $tRows = array();
+                       $tRows[] = ((('
+                               <tr class="bgColor5 tableheader">
+                                       <td>' . $GLOBALS['LANG']->getLL('fieldname')) . ':</td>
+                                       <td width="98%" nowrap="nowrap">') . $GLOBALS['LANG']->getLL('coloredDiffView')) . ':</td>
+                               </tr>
+                       ';
+                       // Initialize variables to pick up string lengths in:
+                       $allStrLen = 0;
+                       $diffStrLen = 0;
+                       // Traversing the first record and process all fields which are editable:
+                       foreach ($diff_1_record as $fN => $fV) {
+                               if (($GLOBALS['TCA'][$table]['columns'][$fN] && $GLOBALS['TCA'][$table]['columns'][$fN]['config']['type'] !== 'passthrough') && !\t3lib_div::inList('t3ver_label', $fN)) {
+                                       // Check if it is files:
+                                       $isFiles = FALSE;
+                                       if ((strcmp(trim($diff_1_record[$fN]), trim($diff_2_record[$fN])) && $GLOBALS['TCA'][$table]['columns'][$fN]['config']['type'] === 'group') && $GLOBALS['TCA'][$table]['columns'][$fN]['config']['internal_type'] === 'file') {
+                                               // Initialize:
+                                               $uploadFolder = $GLOBALS['TCA'][$table]['columns'][$fN]['config']['uploadfolder'];
+                                               $files1 = array_flip(\t3lib_div::trimExplode(',', $diff_1_record[$fN], 1));
+                                               $files2 = array_flip(\t3lib_div::trimExplode(',', $diff_2_record[$fN], 1));
+                                               // Traverse filenames and read their md5 sum:
+                                               foreach ($files1 as $filename => $tmp) {
+                                                       $files1[$filename] = @is_file((((PATH_site . $uploadFolder) . '/') . $filename)) ? md5(\t3lib_div::getUrl(((PATH_site . $uploadFolder) . '/') . $filename)) : $filename;
+                                               }
+                                               foreach ($files2 as $filename => $tmp) {
+                                                       $files2[$filename] = @is_file((((PATH_site . $uploadFolder) . '/') . $filename)) ? md5(\t3lib_div::getUrl(((PATH_site . $uploadFolder) . '/') . $filename)) : $filename;
+                                               }
+                                               // Implode MD5 sums and set flag:
+                                               $diff_1_record[$fN] = implode(' ', $files1);
+                                               $diff_2_record[$fN] = implode(' ', $files2);
+                                               $isFiles = TRUE;
+                                       }
+                                       // If there is a change of value:
+                                       if (strcmp(trim($diff_1_record[$fN]), trim($diff_2_record[$fN]))) {
+                                               // Get the best visual presentation of the value and present that:
+                                               $val1 = \t3lib_BEfunc::getProcessedValue($table, $fN, $diff_2_record[$fN], 0, 1);
+                                               $val2 = \t3lib_BEfunc::getProcessedValue($table, $fN, $diff_1_record[$fN], 0, 1);
+                                               // Make diff result and record string lenghts:
+                                               $diffres = $t3lib_diff_Obj->makeDiffDisplay($val1, $val2, $isFiles ? 'div' : 'span');
+                                               $diffStrLen += $t3lib_diff_Obj->differenceLgd;
+                                               $allStrLen += strlen($val1 . $val2);
+                                               // If the compared values were files, substituted MD5 hashes:
+                                               if ($isFiles) {
+                                                       $allFiles = array_merge($files1, $files2);
+                                                       foreach ($allFiles as $filename => $token) {
+                                                               if (strlen($token) == 32 && strstr($diffres, $token)) {
+                                                                       $filename = \t3lib_BEfunc::thumbCode(array($fN => $filename), $table, $fN, $this->doc->backPath) . $filename;
+                                                                       $diffres = str_replace($token, $filename, $diffres);
+                                                               }
+                                                       }
+                                               }
+                                               // Add table row with result:
+                                               $tRows[] = ((('
+                                                       <tr class="bgColor4">
+                                                               <td>' . htmlspecialchars($GLOBALS['LANG']->sL(\t3lib_BEfunc::getItemLabel($table, $fN)))) . '</td>
+                                                               <td width="98%">') . $diffres) . '</td>
+                                                       </tr>
+                                               ';
+                                       } else {
+                                               // Add string lengths even if value matched - in this was the change percentage is not high if only a single field is changed:
+                                               $allStrLen += strlen($diff_1_record[$fN] . $diff_2_record[$fN]);
+                                       }
+                               }
+                       }
+                       // Calculate final change percentage:
+                       $pctChange = $allStrLen ? ceil(($diffStrLen * 100) / $allStrLen) : -1;
+                       // Create visual representation of result:
+                       if (count($tRows) > 1) {
+                               $content .= ('<table border="0" cellpadding="1" cellspacing="1" class="diffTable">' . implode('', $tRows)) . '</table>';
+                       } else {
+                               $content .= (('<span class="nobr">' . $this->doc->icons(1)) . $GLOBALS['LANG']->getLL('completeMatch')) . '</span>';
+                       }
+               } else {
+                       $content .= $this->doc->icons(3) . $GLOBALS['LANG']->getLL('errorRecordsNotFound');
+               }
+               // Return value:
+               return array($content, $pctChange);
+       }
+
+       /**
+        * Links to stage change of a version
+        *
+        * @param       string          Table name
+        * @param       array           Offline record (version)
+        * @return      string          HTML content, mainly link tags and images.
+        * @todo Define visibility
+        */
+       public function displayWorkspaceOverview_stageCmd($table, &$rec_off) {
+               switch ((int) $rec_off['t3ver_stage']) {
+               case 0:
+                       $sId = 1;
+                       $sLabel = $GLOBALS['LANG']->getLL('editing');
+                       $color = '#666666';
+                       $label = $GLOBALS['LANG']->getLL('commentForReviewer');
+                       $titleAttrib = $GLOBALS['LANG']->getLL('sendToReview');
+                       break;
+               case 1:
+                       $sId = 10;
+                       $sLabel = $GLOBALS['LANG']->getLL('review');
+                       $color = '#6666cc';
+                       $label = $GLOBALS['LANG']->getLL('commentForPublisher');
+                       $titleAttrib = $GLOBALS['LANG']->getLL('approveForPublishing');
+                       break;
+               case 10:
+                       $sLabel = $GLOBALS['LANG']->getLL('publish');
+                       $color = '#66cc66';
+                       break;
+               case -1:
+                       $sLabel = $this->doc->icons(2) . $GLOBALS['LANG']->getLL('rejected');
+                       $sId = 0;
+                       $color = '#ff0000';
+                       $label = $GLOBALS['LANG']->getLL('comment');
+                       $titleAttrib = $GLOBALS['LANG']->getLL('resetStage');
+                       break;
+               default:
+                       $sLabel = $GLOBALS['LANG']->getLL('undefined');
+                       $sId = 0;
+                       $color = '';
+                       break;
+               }
+               $raiseOk = !$GLOBALS['BE_USER']->workspaceCannotEditOfflineVersion($table, $rec_off);
+               if ($raiseOk && $rec_off['t3ver_stage'] != -1) {
+                       $onClick = (((((((('var commentTxt=window.prompt("' . $GLOBALS['LANG']->getLL('rejectExplain')) . '","");
+                                                       if (commentTxt!=null) {window.location.href="') . $this->doc->issueCommand(((((((((('&cmd[' . $table) . '][') . $rec_off['uid']) . '][version][action]=setStage') . '&cmd[') . $table) . '][') . $rec_off['uid']) . '][version][stageId]=-1'))) . '&cmd[') . $table) . '][') . $rec_off['uid']) . '][version][comment]="+escape(commentTxt);}') . ' return false;';
+                       // Reject:
+                       $actionLinks .= ((((('<a href="#" onclick="' . htmlspecialchars($onClick)) . '" title="') . $GLOBALS['LANG']->getLL('reject', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-move-down')) . '</a>';
+               } else {
+                       // Reject:
+                       $actionLinks .= ('<img src="' . $this->doc->backPath) . 'gfx/clear.gif" width="14" height="14" alt="" align="top" title="" />';
+               }
+               $actionLinks .= ((('<span style="background-color: ' . $color) . '; color: white;">') . $sLabel) . '</span>';
+               // Raise
+               if ($raiseOk) {
+                       $onClick = (((((((('var commentTxt=window.prompt("' . $label) . '","");
+                                                       if (commentTxt!=null) {window.location.href="') . $this->doc->issueCommand((((((((((('&cmd[' . $table) . '][') . $rec_off['uid']) . '][version][action]=setStage') . '&cmd[') . $table) . '][') . $rec_off['uid']) . '][version][stageId]=') . $sId))) . '&cmd[') . $table) . '][') . $rec_off['uid']) . '][version][comment]="+escape(commentTxt);}') . ' return false;';
+                       if ($rec_off['t3ver_stage'] != 10) {
+                               $actionLinks .= ((((('<a href="#" onclick="' . htmlspecialchars($onClick)) . '" title="') . htmlspecialchars($titleAttrib)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-move-up')) . '</a>';
+                               $this->stageIndex[$sId][$table][] = $rec_off['uid'];
+                               $this->recIndex[$table][$rec_off['uid']] = $sId;
+                       }
+               }
+               return $actionLinks;
+       }
+
+       /**
+        * Links to publishing etc of a version
+        *
+        * @param       string          Table name
+        * @param       array           Online record
+        * @param       array           Offline record (version)
+        * @param       string          Swap type, "branch", "page" or "element
+        * @return      string          HTML content, mainly link tags and images.
+        * @todo Define visibility
+        */
+       public function displayWorkspaceOverview_commandLinks($table, &$rec_on, &$rec_off, $vType) {
+               if ($this->publishAccess && (!($GLOBALS['BE_USER']->workspaceRec['publish_access'] & 1) || (int) $rec_off['t3ver_stage'] === -10)) {
+                       $actionLinks = ((((('<a href="' . htmlspecialchars($this->doc->issueCommand((((((((((('&cmd[' . $table) . '][') . $rec_on['uid']) . '][version][action]=swap') . '&cmd[') . $table) . '][') . $rec_on['uid']) . '][version][swapWith]=') . $rec_off['uid'])))) . '" title="') . $GLOBALS['LANG']->getLL('publish', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-swap-version')) . '</a>';
+                       if ($GLOBALS['BE_USER']->workspaceSwapAccess()) {
+                               $actionLinks .= ((((('<a href="' . htmlspecialchars($this->doc->issueCommand(((((((((((((((('&cmd[' . $table) . '][') . $rec_on['uid']) . '][version][action]=swap') . '&cmd[') . $table) . '][') . $rec_on['uid']) . '][version][swapWith]=') . $rec_off['uid']) . '&cmd[') . $table) . '][') . $rec_on['uid']) . '][version][swapIntoWS]=1')))) . '" title="') . $GLOBALS['LANG']->getLL('swap', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-swap-workspace')) . '</a>';
+                       }
+               }
+               if (!$GLOBALS['BE_USER']->workspaceCannotEditOfflineVersion($table, $rec_off)) {
+                       // Release
+                       $actionLinks .= ((((((('<a href="' . htmlspecialchars($this->doc->issueCommand((((('&cmd[' . $table) . '][') . $rec_off['uid']) . '][version][action]=clearWSID')))) . '" onclick="return confirm(\'') . $GLOBALS['LANG']->getLL('removeFromWorkspace', TRUE)) . '?\');" title="') . $GLOBALS['LANG']->getLL('removeFromWorkspace', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-document-remove')) . '</a>';
+                       // Edit
+                       if ($table === 'pages' && $vType !== 'element') {
+                               $tempUid = $vType === 'branch' || $GLOBALS['BE_USER']->workspace === 0 ? $rec_off['uid'] : $rec_on['uid'];
+                               $actionLinks .= ((((((('<a href="#" onclick="top.loadEditId(' . $tempUid) . ');top.goToModule(\'') . $this->pageModule) . '\'); return false;" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:img_title_edit_page', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-page-open')) . '</a>';
+                       } else {
+                               $params = ((('&edit[' . $table) . '][') . $rec_off['uid']) . ']=edit';
+                               $actionLinks .= ((((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::editOnClick($params, $this->doc->backPath))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:img_title_edit_element', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-open')) . '</a>';
+                       }
+               }
+               // History/Log
+               $actionLinks .= ((((('<a href="' . htmlspecialchars((((($this->doc->backPath . 'show_rechis.php?element=') . rawurlencode((($table . ':') . $rec_off['uid']))) . '&returnUrl=') . rawurlencode($this->REQUEST_URI)))) . '" title="') . $GLOBALS['LANG']->getLL('showLog', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-history-open')) . '</a>';
+               // View
+               if ($table === 'pages') {
+                       $tempUid = $vType === 'branch' || $GLOBALS['BE_USER']->workspace === 0 ? $rec_off['uid'] : $rec_on['uid'];
+                       $actionLinks .= ((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($tempUid, $this->doc->backPath, \t3lib_BEfunc::BEgetRootLine($tempUid)))) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
+               }
+               return $actionLinks;
+       }
+
+       /**
+        * Links to publishing etc of a version
+        *
+        * @param       string          Table name
+        * @param       array           Record
+        * @param       integer         The uid of the online version of $uid. If zero it means we are drawing a row for the online version itself while a value means we are drawing display for an offline version.
+        * @return      string          HTML content, mainly link tags and images.
+        * @todo Define visibility
+        */
+       public function displayWorkspaceOverview_commandLinksSub($table, $rec, $origId) {
+               $uid = $rec['uid'];
+               if ($origId || $GLOBALS['BE_USER']->workspace === 0) {
+                       if (!$GLOBALS['BE_USER']->workspaceCannotEditRecord($table, $rec)) {
+                               // Edit
+                               if ($table === 'pages') {
+                                       $actionLinks .= ((((((('<a href="#" onclick="top.loadEditId(' . $uid) . ');top.goToModule(\'') . $this->pageModule) . '\'); return false;" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:img_title_edit_page', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('apps-version-page-open')) . '</a>';
+                               } else {
+                                       $params = ((('&edit[' . $table) . '][') . $uid) . ']=edit';
+                                       $actionLinks .= ((((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::editOnClick($params, $this->doc->backPath))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:img_title_edit_element', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-open')) . '</a>';
+                               }
+                       }
+                       // History/Log
+                       $actionLinks .= ((((('<a href="' . htmlspecialchars((((($this->doc->backPath . 'show_rechis.php?element=') . rawurlencode((($table . ':') . $uid))) . '&returnUrl=') . rawurlencode($this->REQUEST_URI)))) . '" title="') . $GLOBALS['LANG']->getLL('showLog', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-history-open')) . '</a>';
+               }
+               // View
+               if ($table === 'pages') {
+                       $actionLinks .= ((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($uid, $this->doc->backPath, \t3lib_BEfunc::BEgetRootLine($uid)))) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
+               }
+               return $actionLinks;
+       }
+
+       /**********************************
+        *
+        * Processing
+        *
+        **********************************/
+       /**
+        * Will publish workspace if buttons are pressed
+        *
+        * @return      void
+        * @todo Define visibility
+        */
+       public function publishAction() {
+               // If "Publish" or "Swap" buttons are pressed:
+               if (\t3lib_div::_POST('_publish') || \t3lib_div::_POST('_swap')) {
+                       if ($this->table === 'pages') {
+                               // Making sure ->uid is a page ID!
+                               // Initialize workspace object and request all pending versions:
+                               $wslibObj = \t3lib_div::makeInstance('TYPO3\\CMS\\Version\\Utility\\WorkspacesUtility');
+                               $cmd = $wslibObj->getCmdArrayForPublishWS($GLOBALS['BE_USER']->workspace, \t3lib_div::_POST('_swap'), $this->uid);
+                               // Execute the commands:
+                               $tce = \t3lib_div::makeInstance('TYPO3\\CMS\\Core\\DataHandler\\DataHandler');
+                               $tce->stripslashes_values = 0;
+                               $tce->start(array(), $cmd);
+                               $tce->process_cmdmap();
+                               \t3lib_BEfunc::setUpdateSignal('updatePageTree');
+                               return $tce->errorLog;
+                       }
+               }
+       }
 
+}
 
 ?>
\ No newline at end of file
index 8277233..3720496 100644 (file)
@@ -891,7 +891,7 @@ class CommandMap {
         * @return \TYPO3\CMS\Version\Dependency\EventCallback
         */
        protected function getDependencyCallback($method, array $targetArguments = array()) {
-               return \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Version\\Dependency\\DependencyResolver_Callback', $this, $method, $targetArguments);
+               return \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Version\\Dependency\\EventCallback', $this, $method, $targetArguments);
        }
 
        /**
index 30749d0..bce3cba 100755 (executable)
@@ -29,1441 +29,14 @@ require $BACK_PATH . 'template.php';
 $GLOBALS['LANG']->includeLLFile('EXT:version/locallang.xml');
 // DEFAULT initialization of a module [END]
 require_once '../ws/class.wslib.php';
-namespace TYPO3\CMS\Version\ClickMenu;
-
-/**
- * Versioning module, including workspace management
- *
- * @author     Kasper Skårhøj <kasperYYYY@typo3.com>
- * @package TYPO3
- * @subpackage core
+/*
+ * @deprecated since 6.0, the classname tx_version_cm1 and this file is obsolete
+ * and will be removed by 7.0. The class was renamed and is now located at:
+ * typo3/sysext/version/Classes/Controller/VersionModuleController.php
  */
-class VersionModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClass {
-
-       // Default variables for backend modules
-       /**
-        * @todo Define visibility
-        */
-       public $MCONF = array();
-
-       // Module configuration
-       /**
-        * @todo Define visibility
-        */
-       public $MOD_MENU = array();
-
-       // Module menu items
-       /**
-        * @todo Define visibility
-        */
-       public $MOD_SETTINGS = array();
-
-       // Module session settings
-       /**
-        * document template object
-        *
-        * @var \TYPO3\CMS\Backend\Template\MediumDocumentTemplate
-        * @todo Define visibility
-        */
-       public $doc;
-
-       /**
-        * @todo Define visibility
-        */
-       public $content;
-
-       // Accumulated content
-       // Internal:
-       /**
-        * @todo Define visibility
-        */
-       public $showWorkspaceCol = 0;
-
-       /**
-        * @todo Define visibility
-        */
-       public $formatWorkspace_cache = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $formatCount_cache = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $targets = array();
-
-       // Accumulation of online targets.
-       /**
-        * @todo Define visibility
-        */
-       public $pageModule = '';
-
-       // Name of page module
-       /**
-        * @todo Define visibility
-        */
-       public $publishAccess = FALSE;
-
-       /**
-        * @todo Define visibility
-        */
-       public $be_user_Array = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $stageIndex = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $recIndex = array();
-
-       protected $showDraftWorkspace = FALSE;
-
-       // Determines whether to show the dummy draft workspace
-       /*********************************
-        *
-        * Standard module initialization
-        *
-        *********************************/
-       /**
-        * Initialize menu configuration
-        *
-        * @return      void
-        * @todo Define visibility
-        */
-       public function menuConfig() {
-               // fetches the configuration of the version extension
-               $versionExtconf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['version']);
-               // show draft workspace only if enabled in the version extensions config
-               if ($versionExtconf['showDraftWorkspace']) {
-                       $this->showDraftWorkspace = TRUE;
-               }
-               // Menu items:
-               $this->MOD_MENU = array(
-                       'filter' => array(
-                               1 => $GLOBALS['LANG']->getLL('filter_drafts'),
-                               2 => $GLOBALS['LANG']->getLL('filter_archive'),
-                               0 => $GLOBALS['LANG']->getLL('filter_all')
-                       ),
-                       'display' => array(
-                               0 => $GLOBALS['LANG']->getLL('liveWorkspace'),
-                               -98 => $GLOBALS['LANG']->getLL('draftWorkspaces'),
-                               -99 => $GLOBALS['LANG']->getLL('filter_all')
-                       ),
-                       'diff' => ''
-               );
-               if ($this->showDraftWorkspace === TRUE) {
-                       $this->MOD_MENU['display'][-1] = $GLOBALS['LANG']->getLL('defaultDraft');
-               }
-               // Add workspaces (only if the live workspace is currently active):
-               if (\t3lib_extMgm::isLoaded('workspaces') && $GLOBALS['BE_USER']->workspace === 0) {
-                       $workspaces = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid,title,adminusers,members,reviewers', 'sys_workspace', 'pid=0' . \t3lib_BEfunc::deleteClause('sys_workspace'), '', 'title');
-                       foreach ($workspaces as $rec) {
-                               if ($GLOBALS['BE_USER']->checkWorkspace($rec)) {
-                                       $this->MOD_MENU['display'][$rec['uid']] = (('[' . $rec['uid']) . '] ') . $rec['title'];
-                               }
-                       }
-               }
-               // CLEANSE SETTINGS
-               $this->MOD_SETTINGS = \t3lib_BEfunc::getModuleData($this->MOD_MENU, \t3lib_div::_GP('SET'), $this->MCONF['name'], 'ses');
-       }
-
-       /**
-        * Main function of the module. Write the content to $this->content
-        *
-        * @return      void
-        * @todo Define visibility
-        */
-       public function main() {
-               // Template markers
-               $markers = array(
-                       'CSH' => '',
-                       'FUNC_MENU' => '',
-                       'WS_MENU' => '',
-                       'CONTENT' => ''
-               );
-               // Setting module configuration:
-               $this->MCONF = $GLOBALS['MCONF'];
-               $this->REQUEST_URI = str_replace('&sendToReview=1', '', \t3lib_div::getIndpEnv('REQUEST_URI'));
-               // Draw the header.
-               $this->doc = \t3lib_div::makeInstance('TYPO3\\CMS\\Backend\\Template\\DocumentTemplate');
-               $this->doc->backPath = $GLOBALS['BACK_PATH'];
-               $this->doc->setModuleTemplate('templates/version.html');
-               // Add styles
-               $this->doc->inDocStylesArray[$GLOBALS['MCONF']['name']] = '
-.version-diff-1 { background-color: green; }
-.version-diff-2 { background-color: red; }
-';
-               // Setting up the context sensitive menu:
-               $this->doc->getContextMenuCode();
-               // Getting input data:
-               $this->id = intval(\t3lib_div::_GP('id'));
-               // Page id. If set, indicates activation from Web>Versioning module
-               if (!$this->id) {
-                       $this->uid = intval(\t3lib_div::_GP('uid'));
-                       // Record uid. Goes with table name to indicate specific record
-                       $this->table = \t3lib_div::_GP('table');
-               } else {
-                       $this->uid = $this->id;
-                       $this->table = 'pages';
-               }
-               $this->details = \t3lib_div::_GP('details');
-               // Page id. If set, indicates activation from Web>Versioning module
-               $this->diffOnly = \t3lib_div::_GP('diffOnly');
-               // Flag. If set, shows only the offline version and with diff-view
-               // Force this setting:
-               $this->MOD_SETTINGS['expandSubElements'] = TRUE;
-               $this->MOD_SETTINGS['diff'] = $this->details || $this->MOD_SETTINGS['diff'] ? 1 : 0;
-               // Reading the record:
-               $record = \t3lib_BEfunc::getRecord($this->table, $this->uid);
-               if ($record['pid'] == -1) {
-                       $record = \t3lib_BEfunc::getRecord($this->table, $record['t3ver_oid']);
-               }
-               $this->recordFound = is_array($record);
-               $pidValue = $this->table === 'pages' ? $this->uid : $record['pid'];
-               // Checking access etc.
-               if ($this->recordFound && $GLOBALS['TCA'][$this->table]['ctrl']['versioningWS']) {
-                       $this->doc->form = '<form action="" method="post">';
-                       $this->uid = $record['uid'];
-                       // Might have changed if new live record was found!
-                       // Access check!
-                       // The page will show only if there is a valid page and if this page may be viewed by the user
-                       $this->pageinfo = \t3lib_BEfunc::readPageAccess($pidValue, $this->perms_clause);
-                       $access = is_array($this->pageinfo) ? 1 : 0;
-                       if ($pidValue && $access || $GLOBALS['BE_USER']->user['admin'] && !$pidValue) {
-                               // JavaScript
-                               $this->doc->JScode .= '
-                                       <script language="javascript" type="text/javascript">
-                                               script_ended = 0;
-                                               function jumpToUrl(URL) {
-                                                       window.location.href = URL;
-                                               }
-
-                                               function hlSubelements(origId, verId, over, diffLayer)  {       //
-                                                       if (over) {
-                                                               document.getElementById(\'orig_\'+origId).attributes.getNamedItem("class").nodeValue = \'typo3-ver-hl\';
-                                                               document.getElementById(\'ver_\'+verId).attributes.getNamedItem("class").nodeValue = \'typo3-ver-hl\';
-                                                               if (diffLayer) {
-                                                                       document.getElementById(\'diff_\'+verId).style.visibility = \'visible\';
-                                                               }
-                                                       } else {
-                                                               document.getElementById(\'orig_\'+origId).attributes.getNamedItem("class").nodeValue = \'typo3-ver\';
-                                                               document.getElementById(\'ver_\'+verId).attributes.getNamedItem("class").nodeValue = \'typo3-ver\';
-                                                               if (diffLayer) {
-                                                                       document.getElementById(\'diff_\'+verId).style.visibility = \'hidden\';
-                                                               }
-                                                       }
-                                               }
-                                       </script>
-                               ';
-                               // If another page module was specified, replace the default Page module with the new one
-                               $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
-                               $this->pageModule = \t3lib_BEfunc::isModuleSetInTBE_MODULES($newPageModule) ? $newPageModule : 'web_layout';
-                               // Setting publish access permission for workspace:
-                               $this->publishAccess = $GLOBALS['BE_USER']->workspacePublishAccess($GLOBALS['BE_USER']->workspace);
-                               // Render content:
-                               if ($this->id) {
-                                       $this->workspaceMgm();
-                               } else {
-                                       $this->versioningMgm();
-                               }
-                       }
-                       $this->content .= $this->doc->spacer(10);
-                       // Setting up the buttons and markers for docheader
-                       $docHeaderButtons = $this->getButtons();
-                       $markers['CSH'] = $docHeaderButtons['csh'];
-                       $markers['FUNC_MENU'] = \t3lib_BEfunc::getFuncMenu($this->id, 'SET[function]', $this->MOD_SETTINGS['function'], $this->MOD_MENU['function']);
-                       $markers['WS_MENU'] = $this->workspaceMenu();
-                       $markers['CONTENT'] = $this->content;
-               } else {
-                       // If no access or id value, create empty document
-                       $this->content = $this->doc->section($GLOBALS['LANG']->getLL('clickAPage_header'), $GLOBALS['LANG']->getLL('clickAPage_content'), 0, 1);
-                       // Setting up the buttons and markers for docheader
-                       $docHeaderButtons = $this->getButtons();
-                       $markers['CONTENT'] = $this->content;
-               }
-               // Build the <body> for the module
-               $this->content = $this->doc->startPage($GLOBALS['LANG']->getLL('title'));
-               $this->content .= $this->doc->moduleBody($this->pageinfo, $docHeaderButtons, $markers);
-               $this->content .= $this->doc->endPage();
-               $this->content = $this->doc->insertStylesAndJS($this->content);
-       }
-
-       /**
-        * Outputs accumulated module content to browser.
-        *
-        * @return      void
-        * @todo Define visibility
-        */
-       public function printContent() {
-               echo $this->content;
-       }
-
-       /**
-        * Create the panel of buttons for submitting the form or otherwise perform operations.
-        *
-        * @return      array   all available buttons as an assoc. array
-        */
-       protected function getButtons() {
-               $buttons = array(
-                       'csh' => '',
-                       'view' => '',
-                       'record_list' => '',
-                       'shortcut' => ''
-               );
-               // CSH
-               //$buttons['csh'] = t3lib_BEfunc::cshItem('_MOD_web_txversionM1', '', $GLOBALS['BACK_PATH']);
-               if ($this->recordFound && $GLOBALS['TCA'][$this->table]['ctrl']['versioningWS']) {
-                       // View page
-                       $buttons['view'] = ((((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($this->pageinfo['uid'], $GLOBALS['BACK_PATH'], \t3lib_BEfunc::BEgetRootLine($this->pageinfo['uid'])))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.showPage', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
-                       // Shortcut
-                       if ($GLOBALS['BE_USER']->mayMakeShortcut()) {
-                               $buttons['shortcut'] = $this->doc->makeShortcutIcon('id, edit_record, pointer, new_unique_uid, search_field, search_levels, showLimit', implode(',', array_keys($this->MOD_MENU)), $this->MCONF['name']);
-                       }
-                       // If access to Web>List for user, then link to that module.
-                       $buttons['record_list'] = \t3lib_BEfunc::getListViewLink(array(
-                               'id' => $this->pageinfo['uid'],
-                               'returnUrl' => \t3lib_div::getIndpEnv('REQUEST_URI')
-                       ), '', $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.showList'));
-               }
-               return $buttons;
-       }
-
-       /******************************
-        *
-        * Versioning management
-        *
-        ******************************/
-       /**
-        * Management of versions for record
-        *
-        * @return      void
-        * @todo Define visibility
-        */
-       public function versioningMgm() {
-               // Diffing:
-               $diff_1 = \t3lib_div::_POST('diff_1');
-               $diff_2 = \t3lib_div::_POST('diff_2');
-               if (\t3lib_div::_POST('do_diff')) {
-                       $content = '';
-                       $content .= ('<h3>' . $GLOBALS['LANG']->getLL('diffing')) . ':</h3>';
-                       if ($diff_1 && $diff_2) {
-                               $diff_1_record = \t3lib_BEfunc::getRecord($this->table, $diff_1);
-                               $diff_2_record = \t3lib_BEfunc::getRecord($this->table, $diff_2);
-                               if (is_array($diff_1_record) && is_array($diff_2_record)) {
-                                       \t3lib_div::loadTCA($this->table);
-                                       $t3lib_diff_Obj = \t3lib_div::makeInstance('TYPO3\\CMS\\Core\\Utility\\DiffUtility');
-                                       $tRows = array();
-                                       $tRows[] = ((('
-                                                                       <tr class="bgColor5 tableheader">
-                                                                               <td>' . $GLOBALS['LANG']->getLL('fieldname')) . '</td>
-                                                                               <td width="98%">') . $GLOBALS['LANG']->getLL('coloredDiffView')) . ':</td>
-                                                                       </tr>
-                                                               ';
-                                       foreach ($diff_1_record as $fN => $fV) {
-                                               if (($GLOBALS['TCA'][$this->table]['columns'][$fN] && $GLOBALS['TCA'][$this->table]['columns'][$fN]['config']['type'] !== 'passthrough') && !\t3lib_div::inList('t3ver_label', $fN)) {
-                                                       if (strcmp($diff_1_record[$fN], $diff_2_record[$fN])) {
-                                                               $diffres = $t3lib_diff_Obj->makeDiffDisplay(\t3lib_BEfunc::getProcessedValue($this->table, $fN, $diff_2_record[$fN], 0, 1), \t3lib_BEfunc::getProcessedValue($this->table, $fN, $diff_1_record[$fN], 0, 1));
-                                                               $tRows[] = ((('
-                                                                       <tr class="bgColor4">
-                                                                               <td>' . $fN) . '</td>
-                                                                               <td width="98%">') . $diffres) . '</td>
-                                                                       </tr>
-                                                               ';
-                                                       }
-                                               }
-                                       }
-                                       if (count($tRows) > 1) {
-                                               $content .= ('<table border="0" cellpadding="1" cellspacing="1" width="100%">' . implode('', $tRows)) . '</table><br /><br />';
-                                       } else {
-                                               $content .= $GLOBALS['LANG']->getLL('recordsMatchesCompletely');
-                                       }
-                               } else {
-                                       $content .= $GLOBALS['LANG']->getLL('errorRecordsNotFound');
-                               }
-                       } else {
-                               $content .= $GLOBALS['LANG']->getLL('errorDiffSources');
-                       }
-               }
-               // Element:
-               $record = \t3lib_BEfunc::getRecord($this->table, $this->uid);
-               $recordIcon = \t3lib_iconWorks::getSpriteIconForRecord($this->table, $record);
-               $recTitle = \t3lib_BEfunc::getRecordTitle($this->table, $record, TRUE);
-               // Display versions:
-               $content .= (((('
-                       ' . $recordIcon) . $recTitle) . '
-                       <form name="theform" action="') . str_replace('&sendToReview=1', '', $this->REQUEST_URI)) . '" method="post">
-                       <table border="0" cellspacing="1" cellpadding="1">';
-               $content .= ((((((((((((((((((((((((((((((((((((((((('
-                               <tr class="bgColor5 tableheader">
-                                       <td>&nbsp;</td>
-                                       <td>&nbsp;</td>
-                                       <td title="' . $GLOBALS['LANG']->getLL('tblHeaderDesc_title')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_title')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_uid')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_uid')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_oid')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_oid')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_id')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_id')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_wsid')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_wsid')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_state')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_state')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_stage')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_stage')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_count')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_count')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_pid')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_pid')) . '</td>
-                                       <td title="') . $GLOBALS['LANG']->getLL('tblHeaderDesc_t3ver_label')) . '">') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_label')) . '</td>
-                                       <td colspan="2"><input type="submit" name="do_diff" value="') . $GLOBALS['LANG']->getLL('diff')) . '" /></td>
-                               </tr>';
-               $versions = \t3lib_BEfunc::selectVersionsOfRecord($this->table, $this->uid, '*', $GLOBALS['BE_USER']->workspace);
-               foreach ($versions as $row) {
-                       $adminLinks = $this->adminLinks($this->table, $row);
-                       $content .= ((((((((((((((((((((((((((((((((((((((('
-                               <tr class="' . ($row['uid'] != $this->uid ? 'bgColor4' : 'bgColor2 tableheader')) . '">
-                                       <td>') . ($row['uid'] != $this->uid ? ((((('<a href="' . $this->doc->issueCommand((((((((((('&cmd[' . $this->table) . '][') . $this->uid) . '][version][swapWith]=') . $row['uid']) . '&cmd[') . $this->table) . '][') . $this->uid) . '][version][action]=swap'))) . '" title="') . $GLOBALS['LANG']->getLL('swapWithCurrent', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-swap-version')) . '</a>' : \t3lib_iconWorks::getSpriteIcon('status-status-current', array('title' => $GLOBALS['LANG']->getLL('currentOnlineVersion', TRUE))))) . '</td>
-                                       <td nowrap="nowrap">') . $adminLinks) . '</td>
-                                       <td nowrap="nowrap">') . \t3lib_BEfunc::getRecordTitle($this->table, $row, TRUE)) . '</td>
-                                       <td>') . $row['uid']) . '</td>
-                                       <td>') . $row['t3ver_oid']) . '</td>
-                                       <td>') . $row['t3ver_id']) . '</td>
-                                       <td>') . $row['t3ver_wsid']) . '</td>
-                                       <td>') . $row['t3ver_state']) . '</td>
-                                       <td>') . $row['t3ver_stage']) . '</td>
-                                       <td>') . $row['t3ver_count']) . '</td>
-                                       <td>') . $row['pid']) . '</td>
-                                       <td nowrap="nowrap"><a href="#" onclick="') . htmlspecialchars(\t3lib_BEfunc::editOnClick((((('&edit[' . $this->table) . '][') . $row['uid']) . ']=edit&columnsOnly=t3ver_label'), $this->doc->backPath))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:cm.edit', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-open')) . '</a>') . htmlspecialchars($row['t3ver_label'])) . '</td>
-                                       <td class="version-diff-1"><input type="radio" name="diff_1" value="') . $row['uid']) . '"') . ($diff_1 == $row['uid'] ? ' checked="checked"' : '')) . '/></td>
-                                       <td class="version-diff-2"><input type="radio" name="diff_2" value="') . $row['uid']) . '"') . ($diff_2 == $row['uid'] ? ' checked="checked"' : '')) . '/></td>
-                               </tr>';
-                       // Show sub-content if the table is pages AND it is not the online branch (because that will mostly render the WHOLE tree below - not smart;)
-                       if ($this->table == 'pages' && $row['uid'] != $this->uid) {
-                               $sub = $this->pageSubContent($row['uid']);
-                               if ($sub) {
-                                       $content .= ('
-                                               <tr>
-                                                       <td></td>
-                                                       <td></td>
-                                                       <td colspan="10">' . $sub) . '</td>
-                                                       <td colspan="2"></td>
-                                               </tr>';
-                               }
-                       }
-               }
-               $content .= '</table></form>';
-               $this->content .= $this->doc->section($GLOBALS['LANG']->getLL('title'), $content, 0, 1);
-               // Create new:
-               $content = ((((((((((((((((('
-
-                       <form action="' . $this->doc->backPath) . 'tce_db.php" method="post">
-                       ') . $GLOBALS['LANG']->getLL('tblHeader_t3ver_label')) . ': <input type="text" name="cmd[') . $this->table) . '][') . $this->uid) . '][version][label]" /><br />
-                       <br /><input type="hidden" name="cmd[') . $this->table) . '][') . $this->uid) . '][version][action]" value="new" />
-                       <input type="hidden" name="prErr" value="1" />
-                       <input type="hidden" name="redirect" value="') . htmlspecialchars($this->REQUEST_URI)) . '" />
-                       <input type="submit" name="_" value="') . $GLOBALS['LANG']->getLL('createNewVersion')) . '" />
-                       ') . \t3lib_TCEforms::getHiddenTokenField('tceAction')) . '
-                       </form>
-
-               ';
-               $this->content .= $this->doc->spacer(15);
-               $this->content .= $this->doc->section($GLOBALS['LANG']->getLL('createNewVersion'), $content, 0, 1);
-       }
-
-       /**
-        * Recursively look for children for page version with $pid
-        *
-        * @param       integer         UID of page record for which to look up sub-elements following that version
-        * @param       integer         Counter, do not set (limits to 100 levels)
-        * @return      string          Table with content if any
-        * @todo Define visibility
-        */
-       public function pageSubContent($pid, $c = 0) {
-               $tableNames = \t3lib_div::removeArrayEntryByValue(array_keys($GLOBALS['TCA']), 'pages');
-               $tableNames[] = 'pages';
-               foreach ($tableNames as $tN) {
-                       // Basically list ALL tables - not only those being copied might be found!
-                       $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $tN, ('pid=' . intval($pid)) . \t3lib_BEfunc::deleteClause($tN), '', $GLOBALS['TCA'][$tN]['ctrl']['sortby'] ? $GLOBALS['TCA'][$tN]['ctrl']['sortby'] : '');
-                       if ($GLOBALS['TYPO3_DB']->sql_num_rows($mres)) {
-                               $content .= ((((('
-                                       <tr>
-                                               <td colspan="4" class="' . ($GLOBALS['TCA'][$tN]['ctrl']['versioning_followPages'] ? 'bgColor6' : ($tN == 'pages' ? 'bgColor5' : 'bgColor-10'))) . '"') . (!$GLOBALS['TCA'][$tN]['ctrl']['versioning_followPages'] && $tN !== 'pages' ? ' style="color: #666666; font-style:italic;"' : '')) . '>') . $tN) . '</td>
-                                       </tr>';
-                               while ($subrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
-                                       $ownVer = $this->lookForOwnVersions($tN, $subrow['uid']);
-                                       $content .= ((((((('
-                                               <tr>
-                                                       <td>' . $this->adminLinks($tN, $subrow)) . '</td>
-                                                       <td>') . $subrow['uid']) . '</td>
-                                                       ') . ($ownVer > 1 ? ((((('<td style="font-weight: bold; background-color: yellow;"><a href="index.php?table=' . rawurlencode($tN)) . '&uid=') . $subrow['uid']) . '">') . ($ownVer - 1)) . '</a></td>' : '<td></td>')) . '
-                                                       <td width="98%">') . \t3lib_BEfunc::getRecordTitle($tN, $subrow, TRUE)) . '</td>
-                                               </tr>';
-                                       if ($tN == 'pages' && $c < 100) {
-                                               $sub = $this->pageSubContent($subrow['uid'], $c + 1);
-                                               if ($sub) {
-                                                       $content .= ('
-                                                               <tr>
-                                                                       <td></td>
-                                                                       <td></td>
-                                                                       <td></td>
-                                                                       <td width="98%">' . $sub) . '</td>
-                                                               </tr>';
-                                               }
-                                       }
-                               }
-                       }
-               }
-               return $content ? ('<table border="1" cellpadding="1" cellspacing="0" width="100%">' . $content) . '</table>' : '';
-       }
-
-       /**
-        * Look for number of versions of a record
-        *
-        * @param       string          Table name
-        * @param       integer         Record uid
-        * @return      integer         Number of versions for record, FALSE if none.
-        * @todo Define visibility
-        */
-       public function lookForOwnVersions($table, $uid) {
-               $versions = \t3lib_BEfunc::selectVersionsOfRecord($table, $uid, 'uid');
-               if (is_array($versions)) {
-                       return count($versions);
-               }
-               return FALSE;
-       }
-
-       /**
-        * Administrative links for a table / record
-        *
-        * @param       string          Table name
-        * @param       array           Record for which administrative links are generated.
-        * @return      string          HTML link tags.
-        * @todo Define visibility
-        */
-       public function adminLinks($table, $row) {
-               // Edit link:
-               $adminLink = ((((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::editOnClick((((('&edit[' . $table) . '][') . $row['uid']) . ']=edit'), $this->doc->backPath))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:cm.edit', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-open')) . '</a>';
-               // Delete link:
-               $adminLink .= ((((('<a href="' . htmlspecialchars($this->doc->issueCommand((((('&cmd[' . $table) . '][') . $row['uid']) . '][delete]=1')))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:cm.delete', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-edit-delete')) . '</a>';
-               if ($table == 'pages') {
-                       // If another page module was specified, replace the default Page module with the new one
-                       $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
-                       $pageModule = \t3lib_BEfunc::isModuleSetInTBE_MODULES($newPageModule) ? $newPageModule : 'web_layout';
-                       // Perform some acccess checks:
-                       $a_wl = $GLOBALS['BE_USER']->check('modules', 'web_list');
-                       $a_wp = \t3lib_extMgm::isLoaded('cms') && $GLOBALS['BE_USER']->check('modules', $pageModule);
-                       $adminLink .= ((((('<a href="#" onclick="top.loadEditId(' . $row['uid']) . ');top.goToModule(\'') . $pageModule) . '\'); return false;">') . \t3lib_iconWorks::getSpriteIcon('actions-page-open')) . '</a>';
-                       $adminLink .= ((('<a href="#" onclick="top.loadEditId(' . $row['uid']) . ');top.goToModule(\'web_list\'); return false;">') . \t3lib_iconWorks::getSpriteIcon('actions-system-list-open')) . '</a>';
-                       // "View page" icon is added:
-                       $adminLink .= ((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($row['uid'], $this->doc->backPath, \t3lib_BEfunc::BEgetRootLine($row['uid'])))) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
-               } else {
-                       if ($row['pid'] == -1) {
-                               $getVars = (('&ADMCMD_vPrev[' . rawurlencode((($table . ':') . $row['t3ver_oid']))) . ']=') . $row['uid'];
-                               // "View page" icon is added:
-                               $adminLink .= ((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($row['_REAL_PID'], $this->doc->backPath, \t3lib_BEfunc::BEgetRootLine($row['_REAL_PID']), '', '', $getVars))) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
-                       }
-               }
-               return $adminLink;
-       }
-
-       /******************************
-        *
-        * Workspace management
-        *
-        ******************************/
-       /**
-        * Management of workspace for page ID
-        * Called when $this->id is set.
-        *
-        * @return      void
-        * @todo Define visibility
-        */
-       public function workspaceMgm() {
-               // Perform workspace publishing action if buttons are pressed:
-               $errors = $this->publishAction();
-               // Generate workspace overview:
-               $WSoverview = $this->displayWorkspaceOverview();
-               // Buttons for publish / swap:
-               $actionLinks = '<br />';
-               if ($GLOBALS['BE_USER']->workspace !== 0) {
-                       if ($this->publishAccess) {
-                               $actionLinks .= ((('<input type="submit" name="_publish" value="' . $GLOBALS['LANG']->getLL('publishPage')) . '" onclick="return confirm(\'') . sprintf($GLOBALS['LANG']->getLL('publishPageQuestion'), ($GLOBALS['BE_USER']->workspaceRec['publish_access'] & 1 ? $GLOBALS['LANG']->getLL('publishPageQuestionStage') : ''))) . '\');"/>';
-                               if ($GLOBALS['BE_USER']->workspaceSwapAccess()) {
-                                       $actionLinks .= ((('<input type="submit" name="_swap" value="' . $GLOBALS['LANG']->getLL('swapPage')) . '" onclick="return confirm(\'') . sprintf($GLOBALS['LANG']->getLL('swapPageQuestion'), ($GLOBALS['BE_USER']->workspaceRec['publish_access'] & 1 ? $GLOBALS['LANG']->getLL('publishPageQuestionStage') : ''))) . '\');" />';
-                               }
-                       } else {
-                               $actionLinks .= $this->doc->icons(1) . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:no_publish_permission');
-                       }
-               }
-               $actionLinks .= ('<input type="submit" name="_" value="' . $GLOBALS['LANG']->getLL('refresh')) . '" />';
-               $actionLinks .= ('<input type="submit" name="_previewLink" value="' . $GLOBALS['LANG']->getLL('previewLink')) . '" />';
-               $actionLinks .= ('<input type="checkbox" class="checkbox" name="_previewLink_wholeWorkspace" id="_previewLink_wholeWorkspace" value="1" /><label for="_previewLink_wholeWorkspace">' . $GLOBALS['LANG']->getLL('allowPreviewOfWholeWorkspace')) . '</label>';
-               $actionLinks .= $this->displayWorkspaceOverview_allStageCmd();
-               if ($actionLinks || count($errors)) {
-                       $this->content .= $this->doc->section('', $actionLinks . (count($errors) ? ((('<h3>' . $GLOBALS['LANG']->getLL('errors')) . '</h3><br />') . implode('<br />', $errors)) . '<hr />' : ''), 0, 1);
-               }
-               if (\t3lib_div::_POST('_previewLink')) {
-                       $ttlHours = intval($GLOBALS['BE_USER']->getTSConfigVal('options.workspaces.previewLinkTTLHours'));
-                       $ttlHours = $ttlHours ? $ttlHours : 24 * 2;
-                       if (\t3lib_div::_POST('_previewLink_wholeWorkspace')) {
-                               $previewUrl = (((\t3lib_BEfunc::getViewDomain($this->id) . '/index.php?ADMCMD_prev=') . \t3lib_BEfunc::compilePreviewKeyword('', $GLOBALS['BE_USER']->user['uid'], (60 * 60) * $ttlHours, $GLOBALS['BE_USER']->workspace)) . '&id=') . intval($this->id);
-                       } else {
-                               $params = (('id=' . $this->id) . '&ADMCMD_previewWS=') . $GLOBALS['BE_USER']->workspace;
-                               $previewUrl = (\t3lib_BEfunc::getViewDomain($this->id) . '/index.php?ADMCMD_prev=') . \t3lib_BEfunc::compilePreviewKeyword($params, $GLOBALS['BE_USER']->user['uid'], (60 * 60) * $ttlHours);
-                       }
-                       $this->content .= $this->doc->section($GLOBALS['LANG']->getLL('previewUrl'), ((((sprintf($GLOBALS['LANG']->getLL('previewInstruction'), $ttlHours) . '<br /><br /><a target="_blank" href="') . htmlspecialchars($previewUrl)) . '">') . $previewUrl) . '</a>', 0, 1);
-               }
-               // Output overview content:
-               $this->content .= $this->doc->spacer(15);
-               $this->content .= $this->doc->section($this->details ? $GLOBALS['LANG']->getLL('versionDetails') : $GLOBALS['LANG']->getLL('wsManagement'), $WSoverview, 0, 1);
-       }
-
-       /**
-        * @todo Define visibility
-        */
-       public function workspaceMenu() {
-               if ($this->id) {
-                       $menu = '';
-                       if ($GLOBALS['BE_USER']->workspace === 0) {
-                               $menu .= \t3lib_BEfunc::getFuncMenu($this->id, 'SET[filter]', $this->MOD_SETTINGS['filter'], $this->MOD_MENU['filter']);
-                               $menu .= \t3lib_BEfunc::getFuncMenu($this->id, 'SET[display]', $this->MOD_SETTINGS['display'], $this->MOD_MENU['display']);
-                       }
-                       if ((!$this->details && $GLOBALS['BE_USER']->workspace) && !$this->diffOnly) {
-                               $menu .= ((\t3lib_BEfunc::getFuncCheck($this->id, 'SET[diff]', $this->MOD_SETTINGS['diff'], '', '', 'id="checkDiff"') . ' <label for="checkDiff">') . $GLOBALS['LANG']->getLL('showDiffView')) . '</label>';
-                       }
-                       if ($menu) {
-                               return $menu;
-                       }
-               }
-       }
-
-       /**
-        * Rendering the overview of versions in the current workspace
-        *
-        * @return      string          HTML (table)
-        * @see ws/index.php for sister function!
-        * @todo Define visibility
-        */
-       public function displayWorkspaceOverview() {
-               // Initialize variables:
-               $this->showWorkspaceCol = $GLOBALS['BE_USER']->workspace === 0 && $this->MOD_SETTINGS['display'] <= -98;
-               // Get usernames and groupnames
-               $be_group_Array = \t3lib_BEfunc::getListGroupNames('title,uid');
-               $groupArray = array_keys($be_group_Array);
-               $this->be_user_Array = \t3lib_BEfunc::getUserNames();
-               if (!$GLOBALS['BE_USER']->isAdmin()) {
-                       $this->be_user_Array = \t3lib_BEfunc::blindUserNames($this->be_user_Array, $groupArray, 1);
-               }
-               // Initialize Workspace ID and filter-value:
-               if ($GLOBALS['BE_USER']->workspace === 0) {
-                       $wsid = $this->details ? -99 : $this->MOD_SETTINGS['display'];
-                       // Set wsid to the value from the menu (displaying content of other workspaces)
-                       $filter = $this->details ? 0 : $this->MOD_SETTINGS['filter'];
-               } else {
-                       $wsid = $GLOBALS['BE_USER']->workspace;
-                       $filter = 0;
-               }
-               // Initialize workspace object and request all pending versions:
-               $wslibObj = \t3lib_div::makeInstance('TYPO3\\CMS\\Version\\Utility\\WorkspacesUtility');
-               // Selecting ALL versions belonging to the workspace:
-               $versions = $wslibObj->selectVersionsInWorkspace($wsid, $filter, -99, $this->uid);
-               // $this->uid is the page id of LIVE record.
-               // Traverse versions and build page-display array:
-               $pArray = array();
-               foreach ($versions as $table => $records) {
-                       foreach ($records as $rec) {
-                               $pageIdField = $table === 'pages' ? 't3ver_oid' : 'realpid';
-                               $this->displayWorkspaceOverview_setInPageArray($pArray, $table, $rec);
-                       }
-               }
-               // Make header of overview:
-               $tableRows = array();
-               if (count($pArray)) {
-                       $tableRows[] = ((((((('
-                               <tr class="bgColor5 tableheader">
-                                       ' . ($this->diffOnly ? '' : ('<td nowrap="nowrap" colspan="2">' . $GLOBALS['LANG']->getLL('liveVersion')) . '</td>')) . '
-                                       <td nowrap="nowrap" colspan="2">') . $GLOBALS['LANG']->getLL('wsVersions')) . '</td>
-                                       <td nowrap="nowrap"') . ($this->diffOnly ? ' colspan="2"' : ' colspan="4"')) . '>') . $GLOBALS['LANG']->getLL('controls')) . '</td>
-                               </tr>';
-                       // Add lines from overview:
-                       $tableRows = array_merge($tableRows, $this->displayWorkspaceOverview_list($pArray));
-                       $table = ('<table border="0" cellpadding="0" cellspacing="1" class="lrPadding workspace-overview">' . implode('', $tableRows)) . '</table>';
-               } else {
-                       $table = '';
-               }
-               $returnUrl = \t3lib_div::sanitizeLocalUrl(\t3lib_div::_GP('returnUrl'));
-               $linkBack = \t3lib_div::_GP('returnUrl') ? (((('<a href="' . htmlspecialchars($returnUrl)) . '" class="typo3-goBack">') . \t3lib_iconWorks::getSpriteIcon('actions-view-go-back')) . $GLOBALS['LANG']->getLL('goBack', TRUE)) . '</a><br /><br />' : '';
-               $resetDiffOnly = $this->diffOnly ? ((('<a href="index.php?id=' . intval($this->id)) . '" class="typo3-goBack">') . $GLOBALS['LANG']->getLL('showAllInformation')) . '</a><br /><br />' : '';
-               $versionSelector = $GLOBALS['BE_USER']->workspace ? $this->doc->getVersionSelector($this->id) : '';
-               return ((($versionSelector . $linkBack) . $resetDiffOnly) . $table) . $this->markupNewOriginals();
-       }
-
-       /**
-        * Rendering the content for the publish / review overview:
-        * (Made for internal recursive calling)
-        *
-        * @param       array           Storage of the elements to display (see displayWorkspaceOverview() / displayWorkspaceOverview_setInPageArray())
-        * @return      array           Table rows, see displayWorkspaceOverview()
-        * @todo Define visibility
-        */
-       public function displayWorkspaceOverview_list($pArray) {
-               // If there ARE elements on this level, print them:
-               $warnAboutVersions_nonPages = FALSE;
-               $warnAboutVersions_page = FALSE;
-               if (is_array($pArray)) {
-                       foreach ($pArray as $table => $oidArray) {
-                               foreach ($oidArray as $oid => $recs) {
-                                       // Get CURRENT online record and icon based on "t3ver_oid":
-                                       $rec_on = \t3lib_BEfunc::getRecord($table, $oid);
-                                       $icon = \t3lib_iconWorks::getSpriteIconForRecord($table, $rec_on, array('title' => \t3lib_BEfunc::getRecordIconAltText($rec_on, $table)));
-                                       if ($GLOBALS['BE_USER']->workspace === 0) {
-                                               // Only edit online records if in ONLINE workspace:
-                                               $icon = $this->doc->wrapClickMenuOnIcon($icon, $table, $rec_on['uid'], 1, '', '+edit,view,info,delete');
-                                       }
-                                       // Online version display:
-                                       // Create the main cells which will span over the number of versions there is.
-                                       $verLinkUrl = $GLOBALS['TCA'][$table]['ctrl']['versioningWS'];
-                                       $origElement = (($icon . ($verLinkUrl ? ('<a href="' . htmlspecialchars(((('index.php?table=' . $table) . '&uid=') . $rec_on['uid']))) . '">' : '')) . \t3lib_BEfunc::getRecordTitle($table, $rec_on, TRUE)) . ($verLinkUrl ? '</a>' : '');
-                                       $mainCell_rowSpan = count($recs) > 1 ? (' rowspan="' . count($recs)) . '"' : '';
-                                       $mainCell = (((((((('
-                                                               <td align="center"' . $mainCell_rowSpan) . '>') . $this->formatVerId($rec_on['t3ver_id'])) . '</td>
-                                                               <td nowrap="nowrap"') . $mainCell_rowSpan) . '>') . $origElement) . '###SUB_ELEMENTS###') . '</td>';
-                                       // Offline versions display:
-                                       // Traverse the versions of the element
-                                       foreach ($recs as $rec) {
-                                               // Get the offline version record and icon:
-                                               $rec_off = \t3lib_BEfunc::getRecord($table, $rec['uid']);
-                                               $vType = 'element';
-                                               // Get icon
-                                               $icon = \t3lib_iconWorks::getSpriteIconForRecord($table, $rec_off, array('title' => \t3lib_BEfunc::getRecordIconAltText($rec_off, $table)));
-                                               $tempUid = ($table != 'pages' || $vType === 'branch') || $GLOBALS['BE_USER']->workspace === 0 ? $rec_off['uid'] : $rec_on['uid'];
-                                               $icon = $this->doc->wrapClickMenuOnIcon($icon, $table, $tempUid, 1, '', ('+edit,' . ($table == 'pages' ? 'view,info,' : '')) . 'delete');
-                                               // Prepare diff-code:
-                                               if ($this->MOD_SETTINGS['diff'] || $this->diffOnly) {
-                                                       $diffCode = '';
-                                                       list($diffHTML, $diffPct) = $this->createDiffView($table, $rec_off, $rec_on);
-                                                       if ($rec_on['t3ver_state'] == 1) {
-                                                               // New record:
-                                                               $diffCode .= ($this->doc->icons(1) . $GLOBALS['LANG']->getLL('newElement')) . '<br />';
-                                                               $diffCode .= $diffHTML;
-                                                       } elseif ($rec_off['t3ver_state'] == 2) {
-                                                               $diffCode .= ($this->doc->icons(2) . $GLOBALS['LANG']->getLL('deletedElement')) . '<br />';
-                                                       } elseif ($rec_on['t3ver_state'] == 3) {
-                                                               $diffCode .= ($this->doc->icons(1) . $GLOBALS['LANG']->getLL('moveToPlaceholder')) . '<br />';
-                                                       } elseif ($rec_off['t3ver_state'] == 4) {
-                                                               $diffCode .= ($this->doc->icons(1) . $GLOBALS['LANG']->getLL('moveToPointer')) . '<br />';
-                                                       } else {
-                                                               $diffCode .= $diffPct < 0 ? $GLOBALS['LANG']->getLL('notAvailable') : ($diffPct ? ($diffPct . '% ') . $GLOBALS['LANG']->getLL('change') : '');
-                                                               $diffCode .= $diffHTML;
-                                                       }
-                                               } else {
-                                                       $diffCode = '';
-                                               }
-                                               switch ($vType) {
-                                               case 'element':
-                                                       $swapLabel = $GLOBALS['LANG']->getLL('element');
-                                                       $swapClass = 'ver-element';
-                                                       $warnAboutVersions_nonPages = $warnAboutVersions_page;
-                                                       // Setting this if sub elements are found with a page+content (must be rendered prior to this of course!)
-                                                       break;
-                                               case 'page':
-                                                       $swapLabel = $GLOBALS['LANG']->getLL('page');
-                                                       $swapClass = 'ver-page';
-                                                       $warnAboutVersions_page = !$this->showWorkspaceCol;
-                                                       // This value is TRUE only if multiple workspaces are shown and we need the opposite here.
-                                                       break;
-                                               case 'branch':
-                                                       $swapLabel = $GLOBALS['LANG']->getLL('branch');
-                                                       $swapClass = 'ver-branch';
-                                                       break;
-                                               }
-                                               // Modify main cell based on first version shown:
-                                               $subElements = array();
-                                               $mainCell = str_replace('###SUB_ELEMENTS###', $subElements['on'], $mainCell);
-                                               // Create version element:
-                                               $versionsInOtherWS = $this->versionsInOtherWS($table, $rec_on['uid']);
-                                               $versionsInOtherWSWarning = $versionsInOtherWS && $GLOBALS['BE_USER']->workspace !== 0 ? (('<br />' . $this->doc->icons(2)) . $GLOBALS['LANG']->getLL('otherVersions')) . $versionsInOtherWS : '';
-                                               $multipleWarning = !$mainCell && $GLOBALS['BE_USER']->workspace !== 0 ? ((('<br />' . $this->doc->icons(3)) . '<strong>') . $GLOBALS['LANG']->getLL('multipleVersions')) . '</strong>' : '';
-                                               $verWarning = $warnAboutVersions || $warnAboutVersions_nonPages && $GLOBALS['TCA'][$table]['ctrl']['versioning_followPages'] ? ((('<br />' . $this->doc->icons(3)) . '<strong>') . $GLOBALS['LANG']->getLL('versionInVersion')) . '</strong>' : '';
-                                               $verElement = ((((($icon . (!$this->details ? ('<a href="' . htmlspecialchars(((((((($this->doc->backPath . \t3lib_extMgm::extRelPath('version')) . 'cm1/index.php?id=') . ($table === 'pages' ? $rec_on['uid'] : $rec_on['pid'])) . '&details=') . rawurlencode((($table . ':') . $rec_off['uid']))) . '&returnUrl=') . rawurlencode($this->REQUEST_URI)))) . '">' : '')) . \t3lib_BEfunc::getRecordTitle($table, $rec_off, TRUE)) . (!$this->details ? '</a>' : '')) . $versionsInOtherWSWarning) . $multipleWarning) . $verWarning;
-                                               $ctrlTable = ((((((('
-                                                               <td nowrap="nowrap">' . $this->showStageChangeLog($table, $rec_off['uid'], $this->displayWorkspaceOverview_stageCmd($table, $rec_off))) . '</td>
-                                                               <td nowrap="nowrap" class="') . $swapClass) . '">') . $this->displayWorkspaceOverview_commandLinks($table, $rec_on, $rec_off, $vType)) . htmlspecialchars($swapLabel)) . '&nbsp;&nbsp;</td>
-                                                               ') . (!$this->diffOnly ? (((('<td nowrap="nowrap"><strong>' . $GLOBALS['LANG']->getLL('lifecycle')) . ':</strong> ') . htmlspecialchars($this->formatCount($rec_off['t3ver_count']))) . '</td>') . ($this->showWorkspaceCol ? ((('
-                                                               <td nowrap="nowrap">&nbsp;&nbsp;<strong>' . $GLOBALS['LANG']->getLL('workspace')) . ':</strong> ') . htmlspecialchars($this->formatWorkspace($rec_off['t3ver_wsid']))) . '</td>' : '') : '');
-                                               if ($diffCode) {
-                                                       $verElement = (((($verElement . '
-                                                       <br /><strong>') . $GLOBALS['LANG']->getLL('diffToLiveElement')) . '</strong>
-                                                       <table border="0" cellpadding="0" cellspacing="0" class="ver-verElement">
-                                                               <tr>
-                                                                       <td class="c-diffCell">') . $diffCode) . '</td>
-                                                               </tr>
-                                                       </table>';
-                                               }
-                                               // Create version cell:
-                                               $verCell = (((('
-                                                               <td align="center">' . $this->formatVerId($rec_off['t3ver_id'])) . '</td>
-                                                               <td nowrap="nowrap">') . $verElement) . $subElements['off']) . '</td>
-                                                               ';
-                                               // Compile table row:
-                                               $tableRows[] = ((('
-                                                       <tr class="bgColor4">
-                                                               ' . ($this->diffOnly ? '' : $mainCell)) . $verCell) . $ctrlTable) . '
-                                                       </tr>';
-                                               // Reset the main cell:
-                                               $mainCell = '';
-                                       }
-                               }
-                       }
-               }
-               return $tableRows;
-       }
-
-       /**
-        * Building up of the $pArray
-        * (Internal)
-        *
-        * @param       array           Array that is built up with the page tree structure
-        * @param       string          Table name
-        * @param       array           Table row
-        * @return      void            $pArray is passed by reference and modified internally
-        * @todo Define visibility
-        */
-       public function displayWorkspaceOverview_setInPageArray(&$pArray, $table, $row) {
-               if (!$this->details || $this->details == ($table . ':') . $row['uid']) {
-                       $pArray[$table][$row['t3ver_oid']][] = $row;
-               }
-       }
-
-       /**
-        * Links to stage change of a version
-        *
-        * @param       string          Table name
-        * @param       array           Offline record (version)
-        * @return      string          HTML content, mainly link tags and images.
-        * @todo Define visibility
-        */
-       public function displayWorkspaceOverview_allStageCmd() {
-               $table = \t3lib_div::_GP('table');
-               if ($table && $table != 'pages') {
-                       $uid = \t3lib_div::_GP('uid');
-                       if ($rec_off = \t3lib_BEfunc::getRecordWSOL($table, $uid)) {
-                               $uid = $rec_off['_ORIG_uid'];
-                       }
-               } else {
-                       $table = '';
-               }
-               if ($table) {
-                       if ($uid && $this->recIndex[$table][$uid]) {
-                               $sId = $this->recIndex[$table][$uid];
-                               switch ($sId) {
-                               case 1:
-                                       $label = $GLOBALS['LANG']->getLL('commentForReviewer');
-                                       break;
-                               case 10:
-                                       $label = $GLOBALS['LANG']->getLL('commentForPublisher');
-                                       break;
-                               }
-                       } else {
-                               $sId = 0;
-                       }
-               } else {
-                       // Review:
-                       if (count($this->stageIndex[1])) {
-                               $sId = 1;
-                               $color = '#666666';
-                               $label = $GLOBALS['LANG']->getLL('sendItemsToReview') . $GLOBALS['LANG']->getLL('commentForReviewer');
-                               $titleAttrib = $GLOBALS['LANG']->getLL('sendAllToReview');
-                       } elseif (count($this->stageIndex[10])) {
-                               $sId = 10;
-                               $color = '#6666cc';
-                               $label = $GLOBALS['LANG']->getLL('approveToPublish') . $GLOBALS['LANG']->getLL('commentForPublisher');
-                               $titleAttrib = $GLOBALS['LANG']->getLL('approveAllToPublish');
-                       } else {
-                               $sId = 0;
-                       }
-               }
-               if ($sId > 0) {
-                       $issueCmd = '';
-                       $itemCount = 0;
-                       if (($table && $uid) && $this->recIndex[$table][$uid]) {
-                               $issueCmd .= ((('&cmd[' . $table) . '][') . $uid) . '][version][action]=setStage';
-                               $issueCmd .= (((('&cmd[' . $table) . '][') . $uid) . '][version][stageId]=') . $this->recIndex[$table][$uid];
-                       } else {
-                               foreach ($this->stageIndex[$sId] as $table => $uidArray) {
-                                       $issueCmd .= ((('&cmd[' . $table) . '][') . implode(',', $uidArray)) . '][version][action]=setStage';
-                                       $issueCmd .= (((('&cmd[' . $table) . '][') . implode(',', $uidArray)) . '][version][stageId]=') . $sId;
-                                       $itemCount += count($uidArray);
-                               }
-                       }
-                       $onClick = ((('var commentTxt=window.prompt("' . sprintf($label, $itemCount)) . '","");
-                               if (commentTxt!=null) {window.location.href="') . $this->doc->issueCommand($issueCmd, $this->REQUEST_URI)) . '&generalComment="+escape(commentTxt);}';
-                       if (\t3lib_div::_GP('sendToReview')) {
-                               $onClick .= (' else {window.location.href = "' . $this->REQUEST_URI) . '"}';
-                               $actionLinks .= $this->doc->wrapScriptTags($onClick);
-                       } else {
-                               $onClick .= ' return false;';
-                               $actionLinks .= ((('<input type="submit" name="_" value="' . htmlspecialchars($titleAttrib)) . '" onclick="') . htmlspecialchars($onClick)) . '" />';
-                       }
-               } elseif (\t3lib_div::_GP('sendToReview')) {
-                       $onClick = ('window.location.href = "' . $this->REQUEST_URI) . '";';
-                       $actionLinks .= $this->doc->wrapScriptTags($onClick);
-               } else {
-                       $actionLinks = '';
-               }
-               return $actionLinks;
-       }
-
-       /**************************************
-        *
-        * Helper functions (REDUNDANT FROM user/ws/index.php - someone could refactor this...)
-        *
-        *************************************/
-       /**
-        * Formatting the version number for HTML output
-        *
-        * @param       integer         Version number
-        * @return      string          Version number for output
-        * @todo Define visibility
-        */
-       public function formatVerId($verId) {
-               return '1.' . $verId;
-       }
-
-       /**
-        * Formatting workspace ID into a visual label
-        *
-        * @param       integer         Workspace ID
-        * @return      string          Workspace title
-        * @todo Define visibility
-        */
-       public function formatWorkspace($wsid) {
-               // Render, if not cached:
-               if (!isset($this->formatWorkspace_cache[$wsid])) {
-                       switch ($wsid) {
-                       case -1:
-                               $this->formatWorkspace_cache[$wsid] = $GLOBALS['LANG']->getLL('offline');
-                               break;
-                       case 0:
-                               $this->formatWorkspace_cache[$wsid] = '';
-                               // Does not output anything for ONLINE because it might confuse people to think that the elemnet IS online which is not the case - only that it exists as an offline version in the online workspace...
-                               break;
-                       default:
-                               $titleRec = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow('title', 'sys_workspace', ('uid=' . intval($wsid)) . \t3lib_BEfunc::deleteClause('sys_workspace'));
-                               $this->formatWorkspace_cache[$wsid] = (('[' . $wsid) . '] ') . $titleRec['title'];
-                               break;
-                       }
-               }
-               return $this->formatWorkspace_cache[$wsid];
-       }
-
-       /**
-        * Format publishing count for version (lifecycle state)
-        *
-        * @param       integer         t3ver_count value (number of times it has been online)
-        * @return      string          String translation of count.
-        * @todo Define visibility
-        */
-       public function formatCount($count) {
-               // Render, if not cached:
-               if (!isset($this->formatCount_cache[$count])) {
-                       switch ($count) {
-                       case 0:
-                               $this->formatCount_cache[$count] = $GLOBALS['LANG']->getLL('draft');
-                               break;
-                       case 1:
-                               $this->formatCount_cache[$count] = $GLOBALS['LANG']->getLL('archive');
-                               break;
-                       default:
-                               $this->formatCount_cache[$count] = sprintf($GLOBALS['LANG']->getLL('publishedXTimes'), $count);
-                               break;
-                       }
-               }
-               return $this->formatCount_cache[$count];
-       }
-
-       /**
-        * Looking for versions of a record in other workspaces than the current
-        *
-        * @param       string          Table name
-        * @param       integer         Record uid
-        * @return      string          List of other workspace IDs
-        * @todo Define visibility
-        */
-       public function versionsInOtherWS($table, $uid) {
-               // Check for duplicates:
-               // Select all versions of record NOT in this workspace:
-               $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('t3ver_wsid', $table, (((('pid=-1
-                               AND t3ver_oid=' . intval($uid)) . '
-                               AND t3ver_wsid!=') . intval($GLOBALS['BE_USER']->workspace)) . '
-                               AND (t3ver_wsid=-1 OR t3ver_wsid>0)') . \t3lib_BEfunc::deleteClause($table), '', 't3ver_wsid', '', 't3ver_wsid');
-               if (count($rows)) {
-                       return implode(',', array_keys($rows));
-               }
-       }
-
-       /**
-        * Looks up stage changes for version and displays a formatted view on mouseover.
-        *
-        * @param       string          Table name
-        * @param       integer         Record ID
-        * @param       string          HTML string to wrap the mouseover around (should be stage change links)
-        * @return      string          HTML code.
-        * @todo Define visibility
-        */
-       public function showStageChangeLog($table, $id, $stageCommands) {
-               $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('log_data,tstamp,userid', 'sys_log', (('action=6 and details_nr=30
-                               AND tablename=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($table, 'sys_log')) . '
-                               AND recuid=') . intval($id));
-               $entry = array();
-               foreach ($rows as $dat) {
-                       $data = unserialize($dat['log_data']);
-                       $username = $this->be_user_Array[$dat['userid']] ? $this->be_user_Array[$dat['userid']]['username'] : ('[' . $dat['userid']) . ']';
-                       switch ($data['stage']) {
-                       case 1:
-                               $text = $GLOBALS['LANG']->getLL('stage.sentToReview');
-                               break;
-                       case 10:
-                               $text = $GLOBALS['LANG']->getLL('stage.approvedForPublish');
-                               break;
-                       case -1:
-                               $text = $GLOBALS['LANG']->getLL('stage.rejectedElement');
-                               break;
-                       case 0:
-                               $text = $GLOBALS['LANG']->getLL('stage.resetToEdit');
-                               break;
-                       default:
-                               $text = $GLOBALS['LANG']->getLL('stage.undefined');
-                               break;
-                       }
-                       $text = (((\t3lib_BEfunc::dateTime($dat['tstamp']) . ': "') . $username) . '" ') . $text;
-                       $text .= $data['comment'] ? ((('<br />' . $GLOBALS['LANG']->getLL('userComment')) . ': <em>') . htmlspecialchars($data['comment'])) . '</em>' : '';
-                       $entry[] = $text;
-               }
-               return count($entry) ? ((((((((((((((('<span onmouseover="document.getElementById(\'log_' . $table) . $id) . '\').style.visibility = \'visible\';" onmouseout="document.getElementById(\'log_') . $table) . $id) . '\').style.visibility = \'hidden\';">') . $stageCommands) . ' (') . count($entry)) . ')</span>') . '<div class="t3-version-infolayer logLayer" id="log_') . $table) . $id) . '">') . implode('<hr/>', array_reverse($entry))) . '</div>' : $stageCommands;
-       }
-
-       /**
-        * Creates display of sub elements of a page when the swap mode is either "Page" or "Branch" (0 / ALL)
-        *
-        * @param       integer         Page uid (for either online or offline version, but it MUST have swapmode/treeLevel set to >0 (not -1 indicating element versioning)
-        * @param       integer         The treeLevel value, >0 indicates "branch" while 0 means page+content. (-1 would have meant element versioning, but that should never happen for a call to this function!)
-        * @param       integer         For offline versions; This is t3ver_oid, the original ID of the online page.
-        * @return      string          HTML content.
-        * @todo Define visibility
-        */
-       public function subElements($uid, $treeLevel, $origId = 0) {
-               // In online workspace we have a reduced view because otherwise it will bloat the listing:
-               if (!$this->details && ($GLOBALS['BE_USER']->workspace === 0 || !$this->MOD_SETTINGS['expandSubElements'])) {
-                       return (('<br />
-                                       <img' . \t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/ol/joinbottom.gif', 'width="18" height="16"')) . ' align="top" alt="" title="" />') . ($origId ? (((('<a href="' . htmlspecialchars(((((((($this->doc->backPath . \t3lib_extMgm::extRelPath('version')) . 'cm1/index.php?id=') . $uid) . '&details=') . rawurlencode(('pages:' . $uid))) . '&returnUrl=') . rawurlencode($this->REQUEST_URI)))) . '">') . '<span class="typo3-dimmed"><em>') . $GLOBALS['LANG']->getLL('subElementsClick')) . '</em><span></a>' : ('<span class="typo3-dimmed"><em>' . $GLOBALS['LANG']->getLL('subElements')) . '</em><span>');
-               } else {
-                       // For an offline workspace, show sub elements:
-                       $tCell = array();
-                       // Find records that follow pages when swapping versions:
-                       $recList = array();
-                       foreach ($GLOBALS['TCA'] as $tN => $tCfg) {
-                               if ($tN !== 'pages' && ($treeLevel > 0 || $GLOBALS['TCA'][$tN]['ctrl']['versioning_followPages'])) {
-                                       $this->subElements_getNonPageRecords($tN, $uid, $recList);
-                               }
-                       }
-                       // Render records collected above:
-                       $elCount = count($recList) - 1;
-                       foreach ($recList as $c => $comb) {
-                               list($tN, $rec) = $comb;
-                               $this->subElements_renderItem($tCell, $tN, $uid, $rec, $origId, $c == $elCount && $treeLevel == 0 ? 1 : 0, '');
-                       }
-                       // For branch, dive into the subtree:
-                       if ($treeLevel > 0) {
-                               // Drawing tree:
-                               $tree = \t3lib_div::makeInstance('TYPO3\\CMS\\Backend\\Tree\\View\\PageTreeView');
-                               $tree->init('AND ' . $GLOBALS['BE_USER']->getPagePermsClause(1));
-                               $tree->makeHTML = 2;
-                               // 2=Also rendering depth-data into the result array
-                               $tree->getTree($uid, 99, '');
-                               // Traverse page tree:
-                               foreach ($tree->tree as $data) {
-                                       // Render page in table cell:
-                                       $this->subElements_renderItem($tCell, 'pages', $uid, \t3lib_BEfunc::getRecord('pages', $data['row']['uid']), $origId, 2, $data['HTML']);
-                                       // Find all records from page and collect in $recList:
-                                       $recList = array();
-                                       foreach ($GLOBALS['TCA'] as $tN => $tCfg) {
-                                               if ($tN !== 'pages') {
-                                                       $this->subElements_getNonPageRecords($tN, $data['row']['uid'], $recList);
-                                               }
-                                       }
-                                       // Render records collected above:
-                                       $elCount = count($recList) - 1;
-                                       foreach ($recList as $c => $comb) {
-                                               list($tN, $rec) = $comb;
-                                               $this->subElements_renderItem($tCell, $tN, $uid, $rec, $origId, $c == $elCount ? 1 : 0, $data['HTML_depthData']);
-                                       }
-                               }
-                       }
-                       return ('
-                                       <!-- Sub-element tree for versions -->
-                                       <table border="0" cellpadding="0" cellspacing="1" class="ver-subtree">
-                                               ' . implode('', $tCell)) . '
-                                       </table>';
-               }
-       }
-
-       /**
-        * Select records from a table and add them to recList
-        *
-        * @param       string          Table name (from TCA)
-        * @param       integer         PID to select records from
-        * @param       array           Array where records are accumulated, passed by reference
-        * @return      void
-        * @todo Define visibility
-        */
-       public function subElements_getNonPageRecords($tN, $uid, &$recList) {
-               $records = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('*', $tN, (('pid=' . intval($uid)) . ($GLOBALS['TCA'][$tN]['ctrl']['versioningWS'] ? ' AND t3ver_state=0' : '')) . \t3lib_BEfunc::deleteClause($tN), '', $GLOBALS['TCA'][$tN]['ctrl']['sortby'] ? $GLOBALS['TCA'][$tN]['ctrl']['sortby'] : $GLOBALS['TYPO3_DB']->stripOrderBy($GLOBALS['TCA'][$tN]['ctrl']['default_sortby']));
-               foreach ($records as $rec) {
-                       $recList[] = array($tN, $rec);
-               }
-       }
-
-       /**
-        * Render a single item in a subelement list into a table row:
-        *
-        * @param       array           Table rows, passed by reference
-        * @param       string          Table name
-        * @param       integer         Page uid for which the subelements are selected/shown
-        * @param       array           Row of element in list
-        * @param       integer         The uid of the online version of $uid. If zero it means we are drawing a row for the online version itself while a value means we are drawing display for an offline version.
-        * @param       integer         Mode of icon display: 0=not the last, 1= is the last in list (make joinbottom icon then), 2=do not shown icons are all (for pages from the page tree already rendered)
-        * @param       string          Prefix HTML data (icons for tree rendering)
-        * @return      void            (Content accumulated in $tCell!)
-        * @todo Define visibility
-        */
-       public function subElements_renderItem(&$tCell, $tN, $uid, $rec, $origId, $iconMode, $HTMLdata) {
-               // Initialize:
-               $origUidFields = $GLOBALS['TCA'][$tN]['ctrl']['origUid'];
-               $diffCode = '';
-               if ($origUidFields) {
-                       // If there is a field for this table with original uids we will use that to connect records:
-                       if (!$origId) {
-                               // In case we are displaying the online originals:
-                               $this->targets[(((('orig_' . $uid) . '_') . $tN) . '_') . $rec['uid']] = $rec;
-                               // Build up target array (important that
-                               $tdParams = (((((' id="orig_' . $uid) . '_') . $tN) . '_') . $rec['uid']) . '" class="typo3-ver"';
-                       } else {
-                               // Version branch:
-                               if ($this->targets[(((('orig_' . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]]) {
-                                       // If there IS a corresponding original record...:
-                                       // Prepare Table row parameters:
-                                       $tdParams = (((((((((((((((((((((((((((((((((((' onmouseover="hlSubelements(\'' . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]) . '\', \'') . $uid) . '_') . $tN) . '_') . $rec[$origUidFields]) . '\', 1, ') . ($this->MOD_SETTINGS['diff'] == 2 ? 1 : 0)) . ');"') . ' onmouseout="hlSubelements(\'') . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]) . '\', \'') . $uid) . '_') . $tN) . '_') . $rec[$origUidFields]) . '\', 0, ') . ($this->MOD_SETTINGS['diff'] == 2 ? 1 : 0)) . ');"') . ' id="ver_') . $uid) . '_') . $tN) . '_') . $rec[$origUidFields]) . '" class="typo3-ver"';
-                                       // Create diff view:
-                                       if ($this->MOD_SETTINGS['diff']) {
-                                               list($diffHTML, $diffPct) = $this->createDiffView($tN, $rec, $this->targets[(((('orig_' . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]]);
-                                               if ($this->MOD_SETTINGS['diff'] == 2) {
-                                                       $diffCode = ((((((((($diffPct ? ('<span class="nobr">' . $diffPct) . '% change</span>' : '-') . '<div style="visibility: hidden; position: absolute;" id="diff_') . $uid) . '_') . $tN) . '_') . $rec[$origUidFields]) . '" class="diffLayer">') . $diffHTML) . '</div>';
-                                               } else {
-                                                       $diffCode = ($diffPct < 0 ? $GLOBALS['LANG']->getLL('notAvailable') : ($diffPct ? ($diffPct . '% ') . $GLOBALS['LANG']->getLL('change') : '')) . $diffHTML;
-                                               }
-                                       }
-                                       // Unsetting the target fields allows us to mark all originals without a version in the subtree (see ->markupNewOriginals())
-                                       unset($this->targets[(((('orig_' . $origId) . '_') . $tN) . '_') . $rec[$origUidFields]]);
-                               } else {
-                                       // No original record, so must be new:
-                                       $tdParams = ' class="typo3-ver-new"';
-                               }
-                       }
-               } else {
-                       // If no original uid column is supported for this table we are forced NOT to display any diff or highlighting.
-                       $tdParams = ' class="typo3-ver-noComp"';
-               }
-               // Compile the cell:
-               $tCell[] = ((((((((('
-                                               <tr' . $tdParams) . '>
-                                                       <td class="iconTitle">') . $HTMLdata) . ($iconMode < 2 ? (('<img' . \t3lib_iconWorks::skinImg($this->doc->backPath, (('gfx/ol/join' . ($iconMode ? 'bottom' : '')) . '.gif'), 'width="18" height="16"')) . ' alt="" />') . \t3lib_iconWorks::getSpriteIconForRecord($tN, $rec) : '')) . \t3lib_BEfunc::getRecordTitle($tN, $rec, TRUE)) . '</td>
-                                                       <td class="cmdCell">') . $this->displayWorkspaceOverview_commandLinksSub($tN, $rec, $origId)) . '</td>') . ($origId ? ('<td class="diffCell">' . $diffCode) . '</td>' : '')) . '
-                                               </tr>';
-       }
-
-       /**
-        * JavaScript code to mark up new records that are online (in sub element lists)
-        *
-        * @return      string          HTML javascript section
-        * @todo Define visibility
-        */
-       public function markupNewOriginals() {
-               if (count($this->targets)) {
-                       $scriptCode = '';
-                       foreach ($this->targets as $key => $rec) {
-                               $scriptCode .= ('
-                                       document.getElementById(\'' . $key) . '\').attributes.getNamedItem("class").nodeValue = \'typo3-ver-new\';
-                               ';
-                       }
-                       return $this->doc->wrapScriptTags($scriptCode);
-               }
-       }
-
-       /**
-        * Create visual difference view of two records. Using t3lib_diff library
-        *
-        * @param       string          Table name
-        * @param       array           New version record (green)
-        * @param       array           Old version record (red)
-        * @return      array           Array with two keys (0/1) with HTML content / percentage integer (if -1, then it means N/A) indicating amount of change
-        * @todo Define visibility
-        */
-       public function createDiffView($table, $diff_1_record, $diff_2_record) {
-               // Initialize:
-               $pctChange = 'N/A';
-               // Check that records are arrays:
-               if (is_array($diff_1_record) && is_array($diff_2_record)) {
-                       // Load full table description and initialize diff-object:
-                       \t3lib_div::loadTCA($table);
-                       $t3lib_diff_Obj = \t3lib_div::makeInstance('TYPO3\\CMS\\Core\\Utility\\DiffUtility');
-                       // Add header row:
-                       $tRows = array();
-                       $tRows[] = ((('
-                               <tr class="bgColor5 tableheader">
-                                       <td>' . $GLOBALS['LANG']->getLL('fieldname')) . ':</td>
-                                       <td width="98%" nowrap="nowrap">') . $GLOBALS['LANG']->getLL('coloredDiffView')) . ':</td>
-                               </tr>
-                       ';
-                       // Initialize variables to pick up string lengths in:
-                       $allStrLen = 0;
-                       $diffStrLen = 0;
-                       // Traversing the first record and process all fields which are editable:
-                       foreach ($diff_1_record as $fN => $fV) {
-                               if (($GLOBALS['TCA'][$table]['columns'][$fN] && $GLOBALS['TCA'][$table]['columns'][$fN]['config']['type'] !== 'passthrough') && !\t3lib_div::inList('t3ver_label', $fN)) {
-                                       // Check if it is files:
-                                       $isFiles = FALSE;
-                                       if ((strcmp(trim($diff_1_record[$fN]), trim($diff_2_record[$fN])) && $GLOBALS['TCA'][$table]['columns'][$fN]['config']['type'] === 'group') && $GLOBALS['TCA'][$table]['columns'][$fN]['config']['internal_type'] === 'file') {
-                                               // Initialize:
-                                               $uploadFolder = $GLOBALS['TCA'][$table]['columns'][$fN]['config']['uploadfolder'];
-                                               $files1 = array_flip(\t3lib_div::trimExplode(',', $diff_1_record[$fN], 1));
-                                               $files2 = array_flip(\t3lib_div::trimExplode(',', $diff_2_record[$fN], 1));
-                                               // Traverse filenames and read their md5 sum:
-                                               foreach ($files1 as $filename => $tmp) {
-                                                       $files1[$filename] = @is_file((((PATH_site . $uploadFolder) . '/') . $filename)) ? md5(\t3lib_div::getUrl(((PATH_site . $uploadFolder) . '/') . $filename)) : $filename;
-                                               }
-                                               foreach ($files2 as $filename => $tmp) {
-                                                       $files2[$filename] = @is_file((((PATH_site . $uploadFolder) . '/') . $filename)) ? md5(\t3lib_div::getUrl(((PATH_site . $uploadFolder) . '/') . $filename)) : $filename;
-                                               }
-                                               // Implode MD5 sums and set flag:
-                                               $diff_1_record[$fN] = implode(' ', $files1);
-                                               $diff_2_record[$fN] = implode(' ', $files2);
-                                               $isFiles = TRUE;
-                                       }
-                                       // If there is a change of value:
-                                       if (strcmp(trim($diff_1_record[$fN]), trim($diff_2_record[$fN]))) {
-                                               // Get the best visual presentation of the value and present that:
-                                               $val1 = \t3lib_BEfunc::getProcessedValue($table, $fN, $diff_2_record[$fN], 0, 1);
-                                               $val2 = \t3lib_BEfunc::getProcessedValue($table, $fN, $diff_1_record[$fN], 0, 1);
-                                               // Make diff result and record string lenghts:
-                                               $diffres = $t3lib_diff_Obj->makeDiffDisplay($val1, $val2, $isFiles ? 'div' : 'span');
-                                               $diffStrLen += $t3lib_diff_Obj->differenceLgd;
-                                               $allStrLen += strlen($val1 . $val2);
-                                               // If the compared values were files, substituted MD5 hashes:
-                                               if ($isFiles) {
-                                                       $allFiles = array_merge($files1, $files2);
-                                                       foreach ($allFiles as $filename => $token) {
-                                                               if (strlen($token) == 32 && strstr($diffres, $token)) {
-                                                                       $filename = \t3lib_BEfunc::thumbCode(array($fN => $filename), $table, $fN, $this->doc->backPath) . $filename;
-                                                                       $diffres = str_replace($token, $filename, $diffres);
-                                                               }
-                                                       }
-                                               }
-                                               // Add table row with result:
-                                               $tRows[] = ((('
-                                                       <tr class="bgColor4">
-                                                               <td>' . htmlspecialchars($GLOBALS['LANG']->sL(\t3lib_BEfunc::getItemLabel($table, $fN)))) . '</td>
-                                                               <td width="98%">') . $diffres) . '</td>
-                                                       </tr>
-                                               ';
-                                       } else {
-                                               // Add string lengths even if value matched - in this was the change percentage is not high if only a single field is changed:
-                                               $allStrLen += strlen($diff_1_record[$fN] . $diff_2_record[$fN]);
-                                       }
-                               }
-                       }
-                       // Calculate final change percentage:
-                       $pctChange = $allStrLen ? ceil(($diffStrLen * 100) / $allStrLen) : -1;
-                       // Create visual representation of result:
-                       if (count($tRows) > 1) {
-                               $content .= ('<table border="0" cellpadding="1" cellspacing="1" class="diffTable">' . implode('', $tRows)) . '</table>';
-                       } else {
-                               $content .= (('<span class="nobr">' . $this->doc->icons(1)) . $GLOBALS['LANG']->getLL('completeMatch')) . '</span>';
-                       }
-               } else {
-                       $content .= $this->doc->icons(3) . $GLOBALS['LANG']->getLL('errorRecordsNotFound');
-               }
-               // Return value:
-               return array($content, $pctChange);
-       }
-
-       /**
-        * Links to stage change of a version
-        *
-        * @param       string          Table name
-        * @param       array           Offline record (version)
-        * @return      string          HTML content, mainly link tags and images.
-        * @todo Define visibility
-        */
-       public function displayWorkspaceOverview_stageCmd($table, &$rec_off) {
-               switch ((int) $rec_off['t3ver_stage']) {
-               case 0:
-                       $sId = 1;
-                       $sLabel = $GLOBALS['LANG']->getLL('editing');
-                       $color = '#666666';
-                       $label = $GLOBALS['LANG']->getLL('commentForReviewer');
-                       $titleAttrib = $GLOBALS['LANG']->getLL('sendToReview');
-                       break;
-               case 1:
-                       $sId = 10;
-                       $sLabel = $GLOBALS['LANG']->getLL('review');
-                       $color = '#6666cc';
-                       $label = $GLOBALS['LANG']->getLL('commentForPublisher');
-                       $titleAttrib = $GLOBALS['LANG']->getLL('approveForPublishing');
-                       break;
-               case 10:
-                       $sLabel = $GLOBALS['LANG']->getLL('publish');
-                       $color = '#66cc66';
-                       break;
-               case -1:
-                       $sLabel = $this->doc->icons(2) . $GLOBALS['LANG']->getLL('rejected');
-                       $sId = 0;
-                       $color = '#ff0000';
-                       $label = $GLOBALS['LANG']->getLL('comment');
-                       $titleAttrib = $GLOBALS['LANG']->getLL('resetStage');
-                       break;
-               default:
-                       $sLabel = $GLOBALS['LANG']->getLL('undefined');
-                       $sId = 0;
-                       $color = '';
-                       break;
-               }
-               $raiseOk = !$GLOBALS['BE_USER']->workspaceCannotEditOfflineVersion($table, $rec_off);
-               if ($raiseOk && $rec_off['t3ver_stage'] != -1) {
-                       $onClick = (((((((('var commentTxt=window.prompt("' . $GLOBALS['LANG']->getLL('rejectExplain')) . '","");
-                                                       if (commentTxt!=null) {window.location.href="') . $this->doc->issueCommand(((((((((('&cmd[' . $table) . '][') . $rec_off['uid']) . '][version][action]=setStage') . '&cmd[') . $table) . '][') . $rec_off['uid']) . '][version][stageId]=-1'))) . '&cmd[') . $table) . '][') . $rec_off['uid']) . '][version][comment]="+escape(commentTxt);}') . ' return false;';
-                       // Reject:
-                       $actionLinks .= ((((('<a href="#" onclick="' . htmlspecialchars($onClick)) . '" title="') . $GLOBALS['LANG']->getLL('reject', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-move-down')) . '</a>';
-               } else {
-                       // Reject:
-                       $actionLinks .= ('<img src="' . $this->doc->backPath) . 'gfx/clear.gif" width="14" height="14" alt="" align="top" title="" />';
-               }
-               $actionLinks .= ((('<span style="background-color: ' . $color) . '; color: white;">') . $sLabel) . '</span>';
-               // Raise
-               if ($raiseOk) {
-                       $onClick = (((((((('var commentTxt=window.prompt("' . $label) . '","");
-                                                       if (commentTxt!=null) {window.location.href="') . $this->doc->issueCommand((((((((((('&cmd[' . $table) . '][') . $rec_off['uid']) . '][version][action]=setStage') . '&cmd[') . $table) . '][') . $rec_off['uid']) . '][version][stageId]=') . $sId))) . '&cmd[') . $table) . '][') . $rec_off['uid']) . '][version][comment]="+escape(commentTxt);}') . ' return false;';
-                       if ($rec_off['t3ver_stage'] != 10) {
-                               $actionLinks .= ((((('<a href="#" onclick="' . htmlspecialchars($onClick)) . '" title="') . htmlspecialchars($titleAttrib)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-move-up')) . '</a>';
-                               $this->stageIndex[$sId][$table][] = $rec_off['uid'];
-                               $this->recIndex[$table][$rec_off['uid']] = $sId;
-                       }
-               }
-               return $actionLinks;
-       }
-
-       /**
-        * Links to publishing etc of a version
-        *
-        * @param       string          Table name
-        * @param       array           Online record
-        * @param       array           Offline record (version)
-        * @param       string          Swap type, "branch", "page" or "element
-        * @return      string          HTML content, mainly link tags and images.
-        * @todo Define visibility
-        */
-       public function displayWorkspaceOverview_commandLinks($table, &$rec_on, &$rec_off, $vType) {
-               if ($this->publishAccess && (!($GLOBALS['BE_USER']->workspaceRec['publish_access'] & 1) || (int) $rec_off['t3ver_stage'] === -10)) {
-                       $actionLinks = ((((('<a href="' . htmlspecialchars($this->doc->issueCommand((((((((((('&cmd[' . $table) . '][') . $rec_on['uid']) . '][version][action]=swap') . '&cmd[') . $table) . '][') . $rec_on['uid']) . '][version][swapWith]=') . $rec_off['uid'])))) . '" title="') . $GLOBALS['LANG']->getLL('publish', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-swap-version')) . '</a>';
-                       if ($GLOBALS['BE_USER']->workspaceSwapAccess()) {
-                               $actionLinks .= ((((('<a href="' . htmlspecialchars($this->doc->issueCommand(((((((((((((((('&cmd[' . $table) . '][') . $rec_on['uid']) . '][version][action]=swap') . '&cmd[') . $table) . '][') . $rec_on['uid']) . '][version][swapWith]=') . $rec_off['uid']) . '&cmd[') . $table) . '][') . $rec_on['uid']) . '][version][swapIntoWS]=1')))) . '" title="') . $GLOBALS['LANG']->getLL('swap', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-swap-workspace')) . '</a>';
-                       }
-               }
-               if (!$GLOBALS['BE_USER']->workspaceCannotEditOfflineVersion($table, $rec_off)) {
-                       // Release
-                       $actionLinks .= ((((((('<a href="' . htmlspecialchars($this->doc->issueCommand((((('&cmd[' . $table) . '][') . $rec_off['uid']) . '][version][action]=clearWSID')))) . '" onclick="return confirm(\'') . $GLOBALS['LANG']->getLL('removeFromWorkspace', TRUE)) . '?\');" title="') . $GLOBALS['LANG']->getLL('removeFromWorkspace', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-document-remove')) . '</a>';
-                       // Edit
-                       if ($table === 'pages' && $vType !== 'element') {
-                               $tempUid = $vType === 'branch' || $GLOBALS['BE_USER']->workspace === 0 ? $rec_off['uid'] : $rec_on['uid'];
-                               $actionLinks .= ((((((('<a href="#" onclick="top.loadEditId(' . $tempUid) . ');top.goToModule(\'') . $this->pageModule) . '\'); return false;" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:img_title_edit_page', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-version-page-open')) . '</a>';
-                       } else {
-                               $params = ((('&edit[' . $table) . '][') . $rec_off['uid']) . ']=edit';
-                               $actionLinks .= ((((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::editOnClick($params, $this->doc->backPath))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:img_title_edit_element', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-open')) . '</a>';
-                       }
-               }
-               // History/Log
-               $actionLinks .= ((((('<a href="' . htmlspecialchars((((($this->doc->backPath . 'show_rechis.php?element=') . rawurlencode((($table . ':') . $rec_off['uid']))) . '&returnUrl=') . rawurlencode($this->REQUEST_URI)))) . '" title="') . $GLOBALS['LANG']->getLL('showLog', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-history-open')) . '</a>';
-               // View
-               if ($table === 'pages') {
-                       $tempUid = $vType === 'branch' || $GLOBALS['BE_USER']->workspace === 0 ? $rec_off['uid'] : $rec_on['uid'];
-                       $actionLinks .= ((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($tempUid, $this->doc->backPath, \t3lib_BEfunc::BEgetRootLine($tempUid)))) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
-               }
-               return $actionLinks;
-       }
-
-       /**
-        * Links to publishing etc of a version
-        *
-        * @param       string          Table name
-        * @param       array           Record
-        * @param       integer         The uid of the online version of $uid. If zero it means we are drawing a row for the online version itself while a value means we are drawing display for an offline version.
-        * @return      string          HTML content, mainly link tags and images.
-        * @todo Define visibility
-        */
-       public function displayWorkspaceOverview_commandLinksSub($table, $rec, $origId) {
-               $uid = $rec['uid'];
-               if ($origId || $GLOBALS['BE_USER']->workspace === 0) {
-                       if (!$GLOBALS['BE_USER']->workspaceCannotEditRecord($table, $rec)) {
-                               // Edit
-                               if ($table === 'pages') {
-                                       $actionLinks .= ((((((('<a href="#" onclick="top.loadEditId(' . $uid) . ');top.goToModule(\'') . $this->pageModule) . '\'); return false;" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:img_title_edit_page', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('apps-version-page-open')) . '</a>';
-                               } else {
-                                       $params = ((('&edit[' . $table) . '][') . $uid) . ']=edit';
-                                       $actionLinks .= ((((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::editOnClick($params, $this->doc->backPath))) . '" title="') . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_user_ws.xml:img_title_edit_element', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-open')) . '</a>';
-                               }
-                       }
-                       // History/Log
-                       $actionLinks .= ((((('<a href="' . htmlspecialchars((((($this->doc->backPath . 'show_rechis.php?element=') . rawurlencode((($table . ':') . $uid))) . '&returnUrl=') . rawurlencode($this->REQUEST_URI)))) . '" title="') . $GLOBALS['LANG']->getLL('showLog', TRUE)) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-history-open')) . '</a>';
-               }
-               // View
-               if ($table === 'pages') {
-                       $actionLinks .= ((('<a href="#" onclick="' . htmlspecialchars(\t3lib_BEfunc::viewOnClick($uid, $this->doc->backPath, \t3lib_BEfunc::BEgetRootLine($uid)))) . '">') . \t3lib_iconWorks::getSpriteIcon('actions-document-view')) . '</a>';
-               }
-               return $actionLinks;
-       }
-
-       /**********************************
-        *
-        * Processing
-        *
-        **********************************/
-       /**
-        * Will publish workspace if buttons are pressed
-        *
-        * @return      void
-        * @todo Define visibility
-        */
-       public function publishAction() {
-               // If "Publish" or "Swap" buttons are pressed:
-               if (\t3lib_div::_POST('_publish') || \t3lib_div::_POST('_swap')) {
-                       if ($this->table === 'pages') {
-                               // Making sure ->uid is a page ID!
-                               // Initialize workspace object and request all pending versions:
-                               $wslibObj = \t3lib_div::makeInstance('TYPO3\\CMS\\Version\\Utility\\WorkspacesUtility');
-                               $cmd = $wslibObj->getCmdArrayForPublishWS($GLOBALS['BE_USER']->workspace, \t3lib_div::_POST('_swap'), $this->uid);
-                               // Execute the commands:
-                               $tce = \t3lib_div::makeInstance('TYPO3\\CMS\\Core\\DataHandler\\DataHandler');
-                               $tce->stripslashes_values = 0;
-                               $tce->start(array(), $cmd);
-                               $tce->process_cmdmap();
-                               \t3lib_BEfunc::setUpdateSignal('updatePageTree');
-                               return $tce->errorLog;
-                       }
-               }
-       }
-
-}
-
-
+require_once \TYPO3\CMS\Core\Extension\ExtensionManager::extPath('version') . 'Classes/Controller/VersionModuleController.php';
 // Make instance:
-$SOBE = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Version\\ClickMenu\\VersionClickMenu');
+$SOBE = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Version\\Controller\\VersionModuleController');
 $SOBE->init();
 $SOBE->main();
 $SOBE->printContent();