function redirectToUrlIfNecessary()
{
    $pageCompleteName = stripslashesPmv($_GET['pagename']);
    if (isset($_GET['url']) && $_GET['url'] != "") {
        $pageUrl = stripslashesPmv($_GET['url']);
    } else {
        $pageUrl = null;
    }
    //	if(substr($pageCompleteName, 0, 5) == PREFIX_FILES)
    if (isPrefixTag($pageCompleteName)) {
        if (DEBUG) {
            printDebug("=====================<br>Header() to file to download<br>=====================");
        } else {
            if ($pageUrl != null) {
                if (defined(PMV_REWRITE_MODE) && PMV_REWRITE_MODE == 'PEAR_REQUEST') {
                    // Debut version PEAR
                    setIncludePath();
                    require_once INCLUDE_PATH . "/libs/Request/Request.php";
                    $a =& new HTTP_Request(str_replace("&amp;", "&", $pageUrl));
                    $a->sendRequest();
                    foreach ($a->getResponseHeader() as $key => $value) {
                        if ($key != "transfer-encoding") {
                            // IE does not support this parameter
                            header($key . ": " . $value);
                        }
                    }
                    $cookies = $a->getResponseCookies();
                    if ($cookies) {
                        foreach ($cookies as $value) {
                            setCookieFromPear($value);
                        }
                    }
                    print $a->getResponseBody();
                    exit;
                    // Fin version PEAR
                } else {
                    header('Location:' . str_replace("&amp;", "&", $pageUrl), false, 302);
                    exit;
                }
            } else {
                trigger_error("Error : There is no url to redirect", E_USER_ERROR);
            }
            exit;
        }
    }
}
 function returnQueryXML($p_query, $p_query2 = "")
 {
     $r = query($p_query);
     $allElem = array();
     while ($l = mysql_fetch_assoc($r)) {
         $l['idcategory'] = "c" . $l['idcategory'];
         $allElem[] = $l;
     }
     if ($p_query2 != "") {
         $r = query($p_query2);
         while ($l = mysql_fetch_assoc($r)) {
             if (isPrefixTag($l['name'])) {
                 $l['idpage'] = "f" . $l['idpage'];
             } else {
                 $l['idpage'] = "p" . $l['idpage'];
             }
             $allElem[] = $l;
         }
     }
     return $allElem;
 }
    if (!isset($pageNameDefault)) {
        $pageNameDefault = null;
    }
}
printDebug("PageNameDefault : " . $pageNameDefault);
// stripslashed because otherwise pageName if value is pageNameDefault is slashed twice
$pageCompleteName = utf8_encode(getRequestVar('pagename', stripslashes(html_entity_decode($pageNameDefault))));
$pageCompleteName = str_replace(array("\n", "\r"), '', $pageCompleteName);
$pageCompleteName = str_replace(array("?"), '', $pageCompleteName);
if ($typeTag != "") {
    $pageCompleteName = $typeTag . ":" . $pageCompleteName;
}
// works only on 'path' of this url because the query may contain delimiter !
$file = '';
//if(substr($pageCompleteName, 0, 5) === PREFIX_FILES)
if (isPrefixTag($pageCompleteName)) {
    //	$file = PREFIX_FILES;
    $file = getPrefixTag($pageCompleteName);
}
printDebug("<br>Page complete name:" . $pageCompleteName);
$urlParse = parse_url('http://site.com/' . $pageCompleteName);
$pageCompleteNamePath = substr($urlParse['path'], 1);
$lastDelimiter = strrpos($pageCompleteNamePath, CATEGORY_DELIMITER);
printDebug("<br>Page name complete path:" . $pageCompleteNamePath);
printDebug("<br>Pos last delimiter : {$lastDelimiter}");
if ($lastDelimiter !== false) {
    // in the $pageCompleteName "g1>g2>page" select only "g1>g2"
    $pageCategory = substr($pageCompleteNamePath, 0, $lastDelimiter);
    //	$pageCategory = str_replace( PREFIX_FILES, '', $pageCategory);
    $tabTag = split(",", PREFIX_ALL_TAG);
    foreach ($tabTag as $info) {
 /**
  * Computes all info relative to pages, groups, and files
  * Arrays computed contain sum by group (and subgroups), for pages and files
  */
 function computeGroupPageInfo()
 {
     /*
      * pages and hierarchy
      */
     // removed in 2.2
     $r = query("SELECT sum(total_time_page_ref) as s, idpage_ref" . " FROM " . T_VISIT . " as v LEFT JOIN " . T_LINK_VP . " as l USING (idvisit) " . " WHERE v.server_date = '" . $this->date->get() . "'" . " AND v.idsite = " . $this->site->getId() . "\n\t\t\t\tGROUP BY idpage_ref");
     while ($l = mysql_fetch_assoc($r)) {
         if ($l['idpage_ref'] != 0) {
             $vis_pag_grp[$l['idpage_ref']] = array(ARRAY_INDEX_TIME_TOTAL => $l['s']);
         }
     }
     $r = query("SELECT count(*) as s, p.name as name, p.idpage as idpage,  " . " COALESCE(c.idcategory,0) as idcategory, COALESCE(c.level, 1) as level, " . " COALESCE(c.idparent,0) as idparent, COALESCE(c.name,0) as namecategory " . " FROM (((" . T_VISIT . " as v LEFT JOIN " . T_LINK_VP . " as l USING (idvisit)) " . "\tLEFT JOIN " . T_PAGE . " as p USING (idpage))" . "\t\tLEFT JOIN " . T_CATEGORY . " as c USING (idcategory))" . " WHERE v.server_date = '" . $this->date->get() . "'" . " AND v.idsite = " . $this->site->getId() . " " . " GROUP BY p.idpage");
     while ($l = mysql_fetch_assoc($r)) {
         // pages names beginning by PREFIX_FILES are files, else there are normal pages
         //			if(substr($l['name'], 0, 5) === PREFIX_FILES)
         if (isPrefixTag($l['name'])) {
             $type = ARRAY_TYPE_FILE;
             //				$l['name'] = substr($l['name'], 5);
             //				$l['name'] = deletePrefixTag ($l['name']);
         } else {
             $type = ARRAY_TYPE_PAGE;
         }
         if (!isset($vis_pag_grp[$l['idpage']])) {
             $vis_pag_grp[$l['idpage']] = array(ARRAY_INDEX_TIME_TOTAL => DEFAULT_TIME_PAGE);
         }
         $vis_pag_grp[$l['idpage']] = array(ARRAY_INDEX_COUNT => $l['s'], ARRAY_INDEX_PAGE_NAME => databaseEscape($l['name']), ARRAY_INDEX_IDPAGE => $l['idpage'], ARRAY_INDEX_IDCATEGORY => $l['idcategory'], ARRAY_INDEX_LEVEL => $l['level'], ARRAY_INDEX_IDPARENT => $l['idparent'], ARRAY_INDEX_TYPE => $type) + $vis_pag_grp[$l['idpage']];
     }
     //exit;
     /*
      * variables and their values
      */
     $r = query("SELECT count(*) as s, l.idpage as idpage, vv.name as vars_name, \n\t\t\t\t\t\t\tIF( varchar_value IS NULL, int_value,varchar_value) as vars_value\n\t\t\t\t FROM (((" . T_VISIT . " as v INNER JOIN " . T_LINK_VP . " as l USING (idvisit)) \n\t\t\t\t\tINNER JOIN " . T_LINK_VPV . " as ll USING (idlink_vp))\n\t\t\t\t\t\tINNER JOIN " . T_VARS . " as vv USING (idvars))\n\t\t\t\t WHERE v.server_date = '" . $this->date->get() . "'\n\t\t\t\t AND v.idsite = " . $this->site->getId() . " \n\t\t\t\t GROUP BY l.idpage, ll.idvars");
     while ($l = mysql_fetch_assoc($r)) {
         $vis_pag_grp[$l['idpage']][ARRAY_INDEX_VARS][$l['vars_name']][] = array(ARRAY_INDEX_VAR_COUNT => $l['s'], ARRAY_INDEX_VAR_VALUE => $l['vars_value']);
     }
     /*
      * entry pages
      */
     $r = query("SELECT count(*) as s, entry_idpage as c, sum(case total_pages when 1 then 1 else 0 end) as t\n\t\t\t\tFROM " . T_VISIT . "\n\t\t\t\tWHERE server_date = '" . $this->date->get() . "'\n\t\t\t\tAND idsite = " . $this->site->getId() . " \n\t\t\t\tGROUP BY c");
     while ($l = mysql_fetch_assoc($r)) {
         // pages that are only but always "one visit page"
         if ($l['t'] > 0) {
             $vis_pag_grp[$l['c']][ARRAY_INDEX_PAGES_VISIT_ONEPAGE] = $l['t'];
         }
         $vis_pag_grp[$l['c']][ARRAY_INDEX_ENTRYPAGE] = $l['s'];
     }
     /*
      * exit pages
      */
     $r = query("SELECT count(*) as s, exit_idpage as c\n\t\t\t\tFROM " . T_VISIT . "\n\t\t\t\tWHERE server_date = '" . $this->date->get() . "'\n\t\t\t\tAND idsite = " . $this->site->getId() . " \n\t\t\t\tGROUP BY c");
     while ($l = mysql_fetch_assoc($r)) {
         $vis_pag_grp[$l['c']][ARRAY_INDEX_EXITPAGE] = $l['s'];
     }
     $a_AllpageInfo = $vis_pag_grp;
     // sort array ording idLebel ASC
     uasort($a_AllpageInfo, "sortingAllPageInfo");
     $res = array();
     $res2 = array();
     foreach ($a_AllpageInfo as $key => $a_pageInfo) {
         if (!isset($a_pageInfo[ARRAY_INDEX_TYPE])) {
             printDebug('<b>There was a problem during archiving...</b>');
             //var_dump($a_pageInfo);
             //var_dump($key);
             //printDebug($a_pageInfo);
             continue;
         }
         // pages
         if (!isset($a_pageInfo[ARRAY_INDEX_TYPE]) || $a_pageInfo[ARRAY_INDEX_TYPE] === ARRAY_TYPE_PAGE) {
             $key = 'p' . $key;
         } else {
             if ($a_pageInfo[ARRAY_INDEX_TYPE] === ARRAY_TYPE_FILE) {
                 $key = 'f' . $key;
             } else {
                 echo "prob";
                 exit;
             }
         }
         $a = array($key => $a_pageInfo);
         if (isset($a_pageInfo[ARRAY_INDEX_IDCATEGORY]) && $a_pageInfo[ARRAY_INDEX_IDCATEGORY] != 0) {
             $res2 = $this->objects['treeCategory']->getTreeCompleted($a_pageInfo[ARRAY_INDEX_IDCATEGORY], $a);
         } else {
             $res2 = $a;
         }
         // merge recursively this page tree with global tree
         $res = array_merge_recursive($res, $res2);
     }
     if (DEBUG) {
         $t = strlen(serialize($res)) / 1000;
     }
     /*
      * convert page & category id from visit base to archive base
      * sum for groups, subgroups, etc. of values of
      * - hits
      * - entry point
      * - exit point
      * - length
      * - hits for each group varname-varvalue
      * - [...]
      */
     $this->walkAndSumArray($res);
     if (DEBUG) {
         $t = strlen(serialize($res)) / 1000;
     }
     $this->toRecord['vis_pag_grp'] = $res;
 }