function checkDataSubmission($feObj)
 {
     // config
     global $TSFE;
     $this->cObj = $TSFE->cObj;
     // cObject
     $this->confArr = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['wt_doorman']);
     // Get backandconfig
     $this->removeXSS = t3lib_div::makeInstance('tx_wtdoorman_RemoveXSS');
     // Create new instance for removeXSS class
     $varsDefinition = $this->string2array($this->confArr['varsDefinition']);
     // get config for doorman
     if ($this->confArr['pidInRootline'] > -1) {
         $pid = t3lib_div::trimExplode(',', $this->confArr['pidInRootline'] . ',' . tslib_cObj::getTreeList($this->confArr['pidInRootline'], 100), 1);
     }
     // array with all allowed pids
     // Let's go
     if ($this->confArr['pidInRootline'] > -1 && (in_array($GLOBALS['TSFE']->id, $pid) || $this->confArr['pidInRootline'] == 0)) {
         // if current page is allowed
         $this->sec = t3lib_div::makeInstance('tx_wtdoorman_security');
         // Create new instance for security class
         $this->sec->secParams = $this->string2array($this->confArr['varsDefinition']);
         // get config for backend definition
         $this->sec->delNotSetVars = $this->confArr['clearNotDefinedVars'];
         // now allowed params should be deleted or not?
         $_GET = $this->sec->sec($_GET);
         // overwrite GET params with vars from doorman class
         $_POST = $this->sec->sec($_POST);
         // overwrite POST params with vars from doorman class
     }
 }
 /**
  * Overrides the storage PID settings, in case the "Startingpoint" settings
  * is set in the plugin configuration.
  *
  * @param array $frameworkConfiguration the framework configurations
  * @return array the framework configuration with overriden storagePid
  */
 protected function overrideStoragePidIfStartingPointIsSet($frameworkConfiguration)
 {
     $pages = $this->contentObject->data['pages'];
     if (is_string($pages) && strlen($pages) > 0) {
         $list = array();
         if ($this->contentObject->data['recursive'] > 0) {
             $explodedPages = t3lib_div::trimExplode(',', $pages);
             foreach ($explodedPages as $pid) {
                 $list[] = trim($this->contentObject->getTreeList($pid, $this->contentObject->data['recursive']), ',');
             }
         }
         if (count($list) > 0) {
             $pages = $pages . ',' . implode(',', $list);
         }
         $frameworkConfiguration = t3lib_div::array_merge_recursive_overrule($frameworkConfiguration, array('persistence' => array('storagePid' => $pages)));
     }
     return $frameworkConfiguration;
 }
 /**
  * Returns a commalist of page ids for a query (eg. 'WHERE pid IN (...)')
  *
  * @param    string  $pid_list  is a comma list of page ids (if empty current page is used)
  * @param    integer $recursive is an integer >=0 telling how deep to dig for pids under each entry in $pid_list
  * @return    string        List of PID values (comma separated)
  */
 public function pi_getPidList($pid_list, $recursive = 0)
 {
     if (!strcmp($pid_list, '')) {
         $pid_list = $GLOBALS['TSFE']->id;
     }
     $recursive = $this->misc->intInRange($recursive, 0);
     $pid_list_arr = array_unique(\TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $pid_list, 1));
     $pid_list = array();
     foreach ($pid_list_arr as $val) {
         $val = $this->misc->intInRange($val, 0);
         if ($val) {
             $_list = $this->cObj->getTreeList(-1 * $val, $recursive);
             if ($_list) {
                 $pid_list[] = $_list;
             }
         }
     }
     return implode(',', $pid_list);
 }
 /**
  * Generates a list of Page-uid's from $id. List does not include $id itself
  * (unless the id specified is negative in which case it does!)
  * The only pages WHICH PREVENTS DECENDING in a branch are
  * - deleted pages,
  * - pages in a recycler (doktype = 255) or of the Backend User Section (doktpe = 6) type
  * - pages that has the extendToSubpages set, WHERE start/endtime, hidden
  * and fe_users would hide the records.
  * Apart from that, pages with enable-fields excluding them, will also be
  * removed. HOWEVER $dontCheckEnableFields set will allow
  * enableFields-excluded pages to be included anyway - including
  * extendToSubpages sections!
  * Mount Pages are also descended but notice that these ID numbers are not
  * useful for links unless the correct MPvar is set.
  *
  * @param	integer		The id of the start page from which point in the page tree to decend. IF NEGATIVE the id itself is included in the end of the list (only if $begin is 0) AND the output does NOT contain a last comma. Recommended since it will resolve the input ID for mount pages correctly and also check if the start ID actually exists!
  * @param	integer		The number of levels to decend. If you want to decend infinitely, just set this to 100 or so. Should be at least "1" since zero will just make the function return (no decend...)
  * @param	integer		$begin is an optional integer that determines at which level in the tree to start collecting uid's. Zero means 'start right away', 1 = 'next level and out'
  * @param	boolean		See function description
  * @param	string		Additional fields to select. Syntax: ",[fieldname],[fieldname],..."
  * @param	string		Additional where clauses. Syntax: " AND [fieldname]=[value] AND ..."
  * @param	array		array of IDs from previous recursions. In order to prevent infinite loops with mount pages.
  * @param	integer		Internal: Zero for the first recursion, incremented for each recursive call.
  * @return	string		Returns the list with a comma in the end (if any pages selected and not if $id is negative and $id is added itself) - which means the input page id can comfortably be appended to the output string if you need it to.
  * @see tslib_fe::checkEnableFields(), tslib_fe::checkPagerecordForIncludeSection()
  */
 public function getTreeList($id, $depth, $begin = 0, $dontCheckEnableFields = FALSE, $addSelectFields = '', $moreWhereClauses = '', array $prevId_array = array(), $recursionLevel = 0)
 {
     // Init vars:
     $allFields = 'uid,hidden,starttime,endtime,fe_group,extendToSubpages,doktype,php_tree_stop,mount_pid,mount_pid_ol,t3ver_state' . $addSelectFields;
     $depth = intval($depth);
     $begin = intval($begin);
     $id = intval($id);
     $theList = '';
     $addId = 0;
     $requestHash = '';
     if ($id) {
         // First level, check id (second level, this is done BEFORE the recursive call)
         if (!$recursionLevel) {
             // check tree list cache
             // first, create the hash for this request - not sure yet whether we need all these parameters though
             $parameters = array($id, $depth, $begin, $dontCheckEnableFields, $addSelectFields, $moreWhereClauses, $prevId_array, $GLOBALS['TSFE']->gr_list);
             $requestHash = md5(serialize($parameters));
             $cacheEntry = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow('treelist', 'cache_treelist', 'md5hash = \'' . $requestHash . '\' AND ( expires > ' . $GLOBALS['EXEC_TIME'] . ' OR expires = 0 )');
             if (is_array($cacheEntry)) {
                 // cache hit
                 return $cacheEntry['treelist'];
             }
             // If Id less than zero it means we should add the real id to list:
             if ($id < 0) {
                 $addId = $id = abs($id);
             }
             // Check start page:
             if ($GLOBALS['TSFE']->sys_page->getRawRecord('pages', $id, 'uid')) {
                 // Find mount point if any:
                 $mount_info = $GLOBALS['TSFE']->sys_page->getMountPointInfo($id);
                 if (is_array($mount_info)) {
                     $id = $mount_info['mount_pid'];
                     // In Overlay mode, use the mounted page uid as added ID!:
                     if ($addId && $mount_info['overlay']) {
                         $addId = $id;
                     }
                 }
             } else {
                 return '';
                 // Return blank if the start page was NOT found at all!
             }
         }
         // Add this ID to the array of IDs
         if ($begin <= 0) {
             $prevId_array[] = $id;
         }
         // Select sublevel:
         if ($depth > 0) {
             $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($allFields, 'pages', 'pid = ' . intval($id) . ' AND deleted = 0 ' . $moreWhereClauses, '', 'sorting');
             while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
                 $GLOBALS['TSFE']->sys_page->versionOL('pages', $row);
                 if ($row['doktype'] == t3lib_pageSelect::DOKTYPE_RECYCLER || $row['doktype'] == t3lib_pageSelect::DOKTYPE_BE_USER_SECTION || $row['t3ver_state'] > 0) {
                     // Doing this after the overlay to make sure changes
                     // in the overlay are respected.
                     // However, we do not process pages below of and
                     // including of type recycler and BE user section
                     continue;
                 }
                 // Find mount point if any:
                 $next_id = $row['uid'];
                 $mount_info = $GLOBALS['TSFE']->sys_page->getMountPointInfo($next_id, $row);
                 // Overlay mode:
                 if (is_array($mount_info) && $mount_info['overlay']) {
                     $next_id = $mount_info['mount_pid'];
                     $res2 = $GLOBALS['TYPO3_DB']->exec_SELECTquery($allFields, 'pages', 'uid = ' . intval($next_id) . ' AND deleted = 0 ' . $moreWhereClauses, '', 'sorting');
                     $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res2);
                     $GLOBALS['TYPO3_DB']->sql_free_result($res2);
                     $GLOBALS['TSFE']->sys_page->versionOL('pages', $row);
                     if ($row['doktype'] == t3lib_pageSelect::DOKTYPE_RECYCLER || $row['doktype'] == t3lib_pageSelect::DOKTYPE_BE_USER_SECTION || $row['t3ver_state'] > 0) {
                         // Doing this after the overlay to make sure
                         // changes in the overlay are respected.
                         // see above
                         continue;
                     }
                 }
                 // Add record:
                 if ($dontCheckEnableFields || $GLOBALS['TSFE']->checkPagerecordForIncludeSection($row)) {
                     // Add ID to list:
                     if ($begin <= 0) {
                         if ($dontCheckEnableFields || $GLOBALS['TSFE']->checkEnableFields($row)) {
                             $theList .= $next_id . ',';
                         }
                     }
                     // Next level:
                     if ($depth > 1 && !$row['php_tree_stop']) {
                         // Normal mode:
                         if (is_array($mount_info) && !$mount_info['overlay']) {
                             $next_id = $mount_info['mount_pid'];
                         }
                         // Call recursively, if the id is not in prevID_array:
                         if (!in_array($next_id, $prevId_array)) {
                             $theList .= tslib_cObj::getTreeList($next_id, $depth - 1, $begin - 1, $dontCheckEnableFields, $addSelectFields, $moreWhereClauses, $prevId_array, $recursionLevel + 1);
                         }
                     }
                 }
             }
             $GLOBALS['TYPO3_DB']->sql_free_result($res);
         }
         // If first run, check if the ID should be returned:
         if (!$recursionLevel) {
             if ($addId) {
                 if ($begin > 0) {
                     $theList .= 0;
                 } else {
                     $theList .= $addId;
                 }
             }
             $GLOBALS['TYPO3_DB']->exec_INSERTquery('cache_treelist', array('md5hash' => $requestHash, 'pid' => $id, 'treelist' => $theList, 'tstamp' => $GLOBALS['EXEC_TIME']));
         }
     }
     // Return list:
     return $theList;
 }
 /**
  * Returns a commalist of page ids for a query (eg. 'WHERE pid IN (...)')
  *
  * @param	string		$pid_list is a comma list of page ids (if empty current page is used)
  * @param	integer		$recursive is an integer >=0 telling how deep to dig for pids under each entry in $pid_list
  * @return	string		List of PID values (comma separated)
  */
 function pi_getPidList($pid_list, $recursive = 0)
 {
     if (!strcmp($pid_list, '')) {
         $pid_list = $GLOBALS['TSFE']->id;
     }
     $recursive = t3lib_div::intInRange($recursive, 0);
     $pid_list_arr = array_unique(t3lib_div::trimExplode(',', $pid_list, 1));
     $pid_list = array();
     foreach ($pid_list_arr as $val) {
         $val = t3lib_div::intInRange($val, 0);
         if ($val) {
             $_list = $this->cObj->getTreeList(-1 * $val, $recursive);
             if ($_list) {
                 $pid_list[] = $_list;
             }
         }
     }
     return implode(',', $pid_list);
 }
 /**
  * Creates the menu in the internal variables, ready for output.
  * Basically this will read the page records needed and fill in the internal $this->menuArr
  * Based on a hash of this array and some other variables the $this->result variable will be loaded either from cache OR by calling the generate() method of the class to create the menu for real.
  *
  * @return	void
  */
 function makeMenu()
 {
     if ($this->id) {
         // Initializing showAccessRestrictedPages
         if ($this->mconf['showAccessRestrictedPages']) {
             // SAVING where_groupAccess
             $SAVED_where_groupAccess = $this->sys_page->where_groupAccess;
             $this->sys_page->where_groupAccess = '';
             // Temporarily removing fe_group checking!
         }
         // Begin production of menu:
         $temp = array();
         $altSortFieldValue = trim($this->mconf['alternativeSortingField']);
         $altSortField = $altSortFieldValue ? $altSortFieldValue : 'sorting';
         if ($this->menuNumber == 1 && $this->conf['special']) {
             // ... only for the FIRST level of a HMENU
             $value = $this->parent_cObj->stdWrap($this->conf['special.']['value'], $this->conf['special.']['value.']);
             switch ($this->conf['special']) {
                 case 'userdefined':
                     $temp = $this->includeMakeMenu($this->conf['special.'], $altSortField);
                     break;
                 case 'userfunction':
                     $temp = $this->parent_cObj->callUserFunction($this->conf['special.']['userFunc'], array_merge($this->conf['special.'], array('_altSortField' => $altSortField)), '');
                     if (!is_array($temp)) {
                         $temp = array();
                     }
                     break;
                 case 'language':
                     $temp = array();
                     // Getting current page record NOT overlaid by any translation:
                     $currentPageWithNoOverlay = $this->sys_page->getRawRecord('pages', $GLOBALS['TSFE']->page['uid']);
                     // Traverse languages set up:
                     $languageItems = t3lib_div::intExplode(',', $value);
                     foreach ($languageItems as $sUid) {
                         // Find overlay record:
                         if ($sUid) {
                             $lRecs = $this->sys_page->getPageOverlay($GLOBALS['TSFE']->page['uid'], $sUid);
                         } else {
                             $lRecs = array();
                         }
                         // Checking if the "disabled" state should be set.
                         if (t3lib_div::hideIfNotTranslated($GLOBALS['TSFE']->page['l18n_cfg']) && $sUid && !count($lRecs) || $GLOBALS['TSFE']->page['l18n_cfg'] & 1 && (!$sUid || !count($lRecs)) || !$this->conf['special.']['normalWhenNoLanguage'] && $sUid && !count($lRecs)) {
                             $iState = $GLOBALS['TSFE']->sys_language_uid == $sUid ? 'USERDEF2' : 'USERDEF1';
                         } else {
                             $iState = $GLOBALS['TSFE']->sys_language_uid == $sUid ? 'ACT' : 'NO';
                         }
                         if ($this->conf['addQueryString']) {
                             $getVars = $this->parent_cObj->getQueryArguments($this->conf['addQueryString.'], array('L' => $sUid), true);
                         } else {
                             $getVars = '&L=' . $sUid;
                         }
                         // Adding menu item:
                         $temp[] = array_merge(array_merge($currentPageWithNoOverlay, $lRecs), array('ITEM_STATE' => $iState, '_ADD_GETVARS' => $getVars, '_SAFE' => TRUE));
                     }
                     break;
                 case 'directory':
                     if ($value == '') {
                         $value = $GLOBALS['TSFE']->page['uid'];
                     }
                     $items = t3lib_div::intExplode(',', $value);
                     foreach ($items as $id) {
                         $MP = $this->tmpl->getFromMPmap($id);
                         // Checking if a page is a mount page and if so, change the ID and set the MP var properly.
                         $mount_info = $this->sys_page->getMountPointInfo($id);
                         if (is_array($mount_info)) {
                             if ($mount_info['overlay']) {
                                 // Overlays should already have their full MPvars calculated:
                                 $MP = $this->tmpl->getFromMPmap($mount_info['mount_pid']);
                                 $MP = $MP ? $MP : $mount_info['MPvar'];
                             } else {
                                 $MP = ($MP ? $MP . ',' : '') . $mount_info['MPvar'];
                             }
                             $id = $mount_info['mount_pid'];
                         }
                         // Get sub-pages:
                         $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages', array('pidInList' => $id, 'orderBy' => $altSortField));
                         while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
                             $GLOBALS['TSFE']->sys_page->versionOL('pages', $row);
                             if (is_array($row)) {
                                 // Keep mount point?
                                 $mount_info = $this->sys_page->getMountPointInfo($row['uid'], $row);
                                 if (is_array($mount_info) && $mount_info['overlay']) {
                                     // There is a valid mount point.
                                     $mp_row = $this->sys_page->getPage($mount_info['mount_pid']);
                                     // Using "getPage" is OK since we need the check for enableFields AND for type 2 of mount pids we DO require a doktype < 200!
                                     if (count($mp_row)) {
                                         $row = $mp_row;
                                         $row['_MP_PARAM'] = $mount_info['MPvar'];
                                     } else {
                                         unset($row);
                                     }
                                     // If the mount point could not be fetched with respect to enableFields, unset the row so it does not become a part of the menu!
                                 }
                                 // Add external MP params, then the row:
                                 if (is_array($row)) {
                                     if ($MP) {
                                         $row['_MP_PARAM'] = $MP . ($row['_MP_PARAM'] ? ',' . $row['_MP_PARAM'] : '');
                                     }
                                     $temp[$row['uid']] = $this->sys_page->getPageOverlay($row);
                                 }
                             }
                         }
                     }
                     break;
                 case 'list':
                     if ($value == '') {
                         $value = $this->id;
                     }
                     $loadDB = t3lib_div::makeInstance('FE_loadDBGroup');
                     $loadDB->start($value, 'pages');
                     $loadDB->additionalWhere['pages'] = tslib_cObj::enableFields('pages');
                     $loadDB->getFromDB();
                     foreach ($loadDB->itemArray as $val) {
                         $MP = $this->tmpl->getFromMPmap($val['id']);
                         // Keep mount point?
                         $mount_info = $this->sys_page->getMountPointInfo($val['id']);
                         if (is_array($mount_info) && $mount_info['overlay']) {
                             // There is a valid mount point.
                             $mp_row = $this->sys_page->getPage($mount_info['mount_pid']);
                             // Using "getPage" is OK since we need the check for enableFields AND for type 2 of mount pids we DO require a doktype < 200!
                             if (count($mp_row)) {
                                 $row = $mp_row;
                                 $row['_MP_PARAM'] = $mount_info['MPvar'];
                                 if ($mount_info['overlay']) {
                                     // Overlays should already have their full MPvars calculated:
                                     $MP = $this->tmpl->getFromMPmap($mount_info['mount_pid']);
                                     if ($MP) {
                                         unset($row['_MP_PARAM']);
                                     }
                                 }
                             } else {
                                 unset($row);
                             }
                             // If the mount point could not be fetched with respect to enableFields, unset the row so it does not become a part of the menu!
                         } else {
                             $row = $loadDB->results['pages'][$val['id']];
                         }
                         //Add versioning overlay for current page (to respect workspaces)
                         if (is_array($row)) {
                             $this->sys_page->versionOL('pages', $row, true);
                         }
                         // Add external MP params, then the row:
                         if (is_array($row)) {
                             if ($MP) {
                                 $row['_MP_PARAM'] = $MP . ($row['_MP_PARAM'] ? ',' . $row['_MP_PARAM'] : '');
                             }
                             $temp[] = $this->sys_page->getPageOverlay($row);
                         }
                     }
                     break;
                 case 'updated':
                     if ($value == '') {
                         $value = $GLOBALS['TSFE']->page['uid'];
                     }
                     $items = t3lib_div::intExplode(',', $value);
                     if (t3lib_div::testInt($this->conf['special.']['depth'])) {
                         $depth = t3lib_div::intInRange($this->conf['special.']['depth'], 1, 20);
                         // Tree depth
                     } else {
                         $depth = 20;
                     }
                     $limit = t3lib_div::intInRange($this->conf['special.']['limit'], 0, 100);
                     // max number of items
                     $maxAge = intval(tslib_cObj::calc($this->conf['special.']['maxAge']));
                     if (!$limit) {
                         $limit = 10;
                     }
                     $mode = $this->conf['special.']['mode'];
                     // *'auto', 'manual', 'tstamp'
                     // Get id's
                     $id_list_arr = array();
                     foreach ($items as $id) {
                         $bA = t3lib_div::intInRange($this->conf['special.']['beginAtLevel'], 0, 100);
                         $id_list_arr[] = tslib_cObj::getTreeList(-1 * $id, $depth - 1 + $bA, $bA - 1);
                     }
                     $id_list = implode(',', $id_list_arr);
                     // Get sortField (mode)
                     switch ($mode) {
                         case 'starttime':
                             $sortField = 'starttime';
                             break;
                         case 'lastUpdated':
                         case 'manual':
                             $sortField = 'lastUpdated';
                             break;
                         case 'tstamp':
                             $sortField = 'tstamp';
                             break;
                         case 'crdate':
                             $sortField = 'crdate';
                             break;
                         default:
                             $sortField = 'SYS_LASTCHANGED';
                             break;
                     }
                     // Get
                     $extraWhere = ($this->conf['includeNotInMenu'] ? '' : ' AND pages.nav_hide=0') . $this->getDoktypeExcludeWhere();
                     if ($this->conf['special.']['excludeNoSearchPages']) {
                         $extraWhere .= ' AND pages.no_search=0';
                     }
                     if ($maxAge > 0) {
                         $extraWhere .= ' AND ' . $sortField . '>' . ($GLOBALS['SIM_ACCESS_TIME'] - $maxAge);
                     }
                     $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages', array('pidInList' => '0', 'uidInList' => $id_list, 'where' => $sortField . '>=0' . $extraWhere, 'orderBy' => $altSortFieldValue ? $altSortFieldValue : $sortField . ' desc', 'max' => $limit));
                     while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
                         $GLOBALS['TSFE']->sys_page->versionOL('pages', $row);
                         if (is_array($row)) {
                             $temp[$row['uid']] = $this->sys_page->getPageOverlay($row);
                         }
                     }
                     break;
                 case 'keywords':
                     list($value) = t3lib_div::intExplode(',', $value);
                     if (!$value) {
                         $value = $GLOBALS['TSFE']->page['uid'];
                     }
                     if ($this->conf['special.']['setKeywords'] || $this->conf['special.']['setKeywords.']) {
                         $kw = $this->parent_cObj->stdWrap($this->conf['special.']['setKeywords'], $this->conf['special.']['setKeywords.']);
                     } else {
                         $value_rec = $this->sys_page->getPage($value);
                         // The page record of the 'value'.
                         $kfieldSrc = $this->conf['special.']['keywordsField.']['sourceField'] ? $this->conf['special.']['keywordsField.']['sourceField'] : 'keywords';
                         $kw = trim(tslib_cObj::keywords($value_rec[$kfieldSrc]));
                         // keywords.
                     }
                     $mode = $this->conf['special.']['mode'];
                     // *'auto', 'manual', 'tstamp'
                     switch ($mode) {
                         case 'starttime':
                             $sortField = 'starttime';
                             break;
                         case 'lastUpdated':
                         case 'manual':
                             $sortField = 'lastUpdated';
                             break;
                         case 'tstamp':
                             $sortField = 'tstamp';
                             break;
                         case 'crdate':
                             $sortField = 'crdate';
                             break;
                         default:
                             $sortField = 'SYS_LASTCHANGED';
                             break;
                     }
                     // depth, limit, extra where
                     if (t3lib_div::testInt($this->conf['special.']['depth'])) {
                         $depth = t3lib_div::intInRange($this->conf['special.']['depth'], 0, 20);
                         // Tree depth
                     } else {
                         $depth = 20;
                     }
                     $limit = t3lib_div::intInRange($this->conf['special.']['limit'], 0, 100);
                     // max number of items
                     $extraWhere = ' AND pages.uid!=' . $value . ($this->conf['includeNotInMenu'] ? '' : ' AND pages.nav_hide=0') . $this->getDoktypeExcludeWhere();
                     if ($this->conf['special.']['excludeNoSearchPages']) {
                         $extraWhere .= ' AND pages.no_search=0';
                     }
                     // start point
                     $eLevel = tslib_cObj::getKey($this->parent_cObj->stdWrap($this->conf['special.']['entryLevel'], $this->conf['special.']['entryLevel.']), $this->tmpl->rootLine);
                     $startUid = intval($this->tmpl->rootLine[$eLevel]['uid']);
                     // which field is for keywords
                     $kfield = 'keywords';
                     if ($this->conf['special.']['keywordsField']) {
                         list($kfield) = explode(' ', trim($this->conf['special.']['keywordsField']));
                     }
                     // If there are keywords and the startuid is present.
                     if ($kw && $startUid) {
                         $bA = t3lib_div::intInRange($this->conf['special.']['beginAtLevel'], 0, 100);
                         $id_list = tslib_cObj::getTreeList(-1 * $startUid, $depth - 1 + $bA, $bA - 1);
                         $kwArr = explode(',', $kw);
                         foreach ($kwArr as $word) {
                             $word = trim($word);
                             if ($word) {
                                 $keyWordsWhereArr[] = $kfield . ' LIKE \'%' . $GLOBALS['TYPO3_DB']->quoteStr($word, 'pages') . '%\'';
                             }
                         }
                         $res = $GLOBALS['TSFE']->cObj->exec_getQuery('pages', array('pidInList' => '0', 'uidInList' => $id_list, 'where' => '(' . implode(' OR ', $keyWordsWhereArr) . ')' . $extraWhere, 'orderBy' => $altSortFieldValue ? $altSortFieldValue : $sortField . ' desc', 'max' => $limit));
                         while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
                             $GLOBALS['TSFE']->sys_page->versionOL('pages', $row);
                             if (is_array($row)) {
                                 $temp[$row['uid']] = $this->sys_page->getPageOverlay($row);
                             }
                         }
                     }
                     break;
                 case 'rootline':
                     $begin_end = explode('|', $this->parent_cObj->stdWrap($this->conf['special.']['range'], $this->conf['special.']['range.']));
                     $begin_end[0] = intval($begin_end[0]);
                     if (!t3lib_div::testInt($begin_end[1])) {
                         $begin_end[1] = -1;
                     }
                     $beginKey = tslib_cObj::getKey($begin_end[0], $this->tmpl->rootLine);
                     $endKey = tslib_cObj::getKey($begin_end[1], $this->tmpl->rootLine);
                     if ($endKey < $beginKey) {
                         $endKey = $beginKey;
                     }
                     $rl_MParray = array();
                     foreach ($this->tmpl->rootLine as $k_rl => $v_rl) {
                         // For overlaid mount points, set the variable right now:
                         if ($v_rl['_MP_PARAM'] && $v_rl['_MOUNT_OL']) {
                             $rl_MParray[] = $v_rl['_MP_PARAM'];
                         }
                         // Traverse rootline:
                         if ($k_rl >= $beginKey && $k_rl <= $endKey) {
                             $temp_key = $k_rl;
                             $temp[$temp_key] = $this->sys_page->getPage($v_rl['uid']);
                             if (count($temp[$temp_key])) {
                                 if (!$temp[$temp_key]['target']) {
                                     // If there are no specific target for the page, put the level specific target on.
                                     $temp[$temp_key]['target'] = $this->conf['special.']['targets.'][$k_rl];
                                     $temp[$temp_key]['_MP_PARAM'] = implode(',', $rl_MParray);
                                 }
                             } else {
                                 unset($temp[$temp_key]);
                             }
                         }
                         // For normal mount points, set the variable for next level.
                         if ($v_rl['_MP_PARAM'] && !$v_rl['_MOUNT_OL']) {
                             $rl_MParray[] = $v_rl['_MP_PARAM'];
                         }
                     }
                     // Reverse order of elements (e.g. "1,2,3,4" gets "4,3,2,1"):
                     if (isset($this->conf['special.']['reverseOrder']) && $this->conf['special.']['reverseOrder']) {
                         $temp = array_reverse($temp);
                         $rl_MParray = array_reverse($rl_MParray);
                     }
                     break;
                 case 'browse':
                     list($value) = t3lib_div::intExplode(',', $value);
                     if (!$value) {
                         $value = $GLOBALS['TSFE']->page['uid'];
                     }
                     if ($value != $this->tmpl->rootLine[0]['uid']) {
                         // Will not work out of rootline
                         $recArr = array();
                         $value_rec = $this->sys_page->getPage($value);
                         // The page record of the 'value'.
                         if ($value_rec['pid']) {
                             // 'up' page cannot be outside rootline
                             $recArr['up'] = $this->sys_page->getPage($value_rec['pid']);
                             // The page record of 'up'.
                         }
                         if ($recArr['up']['pid'] && $value_rec['pid'] != $this->tmpl->rootLine[0]['uid']) {
                             // If the 'up' item was NOT level 0 in rootline...
                             $recArr['index'] = $this->sys_page->getPage($recArr['up']['pid']);
                             // The page record of "index".
                         }
                         // prev / next is found
                         $prevnext_menu = $this->sys_page->getMenu($value_rec['pid'], '*', $altSortField);
                         $lastKey = 0;
                         $nextActive = 0;
                         foreach ($prevnext_menu as $k_b => $v_b) {
                             if ($nextActive) {
                                 $recArr['next'] = $v_b;
                                 $nextActive = 0;
                             }
                             if ($v_b['uid'] == $value) {
                                 if ($lastKey) {
                                     $recArr['prev'] = $prevnext_menu[$lastKey];
                                 }
                                 $nextActive = 1;
                             }
                             $lastKey = $k_b;
                         }
                         reset($prevnext_menu);
                         $recArr['first'] = pos($prevnext_menu);
                         end($prevnext_menu);
                         $recArr['last'] = pos($prevnext_menu);
                         // prevsection / nextsection is found
                         if (is_array($recArr['index'])) {
                             // You can only do this, if there is a valid page two levels up!
                             $prevnextsection_menu = $this->sys_page->getMenu($recArr['index']['uid'], '*', $altSortField);
                             $lastKey = 0;
                             $nextActive = 0;
                             foreach ($prevnextsection_menu as $k_b => $v_b) {
                                 if ($nextActive) {
                                     $sectionRec_temp = $this->sys_page->getMenu($v_b['uid'], '*', $altSortField);
                                     if (count($sectionRec_temp)) {
                                         reset($sectionRec_temp);
                                         $recArr['nextsection'] = pos($sectionRec_temp);
                                         end($sectionRec_temp);
                                         $recArr['nextsection_last'] = pos($sectionRec_temp);
                                         $nextActive = 0;
                                     }
                                 }
                                 if ($v_b['uid'] == $value_rec['pid']) {
                                     if ($lastKey) {
                                         $sectionRec_temp = $this->sys_page->getMenu($prevnextsection_menu[$lastKey]['uid'], '*', $altSortField);
                                         if (count($sectionRec_temp)) {
                                             reset($sectionRec_temp);
                                             $recArr['prevsection'] = pos($sectionRec_temp);
                                             end($sectionRec_temp);
                                             $recArr['prevsection_last'] = pos($sectionRec_temp);
                                         }
                                     }
                                     $nextActive = 1;
                                 }
                                 $lastKey = $k_b;
                             }
                         }
                         if ($this->conf['special.']['items.']['prevnextToSection']) {
                             if (!is_array($recArr['prev']) && is_array($recArr['prevsection_last'])) {
                                 $recArr['prev'] = $recArr['prevsection_last'];
                             }
                             if (!is_array($recArr['next']) && is_array($recArr['nextsection'])) {
                                 $recArr['next'] = $recArr['nextsection'];
                             }
                         }
                         $items = explode('|', $this->conf['special.']['items']);
                         $c = 0;
                         foreach ($items as $k_b => $v_b) {
                             $v_b = strtolower(trim($v_b));
                             if (intval($this->conf['special.'][$v_b . '.']['uid'])) {
                                 $recArr[$v_b] = $this->sys_page->getPage(intval($this->conf['special.'][$v_b . '.']['uid']));
                                 // fetches the page in case of a hardcoded pid in template
                             }
                             if (is_array($recArr[$v_b])) {
                                 $temp[$c] = $recArr[$v_b];
                                 if ($this->conf['special.'][$v_b . '.']['target']) {
                                     $temp[$c]['target'] = $this->conf['special.'][$v_b . '.']['target'];
                                 }
                                 $tmpSpecialFields = $this->conf['special.'][$v_b . '.']['fields.'];
                                 if (is_array($tmpSpecialFields)) {
                                     foreach ($tmpSpecialFields as $fk => $val) {
                                         $temp[$c][$fk] = $val;
                                     }
                                 }
                                 $c++;
                             }
                         }
                     }
                     break;
             }
         } elseif (is_array($this->alternativeMenuTempArray)) {
             // Setting $temp array if not level 1.
             $temp = $this->alternativeMenuTempArray;
         } elseif ($this->mconf['sectionIndex']) {
             if ($GLOBALS['TSFE']->sys_language_uid && count($this->sys_page->getPageOverlay($this->id))) {
                 $sys_language_uid = intval($GLOBALS['TSFE']->sys_language_uid);
             } else {
                 $sys_language_uid = 0;
             }
             $selectSetup = array('pidInList' => $this->id, 'orderBy' => $altSortField, 'where' => 'colPos=0 AND sys_language_uid=' . $sys_language_uid, 'andWhere' => 'sectionIndex!=0');
             switch ($this->mconf['sectionIndex.']['type']) {
                 case 'all':
                     unset($selectSetup['andWhere']);
                     break;
                 case 'header':
                     $selectSetup['andWhere'] .= ' AND header_layout!=100 AND header!=""';
                     break;
             }
             $basePageRow = $this->sys_page->getPage($this->id);
             if (is_array($basePageRow)) {
                 $res = $GLOBALS['TSFE']->cObj->exec_getQuery('tt_content', $selectSetup);
                 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
                     $GLOBALS['TSFE']->sys_page->versionOL('tt_content', $row);
                     if (is_array($row)) {
                         $temp[$row['uid']] = $basePageRow;
                         $temp[$row['uid']]['title'] = $row['header'];
                         $temp[$row['uid']]['nav_title'] = $row['header'];
                         $temp[$row['uid']]['subtitle'] = $row['subheader'];
                         $temp[$row['uid']]['starttime'] = $row['starttime'];
                         $temp[$row['uid']]['endtime'] = $row['endtime'];
                         $temp[$row['uid']]['fe_group'] = $row['fe_group'];
                         $temp[$row['uid']]['media'] = $row['media'];
                         $temp[$row['uid']]['header_layout'] = $row['header_layout'];
                         $temp[$row['uid']]['bodytext'] = $row['bodytext'];
                         $temp[$row['uid']]['image'] = $row['image'];
                         $temp[$row['uid']]['sectionIndex_uid'] = $row['uid'];
                     }
                 }
             }
         } else {
             // Default:
             $temp = $this->sys_page->getMenu($this->id, '*', $altSortField);
             // gets the menu
         }
         $c = 0;
         $c_b = 0;
         $minItems = intval($this->mconf['minItems'] ? $this->mconf['minItems'] : $this->conf['minItems']);
         $maxItems = intval($this->mconf['maxItems'] ? $this->mconf['maxItems'] : $this->conf['maxItems']);
         $begin = tslib_cObj::calc($this->mconf['begin'] ? $this->mconf['begin'] : $this->conf['begin']);
         $banUidArray = $this->getBannedUids();
         // Fill in the menuArr with elements that should go into the menu:
         $this->menuArr = array();
         foreach ($temp as $data) {
             $spacer = t3lib_div::inList($this->spacerIDList, $data['doktype']) || !strcmp($data['ITEM_STATE'], 'SPC') ? 1 : 0;
             // if item is a spacer, $spacer is set
             if ($this->filterMenuPages($data, $banUidArray, $spacer)) {
                 $c_b++;
                 if ($begin <= $c_b) {
                     // If the beginning item has been reached.
                     $this->menuArr[$c] = $data;
                     $this->menuArr[$c]['isSpacer'] = $spacer;
                     $c++;
                     if ($maxItems && $c >= $maxItems) {
                         break;
                     }
                 }
             }
         }
         // Fill in fake items, if min-items is set.
         if ($minItems) {
             while ($c < $minItems) {
                 $this->menuArr[$c] = array('title' => '...', 'uid' => $GLOBALS['TSFE']->id);
                 $c++;
             }
         }
         // Setting number of menu items
         $GLOBALS['TSFE']->register['count_menuItems'] = count($this->menuArr);
         //	Passing the menuArr through a user defined function:
         if ($this->mconf['itemArrayProcFunc']) {
             if (!is_array($this->parentMenuArr)) {
                 $this->parentMenuArr = array();
             }
             $this->menuArr = $this->userProcess('itemArrayProcFunc', $this->menuArr);
         }
         $this->hash = md5(serialize($this->menuArr) . serialize($this->mconf) . serialize($this->tmpl->rootLine) . serialize($this->MP_array));
         // Get the cache timeout:
         if ($this->conf['cache_period']) {
             $cacheTimeout = $this->conf['cache_period'];
         } else {
             $cacheTimeout = $GLOBALS['TSFE']->get_cache_timeout();
         }
         $serData = $this->sys_page->getHash($this->hash);
         if (!$serData) {
             $this->generate();
             $this->sys_page->storeHash($this->hash, serialize($this->result), 'MENUDATA', $cacheTimeout);
         } else {
             $this->result = unserialize($serData);
         }
         // End showAccessRestrictedPages
         if ($this->mconf['showAccessRestrictedPages']) {
             // RESTORING where_groupAccess
             $this->sys_page->where_groupAccess = $SAVED_where_groupAccess;
         }
     }
 }