[BUGFIX] HMENU rendering uses old tslib_ class names 73/18973/2
authorChristian Kuhn <lolli@schwarzbu.ch>
Thu, 14 Mar 2013 16:39:14 +0000 (17:39 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sat, 16 Mar 2013 14:25:01 +0000 (15:25 +0100)
The menu rendering in frontend still instantiates menu classes with
its old tslib_ prefixed names. This is unflexible and a potential
performance issue.

The patch introduces a simple factory instead with a mapping for
existing TypoScript menu types to the implementing classes.
The current variable $menuclasses is obsolete.
Additionally, the naming of three existing classes is adapted to
the correct class names to be in sync with the others.

A method in the factory to register additional menu types will
be added with a second patch.

Change-Id: I3d65258ffe4d30a918705b23349d3facb563c80e
Resolves: #46292
Releases: 6.1, 6.0
Reviewed-on: https://review.typo3.org/18973
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
17 files changed:
typo3/sysext/core/Classes/TypoScript/TemplateService.php
typo3/sysext/core/Migrations/Code/LegacyClassesForIde.php
typo3/sysext/frontend/Classes/ContentObject/HierarchicalMenuContentObject.php
typo3/sysext/frontend/Classes/ContentObject/Menu/AbstractMenuContentObject.php
typo3/sysext/frontend/Classes/ContentObject/Menu/Exception/NoSuchMenuTypeException.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldout.php [deleted file]
typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayers.php [deleted file]
typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/ContentObject/Menu/MenuContentObjectFactory.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayers.php [deleted file]
typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayersContentObject.php [new file with mode: 0644]
typo3/sysext/frontend/Classes/Exception.php [new file with mode: 0644]
typo3/sysext/frontend/Migrations/Code/ClassAliasMap.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

index f5c9fed..4c6a475 100644 (file)
@@ -105,11 +105,6 @@ class TemplateService {
         */
        public $tempPath = 'typo3temp/';
 
-       /**
-        * @todo Define visibility
-        */
-       public $menuclasses = 'gmenu,tmenu,imgmenu,jsmenu';
-
        // Set Internally:
        // This MUST be initialized by the init() function
        /**
@@ -319,9 +314,6 @@ class TemplateService {
                        $this->simulationHiddenOrTime = 1;
                }
                $this->whereClause .= 'AND (starttime<=' . $GLOBALS['SIM_ACCESS_TIME'] . ') AND (endtime=0 OR endtime>' . $GLOBALS['SIM_ACCESS_TIME'] . ')';
-               if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib']) {
-                       $this->menuclasses = 'tmenu,jsmenu,gmenu';
-               }
                // Sets the paths from where TypoScript resources are allowed to be used:
                $this->allowedPaths = array(
                        'media/',
index 446e0d6..2b0a45c 100644 (file)
@@ -5064,12 +5064,12 @@ class tslib_gmenu extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuCo
 /**
  * @deprecated since 6.0 will be removed in 7.0
  */
-class tslib_gmenu_foldout extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuFoldout {}
+class tslib_gmenu_foldout extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuFoldoutContentObject {}
 
 /**
  * @deprecated since 6.0 will be removed in 7.0
  */
-class tslib_gmenu_layers extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuLayers {}
+class tslib_gmenu_layers extends \TYPO3\CMS\Frontend\ContentObject\Menu\GraphicalMenuLayersContentObject {}
 
 /**
  * @deprecated since 6.0 will be removed in 7.0
@@ -5089,7 +5089,7 @@ class tslib_tmenu extends \TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuContent
 /**
  * @deprecated since 6.0 will be removed in 7.0
  */
-class tslib_tmenu_layers extends \TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuLayers {}
+class tslib_tmenu_layers extends \TYPO3\CMS\Frontend\ContentObject\Menu\TextMenuLayersContentObject {}
 
 /**
  * @deprecated since 6.0 will be removed in 7.0
index 91e8547..11dd55f 100644 (file)
@@ -44,8 +44,10 @@ class HierarchicalMenuContentObject extends \TYPO3\CMS\Frontend\ContentObject\Ab
        public function render($conf = array()) {
                $theValue = '';
                if ($this->cObj->checkIf($conf['if.'])) {
-                       $cls = strtolower($conf[1]);
-                       if (\TYPO3\CMS\Core\Utility\GeneralUtility::inList($GLOBALS['TSFE']->tmpl->menuclasses, $cls)) {
+                       $menuType = $conf[1];
+                       try {
+                               $menuObjectFactory = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\MenuContentObjectFactory');
+                               $menu = $menuObjectFactory->getMenuObjectByType($menuType);
                                if (isset($conf['excludeUidList.'])) {
                                        $conf['excludeUidList'] = $this->cObj->stdWrap($conf['excludeUidList'], $conf['excludeUidList.']);
                                }
@@ -57,11 +59,11 @@ class HierarchicalMenuContentObject extends \TYPO3\CMS\Frontend\ContentObject\Ab
                                $GLOBALS['TSFE']->register['count_MENUOBJ'] = 0;
                                $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid'] = array();
                                $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId'] = array();
-                               $menu = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('tslib_' . $cls);
                                $menu->parent_cObj = $this->cObj;
                                $menu->start($GLOBALS['TSFE']->tmpl, $GLOBALS['TSFE']->sys_page, '', $conf, 1);
                                $menu->makeMenu();
                                $theValue .= $menu->writeMenu();
+                       } catch (\TYPO3\CMS\Frontend\ContentObject\Menu\Exception\NoSuchMenuTypeException $e) {
                        }
                        $wrap = isset($conf['wrap.']) ? $this->cObj->stdWrap($conf['wrap'], $conf['wrap.']) : $conf['wrap'];
                        if ($wrap) {
index 025dc37..fdd48cf 100644 (file)
@@ -26,33 +26,15 @@ namespace TYPO3\CMS\Frontend\ContentObject\Menu;
  *
  *  This copyright notice MUST APPEAR in all copies of the script!
  ***************************************************************/
+
 /**
  * Generating navigation / menus from TypoScript
  *
- * This file contains five classes, four of which are extensions to the main class, tslib_menu.
- * The main class, tslib_menu, is also extended by other external PHP scripts such as the GMENU_LAYERS and GMENU_FOLDOUT scripts which creates pop-up menus.
- * Notice that extension classes (like "tslib_tmenu") must have their suffix (here "tmenu") listed in $this->tmpl->menuclasses - otherwise they cannot be instantiated.
- *
- * Revised for TYPO3 3.6 June/2003 by Kasper Skårhøj
- * XHTML compliant
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-/**
  * Base class. The HMENU content object uses this (or more precisely one of the extension classes).
  * Amoung others the class generates an array of menuitems. Thereafter functions from the subclasses are called.
  * The class is ALWAYS used through extension classes (like tslib_gmenu or tslib_tmenu which are classics) and
  *
- * Example of usage (from tslib_cObj):
- *
- * $menu = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('tslib_'.$cls);
- * $menu->parent_cObj = $this;
- * $menu->start($GLOBALS['TSFE']->tmpl, $GLOBALS['TSFE']->sys_page, '', $conf,1);
- * $menu->makeMenu();
- * $content.=$menu->writeMenu();
- *
  * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- * @see tslib_cObj::HMENU()
  */
 class AbstractMenuContentObject {
 
@@ -1390,38 +1372,41 @@ class AbstractMenuContentObject {
                        $altArray = $this->menuArr[$this->I['key']]['_SUB_MENU'];
                }
                // Make submenu if the page is the next active
-               $cls = strtolower($this->conf[($this->menuNumber + 1) . $objSuffix]);
-               $subLevelClass = $cls && \TYPO3\CMS\Core\Utility\GeneralUtility::inList($this->tmpl->menuclasses, $cls) ? $cls : '';
+               $menuType = $this->conf[($this->menuNumber + 1) . $objSuffix];
                // stdWrap for expAll
                if (isset($this->mconf['expAll.'])) {
                        $this->mconf['expAll'] = $this->parent_cObj->stdWrap($this->mconf['expAll'], $this->mconf['expAll.']);
                }
-               if ($subLevelClass && ($this->mconf['expAll'] || $this->isNext($uid, $this->getMPvar($this->I['key'])) || is_array($altArray)) && !$this->mconf['sectionIndex']) {
-                       $submenu = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('tslib_' . $subLevelClass);
-                       $submenu->entryLevel = $this->entryLevel + 1;
-                       $submenu->rL_uidRegister = $this->rL_uidRegister;
-                       $submenu->MP_array = $this->MP_array;
-                       if ($this->menuArr[$this->I['key']]['_MP_PARAM']) {
-                               $submenu->MP_array[] = $this->menuArr[$this->I['key']]['_MP_PARAM'];
-                       }
-                       // Especially scripts that build the submenu needs the parent data
-                       $submenu->parent_cObj = $this->parent_cObj;
-                       $submenu->parentMenuArr = $this->menuArr;
-                       // Setting alternativeMenuTempArray (will be effective only if an array)
-                       if (is_array($altArray)) {
-                               $submenu->alternativeMenuTempArray = $altArray;
-                       }
-                       if ($submenu->start($this->tmpl, $this->sys_page, $uid, $this->conf, $this->menuNumber + 1, $objSuffix)) {
-                               $submenu->makeMenu();
-                               // Memorize the current menu item count
-                               $tempCountMenuObj = $GLOBALS['TSFE']->register['count_MENUOBJ'];
-                               // Reset the menu item count for the submenu
-                               $GLOBALS['TSFE']->register['count_MENUOBJ'] = 0;
-                               $content = $submenu->writeMenu();
-                               // Restore the item count now that the submenu has been handled
-                               $GLOBALS['TSFE']->register['count_MENUOBJ'] = $tempCountMenuObj;
-                               $GLOBALS['TSFE']->register['count_menuItems'] = count($this->menuArr);
-                               return $content;
+               if (($this->mconf['expAll'] || $this->isNext($uid, $this->getMPvar($this->I['key'])) || is_array($altArray)) && !$this->mconf['sectionIndex']) {
+                       try {
+                               $menuObjectFactory = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\MenuContentObjectFactory');
+                               $submenu = $menuObjectFactory->getMenuObjectByType($menuType);
+                               $submenu->entryLevel = $this->entryLevel + 1;
+                               $submenu->rL_uidRegister = $this->rL_uidRegister;
+                               $submenu->MP_array = $this->MP_array;
+                               if ($this->menuArr[$this->I['key']]['_MP_PARAM']) {
+                                       $submenu->MP_array[] = $this->menuArr[$this->I['key']]['_MP_PARAM'];
+                               }
+                               // Especially scripts that build the submenu needs the parent data
+                               $submenu->parent_cObj = $this->parent_cObj;
+                               $submenu->parentMenuArr = $this->menuArr;
+                               // Setting alternativeMenuTempArray (will be effective only if an array)
+                               if (is_array($altArray)) {
+                                       $submenu->alternativeMenuTempArray = $altArray;
+                               }
+                               if ($submenu->start($this->tmpl, $this->sys_page, $uid, $this->conf, $this->menuNumber + 1, $objSuffix)) {
+                                       $submenu->makeMenu();
+                                       // Memorize the current menu item count
+                                       $tempCountMenuObj = $GLOBALS['TSFE']->register['count_MENUOBJ'];
+                                       // Reset the menu item count for the submenu
+                                       $GLOBALS['TSFE']->register['count_MENUOBJ'] = 0;
+                                       $content = $submenu->writeMenu();
+                                       // Restore the item count now that the submenu has been handled
+                                       $GLOBALS['TSFE']->register['count_MENUOBJ'] = $tempCountMenuObj;
+                                       $GLOBALS['TSFE']->register['count_menuItems'] = count($this->menuArr);
+                                       return $content;
+                               }
+                       } catch (\TYPO3\CMS\Frontend\ContentObject\Menu\Exception\NoSuchMenuTypeException $e) {
                        }
                }
        }
diff --git a/typo3/sysext/frontend/Classes/ContentObject/Menu/Exception/NoSuchMenuTypeException.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/Exception/NoSuchMenuTypeException.php
new file mode 100644 (file)
index 0000000..67c7cb5
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+namespace TYPO3\CMS\Frontend\ContentObject\Menu\Exception;
+
+/***************************************************************
+ *  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!
+ ***************************************************************/
+
+/**
+ * No such menu type exception
+ */
+class NoSuchMenuTypeException extends \TYPO3\CMS\Frontend\Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldout.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldout.php
deleted file mode 100644 (file)
index d307139..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-<?php
-namespace TYPO3\CMS\Frontend\ContentObject\Menu;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 1999-2011 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 extension class, tslib_gmenu_foldout
- *
- * Revised for TYPO3 3.6 June/2003 by Kasper Skårhøj
- * XHTML compliant
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-/**
- * Class extension tslib_gmenu for the creation of DHTML foldout menus
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-class GraphicalMenuFoldout 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/GraphicalMenuFoldoutContentObject.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php
new file mode 100644 (file)
index 0000000..240f509
--- /dev/null
@@ -0,0 +1,230 @@
+<?php
+namespace TYPO3\CMS\Frontend\ContentObject\Menu;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 1999-2011 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/GraphicalMenuLayers.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayers.php
deleted file mode 100644 (file)
index 8fb325a..0000000
+++ /dev/null
@@ -1,518 +0,0 @@
-<?php
-namespace TYPO3\CMS\Frontend\ContentObject\Menu;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 1999-2011 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 extension class, tslib_gmenu_layers
- *
- * Revised for TYPO3 3.6 June/2003 by Kasper Skårhøj
- * XHTML compliant
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-/**
- * Class extending tslib_gmenu for the creation of DHTML menus
- * NOTICE: The contents of this class is made so that it can be copied
- * EXACTLY AS IS to the tmenu_layers class! See notes in class
- * (for BEGIN/END) and also "diff.xmenu_layers.txt"
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-class GraphicalMenuLayers 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/frontend/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php
new file mode 100644 (file)
index 0000000..dc0e52f
--- /dev/null
@@ -0,0 +1,509 @@
+<?php
+namespace TYPO3\CMS\Frontend\ContentObject\Menu;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 1999-2011 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/frontend/Classes/ContentObject/Menu/MenuContentObjectFactory.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/MenuContentObjectFactory.php
new file mode 100644 (file)
index 0000000..1ab1b29
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+namespace TYPO3\CMS\Frontend\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.
+ *  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!
+ ***************************************************************/
+
+/**
+ * Factory for menu content objects
+ *
+ * @author Christian Kuhn <lolli@schwarzbu.ch>
+ */
+class MenuContentObjectFactory implements \TYPO3\CMS\Core\SingletonInterface {
+
+       /**
+        * Register of TypoScript keys to according render class
+        *
+        * @var array
+        */
+       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',
+       );
+
+       /**
+        * Gets a typo script string like 'TMENU' and returns an object of this type
+        *
+        * @param string $type
+        * @return object Menu object
+        * @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)]);
+               } else {
+                       throw new Exception\NoSuchMenuTypeException(
+                               'Menu type ' . (string)$type . ' has no implementing class.',
+                               1363278130
+                       );
+               }
+               return $object;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayers.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayers.php
deleted file mode 100644 (file)
index a083681..0000000
+++ /dev/null
@@ -1,518 +0,0 @@
-<?php
-namespace TYPO3\CMS\Frontend\ContentObject\Menu;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 1999-2011 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 extension class, tslib_tmenu_layers
- *
- * Revised for TYPO3 3.6 June/2003 by Kasper Skårhøj
- * XHTML compliant
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-/**
- * Class extending tslib_tmenu for the creation of text based DHTML menus
- * NOTICE: The contents of this class is copied EXACTLY AS IS from gmenu_layers class! See notes in class (for BEGIN/END) and also 'diff.xmenu_layers.txt'
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-class TextMenuLayers 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/Classes/ContentObject/Menu/TextMenuLayersContentObject.php b/typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayersContentObject.php
new file mode 100644 (file)
index 0000000..5c3febf
--- /dev/null
@@ -0,0 +1,511 @@
+<?php
+namespace TYPO3\CMS\Frontend\ContentObject\Menu;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 1999-2011 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/Classes/Exception.php b/typo3/sysext/frontend/Classes/Exception.php
new file mode 100644 (file)
index 0000000..24e21ea
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+namespace TYPO3\CMS\Frontend;
+
+/***************************************************************
+ *  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!
+ ***************************************************************/
+
+/**
+ * A generic frontend exception
+ */
+class Exception extends \Exception {
+
+}
+
+?>
\ No newline at end of file
index 07f0d5f..963133f 100644 (file)
@@ -34,12 +34,12 @@ return array(
        'tslib_menu' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\AbstractMenuContentObject',
        'tslib_menu_filterMenuPagesHook' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\AbstractMenuFilterPagesHookInterface',
        'tslib_gmenu' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\GraphicalMenuContentObject',
-       'tslib_gmenu_foldout' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\GraphicalMenuFoldout',
-       'tslib_gmenu_layers' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\GraphicalMenuLayers',
+       'tslib_gmenu_foldout' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\GraphicalMenuFoldoutContentObject',
+       'tslib_gmenu_layers' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\GraphicalMenuLayersContentObject',
        'tslib_imgmenu' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\ImageMenuContentObject',
        'tslib_jsmenu' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\JavaScriptMenuContentObject',
        'tslib_tmenu' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\TextMenuContentObject',
-       'tslib_tmenu_layers' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\TextMenuLayers',
+       'tslib_tmenu_layers' => 'TYPO3\\CMS\\Frontend\\ContentObject\\Menu\\TextMenuLayersContentObject',
        'tslib_content_Multimedia' => 'TYPO3\\CMS\\Frontend\\ContentObject\\MultimediaContentObject',
        'tslib_tableOffset' => 'TYPO3\\CMS\\Frontend\\ContentObject\\OffsetTableContentObject',
        'tslib_content_OffsetTable' => 'TYPO3\\CMS\\Frontend\\ContentObject\\OffsetTableContentObject',
index e92cd7f..f9a3280 100644 (file)
@@ -2,8 +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/GraphicalMenuFoldout.php
+ * typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php
  */
-require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/GraphicalMenuFoldout.php';
-$GLOBALS['TSFE']->tmpl->menuclasses .= ',gmenu_foldout';
+require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/GraphicalMenuFoldoutContentObject.php';
 ?>
\ No newline at end of file
index f47d056..06931ae 100644 (file)
@@ -2,9 +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/GraphicalMenuLayers.php
+ * typo3/sysext/frontend/Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php
  */
-require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/GraphicalMenuLayers.php';
-// FULL DUPLICATE TO tmenu_layers END:
-$GLOBALS['TSFE']->tmpl->menuclasses .= ',gmenu_layers';
+require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/GraphicalMenuLayersContentObject.php';
 ?>
\ No newline at end of file
index f8e2f00..8741eba 100644 (file)
@@ -2,9 +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/TextMenuLayers.php
+ * typo3/sysext/frontend/Classes/ContentObject/Menu/TextMenuLayersContentObject.php
  */
-require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/TextMenuLayers.php';
-// FULL DUPLICATE FROM gmenu_layers END:
-$GLOBALS['TSFE']->tmpl->menuclasses .= ',tmenu_layers';
+require_once \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('frontend') . 'Classes/ContentObject/Menu/TextMenuLayersContentObject.php';
 ?>
\ No newline at end of file