function getMenu()
{
    global $wgRequest, $wgMemc, $wgScript;
    $content = '';
    $id = $wgRequest->getVal('id');
    if ($id) {
        $menuArray = $wgMemc->get($id);
        if (!empty($menuArray['magicWords'])) {
            $JSurl = Xml::encodeJsVar($wgScript . '?action=ajax&rs=getMenu&v=' . $wgRequest->getVal('v') . '&words=' . urlencode(implode(',', $menuArray['magicWords'])));
            $content .= "wsl.loadScriptAjax({$JSurl}, function() {\n";
            unset($menuArray['magicWords']);
            $usingCallback = true;
        }
        // fallback (RT #20893)
        if ($menuArray === null) {
            $menuArray = array('mainMenu' => array());
        }
        $content .= 'window.menuArray = ' . json_encode($menuArray) . ';$("#navigation_widget").mouseover(menuInit);$(function() { menuInit(); });';
        $duration = 60 * 60 * 24 * 7;
        // one week
        // close JS code
        if (!empty($usingCallback)) {
            $content .= "\n});";
        }
    }
    $words = urldecode($wgRequest->getVal('words'));
    if ($words) {
        $magicWords = array();
        $map = array('voted' => array('highest_ratings', 'GetTopVotedArticles'), 'popular' => array('most_popular', 'GetMostPopularArticles'), 'visited' => array('most_visited', 'GetMostVisitedArticles'), 'newlychanged' => array('newly_changed', 'GetNewlyChangedArticles'), 'topusers' => array('community', 'GetTopFiveUsers'));
        $words = explode(',', $words);
        foreach ($words as $word) {
            if (isset($map[$word])) {
                $magicWords[$word] = DataProvider::$map[$word][1]();
                $magicWords[$word][] = array('className' => 'Monaco-sidebar_more', 'url' => Title::makeTitle(NS_SPECIAL, 'Top/' . $map[$word][0])->getLocalURL(), 'text' => '-more-');
                if ($word == 'popular') {
                    $magicWords[$word][] = array('className' => 'Monaco-sidebar_edit', 'url' => Title::makeTitle(NS_MEDIAWIKI, 'Most popular articles')->getLocalUrl(), 'text' => '-edit-');
                }
            } else {
                if (substr($word, 0, 8) == 'category') {
                    $name = substr($word, 8);
                    $articles = getMenuHelper($name);
                    foreach ($articles as $key => $val) {
                        $title = Title::newFromId($val);
                        if (is_object($title)) {
                            $magicWords[$word][] = array('text' => $title->getText(), 'url' => $title->getLocalUrl());
                        }
                    }
                    $magicWords[$word][] = array('className' => 'Monaco-sidebar_more', 'url' => Title::makeTitle(NS_CATEGORY, $name)->getLocalURL(), 'text' => '-more-');
                }
            }
        }
        $content .= 'window.magicWords = ' . json_encode($magicWords) . ';';
        $duration = 60 * 60 * 12;
        // two days
    }
    if (!empty($content)) {
        header("Content-Type: text/javascript");
        //		header("Content-Length: " . strlen($content) );
        header("Cache-Control: s-maxage={$duration}, must-revalidate, max-age=0");
        header("X-Pass-Cache-Control: max-age={$duration}");
        echo $content;
        exit;
    }
}
 /**
  * @author: Inez Korczyński
  *
  * Return false when given submenu should not be added in a given place
  */
 private function handleExtraWords(&$node, &$nodes, $depth)
 {
     wfProfileIn(__METHOD__);
     $originalLower = strtolower($node[self::ORIGINAL]);
     if (substr($originalLower, 0, 9) == '#category') {
         // ignore magic words in Level 1 (BugId:15240)
         if ($depth == 1) {
             wfProfileOut(__METHOD__);
             return false;
         }
         $param = trim(substr($node[self::ORIGINAL], 9), '#');
         if (is_numeric($param)) {
             $category = $this->getBiggestCategory($param);
             $name = $category['name'];
         } else {
             $name = substr($param, 1);
         }
         //if the name is still empty abort and display it to user
         //so he/she can fix it
         //most it was something like: #category or #category_
         if (!empty($name)) {
             $node[self::HREF] = Title::makeTitle(NS_CATEGORY, $name)->getLocalURL();
             if (strpos($node[self::TEXT], '#') === 0) {
                 $node[self::TEXT] = str_replace('_', ' ', $name);
             }
             $data = getMenuHelper($name);
             foreach ($data as $val) {
                 $title = Title::newFromId($val);
                 if (is_object($title)) {
                     $this->addChildNode($node, $nodes, $title->getText(), $title->getLocalUrl());
                 }
             }
         }
     } else {
         $extraWord = trim($originalLower, '#');
         if (isset($this->extraWordsMap[$extraWord])) {
             if ($node[self::TEXT][0] == '#') {
                 $node[self::TEXT] = wfMsg(trim($node[self::ORIGINAL], ' *'));
             }
             $fname = $this->extraWordsMap[$extraWord];
             $data = DataProvider::$fname();
             //http://bugs.php.net/bug.php?id=46322 count(false) == 1
             if (!empty($data)) {
                 // ignore magic words in Level 1 (BugId:15240)
                 if ($depth == 1) {
                     wfProfileOut(__METHOD__);
                     return false;
                 }
                 foreach ($data as $val) {
                     $this->addChildNode($node, $nodes, $val[self::TEXT], $val['url']);
                 }
             }
         }
     }
     wfProfileOut(__METHOD__);
     return true;
 }