function getExpr(&$rubrics)
{
    $expr = "";
    if (!StrUtils::isEmpty($_REQUEST["rubricsIds"])) {
        $rubs = explode(",", $_REQUEST["rubricsIds"]);
        $tmpRubrics = array();
        foreach ($rubs as $r) {
            $tmpRubrics = array_merge($tmpRubrics, $rubrics->getNoParentRubrics(trim($r)));
        }
        if (sizeof($tmpRubrics) == 0) {
            return new PEAR_Error("Empty subrubrics id for rubric");
        }
        $expr .= " AND rubrics.id IN (" . implode(", ", $tmpRubrics) . ") \n";
    }
    if (isset($_REQUEST["useParams"]) && $_REQUEST["useParams"] == "1") {
        if (isset($_REQUEST["status"])) {
            if (!in_array("all", $_REQUEST["status"]) && sizeof($_REQUEST["status"]) > 0) {
                $expr .= " AND (status LIKE '" . implode("' OR status LIKE '", $_REQUEST["status"]) . "') ";
            }
        }
        if (!StrUtils::isEmpty($_REQUEST["begdate"]) && trim($_REQUEST["begdate"]) !== "дд/мм/гггг" && !StrUtils::isEmpty($_REQUEST["enddate"]) && trim($_REQUEST["enddate"]) !== "дд/мм/гггг") {
            $begdate = split("/", $_REQUEST["begdate"]);
            $begdate = $begdate[2] . "-" . $begdate[1] . "-" . $begdate[0];
            $enddate = split("/", $_REQUEST["enddate"]);
            $enddate = $enddate[2] . "-" . $enddate[1] . "-" . $enddate[0];
            $expr .= " AND (lastdate >= '" . $begdate . "' AND lastdate <= '" . $enddate . "') \n";
        }
        if (!StrUtils::isEmpty($_REQUEST["city"]) && trim($_REQUEST["city"]) !== "город") {
            $expr .= " AND address LIKE '%" . trim($_REQUEST["city"]) . "%' \n";
        }
        if (!StrUtils::isEmpty($_REQUEST["keyword"]) && trim($_REQUEST["keyword"]) !== "ключевое слово") {
            $val = trim($_REQUEST["keyword"]);
            $expr .= " AND (address LIKE '%{$val}%' OR phone LIKE '%{$val}%'\n\t\t\t\tOR site LIKE '%{$val}%' OR items.name LIKE '%{$val}%'\n\t\t\t\tOR emailtext LIKE '%{$val}%' OR fax LIKE '%{$val}%') ";
        }
    }
    if (isset($_REQUEST["region"]) && (int) $_REQUEST["region"] > 0) {
        $expr .= " AND street_id IN (\n\t\t\tSELECT id FROM streets WHERE region_id = " . $_REQUEST["region"] . ") ";
    }
    $expr .= " AND level = 2 ";
    if (!StrUtils::isEmpty($_REQUEST["listType"]) && strcmp($_REQUEST["listType"], "uniques") == 0) {
        $expr .= " GROUP BY items.address, items.name ";
    }
    $expr .= " ORDER BY rubrics.id ";
    return $expr;
}
    function parseItems()
    {
        $items = array();
        $pagesNum = 0;
        $sitesNum = 0;
        $pattern = <<<PATTERN
{<div class="refblock">(.+?)</div>}s
PATTERN;
        $pattern = preg_replace("{\\s+}", "\\s*", $pattern);
        if (!preg_match($pattern, $this->pageContent, $matches)) {
            return new PEAR_Error("Items not found");
        }
        $pattern = "{<b>(.+?)</b>.+?<b>(.+?)</b>}si";
        if (preg_match($pattern, $matches[1], $m)) {
            $pagesNum = (int) StrUtils::cleanString($m[1], true);
            $sitesNum = (int) StrUtils::cleanString($m[2], true);
        }
        $items[] = array("pages" => $pagesNum, "sites" => $sitesNum, "url" => $this->url);
        return $items;
    }
    function getSiteRubrics2($url, $parentId = 0, $parserId = 0)
    {
        $logger =& Log::singleton("file", "results.log", __FUNCTION__);
        $contents = $this->loadPage($url);
        $pattern = '{
			<div class="blocklist">
				<a href="http://navigator.yp.ru/rusn/.+?
			</div>
		}si';
        $pattern = preg_replace("{\\s+}", "\\s*", $pattern);
        if (!preg_match($pattern, $contents, $matches)) {
            $logger->log("Rubrics2 for {$url} not found.");
            return new PEAR_Error("Rubrics2 for {$url} not found.");
        }
        $pattern = '{
			<a href="(http://navigator.yp.ru/rusn/[^"]+)">
			(.+?)
			</a>
		}si';
        $pattern = preg_replace("{\\s+}", "\\s*", $pattern);
        if (preg_match_all($pattern, $matches[0], $matches, PREG_SET_ORDER)) {
            $res = array();
            foreach ($matches as $m) {
                $url = StrUtils::cleanString($m[1]);
                $id = $this->rubricsData->addRubric($url, StrUtils::cleanString($m[2]), -1, $parserId, true, $parentId, 2);
                if (!PEAR::isError($id)) {
                    $res[] = array("id" => $id, "url" => $url);
                }
            }
            $logger->log(print_r($res, true));
            return $res;
        } else {
            $logger->log("Rubrics2 for {$url} not found.");
            return new PEAR_Error("Rubrics2 for {$url} not found.");
        }
    }
function HandleShowProcesses()
{
    session_start();
    require_once "Pager.php";
    require_once "RubricsData.php";
    require_once "StrUtils.php";
    $procNum = -1;
    if (!StrUtils::isEmpty($_REQUEST["procType"]) && $_REQUEST["procType"] == "all") {
        $_GLOBAL["procType"]["all"] = "selected";
        $_SESSION["procType"] = "all";
        $procNum = -1;
    } else {
        if (!StrUtils::isEmpty($_REQUEST["procType"]) && $_REQUEST["procType"] == "usual") {
            $_GLOBAL["procType"]["usual"] = "selected";
            $_SESSION["procType"] = "usual";
            $procNum = 0;
        } else {
            if (!StrUtils::isEmpty($_REQUEST["procType"]) && $_REQUEST["procType"] == "test") {
                $_GLOBAL["procType"]["test"] = "selected";
                $_SESSION["procType"] = "test";
                $procNum = 1;
            } else {
                if (!StrUtils::isEmpty($_REQUEST["procType"]) && $_REQUEST["procType"] == "spec") {
                    $_GLOBAL["procType"]["spec"] = "selected";
                    $_SESSION["procType"] = "spec";
                    $procNum = 2;
                } else {
                    if ($_SESSION["procType"] == "all") {
                        $_GLOBAL["procType"]["all"] = "selected";
                        $procNum = -1;
                    } else {
                        if ($_SESSION["procType"] == "usual") {
                            $_GLOBAL["procType"]["usual"] = "selected";
                            $procNum = 0;
                        } else {
                            if ($_SESSION["procType"] == "test") {
                                $_GLOBAL["procType"]["test"] = "selected";
                                $procNum = 1;
                            } else {
                                if ($_SESSION["procType"] == "spec") {
                                    $_GLOBAL["procType"]["spec"] = "selected";
                                    $procNum = 2;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if (isset($_REQUEST["bSelProcType"])) {
        $_REQUEST["pageID"] = 0;
    }
    header("Content-type: text/html; charset=windows-1251");
    print " ";
    $header = array("Дата", "Время начала", "Время окончания", "Название процесса", "Cтатус", "Очередь");
    $rubricsData = new RubricsData();
    $data = array();
    $navContent = getPagesHtml($rubricsData, $data, $procNum);
    print <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<html><head><title>Журнал текущего состояния</title>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
<meta name="description" content="">
<meta name="keywords" content="">
<link type="text/css" rel="stylesheet" href="styles/style.css">
<script src="scripts/jquery.js"></script>
</head>
<body><div id="container" class="stats"><div id="page">
<div id="content"><div id="header">
<a href="./categs.html">Категории</a> &nbsp; 
| &nbsp; <a href="./tasks.html"><b>Журнал обновлений</b></a> &nbsp; 
| &nbsp; <a href="./stat.html">Статистика скачиваний</a></div>

<div id="main_content">
<h1>Журнал обновлений</h1>
<strong style="font-size: 11px;">Обновление статистики производится ежедневно после 06.00, 12.00, 16.00, 20.00, 00.00 часов.</strong>
<p>&nbsp;</p>
<form id="selProc" name="selProc" action="" method="POST">
<input type="hidden" name="action" value="ShowProcesses">
<select name="procType" style="width: 150pt;">
<option value="all" {$_GLOBAL['procType']['all']}>Все</option>
<option value="usual" {$_GLOBAL['procType']['usual']}>Обычная очередь</option>
<option value="test" {$_GLOBAL['procType']['test']}>Тестовая очередь</option>
<option value="spec" {$_GLOBAL['procType']['spec']}>Специальная очередь</option>
</select>
<input name="bSelProcType" type="submit" value="Выбрать">
</form>
<br><br><br>
<p>
{$navContent}
<p>
<br>
<table border=0 cellspacing=1 cellpadding=3>
HTML;
    print "<thead><tr><th>" . implode("<th>", $header) . "</tr></thead>\n";
    $empty = "&nbsp;";
    $even = true;
    if ($procNum >= 0) {
        $expr = " AND processes.rprocess_num = {$procNum} ";
    } else {
        $expr = "";
    }
    $ids = "";
    if (sizeof($data) > 0) {
        foreach ($data as $r) {
            $ids .= $r[0] . ",";
        }
        $ids = substr($ids, 0, -1);
        $res =& $rubricsData->getProcesses(" WHERE processes.id IN ({$ids}) {$expr}", true);
        if (PEAR::isError($res)) {
            print $res->getMessage() . "<br>";
            print $res->getuserInfo() . "<br>";
            exit;
        }
        foreach ($res as $row) {
            //while ($row = &$res->fetchRow(DB_FETCHMODE_ASSOC)) {
            $row["name"] = $rubricsData->getPath($row["rubric_id"]) . " / " . $row["name"];
            unset($row["rubric_id"]);
            $row["adddate"] = date("d.m.Y H:i", strtotime($row["adddate"]));
            $row["startdate"] = $row["startdate"] == 0 ? $empty : date("d.m.Y H:i", strtotime($row["startdate"]));
            $row["enddate"] = $row["enddate"] == 0 ? $empty : date("d.m.Y H:i", strtotime($row["enddate"]));
            if ($row["loaded"] == 0 && $row["startdate"] === $empty) {
                $row["loaded"] = "Поставлено в очередь";
            } else {
                $row["loaded"] = $row["loaded"] == 1 ? "Обновлено" : "Идет обновление";
            }
            if ($row["rprocess_num"] == 0) {
                $row["rprocess_num"] = "Основная";
            } else {
                if ($row["rprocess_num"] == 1) {
                    $row["rprocess_num"] = "Тестовая";
                } else {
                    if ($row["rprocess_num"] == 2) {
                        $row["rprocess_num"] = "Специальная";
                    }
                }
            }
            if ($even) {
                $evenClass = ' class="even" ';
            } else {
                $evenClass = '';
            }
            $even = !$even;
            print "<tr {$evenClass}><th>" . implode("<th>", $row) . "</tr>\n";
        }
    }
    print <<<HTML
</table>
<br>
<p>
{$navContent}
<p>
</div>
</div></div></div><div id="footer"></div>
</body></html>
HTML;
}
 function findUrl($url, $link)
 {
     $filtered = "";
     $link = strtolower(UrlUtils::removeWWW(str_replace("http://", "", $link)));
     $contents = $this->loadPage($url);
     $pattern = "{<a[^>]+?(href=\".+?\"|href='.+?'|href=.+?\\s)[^>]*>(.+?)</a>}si";
     if (!preg_match_all($pattern, $contents, $matches, PREG_SET_ORDER)) {
         return $filtered;
     }
     foreach ($matches as $match) {
         $src = strtolower(StrUtils::removeQuotes(substr($match[1], 5)));
         $src = parse_url($src);
         $src = UrlUtils::removeWWW($src["host"]);
         if (strcmp($src, $link) == 0) {
             $filtered = StrUtils::cleanString($match[2]);
             break;
         } else {
             if (strpos($src, $link) !== false) {
                 $filtered = StrUtils::cleanString($match[2]);
             }
         }
     }
     return $filtered;
 }
function HandleStoreItemChanges()
{
    header("Location: ItemInfo.php");
    require_once "StrUtils.php";
    define("CMD_COPY_ITEM", <<<SQL
\t\tINSERT INTO our_items (
\t\t\titem_id, art, url, name, price, descr, image_large,
\t\t\timage_small, size, material, drawing, minnum,
\t\t\tcolors, brandname, country, descr_other)
\t\tSELECT id AS item_id, art, url, name, price, descr, image_large,
\t\t\timage_small, size, material, drawing, minnum,
\t\t\tcolors, brandname, country, descr_other
\t\t\tFROM items WHERE items.id = ?
SQL
);
    define("CMD_SET_STAT", <<<SQL
\t\tUPDATE items SET status = ? WHERE id = ?
SQL
);
    global $db;
    if (strcmp($_REQUEST["infoType"], "item") == 0) {
        require_once "../parsers/ContentGrabber.php";
        $parser =& new ContentGrabber();
        // Получить поля для обновления
        $fields = array();
        $fieldsNames = array_intersect(array_keys($parser->getAllFields()), array_keys($_REQUEST));
        foreach ($fieldsNames as $field) {
            $fields[$field] = StrUtils::removeMagicQuotes($_REQUEST[$field]);
        }
        $fields["viewmode"] = isset($_REQUEST["viewmode"]) ? 1 : 0;
        if (sizeof($fields) > 0) {
            if ($_REQUEST["newItem"]) {
                $sql = getUpdateSQL("our_items", $fields, "id = " . $_REQUEST["itemId"]);
                $res =& $db->query($sql, array_values($fields));
                if (PEAR::isError($res)) {
                    $_SESSION["statusMsg"] = "Ошибка при сохранении данных";
                    exit;
                }
            } else {
                // Получить id измененых данных
                $idChanged =& $db->getOne(CMD_SEL_CHANGED_ID, array($_REQUEST["itemId"]));
                if (PEAR::isError($idChanged)) {
                    $_SESSION["statusMsg"] = "Ошибка при сохранении данных";
                    exit;
                }
                // Есть изменения
                if (isset($idChanged)) {
                    // Обновить изменения
                    $sql = getUpdateSQL("our_items", $fields, "id = " . $idChanged);
                } else {
                    // Добавить изменения
                    // Cкопировать данные из items
                    $res =& $db->query(CMD_COPY_ITEM, $_REQUEST["itemId"]);
                    if (PEAR::isError($res)) {
                        $_SESSION["statusMsg"] = "Ошибка при сохранении данных";
                        exit;
                    }
                    $idChanged =& $db->getOne(CMD_SEL_CHANGED_ID, array($_REQUEST["itemId"]));
                    if (PEAR::isError($idChanged) || !isset($idChanged)) {
                        $_SESSION["statusMsg"] = "Ошибка при сохранении данных";
                        exit;
                    }
                    $sql = getUpdateSQL("our_items", $fields, "id = " . $idChanged);
                }
                $res =& $db->query($sql, array_values($fields));
                if (PEAR::isError($res)) {
                    $_SESSION["statusMsg"] = "Ошибка при сохранении данных";
                    exit;
                }
                // Установить флаг изменения записи
                $res =& $db->query("UPDATE items SET existence = 'changed' WHERE id = ?", array($_REQUEST["itemId"]));
            }
        }
    } else {
        if (strcmp($_REQUEST["infoType"], "ourcategory") == 0) {
            $fields = array();
            if (isset($_REQUEST["descr"])) {
                $fields["descr"] = $_REQUEST["descr"];
            }
            if (isset($_REQUEST["dirname"])) {
                $fields["dirname"] = $_REQUEST["dirname"];
            }
            $fields["viewmode"] = isset($_REQUEST["viewmode"]) ? 1 : 0;
            $fields["colorsheme"] = isset($_REQUEST["colorsheme"]) ? 1 : 0;
            $sql = getUpdateSQL("our_categories", $fields, "id = " . $_REQUEST["itemId"]);
            $res =& $db->query($sql, array_values($fields));
            if (PEAR::isError($res)) {
                $_SESSION["statusMsg"] = "Ошибка при сохранении данных";
                exit;
            }
        }
    }
    $_SESSION["statusMsg"] = "Изменения сохранены";
}