[TASK] Separate ext:statictemplates code from core 74/18974/5
authorChristian Kuhn <lolli@schwarzbu.ch>
Sat, 16 Mar 2013 10:41:01 +0000 (11:41 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Tue, 19 Mar 2013 20:50:34 +0000 (21:50 +0100)
The three menu types GMENU_LAYERS GMENU_FOLDOUT and TMENU_LAYERS use
javascript files of statictemplates and belongs to the extension.
Using the new factory of issue #46292, those three menu objects are
now transferred to statictemplates extension.

For upgrade to TYPO3 CMS 4.5 an ugrade wizard was created to install
statictemplates system extension if the database tables was in use.
Everything before 4.5 is out of support for a long time, so we can
expect the extension to be already loaded if it is used. The old
upgrade wizard is removed now.

Some statictemplates specific code in ext:tstemplate is substituted
with hooks, used by statictemplates.

Change-Id: Id14dca12f09051c3003fedaeb971fef457f7a17e
Resolves: #46358
Related: #46292
Releases: 6.1
Reviewed-on: https://review.typo3.org/18974
Reviewed-by: Anja Leichsenring
Tested-by: Anja Leichsenring
Reviewed-by: Wouter Wolters
Tested-by: Wouter Wolters
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
22 files changed:
typo3/sysext/core/Classes/Utility/ExtensionManagementUtility.php
typo3/sysext/core/Migrations/Code/LegacyClassesForIde.php
typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php [deleted file]
typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php [deleted file]
typo3/sysext/frontend/Classes/ContentObject/Menu/MenuContentObjectFactory.php
typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayersContentObject.php [deleted file]
typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/MenuContentObjectFactoryTest.php [new file with mode: 0644]
typo3/sysext/install/Classes/CoreUpdates/StaticTemplatesUpdate.php [deleted file]
typo3/sysext/install/Migrations/Code/ClassAliasMap.php
typo3/sysext/install/ext_localconf.php
typo3/sysext/install/mod/class.tx_install.php
typo3/sysext/install/updates/class.tx_coreupdates_statictemplates.php [deleted file]
typo3/sysext/statictemplates/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php [new file with mode: 0644]
typo3/sysext/statictemplates/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php [new file with mode: 0644]
typo3/sysext/statictemplates/Classes/ContentObject/Menu/TextMenuLayersContentObject.php [new file with mode: 0644]
typo3/sysext/statictemplates/Classes/TypoScriptTemplateModuleControllerHook.php [new file with mode: 0644]
typo3/sysext/statictemplates/ext_localconf.php
typo3/sysext/statictemplates/ext_tables.php
typo3/sysext/statictemplates/media/scripts/gmenu_foldout.php
typo3/sysext/statictemplates/media/scripts/gmenu_layers.php
typo3/sysext/statictemplates/media/scripts/tmenu_layers.php
typo3/sysext/tstemplate/Classes/Controller/TypoScriptTemplateModuleController.php

index 2a98377..13262df 100644 (file)
@@ -1288,7 +1288,6 @@ tt_content.' . $key . $prefix . ' {
 
        /**
         * Call this method to add an entry in the static template list found in sys_templates
-        * "static template files" are the modern equivalent (provided from extensions) to the traditional records in "static_templates"
         * FOR USE IN ext_localconf.php FILES
         *
         * @param string $extKey Is of course the extension key
index 7bbf63d..8b19a61 100644 (file)
@@ -5489,11 +5489,6 @@ class tx_coreupdates_notinmenu extends \TYPO3\CMS\Install\CoreUpdates\NotInMenuU
 /**
  * @deprecated since 6.0 will be removed in 7.0
  */
-class tx_coreupdates_statictemplates extends \TYPO3\CMS\Install\CoreUpdates\StaticTemplatesUpdate {}
-
-/**
- * @deprecated since 6.0 will be removed in 7.0
- */
 class tx_coreupdates_t3skin extends \TYPO3\CMS\Install\CoreUpdates\T3skinUpdate {}
 
 /**
@@ -6359,11 +6354,6 @@ class SC_mod_user_setup_index extends \TYPO3\CMS\Setup\Controller\SetupModuleCon
 /**
  * @deprecated since 6.0 will be removed in 7.0
  */
-class tx_statictemplates extends \TYPO3\CMS\Statictemplates\StaticTemplatesHook {}
-
-/**
- * @deprecated since 6.0 will be removed in 7.0
- */
 abstract class tx_sv_authbase extends \TYPO3\CMS\Sv\AbstractAuthenticationService {}
 
 /**
diff --git a/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php
deleted file mode 100644 (file)
index aa0172e..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-<?php
-namespace TYPO3\CMS\Frontend\ContentObject\Menu;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 1999-2013 Kasper Skårhøj (kasperYYYY@typo3.com)
- *  All rights reserved
- *
- *  This script is part of the TYPO3 project. The TYPO3 project is
- *  free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The GNU General Public License can be found at
- *  http://www.gnu.org/copyleft/gpl.html.
- *  A copy is found in the textfile GPL.txt and important notices to the license
- *  from the author is found in LICENSE.txt distributed with these scripts.
- *
- *
- *  This script is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
-
-/**
- * Contains the GMENU_FOLDOUT menu object
- * Class for the creation of DHTML foldout menus
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-class GraphicalMenuFoldoutContentObject extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject {
-
-       /**
-        * @todo Define visibility
-        */
-       public $GMENU_fixKey = 'foldout';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMarrowNO;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMarrowACT;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMimagesFlag;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMimageHTML;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMsubmenu;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMtableWrap;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WM_activeOnLoad = '';
-
-       /**
-        * Initializing, setting internal variables (prefixed WM)
-        *
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_init() {
-               $this->WMarrowNO = '';
-               $this->WMarrowACT = '';
-               $this->WMimagesFlag = 0;
-               $this->WMimageHTML = '';
-               if (($this->mconf['arrowNO'] || $this->mconf['arrowNO.']) && ($this->mconf['arrowACT'] || $this->mconf['arrowACT.'])) {
-                       $this->WMarrowNO = $GLOBALS['TSFE']->cObj->getImgResource($this->mconf['arrowNO'], $this->mconf['arrowNO.']);
-                       $this->WMarrowACT = $GLOBALS['TSFE']->cObj->getImgResource($this->mconf['arrowACT'], $this->mconf['arrowACT.']);
-                       if (is_array($this->WMarrowACT) && is_array($this->WMarrowNO)) {
-                               $this->WMimagesFlag = 1;
-                       }
-               }
-       }
-
-       /**
-        * Processing before the links are created.
-        * Basically this is setting an onclick handler for clicking the menu item.
-        *
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_beforeLinking($key) {
-               $this->I['addATagParams'] = '';
-               $this->WMsubmenu = $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']);
-               if (trim($this->WMsubmenu)) {
-                       $this->I['addATagParams'] = ' onclick="GF_menu(' . $key . ');' . ($this->mconf['dontLinkIfSubmenu'] ? ' return false;' : '') . '"';
-                       // orig: && $this->WMisSub, changed 210901
-                       if ($this->isActive($this->I['uid'], $this->getMPvar($key)) && $this->mconf['displayActiveOnLoad']) {
-                               $this->WM_activeOnLoad = 'GF_menu(' . $key . ');';
-                       }
-               }
-       }
-
-       /**
-        * Processing after linking, basically setting the <div>-layers for the menu items and possibly wrapping in table, adding bullet images.
-        *
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_afterLinking($key) {
-               $this->WMtableWrap = $this->mconf['dontWrapInTable'] ? '' : '<table cellspacing="0" cellpadding="0" width="100%" border="0"><tr><td>|</td></tr></table>';
-               if ($this->WMimagesFlag) {
-                       $this->WMimageHTML = '<img src="' . $GLOBALS['TSFE']->absRefPrefix . $this->WMarrowNO[3] . '" width="' . $this->WMarrowNO[0] . '" height="' . $this->WMarrowNO[1] . '" border="0" name="imgA' . $key . '"' . ($this->mconf['arrowImgParams'] ? ' ' . $this->mconf['arrowImgParams'] : '') . ' alt="" />';
-               } else {
-                       $this->WMimageHTML = '';
-               }
-               if (strstr($this->I['theItem'], '###ARROW_IMAGE###')) {
-                       $this->I['theItem'] = str_replace('###ARROW_IMAGE###', $this->WMimageHTML, $this->I['theItem']);
-               } else {
-                       $this->I['theItem'] = $this->WMimageHTML . $this->I['theItem'];
-               }
-               $this->WMresult .= '
-<div class="clTop" id="divTop' . ($key + 1) . '">' . $this->tmpl->wrap($this->I['theItem'], $this->WMtableWrap) . '
-<div class="clSub" id="divSub' . ($key + 1) . '">
-               ' . $this->WMsubmenu . '
-</div>
-</div>';
-       }
-
-       /**
-        * Putting things together, in particular the JavaScript code needed for the DHTML menu.
-        *
-        * @return string Empty string! (Since $GLOBALS['TSFE']->divSection is set with the <div>-sections used in the menu)
-        * @todo Define visibility
-        */
-       public function extProc_finish() {
-               $bHeight = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['bottomHeight'] ? $this->mconf['bottomHeight'] : 100, 0, 3000);
-               $bottomContent = $this->mconf['bottomContent'] ? $GLOBALS['TSFE']->cObj->cObjGetSingle($this->mconf['bottomContent'], $this->mconf['bottomContent.'], '/GMENU_FOLDOUT/.bottomContent') : '';
-               $adjustTopHeights = intval($this->mconf['adjustItemsH']);
-               $adjustSubHeights = intval($this->mconf['adjustSubItemsH']);
-               $mWidth = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['menuWidth'] ? $this->mconf['menuWidth'] : 170, 0, 3000);
-               $mHeight = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['menuHeight'] ? $this->mconf['menuHeight'] : 400, 0, 3000);
-               $insertmColor = $this->mconf['menuBackColor'] ? 'BACKGROUND-COLOR: ' . $this->mconf['menuBackColor'] . '; layer-background-color: ' . $this->mconf['menuBackColor'] : '';
-               $insertBottomColor = $this->mconf['bottomBackColor'] ? 'BACKGROUND-COLOR: ' . $this->mconf['bottomBackColor'] . '; layer-background-color: ' . $this->mconf['bottomBackColor'] : '';
-               $menuOffset = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $this->mconf['menuOffset'] . ',');
-               $subOffset = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $this->mconf['subMenuOffset'] . ',');
-               $GLOBALS['TSFE']->additionalHeaderData['gmenu_layer_shared'] = '<script type="text/javascript" src="' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::siteRelPath('statictemplates') . 'media/scripts/jsfunc.layermenu.js"></script>';
-               $GLOBALS['TSFE']->additionalHeaderData['gmenu_foldout'] = '<script type="text/javascript" src="' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::siteRelPath('statictemplates') . 'media/scripts/jsfunc.foldout.js"></script>';
-               $GLOBALS['TSFE']->additionalHeaderData[] .= '
-<style type="text/css">
-       /*<![CDATA[*/
-#divCont {
-       Z-INDEX: 1; LEFT: ' . $menuOffset[0] . 'px; VISIBILITY: hidden; WIDTH: ' . $mWidth . 'px; POSITION: absolute; TOP: ' . $menuOffset[1] . 'px; HEIGHT: ' . $mHeight . 'px
-}
-.clTop {
-       Z-INDEX: 1; WIDTH: ' . $mWidth . 'px; POSITION: absolute; ' . $insertmColor . '
-}
-.clSub {
-       Z-INDEX: 1; LEFT: ' . $subOffset[0] . 'px; WIDTH: ' . $mWidth . 'px; POSITION: absolute; TOP: ' . $subOffset[1] . 'px
-}
-.bottomLayer {
-       Z-INDEX: 1; WIDTH: ' . $mWidth . 'px; CLIP: rect(0px ' . $mWidth . 'px ' . $bHeight . 'px 0px); POSITION: absolute; HEIGHT: ' . $bHeight . 'px; ' . $insertBottomColor . '
-}
-       /*]]>*/
-</style>
-<script type="text/javascript">
-/*<![CDATA[*/
-<!--
-GFV_foldNumber=' . $this->WMmenuItems . ';          //How many toplinks do you have?
-GFV_foldTimer=' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange(($this->mconf['foldTimer'] ? $this->mconf['foldTimer'] : 40), 1, 3000) . ';          //The timeout in the animation, these are milliseconds.
-GFV_foldSpeed=' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['foldSpeed'], 1, 100) . ';           //How many steps in an animation?
-GFV_stayFolded=' . ($this->mconf['stayFolded'] ? 'true' : 'false') . ';      //Stay open when you click a new toplink?
-GFV_foldImg=' . $this->WMimagesFlag . ';             //Do you want images (if not set to 0 and remove the images from the body)?
-GFV_currentFold=null;
-GFV_foldStep1=null;
-GFV_foldStep2=null;
-GFV_step=0;
-GFV_active=false;       //Don\'t change this one.
-GFV_adjustTopHeights = ' . $adjustTopHeights . ';
-GFV_adjustSubHeights = ' . $adjustSubHeights . ';
-if (bw.opera) {
-       GFV_scrX= innerWidth;
-       GFV_scrY= innerHeight;
-}
-
-//This is the default image.
-//Remember to change the actual images in the page as well, but remember to keep the name of the image.
-var GFV_unImg=new Image();
-GFV_unImg.src="' . $GLOBALS['TSFE']->absRefPrefix . $this->WMarrowNO[3] . '";
-
-var GFV_exImg=new Image();          //Making an image variable...
-GFV_exImg.src="' . $GLOBALS['TSFE']->absRefPrefix . $this->WMarrowACT[3] . '";   //...this is the source of the image that it changes to when the menu expands.
-
-//-->
-/*]]>*/
-</script>
-';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove']['GF_resizeForOpera()'] = 'GF_resizeForOpera();';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onload']['GMENU_FOLDOUT'] = 'if(bw.bw) {GF_initFoldout();' . $this->WM_activeOnLoad . '}';
-               $GLOBALS['TSFE']->divSection .= '
-<div id="divCont"><!-- These are the contents of the foldoutmenu. -->
-               ' . $this->tmpl->wrap($this->WMresult, $this->mconf['wrap']) . '
-<div class="bottomLayer" id="divTop' . ($this->WMmenuItems + 1) . '">
-       <div class="clSub" id="divSub' . ($this->WMmenuItems + 1) . '"><!-- This is a cover layer, it should always be the last one, and does NOT count in your number of toplinks! --><!-- So if this one is divTop7, the GFV_foldNumber variable should be set to 6 --><!-- This layer covers up the last sub, so if the last sub gets too big, increase this layers size in the stylesheet. --><!-- There are tables with width="100%" around the toplinks, to force NS4 to use the real width specified for the toplinks in the stylesheet. -->
-       </div>' . $this->tmpl->wrap($bottomContent, $this->WMtableWrap) . '
-</div>
-</div><!-- Here ends the foldoutmenu. -->
-               ';
-               return '';
-       }
-
-}
-
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php
deleted file mode 100644 (file)
index 4d09041..0000000
+++ /dev/null
@@ -1,509 +0,0 @@
-<?php
-namespace TYPO3\CMS\Frontend\ContentObject\Menu;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 1999-2013 Kasper Skårhøj (kasperYYYY@typo3.com)
- *  All rights reserved
- *
- *  This script is part of the TYPO3 project. The TYPO3 project is
- *  free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The GNU General Public License can be found at
- *  http://www.gnu.org/copyleft/gpl.html.
- *  A copy is found in the textfile GPL.txt and important notices to the license
- *  from the author is found in LICENSE.txt distributed with these scripts.
- *
- *
- *  This script is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
-
-/**
- * Contains the GMENU_LAYERS menu object
- * Class for the creation of DHTML menus
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-class GraphicalMenuLayersContentObject extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject {
-
-       // FULL DUPLICATE TO tmenu_layers BEGIN:
-       /**
-        * @todo Define visibility
-        */
-       public $GMENU_fixKey = 'layers';
-
-       /**
-        * @todo Define visibility
-        */
-       public $divLayers = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMx = 0;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMy = 0;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMxyArray = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMextraScript = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMlastKey = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMrestoreScript = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMresetSubMenus = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMactiveHasSubMenu = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMactiveKey = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMtheSubMenu;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMisSub;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMhideCode;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMonlyOnLoad = 0;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMbordersWithin = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMsubIds = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMtempStore = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMlockPosition_addAccumulated = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $VMmouseoverActions = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $VMmouseoutActions = array();
-
-       /**
-        * Creating unique menu id string plus other initialization of internal
-        * variables (all prefixed "WM")
-        *
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_init() {
-               $this->WMid = trim($this->mconf['layer_menu_id']) ? trim($this->mconf['layer_menu_id']) . 'x' : substr(md5('gl' . serialize($this->mconf)), 0, 6);
-               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'][] = $this->WMid;
-               $this->WMtempStore = $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'];
-               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array();
-               // Save:
-               $this->WMonlyOnLoad = $this->mconf['displayActiveOnLoad'] && !$this->mconf['displayActiveOnLoad.']['onlyOnLoad'];
-               $this->WMbordersWithin = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $this->mconf['bordersWithin'] . ',0,0,0,0,0');
-       }
-
-       /**
-        * Processing of mouse-over features depending on whether "freezeMouseover"
-        * property is set.
-        *
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found OR $this->result['RO'][$key] where the configuration for that elements RO version is found! Here it is used with the ->WMid to make unique names
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_RO($key) {
-               if ($this->mconf['freezeMouseover']) {
-                       $this->VMmouseoverActions[$this->WMid . $key] = 'case "Menu' . $this->WMid . $key . '":' . $this->I['linkHREF']['onMouseover'] . '; break;';
-                       $this->VMmouseoutActions[$this->WMid . $key] = 'case "Menu' . $this->WMid . $key . '":' . $this->I['linkHREF']['onMouseout'] . '; break;';
-                       $this->I['linkHREF']['onMouseover'] = 'GL' . $this->WMid . '_over(\'Menu' . $this->WMid . $key . '\');';
-                       $this->I['linkHREF']['onMouseout'] = '';
-               }
-       }
-
-       /**
-        * Processing before the links are created.
-        * This means primarily creating some javaScript code for the management.
-        *
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_beforeLinking($key) {
-               if ($this->I['uid']) {
-                       array_push($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId'], $this->WMid);
-                       $this->WMtheSubMenu = $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']);
-                       array_pop($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']);
-                       $this->WMisSub = trim($this->WMtheSubMenu) ? 1 : 0;
-                       if ($this->mconf['lockPosition_addSelf']) {
-                               $this->WMy += (strcmp($this->mconf['setFixedHeight'], '') ? $this->mconf['setFixedHeight'] : $this->I['val']['output_h']) + intval($this->mconf['lockPosition_adjust']);
-                               $this->WMx += (strcmp($this->mconf['setFixedWidth'], '') ? $this->mconf['setFixedWidth'] : $this->I['val']['output_w']) + intval($this->mconf['lockPosition_adjust']);
-                       }
-                       // orig: && $this->WMisSub, changed 210901
-                       if ($this->isActive($this->I['uid'], $this->getMPvar($key)) && $this->mconf['displayActiveOnLoad']) {
-                               $this->WMactiveHasSubMenu = $this->WMisSub;
-                               $this->WMactiveKey = 'Menu' . $this->WMid . $key;
-                               $this->WMrestoreVars = trim('
-GLV_restoreMenu["' . $this->WMid . '"] = "' . $this->WMactiveKey . '";
-                               ');
-                               $this->WMrestoreScript = '      GL_doTop("' . $this->WMid . '",GLV_restoreMenu["' . $this->WMid . '"]);' . ($this->mconf['freezeMouseover'] ? '
-       GL' . $this->WMid . '_over(GLV_restoreMenu["' . $this->WMid . '"]);
-' : '');
-                       }
-                       if ($this->WMisSub) {
-                               $event = 'GL_stopMove(\'' . $this->WMid . '\');';
-                               $this->I['linkHREF']['onMouseover'] = 'GL_doTop(\'' . $this->WMid . '\', \'Menu' . $this->WMid . $key . '\');' . $this->I['linkHREF']['onMouseover'];
-                               // IESelectFix - Activates IFRAME layer below menu
-                               if ($this->mconf['ieSelectFix']) {
-                                       $this->I['linkHREF']['onMouseover'] = $this->I['linkHREF']['onMouseover'] . 'GL_iframer(\'' . $this->WMid . '\',\'Menu' . $this->WMid . $key . '\',true);';
-                               }
-                               // Added 120802; This means that everytime leaving a menuitem the layer should be shut down (and if the layer is hit in the meantime it is not though).
-                               // This should happen only for items that are auto-hidden when not over and possibly only when a hide-timer is set. Problem is if the hide-timer is not set and we leave the main element, then the layer will be hidden unless we reach the layer before the timeout will happen and the menu hidden.
-                               if (\TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuWhenNotOver'], 0, 600) && $this->mconf['hideMenuTimer']) {
-                                       $event .= 'GL_resetAll("' . $this->WMid . '");';
-                               }
-                               $this->I['linkHREF']['onMouseout'] .= $event;
-                       } else {
-                               $this->I['linkHREF']['onMouseover'] = 'GL_hideAll("' . $this->WMid . '");' . $this->I['linkHREF']['onMouseover'];
-                               // IESelectFix - Hides IFRAME layer below menu
-                               if ($this->mconf['ieSelectFix']) {
-                                       $this->I['linkHREF']['onMouseover'] = $this->I['linkHREF']['onMouseover'] . 'GL_iframer(\'' . $this->WMid . '\',\'\',false);';
-                               }
-                               $event = 'GL_resetAll("' . $this->WMid . '");';
-                               $this->I['linkHREF']['onMouseout'] .= $event;
-                       }
-                       $this->WMxyArray[] = 'GLV_menuXY["' . $this->WMid . '"]["Menu' . $this->WMid . $key . '"] = new Array(' . $this->WMx . ',' . $this->WMy . ',"itemID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '","anchorID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '");';
-               }
-       }
-
-       /**
-        * Processing after linking, basically setting the <div>-layers for the
-        * menu items. Also some more JavaScript code is made.
-        *
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_afterLinking($key) {
-               if ($this->I['uid']) {
-                       if (!$this->I['spacer'] && $this->WMisSub) {
-                               $exStyle = $this->mconf['layerStyle'] ? $this->mconf['layerStyle'] : 'position:absolute;visibility:hidden';
-                               if (trim($exStyle)) {
-                                       $exStyle = ' ' . $exStyle;
-                               }
-                               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['layerCounter']++;
-                               $zIndex = 10000 - $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['layerCounter'];
-                               $divStart = '<div id="Menu' . $this->WMid . $key . '" style="z-index:' . $zIndex . ';' . $exStyle . '">';
-                               $divStop = '</div>';
-                               $this->divLayers[] = $divStart . $this->WMtheSubMenu . $divStop;
-                               $this->WMhideCode .= '
-       GL_getObjCss("Menu' . $this->WMid . $key . '").visibility = "hidden";';
-                               $this->WMlastKey = 'Menu' . $this->WMid . $key;
-                       }
-                       if (!$this->mconf['lockPosition_addSelf']) {
-                               $this->WMy += (strcmp($this->mconf['setFixedHeight'], '') ? $this->mconf['setFixedHeight'] : $this->I['val']['output_h']) + intval($this->mconf['lockPosition_adjust']);
-                               $this->WMx += (strcmp($this->mconf['setFixedWidth'], '') ? $this->mconf['setFixedWidth'] : $this->I['val']['output_w']) + intval($this->mconf['lockPosition_adjust']);
-                       }
-               }
-               $this->WMresult .= $this->I['theItem'];
-       }
-
-       /**
-        * Wrapping the item in a <div> section if 'relativeToTriggerItem' was set
-        *
-        * @param string The current content of the menu item, $this->I['theItem'], passed along.
-        * @param integer Pointer to $this->menuArr[$key] where the current menu element record is found
-        * @return string The modified version of $item, going back into $this->I['theItem']
-        * @todo Define visibility
-        */
-       public function extProc_beforeAllWrap($item, $key) {
-               if ($this->mconf['relativeToTriggerItem']) {
-                       $item = '<div id="anchorID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '" style="position:absolute;visibility:hidden;"></div><div id="itemID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '" style="width:100%; height:100%;">' . $item . '</div>';
-               }
-               return $item;
-       }
-
-       /**
-        * Returns TRUE if different from ''  OR if intval()!=0
-        *
-        * @param string $in Value to evaluate
-        * @return boolean TRUE if $in is different from ''  OR if intval()!=0
-        * @todo Define visibility
-        */
-       public function isSetIntval($in) {
-               return $this->mconf['blankStrEqFalse'] ? strcmp($in, '') : intval($in);
-       }
-
-       /**
-        * Putting things together, in particular the JavaScript code needed
-        * for the DHTML menu.
-        *
-        * @return mixed Returns the value of a call to the parent function, parent::extProc_finish();
-        * @todo Define visibility
-        */
-       public function extProc_finish() {
-               $dirL = $this->mconf['directionLeft'] ? '-GL_getObj(id).width' : '';
-               $dirU = $this->mconf['directionUp'] ? '-GL_getObj(id).height' : '';
-               $parentLayerId = end($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']);
-               $DoTop = array();
-               $GLV_menuOn = array();
-               $relCode = array();
-               $relFlag = 0;
-               if ($this->mconf['relativeToParentLayer'] && $parentLayerId) {
-                       $relCode['X'] .= 'GLV_curLayerX["' . $parentLayerId . '"]+';
-                       $relCode['Y'] .= 'GLV_curLayerY["' . $parentLayerId . '"]+';
-                       if ($this->mconf['relativeToParentLayer.']['addWidth']) {
-                               $relCode['X'] .= 'GLV_curLayerWidth["' . $parentLayerId . '"]+';
-                       }
-                       if ($this->mconf['relativeToParentLayer.']['addHeight']) {
-                               $relCode['Y'] .= 'GLV_curLayerHeight["' . $parentLayerId . '"]+';
-                       }
-               }
-               if ($this->mconf['relativeToTriggerItem']) {
-                       $DoTop[] = '
-               var parentObject = GL_getObj(GLV_menuXY[WMid][id][2]);
-               var TI_width = parentObject.width;
-               var TI_height = parentObject.height;
-               var anchorObj = GL_getObj(GLV_menuXY[WMid][id][3]);
-               var TI_x = anchorObj.x;
-               var TI_y = anchorObj.y;
-                       ';
-                       $relCode['X'] .= 'TI_x+';
-                       $relCode['Y'] .= 'TI_y+';
-                       if ($this->mconf['relativeToTriggerItem.']['addWidth']) {
-                               $relCode['X'] .= 'TI_width+';
-                       }
-                       if ($this->mconf['relativeToTriggerItem.']['addHeight']) {
-                               $relCode['Y'] .= 'TI_height+';
-                       }
-                       $relFlag = 1;
-               }
-               if ($relFlag) {
-                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
-                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top =  (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
-               } else {
-                       // X position (y is fixed)
-                       if (!strcmp($this->mconf['lockPosition'], 'x')) {
-                               $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . 'GLV_menuXY["' . $this->WMid . '"][id][0]-(' . intval($this->mconf['xPosOffset']) . ')' . $dirL . ')+"px";';
-                               if ($this->isSetIntval($this->mconf['topOffset'])) {
-                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
-                               }
-                       } elseif ($this->isSetIntval($this->mconf['xPosOffset'])) {
-                               $GLV_menuOn[] = ($DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (GLV_x-(' . intval($this->mconf['xPosOffset']) . ')' . $dirL . ')+"px";');
-                               if ($this->isSetIntval($this->mconf['topOffset'])) {
-                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
-                               }
-                       }
-                       // Y position   (x is fixed)
-                       if (!strcmp($this->mconf['lockPosition'], 'y')) {
-                               $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . 'GLV_menuXY["' . $this->WMid . '"][id][1]-(' . intval($this->mconf['yPosOffset']) . ')' . $dirU . ')+"px";';
-                               if ($this->isSetIntval($this->mconf['leftOffset'])) {
-                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
-                               }
-                       } elseif ($this->isSetIntval($this->mconf['yPosOffset'])) {
-                               $GLV_menuOn[] = ($DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (GLV_y-(' . intval($this->mconf['yPosOffset']) . ')' . $dirU . ')+"px";');
-                               if ($this->isSetIntval($this->mconf['leftOffset'])) {
-                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
-                               }
-                       }
-               }
-               // BordersWithIn:
-               $DoTop[] = $this->extCalcBorderWithin('left', $this->WMbordersWithin[0]);
-               $DoTop[] = $this->extCalcBorderWithin('top', $this->WMbordersWithin[1]);
-               $DoTop[] = $this->extCalcBorderWithin('right', $this->WMbordersWithin[2]);
-               $DoTop[] = $this->extCalcBorderWithin('bottom', $this->WMbordersWithin[3]);
-               $DoTop[] = $this->extCalcBorderWithin('left', $this->WMbordersWithin[4]);
-               $DoTop[] = $this->extCalcBorderWithin('top', $this->WMbordersWithin[5]);
-               if ($this->mconf['freezeMouseover'] && !$this->mconf['freezeMouseover.']['alwaysKeep']) {
-                       $this->WMhideCode .= '
-GL' . $this->WMid . '_out("");';
-               }
-               $TEST = '';
-               if (count($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'])) {
-                       foreach ($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] as $mIdStr) {
-                               $this->WMhideCode .= '
-GL_hideAll("' . $mIdStr . '");';
-                               $this->WMrestoreScript .= '
-GL_restoreMenu("' . $mIdStr . '");';
-                               $this->WMresetSubMenus .= '
-if (!GLV_doReset["' . $mIdStr . '"] && GLV_currentLayer["' . $mIdStr . '"]!=null)      resetSubMenu=0;';
-                       }
-               }
-               // IESelectFix - Adds IFRAME tag to HTML, Hides IFRAME layer below menu
-               if ($this->mconf['ieSelectFix']) {
-                       $this->WMhideCode .= '
-       GL_iframer(\'' . $this->WMid . '\',\'\',false);';
-                       $this->divLayers['iframe'] = '<iframe id="Iframe' . $this->WMid . '" scrolling="no" frameborder="0" style="position:absolute; top:0px; left:0px; background-color:transparent; layer-background-color:transparent; display:none;"></iframe>';
-               }
-               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array_merge($this->WMtempStore, $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid']);
-               $GLOBALS['TSFE']->additionalHeaderData['gmenu_layer_shared'] = '<script type="text/javascript" src="' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::siteRelPath('statictemplates') . 'media/scripts/jsfunc.layermenu.js"></script>';
-               $GLOBALS['TSFE']->JSCode .= '
-
-GLV_curLayerWidth["' . $this->WMid . '"]=0;
-GLV_curLayerHeight["' . $this->WMid . '"]=0;
-GLV_curLayerX["' . $this->WMid . '"]=0;
-GLV_curLayerY["' . $this->WMid . '"]=0;
-GLV_menuOn["' . $this->WMid . '"] = null;
-GLV_gap["' . $this->WMid . '"]=' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuWhenNotOver'], 0, 600) . ';
-GLV_currentLayer["' . $this->WMid . '"] = null;
-GLV_currentROitem["' . $this->WMid . '"] = null;
-GLV_hasBeenOver["' . $this->WMid . '"]=0;
-GLV_doReset["' . $this->WMid . '"]=false;
-GLV_lastKey["' . $this->WMid . '"] = "' . $this->WMlastKey . '";
-GLV_onlyOnLoad["' . $this->WMid . '"] = ' . ($this->WMonlyOnLoad ? 1 : 0) . ';
-GLV_dontHideOnMouseUp["' . $this->WMid . '"] = ' . ($this->mconf['dontHideOnMouseUp'] ? 1 : 0) . ';
-GLV_dontFollowMouse["' . $this->WMid . '"] = ' . ($this->mconf['dontFollowMouse'] ? 1 : 0) . ';
-GLV_date = new Date();
-GLV_timeout["' . $this->WMid . '"] = GLV_date.getTime();
-GLV_timeoutRef["' . $this->WMid . '"] = ' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuTimer'], 0, 20000) . ';
-GLV_menuXY["' . $this->WMid . '"] = new Array();
-' . implode(LF, $this->WMxyArray) . '
-' . $this->WMrestoreVars;
-               if ($this->mconf['freezeMouseover']) {
-                       $GLOBALS['TSFE']->JSCode .= '
-// Alternative rollover/out functions for use with GMENU_LAYER
-function GL' . $this->WMid . '_over(mitm_id) {
-       GL' . $this->WMid . '_out("");  // removes any old roll over state of an item. Needed for alwaysKeep and Opera browsers.
-       switch(mitm_id) {
-' . implode(LF, $this->VMmouseoverActions) . '
-       }
-       GLV_currentROitem["' . $this->WMid . '"]=mitm_id;
-}
-function GL' . $this->WMid . '_out(mitm_id) {
-       if (!mitm_id)   mitm_id=GLV_currentROitem["' . $this->WMid . '"];
-       switch(mitm_id) {
-' . implode(LF, $this->VMmouseoutActions) . '
-       }
-}
-';
-               }
-               $GLOBALS['TSFE']->JSCode .= '
-function GL' . $this->WMid . '_getMouse(e) {
-       if (GLV_menuOn["' . $this->WMid . '"]!=null && !GLV_dontFollowMouse["' . $this->WMid . '"]){
-' . implode(LF, $GLV_menuOn) . '
-       }
-       GL_mouseMoveEvaluate("' . $this->WMid . '");
-}
-function GL' . $this->WMid . '_hideCode() {
-' . $this->WMhideCode . '
-}
-function GL' . $this->WMid . '_doTop(WMid,id) {
-' . trim(implode(LF, $DoTop)) . '
-}
-function GL' . $this->WMid . '_restoreMenu() {
-' . $this->WMrestoreScript . '
-}
-function GL' . $this->WMid . '_resetSubMenus() {
-       var resetSubMenu=1;
-' . $this->WMresetSubMenus . '
-       return resetSubMenu;
-}
-
-GLV_timeout_pointers[GLV_timeout_count] = "' . $this->WMid . '";
-GLV_timeout_count++;
-
-';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onload']['GL_initLayers()'] = 'GL_initLayers();';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onload'][$this->WMid] = 'GL_restoreMenu("' . $this->WMid . '");';
-               // Should be called BEFORE any of the 'local' getMouse functions!
-               // is put inside in a try catch block to avoid JS errors in IE
-               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove']['GL_getMouse(e)'] = 'try{GL_getMouse(e);}catch(ex){};';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove'][$this->WMid] = 'try{GL' . $this->WMid . '_getMouse(e);}catch(ex){};';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onmouseup'][$this->WMid] = 'GL_mouseUp(\'' . $this->WMid . '\',e);';
-               $GLOBALS['TSFE']->divSection .= implode($this->divLayers, LF) . LF;
-               return parent::extProc_finish();
-       }
-
-       /**
-        * Creates a JavaScript line which corrects the position of the layer
-        * based on the constraints in TypoScript property 'bordersWithin'
-        *
-        * @param string $kind Direction to test.
-        * @param integer $integer The boundary limit in the direction set by $kind. If set then a value is returned, otherwise blank.
-        * @return string JavaScript string for correction of the layer position (if $integer is TRUE)
-        * @see extProc_finish(), extProc_init()
-        * @todo Define visibility
-        */
-       public function extCalcBorderWithin($kind, $integer) {
-               if ($integer) {
-                       switch ($kind) {
-                       case 'right':
-
-                       case 'bottom':
-                               $add = '';
-                               if ($kind == 'right') {
-                                       $add = 'GL_getObj(id).width';
-                                       $key = 'left';
-                               }
-                               if ($kind == 'bottom') {
-                                       $add = 'GL_getObj(id).height';
-                                       $key = 'top';
-                               }
-                               $str = 'if (parseInt(GLV_menuOn["' . $this->WMid . '"].' . $key . ')+' . $add . '>' . $integer . ') GLV_menuOn["' . $this->WMid . '"].' . $key . '=' . $integer . '-' . $add . ';';
-                               break;
-                       default:
-                               $str = 'if (parseInt(GLV_menuOn["' . $this->WMid . '"].' . $kind . ')<' . $integer . ') GLV_menuOn["' . $this->WMid . '"].' . $kind . '=' . $integer . ';';
-                               break;
-                       }
-               }
-               return $str;
-       }
-
-}
-
-
-?>
\ No newline at end of file
index 1ab1b29..8222506 100644 (file)
@@ -28,7 +28,9 @@ namespace TYPO3\CMS\Frontend\ContentObject\Menu;
  ***************************************************************/
 
 /**
- * Factory for menu content objects
+ * Factory for menu content objects. Allows overriding the default
+ * types like 'GMENU' with an own implementation (only one possible)
+ * and new types can be registered.
  *
  * @author Christian Kuhn <lolli@schwarzbu.ch>
  */
@@ -41,9 +43,6 @@ class MenuContentObjectFactory implements \TYPO3\CMS\Core\SingletonInterface {
         */
        protected $menuTypeToClassMapping = array(
                'GMENU' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\GraphicalMenuContentObject',
-               'GMENU_LAYERS' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\GraphicalMenuLayersContentObject',
-               'GMENU_FOLDOUT' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\GraphicalMenuFoldoutContentObject',
-               'TMENU_LAYERS' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\TextMenuLayersContentObject',
                'TMENU' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\TextMenuContentObject',
                'IMGMENU' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\ImageMenuContentObject',
                'JSMENU' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\JavaScriptMenuContentObject',
@@ -57,8 +56,9 @@ class MenuContentObjectFactory implements \TYPO3\CMS\Core\SingletonInterface {
         * @throws Exception\NoSuchMenuTypeException
         */
        public function getMenuObjectByType($type = '') {
-               if (array_key_exists(strtoupper($type), $this->menuTypeToClassMapping)) {
-                       $object = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance($this->menuTypeToClassMapping[strtoupper($type)]);
+               $uppercasedClassname = strtoupper($type);
+               if (array_key_exists($uppercasedClassname, $this->menuTypeToClassMapping)) {
+                       $object = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance($this->menuTypeToClassMapping[$uppercasedClassname]);
                } else {
                        throw new Exception\NoSuchMenuTypeException(
                                'Menu type ' . (string)$type . ' has no implementing class.',
@@ -67,6 +67,23 @@ class MenuContentObjectFactory implements \TYPO3\CMS\Core\SingletonInterface {
                }
                return $object;
        }
+
+       /**
+        * Register new menu type or override existing type
+        *
+        * @param string $type Menu type to be used in TypoScript
+        * @param string $className Class rendering the menu
+        * @throws \InvalidArgumentException
+        */
+       public function registerMenuType($type, $className) {
+               if (!is_string($type) || !is_string($className)) {
+                       throw new \InvalidArgumentException(
+                               'type and className must be strings',
+                               1363429303
+                       );
+               }
+               $this->menuTypeToClassMapping[strtoupper($type)] = $className;
+       }
 }
 
 ?>
\ No newline at end of file
diff --git a/typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayersContentObject.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayersContentObject.php
deleted file mode 100644 (file)
index 8d31f25..0000000
+++ /dev/null
@@ -1,511 +0,0 @@
-<?php
-namespace TYPO3\CMS\Frontend\ContentObject\Menu;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 1999-2013 Kasper Skårhøj (kasperYYYY@typo3.com)
- *  All rights reserved
- *
- *  This script is part of the TYPO3 project. The TYPO3 project is
- *  free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The GNU General Public License can be found at
- *  http://www.gnu.org/copyleft/gpl.html.
- *  A copy is found in the textfile GPL.txt and important notices to the license
- *  from the author is found in LICENSE.txt distributed with these scripts.
- *
- *
- *  This script is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
-
-/**
- * Contains the TMENU_LAYERS menu object
- * Class for the creation of text based DHTML menus
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-class TextMenuLayersContentObject extends \TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContentObject {
-
-       // FULL DUPLICATE FROM gmenu_layers BEGIN:
-       /**
-        * @todo Define visibility
-        */
-       public $GMENU_fixKey = 'layers';
-
-       /**
-        * @todo Define visibility
-        */
-       public $divLayers = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMx = 0;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMy = 0;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMxyArray = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMextraScript = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMlastKey = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMrestoreScript = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMresetSubMenus = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMactiveHasSubMenu = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMactiveKey = '';
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMtheSubMenu;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMisSub;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMhideCode;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMonlyOnLoad = 0;
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMbordersWithin = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMsubIds = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMtempStore = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $WMlockPosition_addAccumulated = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $VMmouseoverActions = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $VMmouseoutActions = array();
-
-       /**
-        * Creating unique menu id string plus other initialization of internal variables (all prefixed "WM")
-        *
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_init() {
-               $this->WMid = trim($this->mconf['layer_menu_id']) ? trim($this->mconf['layer_menu_id']) . 'x' : substr(md5('gl' . serialize($this->mconf)), 0, 6);
-               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'][] = $this->WMid;
-               $this->WMtempStore = $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'];
-               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array();
-               // Save:
-               $this->WMonlyOnLoad = $this->mconf['displayActiveOnLoad'] && !$this->mconf['displayActiveOnLoad.']['onlyOnLoad'];
-               $this->WMbordersWithin = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $this->mconf['bordersWithin'] . ',0,0,0,0,0');
-       }
-
-       /**
-        * Processing of mouse-over features depending on whether "freezeMouseover" property is set.
-        *
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found OR $this->result['RO'][$key] where the configuration for that elements RO version is found! Here it is used with the ->WMid to make unique names
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_RO($key) {
-               if ($this->mconf['freezeMouseover']) {
-                       $this->VMmouseoverActions[$this->WMid . $key] = 'case "Menu' . $this->WMid . $key . '":' . $this->I['linkHREF']['onMouseover'] . '; break;';
-                       $this->VMmouseoutActions[$this->WMid . $key] = 'case "Menu' . $this->WMid . $key . '":' . $this->I['linkHREF']['onMouseout'] . '; break;';
-                       $this->I['linkHREF']['onMouseover'] = 'GL' . $this->WMid . '_over(\'Menu' . $this->WMid . $key . '\');';
-                       $this->I['linkHREF']['onMouseout'] = '';
-               }
-       }
-
-       /**
-        * Processing before the links are created.
-        * This means primarily creating some javaScript code for the management.
-        *
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_beforeLinking($key) {
-               if ($this->I['uid']) {
-                       array_push($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId'], $this->WMid);
-                       $this->WMtheSubMenu = $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']);
-                       array_pop($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']);
-                       $this->WMisSub = trim($this->WMtheSubMenu) ? 1 : 0;
-                       if ($this->mconf['lockPosition_addSelf']) {
-                               $this->WMy += (strcmp($this->mconf['setFixedHeight'], '') ? $this->mconf['setFixedHeight'] : $this->I['val']['output_h']) + intval($this->mconf['lockPosition_adjust']);
-                               $this->WMx += (strcmp($this->mconf['setFixedWidth'], '') ? $this->mconf['setFixedWidth'] : $this->I['val']['output_w']) + intval($this->mconf['lockPosition_adjust']);
-                       }
-                       // orig: && $this->WMisSub, changed 210901
-                       if ($this->isActive($this->I['uid'], $this->getMPvar($key)) && $this->mconf['displayActiveOnLoad']) {
-                               $this->WMactiveHasSubMenu = $this->WMisSub;
-                               $this->WMactiveKey = 'Menu' . $this->WMid . $key;
-                               $this->WMrestoreVars = trim('
-GLV_restoreMenu["' . $this->WMid . '"] = "' . $this->WMactiveKey . '";
-                               ');
-                               $this->WMrestoreScript = '      GL_doTop("' . $this->WMid . '",GLV_restoreMenu["' . $this->WMid . '"]);' . ($this->mconf['freezeMouseover'] ? '
-       GL' . $this->WMid . '_over(GLV_restoreMenu["' . $this->WMid . '"]);
-' : '');
-                       }
-                       if ($this->WMisSub) {
-                               $event = 'GL_stopMove(\'' . $this->WMid . '\');';
-                               $this->I['linkHREF']['onMouseover'] = 'GL_doTop(\'' . $this->WMid . '\', \'Menu' . $this->WMid . $key . '\');' . $this->I['linkHREF']['onMouseover'];
-                               // IESelectFix - Activates IFRAME layer below menu
-                               if ($this->mconf['ieSelectFix']) {
-                                       $this->I['linkHREF']['onMouseover'] = $this->I['linkHREF']['onMouseover'] . 'GL_iframer(\'' . $this->WMid . '\',\'Menu' . $this->WMid . $key . '\',true);';
-                               }
-                               // Added 120802; This means that everytime leaving a menuitem the layer
-                               // should be shut down (and if the layer is hit in the meantime it is
-                               // not though). This should happen only for items that are auto-hidden
-                               // when not over and possibly only when a hide-timer is set. Problem is
-                               // if the hide-timer is not set and we leave the main element, then the
-                               // layer will be hidden unless we reach the layer before the timeout will
-                               // happen and the menu hidden.
-                               if (\TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuWhenNotOver'], 0, 600) && $this->mconf['hideMenuTimer']) {
-                                       $event .= 'GL_resetAll("' . $this->WMid . '");';
-                               }
-                               $this->I['linkHREF']['onMouseout'] .= $event;
-                       } else {
-                               $this->I['linkHREF']['onMouseover'] = 'GL_hideAll("' . $this->WMid . '");' . $this->I['linkHREF']['onMouseover'];
-                               // IESelectFix - Hides IFRAME layer below menu
-                               if ($this->mconf['ieSelectFix']) {
-                                       $this->I['linkHREF']['onMouseover'] = $this->I['linkHREF']['onMouseover'] . 'GL_iframer(\'' . $this->WMid . '\',\'\',false);';
-                               }
-                               $event = 'GL_resetAll("' . $this->WMid . '");';
-                               $this->I['linkHREF']['onMouseout'] .= $event;
-                       }
-                       $this->WMxyArray[] = 'GLV_menuXY["' . $this->WMid . '"]["Menu' . $this->WMid . $key . '"] = new Array(' . $this->WMx . ',' . $this->WMy . ',"itemID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '","anchorID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '");';
-               }
-       }
-
-       /**
-        * Processing after linking, basically setting the <div>-layers for the menu
-        * items. Also some more JavaScript code is made.
-        *
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
-        * @return void
-        * @todo Define visibility
-        */
-       public function extProc_afterLinking($key) {
-               if ($this->I['uid']) {
-                       if (!$this->I['spacer'] && $this->WMisSub) {
-                               $exStyle = $this->mconf['layerStyle'] ? $this->mconf['layerStyle'] : 'position:absolute;visibility:hidden';
-                               if (trim($exStyle)) {
-                                       $exStyle = ' ' . $exStyle;
-                               }
-                               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['layerCounter']++;
-                               $zIndex = 10000 - $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['layerCounter'];
-                               $divStart = '<div id="Menu' . $this->WMid . $key . '" style="z-index:' . $zIndex . ';' . $exStyle . '">';
-                               $divStop = '</div>';
-                               $this->divLayers[] = $divStart . $this->WMtheSubMenu . $divStop;
-                               $this->WMhideCode .= '
-       GL_getObjCss("Menu' . $this->WMid . $key . '").visibility = "hidden";';
-                               $this->WMlastKey = 'Menu' . $this->WMid . $key;
-                       }
-                       if (!$this->mconf['lockPosition_addSelf']) {
-                               $this->WMy += (strcmp($this->mconf['setFixedHeight'], '') ? $this->mconf['setFixedHeight'] : $this->I['val']['output_h']) + intval($this->mconf['lockPosition_adjust']);
-                               $this->WMx += (strcmp($this->mconf['setFixedWidth'], '') ? $this->mconf['setFixedWidth'] : $this->I['val']['output_w']) + intval($this->mconf['lockPosition_adjust']);
-                       }
-               }
-               $this->WMresult .= $this->I['theItem'];
-       }
-
-       /**
-        * Wrapping the item in a <div> section if 'relativeToTriggerItem' was set
-        *
-        * @param string $item The current content of the menu item, $this->I['theItem'], passed along.
-        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
-        * @return string The modified version of $item, going back into $this->I['theItem']
-        * @todo Define visibility
-        */
-       public function extProc_beforeAllWrap($item, $key) {
-               if ($this->mconf['relativeToTriggerItem']) {
-                       $item = '<div id="anchorID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '" style="position:absolute;visibility:hidden;"></div><div id="itemID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '" style="width:100%; height:100%;">' . $item . '</div>';
-               }
-               return $item;
-       }
-
-       /**
-        * Returns TRUE if different from ''  OR if intval()!=0
-        *
-        * @param string $in Value to evaluate
-        * @return boolean TRUE if $in is different from ''  OR if intval()!=0
-        * @todo Define visibility
-        */
-       public function isSetIntval($in) {
-               return $this->mconf['blankStrEqFalse'] ? strcmp($in, '') : intval($in);
-       }
-
-       /**
-        * Putting things together, in particular the JavaScript code needed for the DHTML menu.
-        *
-        * @return mixed Returns the value of a call to the parent function, parent::extProc_finish();
-        * @todo Define visibility
-        */
-       public function extProc_finish() {
-               $dirL = $this->mconf['directionLeft'] ? '-GL_getObj(id).width' : '';
-               $dirU = $this->mconf['directionUp'] ? '-GL_getObj(id).height' : '';
-               $parentLayerId = end($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']);
-               $DoTop = array();
-               $GLV_menuOn = array();
-               $relCode = array();
-               $relFlag = 0;
-               if ($this->mconf['relativeToParentLayer'] && $parentLayerId) {
-                       $relCode['X'] .= 'GLV_curLayerX["' . $parentLayerId . '"]+';
-                       $relCode['Y'] .= 'GLV_curLayerY["' . $parentLayerId . '"]+';
-                       if ($this->mconf['relativeToParentLayer.']['addWidth']) {
-                               $relCode['X'] .= 'GLV_curLayerWidth["' . $parentLayerId . '"]+';
-                       }
-                       if ($this->mconf['relativeToParentLayer.']['addHeight']) {
-                               $relCode['Y'] .= 'GLV_curLayerHeight["' . $parentLayerId . '"]+';
-                       }
-               }
-               if ($this->mconf['relativeToTriggerItem']) {
-                       $DoTop[] = '
-               var parentObject = GL_getObj(GLV_menuXY[WMid][id][2]);
-               var TI_width = parentObject.width;
-               var TI_height = parentObject.height;
-               var anchorObj = GL_getObj(GLV_menuXY[WMid][id][3]);
-               var TI_x = anchorObj.x;
-               var TI_y = anchorObj.y;
-                       ';
-                       $relCode['X'] .= 'TI_x+';
-                       $relCode['Y'] .= 'TI_y+';
-                       if ($this->mconf['relativeToTriggerItem.']['addWidth']) {
-                               $relCode['X'] .= 'TI_width+';
-                       }
-                       if ($this->mconf['relativeToTriggerItem.']['addHeight']) {
-                               $relCode['Y'] .= 'TI_height+';
-                       }
-                       $relFlag = 1;
-               }
-               if ($relFlag) {
-                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
-                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top =  (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
-               } else {
-                       // X position (y is fixed)
-                       if (!strcmp($this->mconf['lockPosition'], 'x')) {
-                               $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . 'GLV_menuXY["' . $this->WMid . '"][id][0]-(' . intval($this->mconf['xPosOffset']) . ')' . $dirL . ')+"px";';
-                               if ($this->isSetIntval($this->mconf['topOffset'])) {
-                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
-                               }
-                       } elseif ($this->isSetIntval($this->mconf['xPosOffset'])) {
-                               $GLV_menuOn[] = ($DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (GLV_x-(' . intval($this->mconf['xPosOffset']) . ')' . $dirL . ')+"px";');
-                               if ($this->isSetIntval($this->mconf['topOffset'])) {
-                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
-                               }
-                       }
-                       // Y position   (x is fixed)
-                       if (!strcmp($this->mconf['lockPosition'], 'y')) {
-                               $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . 'GLV_menuXY["' . $this->WMid . '"][id][1]-(' . intval($this->mconf['yPosOffset']) . ')' . $dirU . ')+"px";';
-                               if ($this->isSetIntval($this->mconf['leftOffset'])) {
-                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
-                               }
-                       } elseif ($this->isSetIntval($this->mconf['yPosOffset'])) {
-                               $GLV_menuOn[] = ($DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (GLV_y-(' . intval($this->mconf['yPosOffset']) . ')' . $dirU . ')+"px";');
-                               if ($this->isSetIntval($this->mconf['leftOffset'])) {
-                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
-                               }
-                       }
-               }
-               // BordersWithIn:
-               $DoTop[] = $this->extCalcBorderWithin('left', $this->WMbordersWithin[0]);
-               $DoTop[] = $this->extCalcBorderWithin('top', $this->WMbordersWithin[1]);
-               $DoTop[] = $this->extCalcBorderWithin('right', $this->WMbordersWithin[2]);
-               $DoTop[] = $this->extCalcBorderWithin('bottom', $this->WMbordersWithin[3]);
-               $DoTop[] = $this->extCalcBorderWithin('left', $this->WMbordersWithin[4]);
-               $DoTop[] = $this->extCalcBorderWithin('top', $this->WMbordersWithin[5]);
-               if ($this->mconf['freezeMouseover'] && !$this->mconf['freezeMouseover.']['alwaysKeep']) {
-                       $this->WMhideCode .= '
-GL' . $this->WMid . '_out("");';
-               }
-               $TEST = '';
-               if (count($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'])) {
-                       foreach ($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] as $mIdStr) {
-                               $this->WMhideCode .= '
-GL_hideAll("' . $mIdStr . '");';
-                               $this->WMrestoreScript .= '
-GL_restoreMenu("' . $mIdStr . '");';
-                               $this->WMresetSubMenus .= '
-if (!GLV_doReset["' . $mIdStr . '"] && GLV_currentLayer["' . $mIdStr . '"]!=null)      resetSubMenu=0;';
-                       }
-               }
-               // IESelectFix - Adds IFRAME tag to HTML, Hides IFRAME layer below menu
-               if ($this->mconf['ieSelectFix']) {
-                       $this->WMhideCode .= '
-       GL_iframer(\'' . $this->WMid . '\',\'\',false);';
-                       $this->divLayers['iframe'] = '<iframe id="Iframe' . $this->WMid . '" scrolling="no" frameborder="0" style="position:absolute; top:0px; left:0px; background-color:transparent; layer-background-color:transparent; display:none;"></iframe>';
-               }
-               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array_merge($this->WMtempStore, $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid']);
-               $GLOBALS['TSFE']->additionalHeaderData['gmenu_layer_shared'] = '<script type="text/javascript" src="' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::siteRelPath('statictemplates') . 'media/scripts/jsfunc.layermenu.js"></script>';
-               $GLOBALS['TSFE']->JSCode .= '
-
-GLV_curLayerWidth["' . $this->WMid . '"]=0;
-GLV_curLayerHeight["' . $this->WMid . '"]=0;
-GLV_curLayerX["' . $this->WMid . '"]=0;
-GLV_curLayerY["' . $this->WMid . '"]=0;
-GLV_menuOn["' . $this->WMid . '"] = null;
-GLV_gap["' . $this->WMid . '"]=' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuWhenNotOver'], 0, 600) . ';
-GLV_currentLayer["' . $this->WMid . '"] = null;
-GLV_currentROitem["' . $this->WMid . '"] = null;
-GLV_hasBeenOver["' . $this->WMid . '"]=0;
-GLV_doReset["' . $this->WMid . '"]=false;
-GLV_lastKey["' . $this->WMid . '"] = "' . $this->WMlastKey . '";
-GLV_onlyOnLoad["' . $this->WMid . '"] = ' . ($this->WMonlyOnLoad ? 1 : 0) . ';
-GLV_dontHideOnMouseUp["' . $this->WMid . '"] = ' . ($this->mconf['dontHideOnMouseUp'] ? 1 : 0) . ';
-GLV_dontFollowMouse["' . $this->WMid . '"] = ' . ($this->mconf['dontFollowMouse'] ? 1 : 0) . ';
-GLV_date = new Date();
-GLV_timeout["' . $this->WMid . '"] = GLV_date.getTime();
-GLV_timeoutRef["' . $this->WMid . '"] = ' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuTimer'], 0, 20000) . ';
-GLV_menuXY["' . $this->WMid . '"] = new Array();
-' . implode(LF, $this->WMxyArray) . '
-' . $this->WMrestoreVars;
-               if ($this->mconf['freezeMouseover']) {
-                       $GLOBALS['TSFE']->JSCode .= '
-// Alternative rollover/out functions for use with GMENU_LAYER
-function GL' . $this->WMid . '_over(mitm_id) {
-       GL' . $this->WMid . '_out("");  // removes any old roll over state of an item. Needed for alwaysKeep and Opera browsers.
-       switch(mitm_id) {
-' . implode(LF, $this->VMmouseoverActions) . '
-       }
-       GLV_currentROitem["' . $this->WMid . '"]=mitm_id;
-}
-function GL' . $this->WMid . '_out(mitm_id) {
-       if (!mitm_id)   mitm_id=GLV_currentROitem["' . $this->WMid . '"];
-       switch(mitm_id) {
-' . implode(LF, $this->VMmouseoutActions) . '
-       }
-}
-';
-               }
-               $GLOBALS['TSFE']->JSCode .= '
-function GL' . $this->WMid . '_getMouse(e) {
-       if (GLV_menuOn["' . $this->WMid . '"]!=null && !GLV_dontFollowMouse["' . $this->WMid . '"]){
-' . implode(LF, $GLV_menuOn) . '
-       }
-       GL_mouseMoveEvaluate("' . $this->WMid . '");
-}
-function GL' . $this->WMid . '_hideCode() {
-' . $this->WMhideCode . '
-}
-function GL' . $this->WMid . '_doTop(WMid,id) {
-' . trim(implode(LF, $DoTop)) . '
-}
-function GL' . $this->WMid . '_restoreMenu() {
-' . $this->WMrestoreScript . '
-}
-function GL' . $this->WMid . '_resetSubMenus() {
-       var resetSubMenu=1;
-' . $this->WMresetSubMenus . '
-       return resetSubMenu;
-}
-
-GLV_timeout_pointers[GLV_timeout_count] = "' . $this->WMid . '";
-GLV_timeout_count++;
-
-';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onload']['GL_initLayers()'] = 'GL_initLayers();';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onload'][$this->WMid] = 'GL_restoreMenu("' . $this->WMid . '");';
-               // Should be called BEFORE any of the 'local' getMouse functions!
-               // is put inside in a try catch block to avoid JS errors in IE
-               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove']['GL_getMouse(e)'] = 'try{GL_getMouse(e);}catch(ex){};';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove'][$this->WMid] = 'try{GL' . $this->WMid . '_getMouse(e);}catch(ex){};';
-               $GLOBALS['TSFE']->JSeventFuncCalls['onmouseup'][$this->WMid] = 'GL_mouseUp(\'' . $this->WMid . '\',e);';
-               $GLOBALS['TSFE']->divSection .= implode($this->divLayers, LF) . LF;
-               return parent::extProc_finish();
-       }
-
-       /**
-        * Creates a JavaScript line which corrects the position of the layer based on
-        * the constraints in TypoScript property 'bordersWithin'
-        *
-        * @param string $kind Direction to test.
-        * @param integer $integer The boundary limit in the direction set by $kind. If set then a value is returned, otherwise blank.
-        * @return string JavaScript string for correction of the layer position (if $integer is TRUE)
-        * @see extProc_finish(), extProc_init()
-        * @todo Define visibility
-        */
-       public function extCalcBorderWithin($kind, $integer) {
-               if ($integer) {
-                       switch ($kind) {
-                       case 'right':
-
-                       case 'bottom':
-                               $add = '';
-                               if ($kind == 'right') {
-                                       $add = 'GL_getObj(id).width';
-                                       $key = 'left';
-                               }
-                               if ($kind == 'bottom') {
-                                       $add = 'GL_getObj(id).height';
-                                       $key = 'top';
-                               }
-                               $str = 'if (parseInt(GLV_menuOn["' . $this->WMid . '"].' . $key . ')+' . $add . '>' . $integer . ') GLV_menuOn["' . $this->WMid . '"].' . $key . '=' . $integer . '-' . $add . ';';
-                               break;
-                       default:
-                               $str = 'if (parseInt(GLV_menuOn["' . $this->WMid . '"].' . $kind . ')<' . $integer . ') GLV_menuOn["' . $this->WMid . '"].' . $kind . '=' . $integer . ';';
-                               break;
-                       }
-               }
-               return $str;
-       }
-
-}
-
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/MenuContentObjectFactoryTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/MenuContentObjectFactoryTest.php
new file mode 100644 (file)
index 0000000..b9f3dea
--- /dev/null
@@ -0,0 +1,99 @@
+<?php
+namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject\Menu;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2013 Christian Kuhn <lolli@schwarzbu.ch>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Testcase
+ *
+ * @author Christian Kuhn <lolli@schwarzbu.ch
+ */
+class MenuContentObjectFactoryTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
+
+       /**
+        * @test
+        * @expectedException \TYPO3\CMS\Frontend\ContentObject\Menu\Exception\NoSuchMenuTypeException
+        */
+       public function getMenuObjectByTypeThrowsExceptionForUnknownType() {
+               $factory = new \TYPO3\CMS\Frontend\ContentObject\Menu\MenuContentObjectFactory;
+               $factory->getMenuObjectByType(uniqid('foo_'));
+       }
+
+       /**
+        * @test
+        */
+       public function getMenuObjectByTypeReturnsObjectForRegisteredMenuType() {
+               $factory = new \TYPO3\CMS\Frontend\ContentObject\Menu\MenuContentObjectFactory;
+               $this->assertInternalType('object', $factory->getMenuObjectByType('GMENU'));
+       }
+
+       /**
+        * @test
+        */
+       public function getMenuObjectByTypeReturnsObjectWithLowercasedMenuType() {
+               $factory = new \TYPO3\CMS\Frontend\ContentObject\Menu\MenuContentObjectFactory;
+               $this->assertInternalType('object', $factory->getMenuObjectByType('gmenu'));
+       }
+
+       /**
+        * @test
+        */
+       public function getMenuObjectByTypeReturnsInstanceOfOwnRegisteredTypeInsteadOfInternalType() {
+               $factory = new \TYPO3\CMS\Frontend\ContentObject\Menu\MenuContentObjectFactory;
+               $selfClassName = get_class($this);
+               $factory->registerMenuType('GMENU', $selfClassName);
+               $this->assertInstanceOf($selfClassName, $factory->getMenuObjectByType('GMENU'));
+       }
+
+       /**
+        * @test
+        */
+       public function getMenuObjectByTypeReturnsInstanceOfNewRegisteredType() {
+               $factory = new \TYPO3\CMS\Frontend\ContentObject\Menu\MenuContentObjectFactory;
+               $selfClassName = get_class($this);
+               $uniqueMenuType = uniqid('foo_');
+               $factory->registerMenuType($uniqueMenuType, $selfClassName);
+               $this->assertInstanceOf($selfClassName, $factory->getMenuObjectByType($uniqueMenuType));
+       }
+
+       /**
+        * @test
+        * @expectedException \InvalidArgumentException
+        */
+       public function registerMenuTypeThrowsExceptionIfTypeIsNotOfTypeString() {
+               $factory = new \TYPO3\CMS\Frontend\ContentObject\Menu\MenuContentObjectFactory;
+               $factory->registerMenuType(array(), 'foo');
+       }
+
+       /**
+        * @test
+        * @expectedException \InvalidArgumentException
+        */
+       public function registerMenuTypeThrowsExceptionIfClassNameIsNotOfTypeString() {
+               $factory = new \TYPO3\CMS\Frontend\ContentObject\Menu\MenuContentObjectFactory;
+               $factory->registerMenuType('foo', array());
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/install/Classes/CoreUpdates/StaticTemplatesUpdate.php b/typo3/sysext/install/Classes/CoreUpdates/StaticTemplatesUpdate.php
deleted file mode 100644 (file)
index 67498f2..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-namespace TYPO3\CMS\Install\CoreUpdates;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 2008-2013  Steffen Ritter (info@rs-websystems.de)
- *      2009-2013  Benjamin Mack (benni@typo3.org)
- *  All rights reserved
- *
- *  This script is part of the TYPO3 project. The TYPO3 project is
- *  free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The GNU General Public License can be found at
- *  http://www.gnu.org/copyleft/gpl.html.
- *  A copy is found in the textfile GPL.txt and important notices to the license
- *  from the author is found in LICENSE.txt distributed with these scripts.
- *
- *
- *  This script is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
-/**
- * Contains the update class for old static templates. Used by the update wizard in the install tool.
- *
- * @author     Steffen Ritter <info@rs-websystems.de>
- * @author Benjamin Mack <benni@typo3.org>
- */
-class StaticTemplatesUpdate extends \TYPO3\CMS\Install\Updates\AbstractUpdate {
-
-       protected $title = 'Install Outsourced Static Templates (now in System Extension)';
-
-       /**
-        * Checks if there are any references to static_templates and an update is needed.
-        *
-        * @param       string          &$description: The description for the update
-        * @return      boolean         whether an update is needed (TRUE) or not (FALSE)
-        */
-       public function checkForUpdate(&$description) {
-               $description = '<strong>Check dependencies / references to old TypoScript templates in table static_template.</strong><br />
-               This updater checks if you are using the old TypoScript static templates. These are extracted into its own extension "statictemplates". If you need them, this updater will install this extension.<br /><br />';
-               if ($this->versionNumber >= 4004000 && !\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('statictemplates')) {
-                       $count = $GLOBALS['TYPO3_DB']->exec_SELECTcountRows('*', 'sys_refindex', 'ref_table = \'static_template\' AND tablename <> \'static_template\' AND deleted=0');
-                       if ($count) {
-                               $description .= '<strong style="color:#f00">Dependencies found! You MUST install the extenion "statictemplates"!</strong>';
-                               return TRUE;
-                       } else {
-                               $description .= 'No Dependencies found! You may use the COMPARE - Tool to delete the static_template table.';
-                       }
-               }
-               return FALSE;
-       }
-
-       /**
-        * second step: get user info
-        *
-        * @param       string          input prefix, all names of form fields have to start with this. Append custom name in [ ... ]
-        * @return      string          HTML output
-        */
-       public function getUserInput($inputPrefix) {
-               $content = '<strong>Install the system extension</strong><br />You are about to install the extension "statictemplates". Make sure it is available in the TYPO3 source.';
-               return $content;
-       }
-
-       /**
-        * performs the action of the UpdateManager
-        *
-        * @param       array           &$dbQueries: queries done in this update
-        * @param       mixed           &$customMessages: custom messages
-        * @return      bool            whether everything went smoothly or not
-        */
-       public function performUpdate(array &$dbQueries, &$customMessages) {
-               if ($this->versionNumber >= 4004000 && !\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('statictemplates')) {
-                       // check wether the table can be truncated or if sysext with tca has to be installed
-                       if ($this->checkForUpdate($customMessages[])) {
-                               try {
-                                       \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::loadExtension('statictemplates');
-                                       $customMessages[] = 'System Extension "statictemplates" was successfully loaded, static templates are now supported.';
-                                       $result = TRUE;
-                               } catch (\RuntimeException $e) {
-                                       $result = FALSE;
-                               }
-                               return $result;
-                       }
-                       return TRUE;
-               }
-       }
-
-}
-
-
-?>
\ No newline at end of file
index ed685d7..735cdce 100644 (file)
@@ -15,7 +15,6 @@ return array(
        'tx_coreupdates_mergeadvanced' => 'TYPO3\\CMS\\Install\\CoreUpdates\\MergeAdvancedUpdate',
        'tx_coreupdates_migrateworkspaces' => 'TYPO3\\CMS\\Install\\CoreUpdates\\MigrateWorkspacesUpdate',
        'tx_coreupdates_notinmenu' => 'TYPO3\\CMS\\Install\\CoreUpdates\\NotInMenuUpdate',
-       'tx_coreupdates_statictemplates' => 'TYPO3\\CMS\\Install\\CoreUpdates\\StaticTemplatesUpdate',
        'tx_coreupdates_t3skin' => 'TYPO3\\CMS\\Install\\CoreUpdates\\T3skinUpdate',
        'tx_install_ajax' => 'TYPO3\\CMS\\Install\\EidHandler',
        'Tx_Install_Service_BasicService' => 'TYPO3\\CMS\\Install\\EnableFileService',
index 6c94238..f059a3d 100644 (file)
@@ -25,9 +25,6 @@ $TYPO3_CONF_VARS['SC_OPTIONS']['ext/install']['update']['installSystemExtensions
 $TYPO3_CONF_VARS['SC_OPTIONS']['ext/install']['update']['changeImagecolsValue'] = 'TYPO3\\CMS\\Install\\CoreUpdates\\ImagecolsUpdate';
 // register eID script for install tool AJAX calls
 $TYPO3_CONF_VARS['FE']['eID_include']['tx_install_ajax'] = 'EXT:install/mod/class.tx_install_ajax.php';
-// add static_template if needed (since TYPO3 4.4 this table is not standard)
-// if needed, sysext statictables is loaded, which gives back functionality
-$TYPO3_CONF_VARS['SC_OPTIONS']['ext/install']['update']['checkForStaticTypoScriptTemplates'] = 'TYPO3\\CMS\\Install\\CoreUpdates\\StaticTemplatesUpdate';
 // warn for t3skin installed in Version 4.4
 $TYPO3_CONF_VARS['SC_OPTIONS']['ext/install']['update']['checkForT3SkinInstalled'] = 'TYPO3\\CMS\\Install\\CoreUpdates\\T3skinUpdate';
 // Version 4.4: warn for set CompressionLevel and warn user to update his .htaccess
index 67381a7..17d41ec 100644 (file)
@@ -40,7 +40,6 @@ require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('instal
 require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Classes/CoreUpdates/MergeAdvancedUpdate.php';
 require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Classes/CoreUpdates/InstallSysExtsUpdate.php';
 require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Classes/CoreUpdates/ImagecolsUpdate.php';
-require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Classes/CoreUpdates/StaticTemplatesUpdate.php';
 require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Classes/CoreUpdates/T3skinUpdate.php';
 require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Classes/CoreUpdates/CompressionLevelUpdate.php';
 require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Classes/CoreUpdates/MigrateWorkspacesUpdate.php';
diff --git a/typo3/sysext/install/updates/class.tx_coreupdates_statictemplates.php b/typo3/sysext/install/updates/class.tx_coreupdates_statictemplates.php
deleted file mode 100644 (file)
index 3781e47..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-/*
- * @deprecated since 6.0, the classname tx_coreupdates_statictemplates and this file is obsolete
- * and will be removed with 6.2. The class was renamed and is now located at:
- * typo3/sysext/install/Classes/CoreUpdates/StaticTemplatesUpdate.php
- */
-require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('install') . 'Classes/CoreUpdates/StaticTemplatesUpdate.php';
-?>
\ No newline at end of file
diff --git a/typo3/sysext/statictemplates/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php b/typo3/sysext/statictemplates/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php
new file mode 100644 (file)
index 0000000..6584855
--- /dev/null
@@ -0,0 +1,230 @@
+<?php
+namespace TYPO3\CMS\Statictemplates\ContentObject\Menu;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 1999-2013 Kasper Skårhøj (kasperYYYY@typo3.com)
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Contains the GMENU_FOLDOUT menu object
+ * Class for the creation of DHTML foldout menus
+ *
+ * @author Kasper Skårhøj <kasperYYYY@typo3.com>
+ */
+class GraphicalMenuFoldoutContentObject extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject {
+
+       /**
+        * @todo Define visibility
+        */
+       public $GMENU_fixKey = 'foldout';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMarrowNO;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMarrowACT;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMimagesFlag;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMimageHTML;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMsubmenu;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMtableWrap;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WM_activeOnLoad = '';
+
+       /**
+        * Initializing, setting internal variables (prefixed WM)
+        *
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_init() {
+               $this->WMarrowNO = '';
+               $this->WMarrowACT = '';
+               $this->WMimagesFlag = 0;
+               $this->WMimageHTML = '';
+               if (($this->mconf['arrowNO'] || $this->mconf['arrowNO.']) && ($this->mconf['arrowACT'] || $this->mconf['arrowACT.'])) {
+                       $this->WMarrowNO = $GLOBALS['TSFE']->cObj->getImgResource($this->mconf['arrowNO'], $this->mconf['arrowNO.']);
+                       $this->WMarrowACT = $GLOBALS['TSFE']->cObj->getImgResource($this->mconf['arrowACT'], $this->mconf['arrowACT.']);
+                       if (is_array($this->WMarrowACT) && is_array($this->WMarrowNO)) {
+                               $this->WMimagesFlag = 1;
+                       }
+               }
+       }
+
+       /**
+        * Processing before the links are created.
+        * Basically this is setting an onclick handler for clicking the menu item.
+        *
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_beforeLinking($key) {
+               $this->I['addATagParams'] = '';
+               $this->WMsubmenu = $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']);
+               if (trim($this->WMsubmenu)) {
+                       $this->I['addATagParams'] = ' onclick="GF_menu(' . $key . ');' . ($this->mconf['dontLinkIfSubmenu'] ? ' return false;' : '') . '"';
+                       // orig: && $this->WMisSub, changed 210901
+                       if ($this->isActive($this->I['uid'], $this->getMPvar($key)) && $this->mconf['displayActiveOnLoad']) {
+                               $this->WM_activeOnLoad = 'GF_menu(' . $key . ');';
+                       }
+               }
+       }
+
+       /**
+        * Processing after linking, basically setting the <div>-layers for the menu items and possibly wrapping in table, adding bullet images.
+        *
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_afterLinking($key) {
+               $this->WMtableWrap = $this->mconf['dontWrapInTable'] ? '' : '<table cellspacing="0" cellpadding="0" width="100%" border="0"><tr><td>|</td></tr></table>';
+               if ($this->WMimagesFlag) {
+                       $this->WMimageHTML = '<img src="' . $GLOBALS['TSFE']->absRefPrefix . $this->WMarrowNO[3] . '" width="' . $this->WMarrowNO[0] . '" height="' . $this->WMarrowNO[1] . '" border="0" name="imgA' . $key . '"' . ($this->mconf['arrowImgParams'] ? ' ' . $this->mconf['arrowImgParams'] : '') . ' alt="" />';
+               } else {
+                       $this->WMimageHTML = '';
+               }
+               if (strstr($this->I['theItem'], '###ARROW_IMAGE###')) {
+                       $this->I['theItem'] = str_replace('###ARROW_IMAGE###', $this->WMimageHTML, $this->I['theItem']);
+               } else {
+                       $this->I['theItem'] = $this->WMimageHTML . $this->I['theItem'];
+               }
+               $this->WMresult .= '
+<div class="clTop" id="divTop' . ($key + 1) . '">' . $this->tmpl->wrap($this->I['theItem'], $this->WMtableWrap) . '
+<div class="clSub" id="divSub' . ($key + 1) . '">
+               ' . $this->WMsubmenu . '
+</div>
+</div>';
+       }
+
+       /**
+        * Putting things together, in particular the JavaScript code needed for the DHTML menu.
+        *
+        * @return string Empty string! (Since $GLOBALS['TSFE']->divSection is set with the <div>-sections used in the menu)
+        * @todo Define visibility
+        */
+       public function extProc_finish() {
+               $bHeight = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['bottomHeight'] ? $this->mconf['bottomHeight'] : 100, 0, 3000);
+               $bottomContent = $this->mconf['bottomContent'] ? $GLOBALS['TSFE']->cObj->cObjGetSingle($this->mconf['bottomContent'], $this->mconf['bottomContent.'], '/GMENU_FOLDOUT/.bottomContent') : '';
+               $adjustTopHeights = intval($this->mconf['adjustItemsH']);
+               $adjustSubHeights = intval($this->mconf['adjustSubItemsH']);
+               $mWidth = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['menuWidth'] ? $this->mconf['menuWidth'] : 170, 0, 3000);
+               $mHeight = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['menuHeight'] ? $this->mconf['menuHeight'] : 400, 0, 3000);
+               $insertmColor = $this->mconf['menuBackColor'] ? 'BACKGROUND-COLOR: ' . $this->mconf['menuBackColor'] . '; layer-background-color: ' . $this->mconf['menuBackColor'] : '';
+               $insertBottomColor = $this->mconf['bottomBackColor'] ? 'BACKGROUND-COLOR: ' . $this->mconf['bottomBackColor'] . '; layer-background-color: ' . $this->mconf['bottomBackColor'] : '';
+               $menuOffset = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $this->mconf['menuOffset'] . ',');
+               $subOffset = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $this->mconf['subMenuOffset'] . ',');
+               $GLOBALS['TSFE']->additionalHeaderData['gmenu_layer_shared'] = '<script type="text/javascript" src="' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::siteRelPath('statictemplates') . 'media/scripts/jsfunc.layermenu.js"></script>';
+               $GLOBALS['TSFE']->additionalHeaderData['gmenu_foldout'] = '<script type="text/javascript" src="' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::siteRelPath('statictemplates') . 'media/scripts/jsfunc.foldout.js"></script>';
+               $GLOBALS['TSFE']->additionalHeaderData[] .= '
+<style type="text/css">
+       /*<![CDATA[*/
+#divCont {
+       Z-INDEX: 1; LEFT: ' . $menuOffset[0] . 'px; VISIBILITY: hidden; WIDTH: ' . $mWidth . 'px; POSITION: absolute; TOP: ' . $menuOffset[1] . 'px; HEIGHT: ' . $mHeight . 'px
+}
+.clTop {
+       Z-INDEX: 1; WIDTH: ' . $mWidth . 'px; POSITION: absolute; ' . $insertmColor . '
+}
+.clSub {
+       Z-INDEX: 1; LEFT: ' . $subOffset[0] . 'px; WIDTH: ' . $mWidth . 'px; POSITION: absolute; TOP: ' . $subOffset[1] . 'px
+}
+.bottomLayer {
+       Z-INDEX: 1; WIDTH: ' . $mWidth . 'px; CLIP: rect(0px ' . $mWidth . 'px ' . $bHeight . 'px 0px); POSITION: absolute; HEIGHT: ' . $bHeight . 'px; ' . $insertBottomColor . '
+}
+       /*]]>*/
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+<!--
+GFV_foldNumber=' . $this->WMmenuItems . ';          //How many toplinks do you have?
+GFV_foldTimer=' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange(($this->mconf['foldTimer'] ? $this->mconf['foldTimer'] : 40), 1, 3000) . ';          //The timeout in the animation, these are milliseconds.
+GFV_foldSpeed=' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['foldSpeed'], 1, 100) . ';           //How many steps in an animation?
+GFV_stayFolded=' . ($this->mconf['stayFolded'] ? 'true' : 'false') . ';      //Stay open when you click a new toplink?
+GFV_foldImg=' . $this->WMimagesFlag . ';             //Do you want images (if not set to 0 and remove the images from the body)?
+GFV_currentFold=null;
+GFV_foldStep1=null;
+GFV_foldStep2=null;
+GFV_step=0;
+GFV_active=false;       //Don\'t change this one.
+GFV_adjustTopHeights = ' . $adjustTopHeights . ';
+GFV_adjustSubHeights = ' . $adjustSubHeights . ';
+if (bw.opera) {
+       GFV_scrX= innerWidth;
+       GFV_scrY= innerHeight;
+}
+
+//This is the default image.
+//Remember to change the actual images in the page as well, but remember to keep the name of the image.
+var GFV_unImg=new Image();
+GFV_unImg.src="' . $GLOBALS['TSFE']->absRefPrefix . $this->WMarrowNO[3] . '";
+
+var GFV_exImg=new Image();          //Making an image variable...
+GFV_exImg.src="' . $GLOBALS['TSFE']->absRefPrefix . $this->WMarrowACT[3] . '";   //...this is the source of the image that it changes to when the menu expands.
+
+//-->
+/*]]>*/
+</script>
+';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove']['GF_resizeForOpera()'] = 'GF_resizeForOpera();';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onload']['GMENU_FOLDOUT'] = 'if(bw.bw) {GF_initFoldout();' . $this->WM_activeOnLoad . '}';
+               $GLOBALS['TSFE']->divSection .= '
+<div id="divCont"><!-- These are the contents of the foldoutmenu. -->
+               ' . $this->tmpl->wrap($this->WMresult, $this->mconf['wrap']) . '
+<div class="bottomLayer" id="divTop' . ($this->WMmenuItems + 1) . '">
+       <div class="clSub" id="divSub' . ($this->WMmenuItems + 1) . '"><!-- This is a cover layer, it should always be the last one, and does NOT count in your number of toplinks! --><!-- So if this one is divTop7, the GFV_foldNumber variable should be set to 6 --><!-- This layer covers up the last sub, so if the last sub gets too big, increase this layers size in the stylesheet. --><!-- There are tables with width="100%" around the toplinks, to force NS4 to use the real width specified for the toplinks in the stylesheet. -->
+       </div>' . $this->tmpl->wrap($bottomContent, $this->WMtableWrap) . '
+</div>
+</div><!-- Here ends the foldoutmenu. -->
+               ';
+               return '';
+       }
+
+}
+
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/statictemplates/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php b/typo3/sysext/statictemplates/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php
new file mode 100644 (file)
index 0000000..448a415
--- /dev/null
@@ -0,0 +1,509 @@
+<?php
+namespace TYPO3\CMS\Statictemplates\ContentObject\Menu;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 1999-2013 Kasper Skårhøj (kasperYYYY@typo3.com)
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Contains the GMENU_LAYERS menu object
+ * Class for the creation of DHTML menus
+ *
+ * @author Kasper Skårhøj <kasperYYYY@typo3.com>
+ */
+class GraphicalMenuLayersContentObject extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuContentObject {
+
+       // FULL DUPLICATE TO tmenu_layers BEGIN:
+       /**
+        * @todo Define visibility
+        */
+       public $GMENU_fixKey = 'layers';
+
+       /**
+        * @todo Define visibility
+        */
+       public $divLayers = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMx = 0;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMy = 0;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMxyArray = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMextraScript = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMlastKey = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMrestoreScript = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMresetSubMenus = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMactiveHasSubMenu = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMactiveKey = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMtheSubMenu;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMisSub;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMhideCode;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMonlyOnLoad = 0;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMbordersWithin = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMsubIds = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMtempStore = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMlockPosition_addAccumulated = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $VMmouseoverActions = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $VMmouseoutActions = array();
+
+       /**
+        * Creating unique menu id string plus other initialization of internal
+        * variables (all prefixed "WM")
+        *
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_init() {
+               $this->WMid = trim($this->mconf['layer_menu_id']) ? trim($this->mconf['layer_menu_id']) . 'x' : substr(md5('gl' . serialize($this->mconf)), 0, 6);
+               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'][] = $this->WMid;
+               $this->WMtempStore = $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'];
+               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array();
+               // Save:
+               $this->WMonlyOnLoad = $this->mconf['displayActiveOnLoad'] && !$this->mconf['displayActiveOnLoad.']['onlyOnLoad'];
+               $this->WMbordersWithin = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $this->mconf['bordersWithin'] . ',0,0,0,0,0');
+       }
+
+       /**
+        * Processing of mouse-over features depending on whether "freezeMouseover"
+        * property is set.
+        *
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found OR $this->result['RO'][$key] where the configuration for that elements RO version is found! Here it is used with the ->WMid to make unique names
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_RO($key) {
+               if ($this->mconf['freezeMouseover']) {
+                       $this->VMmouseoverActions[$this->WMid . $key] = 'case "Menu' . $this->WMid . $key . '":' . $this->I['linkHREF']['onMouseover'] . '; break;';
+                       $this->VMmouseoutActions[$this->WMid . $key] = 'case "Menu' . $this->WMid . $key . '":' . $this->I['linkHREF']['onMouseout'] . '; break;';
+                       $this->I['linkHREF']['onMouseover'] = 'GL' . $this->WMid . '_over(\'Menu' . $this->WMid . $key . '\');';
+                       $this->I['linkHREF']['onMouseout'] = '';
+               }
+       }
+
+       /**
+        * Processing before the links are created.
+        * This means primarily creating some javaScript code for the management.
+        *
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_beforeLinking($key) {
+               if ($this->I['uid']) {
+                       array_push($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId'], $this->WMid);
+                       $this->WMtheSubMenu = $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']);
+                       array_pop($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']);
+                       $this->WMisSub = trim($this->WMtheSubMenu) ? 1 : 0;
+                       if ($this->mconf['lockPosition_addSelf']) {
+                               $this->WMy += (strcmp($this->mconf['setFixedHeight'], '') ? $this->mconf['setFixedHeight'] : $this->I['val']['output_h']) + intval($this->mconf['lockPosition_adjust']);
+                               $this->WMx += (strcmp($this->mconf['setFixedWidth'], '') ? $this->mconf['setFixedWidth'] : $this->I['val']['output_w']) + intval($this->mconf['lockPosition_adjust']);
+                       }
+                       // orig: && $this->WMisSub, changed 210901
+                       if ($this->isActive($this->I['uid'], $this->getMPvar($key)) && $this->mconf['displayActiveOnLoad']) {
+                               $this->WMactiveHasSubMenu = $this->WMisSub;
+                               $this->WMactiveKey = 'Menu' . $this->WMid . $key;
+                               $this->WMrestoreVars = trim('
+GLV_restoreMenu["' . $this->WMid . '"] = "' . $this->WMactiveKey . '";
+                               ');
+                               $this->WMrestoreScript = '      GL_doTop("' . $this->WMid . '",GLV_restoreMenu["' . $this->WMid . '"]);' . ($this->mconf['freezeMouseover'] ? '
+       GL' . $this->WMid . '_over(GLV_restoreMenu["' . $this->WMid . '"]);
+' : '');
+                       }
+                       if ($this->WMisSub) {
+                               $event = 'GL_stopMove(\'' . $this->WMid . '\');';
+                               $this->I['linkHREF']['onMouseover'] = 'GL_doTop(\'' . $this->WMid . '\', \'Menu' . $this->WMid . $key . '\');' . $this->I['linkHREF']['onMouseover'];
+                               // IESelectFix - Activates IFRAME layer below menu
+                               if ($this->mconf['ieSelectFix']) {
+                                       $this->I['linkHREF']['onMouseover'] = $this->I['linkHREF']['onMouseover'] . 'GL_iframer(\'' . $this->WMid . '\',\'Menu' . $this->WMid . $key . '\',true);';
+                               }
+                               // Added 120802; This means that everytime leaving a menuitem the layer should be shut down (and if the layer is hit in the meantime it is not though).
+                               // This should happen only for items that are auto-hidden when not over and possibly only when a hide-timer is set. Problem is if the hide-timer is not set and we leave the main element, then the layer will be hidden unless we reach the layer before the timeout will happen and the menu hidden.
+                               if (\TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuWhenNotOver'], 0, 600) && $this->mconf['hideMenuTimer']) {
+                                       $event .= 'GL_resetAll("' . $this->WMid . '");';
+                               }
+                               $this->I['linkHREF']['onMouseout'] .= $event;
+                       } else {
+                               $this->I['linkHREF']['onMouseover'] = 'GL_hideAll("' . $this->WMid . '");' . $this->I['linkHREF']['onMouseover'];
+                               // IESelectFix - Hides IFRAME layer below menu
+                               if ($this->mconf['ieSelectFix']) {
+                                       $this->I['linkHREF']['onMouseover'] = $this->I['linkHREF']['onMouseover'] . 'GL_iframer(\'' . $this->WMid . '\',\'\',false);';
+                               }
+                               $event = 'GL_resetAll("' . $this->WMid . '");';
+                               $this->I['linkHREF']['onMouseout'] .= $event;
+                       }
+                       $this->WMxyArray[] = 'GLV_menuXY["' . $this->WMid . '"]["Menu' . $this->WMid . $key . '"] = new Array(' . $this->WMx . ',' . $this->WMy . ',"itemID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '","anchorID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '");';
+               }
+       }
+
+       /**
+        * Processing after linking, basically setting the <div>-layers for the
+        * menu items. Also some more JavaScript code is made.
+        *
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_afterLinking($key) {
+               if ($this->I['uid']) {
+                       if (!$this->I['spacer'] && $this->WMisSub) {
+                               $exStyle = $this->mconf['layerStyle'] ? $this->mconf['layerStyle'] : 'position:absolute;visibility:hidden';
+                               if (trim($exStyle)) {
+                                       $exStyle = ' ' . $exStyle;
+                               }
+                               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['layerCounter']++;
+                               $zIndex = 10000 - $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['layerCounter'];
+                               $divStart = '<div id="Menu' . $this->WMid . $key . '" style="z-index:' . $zIndex . ';' . $exStyle . '">';
+                               $divStop = '</div>';
+                               $this->divLayers[] = $divStart . $this->WMtheSubMenu . $divStop;
+                               $this->WMhideCode .= '
+       GL_getObjCss("Menu' . $this->WMid . $key . '").visibility = "hidden";';
+                               $this->WMlastKey = 'Menu' . $this->WMid . $key;
+                       }
+                       if (!$this->mconf['lockPosition_addSelf']) {
+                               $this->WMy += (strcmp($this->mconf['setFixedHeight'], '') ? $this->mconf['setFixedHeight'] : $this->I['val']['output_h']) + intval($this->mconf['lockPosition_adjust']);
+                               $this->WMx += (strcmp($this->mconf['setFixedWidth'], '') ? $this->mconf['setFixedWidth'] : $this->I['val']['output_w']) + intval($this->mconf['lockPosition_adjust']);
+                       }
+               }
+               $this->WMresult .= $this->I['theItem'];
+       }
+
+       /**
+        * Wrapping the item in a <div> section if 'relativeToTriggerItem' was set
+        *
+        * @param string The current content of the menu item, $this->I['theItem'], passed along.
+        * @param integer Pointer to $this->menuArr[$key] where the current menu element record is found
+        * @return string The modified version of $item, going back into $this->I['theItem']
+        * @todo Define visibility
+        */
+       public function extProc_beforeAllWrap($item, $key) {
+               if ($this->mconf['relativeToTriggerItem']) {
+                       $item = '<div id="anchorID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '" style="position:absolute;visibility:hidden;"></div><div id="itemID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '" style="width:100%; height:100%;">' . $item . '</div>';
+               }
+               return $item;
+       }
+
+       /**
+        * Returns TRUE if different from ''  OR if intval()!=0
+        *
+        * @param string $in Value to evaluate
+        * @return boolean TRUE if $in is different from ''  OR if intval()!=0
+        * @todo Define visibility
+        */
+       public function isSetIntval($in) {
+               return $this->mconf['blankStrEqFalse'] ? strcmp($in, '') : intval($in);
+       }
+
+       /**
+        * Putting things together, in particular the JavaScript code needed
+        * for the DHTML menu.
+        *
+        * @return mixed Returns the value of a call to the parent function, parent::extProc_finish();
+        * @todo Define visibility
+        */
+       public function extProc_finish() {
+               $dirL = $this->mconf['directionLeft'] ? '-GL_getObj(id).width' : '';
+               $dirU = $this->mconf['directionUp'] ? '-GL_getObj(id).height' : '';
+               $parentLayerId = end($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']);
+               $DoTop = array();
+               $GLV_menuOn = array();
+               $relCode = array();
+               $relFlag = 0;
+               if ($this->mconf['relativeToParentLayer'] && $parentLayerId) {
+                       $relCode['X'] .= 'GLV_curLayerX["' . $parentLayerId . '"]+';
+                       $relCode['Y'] .= 'GLV_curLayerY["' . $parentLayerId . '"]+';
+                       if ($this->mconf['relativeToParentLayer.']['addWidth']) {
+                               $relCode['X'] .= 'GLV_curLayerWidth["' . $parentLayerId . '"]+';
+                       }
+                       if ($this->mconf['relativeToParentLayer.']['addHeight']) {
+                               $relCode['Y'] .= 'GLV_curLayerHeight["' . $parentLayerId . '"]+';
+                       }
+               }
+               if ($this->mconf['relativeToTriggerItem']) {
+                       $DoTop[] = '
+               var parentObject = GL_getObj(GLV_menuXY[WMid][id][2]);
+               var TI_width = parentObject.width;
+               var TI_height = parentObject.height;
+               var anchorObj = GL_getObj(GLV_menuXY[WMid][id][3]);
+               var TI_x = anchorObj.x;
+               var TI_y = anchorObj.y;
+                       ';
+                       $relCode['X'] .= 'TI_x+';
+                       $relCode['Y'] .= 'TI_y+';
+                       if ($this->mconf['relativeToTriggerItem.']['addWidth']) {
+                               $relCode['X'] .= 'TI_width+';
+                       }
+                       if ($this->mconf['relativeToTriggerItem.']['addHeight']) {
+                               $relCode['Y'] .= 'TI_height+';
+                       }
+                       $relFlag = 1;
+               }
+               if ($relFlag) {
+                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
+                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top =  (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
+               } else {
+                       // X position (y is fixed)
+                       if (!strcmp($this->mconf['lockPosition'], 'x')) {
+                               $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . 'GLV_menuXY["' . $this->WMid . '"][id][0]-(' . intval($this->mconf['xPosOffset']) . ')' . $dirL . ')+"px";';
+                               if ($this->isSetIntval($this->mconf['topOffset'])) {
+                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
+                               }
+                       } elseif ($this->isSetIntval($this->mconf['xPosOffset'])) {
+                               $GLV_menuOn[] = ($DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (GLV_x-(' . intval($this->mconf['xPosOffset']) . ')' . $dirL . ')+"px";');
+                               if ($this->isSetIntval($this->mconf['topOffset'])) {
+                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
+                               }
+                       }
+                       // Y position   (x is fixed)
+                       if (!strcmp($this->mconf['lockPosition'], 'y')) {
+                               $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . 'GLV_menuXY["' . $this->WMid . '"][id][1]-(' . intval($this->mconf['yPosOffset']) . ')' . $dirU . ')+"px";';
+                               if ($this->isSetIntval($this->mconf['leftOffset'])) {
+                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
+                               }
+                       } elseif ($this->isSetIntval($this->mconf['yPosOffset'])) {
+                               $GLV_menuOn[] = ($DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (GLV_y-(' . intval($this->mconf['yPosOffset']) . ')' . $dirU . ')+"px";');
+                               if ($this->isSetIntval($this->mconf['leftOffset'])) {
+                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
+                               }
+                       }
+               }
+               // BordersWithIn:
+               $DoTop[] = $this->extCalcBorderWithin('left', $this->WMbordersWithin[0]);
+               $DoTop[] = $this->extCalcBorderWithin('top', $this->WMbordersWithin[1]);
+               $DoTop[] = $this->extCalcBorderWithin('right', $this->WMbordersWithin[2]);
+               $DoTop[] = $this->extCalcBorderWithin('bottom', $this->WMbordersWithin[3]);
+               $DoTop[] = $this->extCalcBorderWithin('left', $this->WMbordersWithin[4]);
+               $DoTop[] = $this->extCalcBorderWithin('top', $this->WMbordersWithin[5]);
+               if ($this->mconf['freezeMouseover'] && !$this->mconf['freezeMouseover.']['alwaysKeep']) {
+                       $this->WMhideCode .= '
+GL' . $this->WMid . '_out("");';
+               }
+               $TEST = '';
+               if (count($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'])) {
+                       foreach ($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] as $mIdStr) {
+                               $this->WMhideCode .= '
+GL_hideAll("' . $mIdStr . '");';
+                               $this->WMrestoreScript .= '
+GL_restoreMenu("' . $mIdStr . '");';
+                               $this->WMresetSubMenus .= '
+if (!GLV_doReset["' . $mIdStr . '"] && GLV_currentLayer["' . $mIdStr . '"]!=null)      resetSubMenu=0;';
+                       }
+               }
+               // IESelectFix - Adds IFRAME tag to HTML, Hides IFRAME layer below menu
+               if ($this->mconf['ieSelectFix']) {
+                       $this->WMhideCode .= '
+       GL_iframer(\'' . $this->WMid . '\',\'\',false);';
+                       $this->divLayers['iframe'] = '<iframe id="Iframe' . $this->WMid . '" scrolling="no" frameborder="0" style="position:absolute; top:0px; left:0px; background-color:transparent; layer-background-color:transparent; display:none;"></iframe>';
+               }
+               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array_merge($this->WMtempStore, $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid']);
+               $GLOBALS['TSFE']->additionalHeaderData['gmenu_layer_shared'] = '<script type="text/javascript" src="' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::siteRelPath('statictemplates') . 'media/scripts/jsfunc.layermenu.js"></script>';
+               $GLOBALS['TSFE']->JSCode .= '
+
+GLV_curLayerWidth["' . $this->WMid . '"]=0;
+GLV_curLayerHeight["' . $this->WMid . '"]=0;
+GLV_curLayerX["' . $this->WMid . '"]=0;
+GLV_curLayerY["' . $this->WMid . '"]=0;
+GLV_menuOn["' . $this->WMid . '"] = null;
+GLV_gap["' . $this->WMid . '"]=' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuWhenNotOver'], 0, 600) . ';
+GLV_currentLayer["' . $this->WMid . '"] = null;
+GLV_currentROitem["' . $this->WMid . '"] = null;
+GLV_hasBeenOver["' . $this->WMid . '"]=0;
+GLV_doReset["' . $this->WMid . '"]=false;
+GLV_lastKey["' . $this->WMid . '"] = "' . $this->WMlastKey . '";
+GLV_onlyOnLoad["' . $this->WMid . '"] = ' . ($this->WMonlyOnLoad ? 1 : 0) . ';
+GLV_dontHideOnMouseUp["' . $this->WMid . '"] = ' . ($this->mconf['dontHideOnMouseUp'] ? 1 : 0) . ';
+GLV_dontFollowMouse["' . $this->WMid . '"] = ' . ($this->mconf['dontFollowMouse'] ? 1 : 0) . ';
+GLV_date = new Date();
+GLV_timeout["' . $this->WMid . '"] = GLV_date.getTime();
+GLV_timeoutRef["' . $this->WMid . '"] = ' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuTimer'], 0, 20000) . ';
+GLV_menuXY["' . $this->WMid . '"] = new Array();
+' . implode(LF, $this->WMxyArray) . '
+' . $this->WMrestoreVars;
+               if ($this->mconf['freezeMouseover']) {
+                       $GLOBALS['TSFE']->JSCode .= '
+// Alternative rollover/out functions for use with GMENU_LAYER
+function GL' . $this->WMid . '_over(mitm_id) {
+       GL' . $this->WMid . '_out("");  // removes any old roll over state of an item. Needed for alwaysKeep and Opera browsers.
+       switch(mitm_id) {
+' . implode(LF, $this->VMmouseoverActions) . '
+       }
+       GLV_currentROitem["' . $this->WMid . '"]=mitm_id;
+}
+function GL' . $this->WMid . '_out(mitm_id) {
+       if (!mitm_id)   mitm_id=GLV_currentROitem["' . $this->WMid . '"];
+       switch(mitm_id) {
+' . implode(LF, $this->VMmouseoutActions) . '
+       }
+}
+';
+               }
+               $GLOBALS['TSFE']->JSCode .= '
+function GL' . $this->WMid . '_getMouse(e) {
+       if (GLV_menuOn["' . $this->WMid . '"]!=null && !GLV_dontFollowMouse["' . $this->WMid . '"]){
+' . implode(LF, $GLV_menuOn) . '
+       }
+       GL_mouseMoveEvaluate("' . $this->WMid . '");
+}
+function GL' . $this->WMid . '_hideCode() {
+' . $this->WMhideCode . '
+}
+function GL' . $this->WMid . '_doTop(WMid,id) {
+' . trim(implode(LF, $DoTop)) . '
+}
+function GL' . $this->WMid . '_restoreMenu() {
+' . $this->WMrestoreScript . '
+}
+function GL' . $this->WMid . '_resetSubMenus() {
+       var resetSubMenu=1;
+' . $this->WMresetSubMenus . '
+       return resetSubMenu;
+}
+
+GLV_timeout_pointers[GLV_timeout_count] = "' . $this->WMid . '";
+GLV_timeout_count++;
+
+';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onload']['GL_initLayers()'] = 'GL_initLayers();';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onload'][$this->WMid] = 'GL_restoreMenu("' . $this->WMid . '");';
+               // Should be called BEFORE any of the 'local' getMouse functions!
+               // is put inside in a try catch block to avoid JS errors in IE
+               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove']['GL_getMouse(e)'] = 'try{GL_getMouse(e);}catch(ex){};';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove'][$this->WMid] = 'try{GL' . $this->WMid . '_getMouse(e);}catch(ex){};';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onmouseup'][$this->WMid] = 'GL_mouseUp(\'' . $this->WMid . '\',e);';
+               $GLOBALS['TSFE']->divSection .= implode($this->divLayers, LF) . LF;
+               return parent::extProc_finish();
+       }
+
+       /**
+        * Creates a JavaScript line which corrects the position of the layer
+        * based on the constraints in TypoScript property 'bordersWithin'
+        *
+        * @param string $kind Direction to test.
+        * @param integer $integer The boundary limit in the direction set by $kind. If set then a value is returned, otherwise blank.
+        * @return string JavaScript string for correction of the layer position (if $integer is TRUE)
+        * @see extProc_finish(), extProc_init()
+        * @todo Define visibility
+        */
+       public function extCalcBorderWithin($kind, $integer) {
+               if ($integer) {
+                       switch ($kind) {
+                       case 'right':
+
+                       case 'bottom':
+                               $add = '';
+                               if ($kind == 'right') {
+                                       $add = 'GL_getObj(id).width';
+                                       $key = 'left';
+                               }
+                               if ($kind == 'bottom') {
+                                       $add = 'GL_getObj(id).height';
+                                       $key = 'top';
+                               }
+                               $str = 'if (parseInt(GLV_menuOn["' . $this->WMid . '"].' . $key . ')+' . $add . '>' . $integer . ') GLV_menuOn["' . $this->WMid . '"].' . $key . '=' . $integer . '-' . $add . ';';
+                               break;
+                       default:
+                               $str = 'if (parseInt(GLV_menuOn["' . $this->WMid . '"].' . $kind . ')<' . $integer . ') GLV_menuOn["' . $this->WMid . '"].' . $kind . '=' . $integer . ';';
+                               break;
+                       }
+               }
+               return $str;
+       }
+
+}
+
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/statictemplates/Classes/ContentObject/Menu/TextMenuLayersContentObject.php b/typo3/sysext/statictemplates/Classes/ContentObject/Menu/TextMenuLayersContentObject.php
new file mode 100644 (file)
index 0000000..6fec3a8
--- /dev/null
@@ -0,0 +1,511 @@
+<?php
+namespace TYPO3\CMS\Statictemplates\ContentObject\Menu;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 1999-2013 Kasper Skårhøj (kasperYYYY@typo3.com)
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Contains the TMENU_LAYERS menu object
+ * Class for the creation of text based DHTML menus
+ *
+ * @author Kasper Skårhøj <kasperYYYY@typo3.com>
+ */
+class TextMenuLayersContentObject extends \TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContentObject {
+
+       // FULL DUPLICATE FROM gmenu_layers BEGIN:
+       /**
+        * @todo Define visibility
+        */
+       public $GMENU_fixKey = 'layers';
+
+       /**
+        * @todo Define visibility
+        */
+       public $divLayers = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMx = 0;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMy = 0;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMxyArray = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMextraScript = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMlastKey = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMrestoreScript = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMresetSubMenus = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMactiveHasSubMenu = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMactiveKey = '';
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMtheSubMenu;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMisSub;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMhideCode;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMonlyOnLoad = 0;
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMbordersWithin = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMsubIds = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMtempStore = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $WMlockPosition_addAccumulated = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $VMmouseoverActions = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $VMmouseoutActions = array();
+
+       /**
+        * Creating unique menu id string plus other initialization of internal variables (all prefixed "WM")
+        *
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_init() {
+               $this->WMid = trim($this->mconf['layer_menu_id']) ? trim($this->mconf['layer_menu_id']) . 'x' : substr(md5('gl' . serialize($this->mconf)), 0, 6);
+               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'][] = $this->WMid;
+               $this->WMtempStore = $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'];
+               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array();
+               // Save:
+               $this->WMonlyOnLoad = $this->mconf['displayActiveOnLoad'] && !$this->mconf['displayActiveOnLoad.']['onlyOnLoad'];
+               $this->WMbordersWithin = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $this->mconf['bordersWithin'] . ',0,0,0,0,0');
+       }
+
+       /**
+        * Processing of mouse-over features depending on whether "freezeMouseover" property is set.
+        *
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found OR $this->result['RO'][$key] where the configuration for that elements RO version is found! Here it is used with the ->WMid to make unique names
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_RO($key) {
+               if ($this->mconf['freezeMouseover']) {
+                       $this->VMmouseoverActions[$this->WMid . $key] = 'case "Menu' . $this->WMid . $key . '":' . $this->I['linkHREF']['onMouseover'] . '; break;';
+                       $this->VMmouseoutActions[$this->WMid . $key] = 'case "Menu' . $this->WMid . $key . '":' . $this->I['linkHREF']['onMouseout'] . '; break;';
+                       $this->I['linkHREF']['onMouseover'] = 'GL' . $this->WMid . '_over(\'Menu' . $this->WMid . $key . '\');';
+                       $this->I['linkHREF']['onMouseout'] = '';
+               }
+       }
+
+       /**
+        * Processing before the links are created.
+        * This means primarily creating some javaScript code for the management.
+        *
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_beforeLinking($key) {
+               if ($this->I['uid']) {
+                       array_push($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId'], $this->WMid);
+                       $this->WMtheSubMenu = $this->subMenu($this->I['uid'], $this->WMsubmenuObjSuffixes[$key]['sOSuffix']);
+                       array_pop($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']);
+                       $this->WMisSub = trim($this->WMtheSubMenu) ? 1 : 0;
+                       if ($this->mconf['lockPosition_addSelf']) {
+                               $this->WMy += (strcmp($this->mconf['setFixedHeight'], '') ? $this->mconf['setFixedHeight'] : $this->I['val']['output_h']) + intval($this->mconf['lockPosition_adjust']);
+                               $this->WMx += (strcmp($this->mconf['setFixedWidth'], '') ? $this->mconf['setFixedWidth'] : $this->I['val']['output_w']) + intval($this->mconf['lockPosition_adjust']);
+                       }
+                       // orig: && $this->WMisSub, changed 210901
+                       if ($this->isActive($this->I['uid'], $this->getMPvar($key)) && $this->mconf['displayActiveOnLoad']) {
+                               $this->WMactiveHasSubMenu = $this->WMisSub;
+                               $this->WMactiveKey = 'Menu' . $this->WMid . $key;
+                               $this->WMrestoreVars = trim('
+GLV_restoreMenu["' . $this->WMid . '"] = "' . $this->WMactiveKey . '";
+                               ');
+                               $this->WMrestoreScript = '      GL_doTop("' . $this->WMid . '",GLV_restoreMenu["' . $this->WMid . '"]);' . ($this->mconf['freezeMouseover'] ? '
+       GL' . $this->WMid . '_over(GLV_restoreMenu["' . $this->WMid . '"]);
+' : '');
+                       }
+                       if ($this->WMisSub) {
+                               $event = 'GL_stopMove(\'' . $this->WMid . '\');';
+                               $this->I['linkHREF']['onMouseover'] = 'GL_doTop(\'' . $this->WMid . '\', \'Menu' . $this->WMid . $key . '\');' . $this->I['linkHREF']['onMouseover'];
+                               // IESelectFix - Activates IFRAME layer below menu
+                               if ($this->mconf['ieSelectFix']) {
+                                       $this->I['linkHREF']['onMouseover'] = $this->I['linkHREF']['onMouseover'] . 'GL_iframer(\'' . $this->WMid . '\',\'Menu' . $this->WMid . $key . '\',true);';
+                               }
+                               // Added 120802; This means that everytime leaving a menuitem the layer
+                               // should be shut down (and if the layer is hit in the meantime it is
+                               // not though). This should happen only for items that are auto-hidden
+                               // when not over and possibly only when a hide-timer is set. Problem is
+                               // if the hide-timer is not set and we leave the main element, then the
+                               // layer will be hidden unless we reach the layer before the timeout will
+                               // happen and the menu hidden.
+                               if (\TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuWhenNotOver'], 0, 600) && $this->mconf['hideMenuTimer']) {
+                                       $event .= 'GL_resetAll("' . $this->WMid . '");';
+                               }
+                               $this->I['linkHREF']['onMouseout'] .= $event;
+                       } else {
+                               $this->I['linkHREF']['onMouseover'] = 'GL_hideAll("' . $this->WMid . '");' . $this->I['linkHREF']['onMouseover'];
+                               // IESelectFix - Hides IFRAME layer below menu
+                               if ($this->mconf['ieSelectFix']) {
+                                       $this->I['linkHREF']['onMouseover'] = $this->I['linkHREF']['onMouseover'] . 'GL_iframer(\'' . $this->WMid . '\',\'\',false);';
+                               }
+                               $event = 'GL_resetAll("' . $this->WMid . '");';
+                               $this->I['linkHREF']['onMouseout'] .= $event;
+                       }
+                       $this->WMxyArray[] = 'GLV_menuXY["' . $this->WMid . '"]["Menu' . $this->WMid . $key . '"] = new Array(' . $this->WMx . ',' . $this->WMy . ',"itemID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '","anchorID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '");';
+               }
+       }
+
+       /**
+        * Processing after linking, basically setting the <div>-layers for the menu
+        * items. Also some more JavaScript code is made.
+        *
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
+        * @return void
+        * @todo Define visibility
+        */
+       public function extProc_afterLinking($key) {
+               if ($this->I['uid']) {
+                       if (!$this->I['spacer'] && $this->WMisSub) {
+                               $exStyle = $this->mconf['layerStyle'] ? $this->mconf['layerStyle'] : 'position:absolute;visibility:hidden';
+                               if (trim($exStyle)) {
+                                       $exStyle = ' ' . $exStyle;
+                               }
+                               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['layerCounter']++;
+                               $zIndex = 10000 - $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['layerCounter'];
+                               $divStart = '<div id="Menu' . $this->WMid . $key . '" style="z-index:' . $zIndex . ';' . $exStyle . '">';
+                               $divStop = '</div>';
+                               $this->divLayers[] = $divStart . $this->WMtheSubMenu . $divStop;
+                               $this->WMhideCode .= '
+       GL_getObjCss("Menu' . $this->WMid . $key . '").visibility = "hidden";';
+                               $this->WMlastKey = 'Menu' . $this->WMid . $key;
+                       }
+                       if (!$this->mconf['lockPosition_addSelf']) {
+                               $this->WMy += (strcmp($this->mconf['setFixedHeight'], '') ? $this->mconf['setFixedHeight'] : $this->I['val']['output_h']) + intval($this->mconf['lockPosition_adjust']);
+                               $this->WMx += (strcmp($this->mconf['setFixedWidth'], '') ? $this->mconf['setFixedWidth'] : $this->I['val']['output_w']) + intval($this->mconf['lockPosition_adjust']);
+                       }
+               }
+               $this->WMresult .= $this->I['theItem'];
+       }
+
+       /**
+        * Wrapping the item in a <div> section if 'relativeToTriggerItem' was set
+        *
+        * @param string $item The current content of the menu item, $this->I['theItem'], passed along.
+        * @param integer $key Pointer to $this->menuArr[$key] where the current menu element record is found
+        * @return string The modified version of $item, going back into $this->I['theItem']
+        * @todo Define visibility
+        */
+       public function extProc_beforeAllWrap($item, $key) {
+               if ($this->mconf['relativeToTriggerItem']) {
+                       $item = '<div id="anchorID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '" style="position:absolute;visibility:hidden;"></div><div id="itemID' . \TYPO3\CMS\Core\Utility\GeneralUtility::shortmd5(($this->I['uid'] . '-' . $this->WMid)) . '" style="width:100%; height:100%;">' . $item . '</div>';
+               }
+               return $item;
+       }
+
+       /**
+        * Returns TRUE if different from ''  OR if intval()!=0
+        *
+        * @param string $in Value to evaluate
+        * @return boolean TRUE if $in is different from ''  OR if intval()!=0
+        * @todo Define visibility
+        */
+       public function isSetIntval($in) {
+               return $this->mconf['blankStrEqFalse'] ? strcmp($in, '') : intval($in);
+       }
+
+       /**
+        * Putting things together, in particular the JavaScript code needed for the DHTML menu.
+        *
+        * @return mixed Returns the value of a call to the parent function, parent::extProc_finish();
+        * @todo Define visibility
+        */
+       public function extProc_finish() {
+               $dirL = $this->mconf['directionLeft'] ? '-GL_getObj(id).width' : '';
+               $dirU = $this->mconf['directionUp'] ? '-GL_getObj(id).height' : '';
+               $parentLayerId = end($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']);
+               $DoTop = array();
+               $GLV_menuOn = array();
+               $relCode = array();
+               $relFlag = 0;
+               if ($this->mconf['relativeToParentLayer'] && $parentLayerId) {
+                       $relCode['X'] .= 'GLV_curLayerX["' . $parentLayerId . '"]+';
+                       $relCode['Y'] .= 'GLV_curLayerY["' . $parentLayerId . '"]+';
+                       if ($this->mconf['relativeToParentLayer.']['addWidth']) {
+                               $relCode['X'] .= 'GLV_curLayerWidth["' . $parentLayerId . '"]+';
+                       }
+                       if ($this->mconf['relativeToParentLayer.']['addHeight']) {
+                               $relCode['Y'] .= 'GLV_curLayerHeight["' . $parentLayerId . '"]+';
+                       }
+               }
+               if ($this->mconf['relativeToTriggerItem']) {
+                       $DoTop[] = '
+               var parentObject = GL_getObj(GLV_menuXY[WMid][id][2]);
+               var TI_width = parentObject.width;
+               var TI_height = parentObject.height;
+               var anchorObj = GL_getObj(GLV_menuXY[WMid][id][3]);
+               var TI_x = anchorObj.x;
+               var TI_y = anchorObj.y;
+                       ';
+                       $relCode['X'] .= 'TI_x+';
+                       $relCode['Y'] .= 'TI_y+';
+                       if ($this->mconf['relativeToTriggerItem.']['addWidth']) {
+                               $relCode['X'] .= 'TI_width+';
+                       }
+                       if ($this->mconf['relativeToTriggerItem.']['addHeight']) {
+                               $relCode['Y'] .= 'TI_height+';
+                       }
+                       $relFlag = 1;
+               }
+               if ($relFlag) {
+                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
+                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top =  (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
+               } else {
+                       // X position (y is fixed)
+                       if (!strcmp($this->mconf['lockPosition'], 'x')) {
+                               $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . 'GLV_menuXY["' . $this->WMid . '"][id][0]-(' . intval($this->mconf['xPosOffset']) . ')' . $dirL . ')+"px";';
+                               if ($this->isSetIntval($this->mconf['topOffset'])) {
+                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
+                               }
+                       } elseif ($this->isSetIntval($this->mconf['xPosOffset'])) {
+                               $GLV_menuOn[] = ($DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (GLV_x-(' . intval($this->mconf['xPosOffset']) . ')' . $dirL . ')+"px";');
+                               if ($this->isSetIntval($this->mconf['topOffset'])) {
+                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . intval($this->mconf['topOffset']) . $dirU . ')+"px";';
+                               }
+                       }
+                       // Y position   (x is fixed)
+                       if (!strcmp($this->mconf['lockPosition'], 'y')) {
+                               $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (' . $relCode['Y'] . 'GLV_menuXY["' . $this->WMid . '"][id][1]-(' . intval($this->mconf['yPosOffset']) . ')' . $dirU . ')+"px";';
+                               if ($this->isSetIntval($this->mconf['leftOffset'])) {
+                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
+                               }
+                       } elseif ($this->isSetIntval($this->mconf['yPosOffset'])) {
+                               $GLV_menuOn[] = ($DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].top = (GLV_y-(' . intval($this->mconf['yPosOffset']) . ')' . $dirU . ')+"px";');
+                               if ($this->isSetIntval($this->mconf['leftOffset'])) {
+                                       $DoTop[] = 'GLV_menuOn["' . $this->WMid . '"].left = (' . $relCode['X'] . intval($this->mconf['leftOffset']) . $dirL . ')+"px";';
+                               }
+                       }
+               }
+               // BordersWithIn:
+               $DoTop[] = $this->extCalcBorderWithin('left', $this->WMbordersWithin[0]);
+               $DoTop[] = $this->extCalcBorderWithin('top', $this->WMbordersWithin[1]);
+               $DoTop[] = $this->extCalcBorderWithin('right', $this->WMbordersWithin[2]);
+               $DoTop[] = $this->extCalcBorderWithin('bottom', $this->WMbordersWithin[3]);
+               $DoTop[] = $this->extCalcBorderWithin('left', $this->WMbordersWithin[4]);
+               $DoTop[] = $this->extCalcBorderWithin('top', $this->WMbordersWithin[5]);
+               if ($this->mconf['freezeMouseover'] && !$this->mconf['freezeMouseover.']['alwaysKeep']) {
+                       $this->WMhideCode .= '
+GL' . $this->WMid . '_out("");';
+               }
+               $TEST = '';
+               if (count($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'])) {
+                       foreach ($GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] as $mIdStr) {
+                               $this->WMhideCode .= '
+GL_hideAll("' . $mIdStr . '");';
+                               $this->WMrestoreScript .= '
+GL_restoreMenu("' . $mIdStr . '");';
+                               $this->WMresetSubMenus .= '
+if (!GLV_doReset["' . $mIdStr . '"] && GLV_currentLayer["' . $mIdStr . '"]!=null)      resetSubMenu=0;';
+                       }
+               }
+               // IESelectFix - Adds IFRAME tag to HTML, Hides IFRAME layer below menu
+               if ($this->mconf['ieSelectFix']) {
+                       $this->WMhideCode .= '
+       GL_iframer(\'' . $this->WMid . '\',\'\',false);';
+                       $this->divLayers['iframe'] = '<iframe id="Iframe' . $this->WMid . '" scrolling="no" frameborder="0" style="position:absolute; top:0px; left:0px; background-color:transparent; layer-background-color:transparent; display:none;"></iframe>';
+               }
+               $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array_merge($this->WMtempStore, $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid']);
+               $GLOBALS['TSFE']->additionalHeaderData['gmenu_layer_shared'] = '<script type="text/javascript" src="' . \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::siteRelPath('statictemplates') . 'media/scripts/jsfunc.layermenu.js"></script>';
+               $GLOBALS['TSFE']->JSCode .= '
+
+GLV_curLayerWidth["' . $this->WMid . '"]=0;
+GLV_curLayerHeight["' . $this->WMid . '"]=0;
+GLV_curLayerX["' . $this->WMid . '"]=0;
+GLV_curLayerY["' . $this->WMid . '"]=0;
+GLV_menuOn["' . $this->WMid . '"] = null;
+GLV_gap["' . $this->WMid . '"]=' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuWhenNotOver'], 0, 600) . ';
+GLV_currentLayer["' . $this->WMid . '"] = null;
+GLV_currentROitem["' . $this->WMid . '"] = null;
+GLV_hasBeenOver["' . $this->WMid . '"]=0;
+GLV_doReset["' . $this->WMid . '"]=false;
+GLV_lastKey["' . $this->WMid . '"] = "' . $this->WMlastKey . '";
+GLV_onlyOnLoad["' . $this->WMid . '"] = ' . ($this->WMonlyOnLoad ? 1 : 0) . ';
+GLV_dontHideOnMouseUp["' . $this->WMid . '"] = ' . ($this->mconf['dontHideOnMouseUp'] ? 1 : 0) . ';
+GLV_dontFollowMouse["' . $this->WMid . '"] = ' . ($this->mconf['dontFollowMouse'] ? 1 : 0) . ';
+GLV_date = new Date();
+GLV_timeout["' . $this->WMid . '"] = GLV_date.getTime();
+GLV_timeoutRef["' . $this->WMid . '"] = ' . \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->mconf['hideMenuTimer'], 0, 20000) . ';
+GLV_menuXY["' . $this->WMid . '"] = new Array();
+' . implode(LF, $this->WMxyArray) . '
+' . $this->WMrestoreVars;
+               if ($this->mconf['freezeMouseover']) {
+                       $GLOBALS['TSFE']->JSCode .= '
+// Alternative rollover/out functions for use with GMENU_LAYER
+function GL' . $this->WMid . '_over(mitm_id) {
+       GL' . $this->WMid . '_out("");  // removes any old roll over state of an item. Needed for alwaysKeep and Opera browsers.
+       switch(mitm_id) {
+' . implode(LF, $this->VMmouseoverActions) . '
+       }
+       GLV_currentROitem["' . $this->WMid . '"]=mitm_id;
+}
+function GL' . $this->WMid . '_out(mitm_id) {
+       if (!mitm_id)   mitm_id=GLV_currentROitem["' . $this->WMid . '"];
+       switch(mitm_id) {
+' . implode(LF, $this->VMmouseoutActions) . '
+       }
+}
+';
+               }
+               $GLOBALS['TSFE']->JSCode .= '
+function GL' . $this->WMid . '_getMouse(e) {
+       if (GLV_menuOn["' . $this->WMid . '"]!=null && !GLV_dontFollowMouse["' . $this->WMid . '"]){
+' . implode(LF, $GLV_menuOn) . '
+       }
+       GL_mouseMoveEvaluate("' . $this->WMid . '");
+}
+function GL' . $this->WMid . '_hideCode() {
+' . $this->WMhideCode . '
+}
+function GL' . $this->WMid . '_doTop(WMid,id) {
+' . trim(implode(LF, $DoTop)) . '
+}
+function GL' . $this->WMid . '_restoreMenu() {
+' . $this->WMrestoreScript . '
+}
+function GL' . $this->WMid . '_resetSubMenus() {
+       var resetSubMenu=1;
+' . $this->WMresetSubMenus . '
+       return resetSubMenu;
+}
+
+GLV_timeout_pointers[GLV_timeout_count] = "' . $this->WMid . '";
+GLV_timeout_count++;
+
+';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onload']['GL_initLayers()'] = 'GL_initLayers();';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onload'][$this->WMid] = 'GL_restoreMenu("' . $this->WMid . '");';
+               // Should be called BEFORE any of the 'local' getMouse functions!
+               // is put inside in a try catch block to avoid JS errors in IE
+               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove']['GL_getMouse(e)'] = 'try{GL_getMouse(e);}catch(ex){};';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onmousemove'][$this->WMid] = 'try{GL' . $this->WMid . '_getMouse(e);}catch(ex){};';
+               $GLOBALS['TSFE']->JSeventFuncCalls['onmouseup'][$this->WMid] = 'GL_mouseUp(\'' . $this->WMid . '\',e);';
+               $GLOBALS['TSFE']->divSection .= implode($this->divLayers, LF) . LF;
+               return parent::extProc_finish();
+       }
+
+       /**
+        * Creates a JavaScript line which corrects the position of the layer based on
+        * the constraints in TypoScript property 'bordersWithin'
+        *
+        * @param string $kind Direction to test.
+        * @param integer $integer The boundary limit in the direction set by $kind. If set then a value is returned, otherwise blank.
+        * @return string JavaScript string for correction of the layer position (if $integer is TRUE)
+        * @see extProc_finish(), extProc_init()
+        * @todo Define visibility
+        */
+       public function extCalcBorderWithin($kind, $integer) {
+               if ($integer) {
+                       switch ($kind) {
+                       case 'right':
+
+                       case 'bottom':
+                               $add = '';
+                               if ($kind == 'right') {
+                                       $add = 'GL_getObj(id).width';
+                                       $key = 'left';
+                               }
+                               if ($kind == 'bottom') {
+                                       $add = 'GL_getObj(id).height';
+                                       $key = 'top';
+                               }
+                               $str = 'if (parseInt(GLV_menuOn["' . $this->WMid . '"].' . $key . ')+' . $add . '>' . $integer . ') GLV_menuOn["' . $this->WMid . '"].' . $key . '=' . $integer . '-' . $add . ';';
+                               break;
+                       default:
+                               $str = 'if (parseInt(GLV_menuOn["' . $this->WMid . '"].' . $kind . ')<' . $integer . ') GLV_menuOn["' . $this->WMid . '"].' . $kind . '=' . $integer . ';';
+                               break;
+                       }
+               }
+               return $str;
+       }
+
+}
+
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/statictemplates/Classes/TypoScriptTemplateModuleControllerHook.php b/typo3/sysext/statictemplates/Classes/TypoScriptTemplateModuleControllerHook.php
new file mode 100644 (file)
index 0000000..52b5867
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+namespace TYPO3\CMS\Statictemplates;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2013 Christian Kuhn <lolli@schwarzbu.ch>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * Statictemplates for typo script tstemplate menu
+ *
+ * Shows 'static template selector' and adds handling
+ *
+ * @author Christian Kuhn <lolli@schwarzbu.ch>
+ */
+class TypoScriptTemplateModuleControllerHook {
+
+       /**
+        * Render a drop down of available static templates
+        *
+        * @param array $params Params array
+        * @param object $pObj Parent object
+        * @return void
+        */
+       public function render(array $params, $pObj) {
+               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('title,uid', 'static_template', '', '', 'title');
+               $opt = '';
+               while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
+                       if (substr(trim($row['title']), 0, 8) == 'template') {
+                               $opt .= '<option value="' . $row['uid'] . '">' . htmlspecialchars($row['title']) . '</option>';
+                       }
+               }
+               $GLOBALS['TYPO3_DB']->sql_free_result($res);
+               $params['selectorHtml'] = '<select name="createStandard"><option></option>' . $opt . '</select><br />';
+               $params['staticsText'] = ', optionally based on one of the standard templates';
+       }
+
+       /**
+        * Manipulate row data when creating new template
+        *
+        * @param array $params Params array
+        * @param object $pObj Parent object
+        * @return void
+        */
+       public function handle(array $params, $pObj) {
+               if (intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GP('createStandard'))) {
+                       $staticT = intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GP('createStandard'));
+                       $params['recData']['sys_template']['NEW'] = array(
+                               'pid' => $params['id'],
+                               'title' => $GLOBALS['LANG']->getLL('titleNewSiteStandard'),
+                               'sorting' => 0,
+                               'root' => 1,
+                               'clear' => 3,
+                               'include_static' => $staticT . ',57'
+                       );
+               }
+       }
+}
+
+?>
\ No newline at end of file
index 50c247f..296c031 100644 (file)
@@ -2,5 +2,24 @@
 if (!defined('TYPO3_MODE')) {
        die('Access denied.');
 }
-$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tstemplate.php']['includeStaticTypoScriptSources'][] = 'EXT:statictemplates/Classes/StaticTemplatesHook.php:TYPO3\\CMS\\Statictemplates\\StaticTemplatesHook->includeStaticTypoScriptSources';
+$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tstemplate.php']['includeStaticTypoScriptSources'][] =
+       'TYPO3\\CMS\\Statictemplates\\StaticTemplatesHook->includeStaticTypoScriptSources';
+
+// Register GMENU_LAYERS, GMENU_FOLDOUT and TMENU_LAYERS menu objects
+/** @var $menuContentObjectFactory \TYPO3\CMS\Frontend\ContentObject\Menu\MenuContentObjectFactory */
+$menuContentObjectFactory = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
+       'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\MenuContentObjectFactory'
+);
+$menuContentObjectFactory->registerMenuType(
+       'GMENU_LAYERS',
+       'TYPO3\\CMS\\Statictemplates\\ContentObject\\Menu\\GraphicalMenuLayersContentObject'
+);
+$menuContentObjectFactory->registerMenuType(
+       'GMENU_FOLDOUT',
+       'TYPO3\\CMS\\Statictemplates\\ContentObject\\Menu\\GraphicalMenuFoldoutContentObject'
+);
+$menuContentObjectFactory->registerMenuType(
+       'TMENU_LAYERS',
+       'TYPO3\\CMS\\Statictemplates\\ContentObject\\Menu\\TextMenuLayersContentObject'
+);
 ?>
\ No newline at end of file
index c65054d..fd78b32 100644 (file)
@@ -35,4 +35,12 @@ $tempField = array(
 );
 \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('sys_template', $tempField, 1);
 \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('sys_template', 'include_static;;2;;5-5-5', '', 'before:includeStaticAfterBasedOn');
+
+if (TYPO3_MODE === 'BE') {
+       $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\\CMS\\Tstemplate\\Controller\\TypoScriptTemplateModuleController']['newStandardTemplateView'] =
+               'TYPO3\\CMS\\Statictemplates\\TypoScriptTemplateModuleControllerHook->render';
+       $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\\CMS\\Tstemplate\\Controller\\TypoScriptTemplateModuleController']['newStandardTemplateHandler'] =
+               'TYPO3\\CMS\\Statictemplates\\TypoScriptTemplateModuleControllerHook->handle';
+}
+
 ?>
\ No newline at end of file
index f9a3280..513fa2f 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * @deprecated since 6.0, the classname tslib_gmenu_foldout and this file is obsolete
  * and will be removed with 6.2. The class was renamed and is now located at:
- * typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php
+ * typo3/sysext/statictemplates/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php
  */
-require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php';
+require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('statictemplates') . 'Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php';
 ?>
\ No newline at end of file
index 06931ae..7cab129 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * @deprecated since 6.0, the classname tslib_gmenu_layers and this file is obsolete
  * and will be removed with 6.2. The class was renamed and is now located at:
- * typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php
+ * typo3/sysext/statictemplates/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php
  */
-require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php';
+require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('statictemplates') . 'Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php';
 ?>
\ No newline at end of file
index 8741eba..fc5f53e 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * @deprecated since 6.0, the classname tslib_tmenu_layers and this file is obsolete
  * and will be removed with 6.2. The class was renamed and is now located at:
- * typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayersContentObject.php
+ * typo3/sysext/statictemplates/Classes/ContentObject/Menu/TextMenuLayersContentObject.php
  */
-require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/TextMenuLayersContentObject.php';
+require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('statictemplates') . 'Classes/ContentObject/Menu/TextMenuLayersContentObject.php';
 ?>
\ No newline at end of file
index a6ac1fa..de1902c 100644 (file)
@@ -338,18 +338,23 @@ class TypoScriptTemplateModuleController extends \TYPO3\CMS\Backend\Module\BaseS
                $theOutput .= $flashMessage->render();
                // New standard?
                if ($newStandardTemplate) {
-                       // check wether statictemplates are supported
-                       if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('statictemplates')) {
-                               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('title,uid', 'static_template', '', '', 'title');
-                               $opt = '';
-                               while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
-                                       if (substr(trim($row['title']), 0, 8) == 'template') {
-                                               $opt .= '<option value="' . $row['uid'] . '">' . htmlspecialchars($row['title']) . '</option>';
-                                       }
-                               }
-                               $GLOBALS['TYPO3_DB']->sql_free_result($res);
-                               $selector = '<select name="createStandard"><option></option>' . $opt . '</select><br />';
-                               $staticsText = ', optionally based on one of the standard templates';
+                       // Hook to change output, implemented for statictemplates
+                       if (isset(
+                               $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\\CMS\\Tstemplate\\Controller\\TypoScriptTemplateModuleController']['newStandardTemplateView']
+                       )) {
+                               $selector = '';
+                               $staticsText = '';
+                               $reference = array(
+                                       'selectorHtml' => &$selector,
+                                       'staticsText' => &$staticsText
+                               );
+                               \TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction(
+                                       $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\\CMS\\Tstemplate\\Controller\\TypoScriptTemplateModuleController']['newStandardTemplateView'],
+                                       $reference,
+                                       $this
+                               );
+                               $selector = $reference['selectorHtml'];
+                               $staticsText = $reference['staticsText'];
                        } else {
                                $selector = '<input type="hidden" name="createStandard" value="" />';
                                $staticsText = '';
@@ -422,16 +427,20 @@ class TypoScriptTemplateModuleController extends \TYPO3\CMS\Backend\Module\BaseS
                        /** @var $tce \TYPO3\CMS\Core\DataHandling\DataHandler */
                        $tce->stripslashes_values = 0;
                        $recData = array();
-                       if (intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GP('createStandard'))) {
-                               $staticT = intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GP('createStandard'));
-                               $recData['sys_template']['NEW'] = array(
-                                       'pid' => $id,
-                                       'title' => $GLOBALS['LANG']->getLL('titleNewSiteStandard'),
-                                       'sorting' => 0,
-                                       'root' => 1,
-                                       'clear' => 3,
-                                       'include_static' => $staticT . ',57'
+                       // Hook to handle row data, implemented for statictemplates
+                       if (isset(
+                               $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\\CMS\\Tstemplate\\Controller\\TypoScriptTemplateModuleController']['newStandardTemplateHandler']
+                       )) {
+                               $reference = array(
+                                       'recData' => &$recData,
+                                       'id' => $id,
+                               );
+                               \TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction(
+                                       $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['TYPO3\\CMS\\Tstemplate\\Controller\\TypoScriptTemplateModuleController']['newStandardTemplateHandler'],
+                                       $reference,
+                                       $this
                                );
+                               $recData = $reference['recData'];
                        } else {
                                $recData['sys_template']['NEW'] = array(
                                        'pid' => $id,