<?php

if ($token != $_SESSION['token'] || $_SESSION['links'][$index]->url != $url) {
    showFatalError("Bookmark garbled!  Please <a href=\"?action=restart\">" . "restart.</a>");
}
if ($_SESSION['links_ctime'] < filectime($bookmarkFile)) {
    showFatalError("Stale bookmark list detected!  " . "Please <a href=\"?action=restart\">restart</a>");
}
unset($_SESSION['links'][$index]);
$_SESSION['links'] = array_values($_SESSION['links']);
writeLinkFile($bookmarkFile, $_SESSION['links']);
refreshLinks($SESSION, $bookmarkFile);
include 'templates/list.html';
<?php

$index = $REQUEST['index'];
$url = $REQUEST['url'];
// Quick sanity check to make sure we are not getting stale or bogus info
if ($_SESSION['links'][$index]->url != $url) {
    showFatalError("Bookmark garbled!  Please <a href=\"?action=restart\">" . "restart.</a>");
}
$_SESSION['links'][$index]->lastVisitedTimestamp = time();
$_SESSION['links'][$index]->visitCount++;
writeLinkFile($bookmarkFile, $_SESSION['links']);
refreshLinks($bookmarkFile);
header("Location: {$_SESSION['links'][$index]->url}\r\n");
/**
 * parseLinkFile
 *   Extract a list of CLinkClass objects from a HTML bookmark file
 */
function parseLinkFile($linkFileName)
{
    $links = array();
    $index = 0;
    if (!($linkFile = file_get_contents($linkFileName))) {
        showFatalError("Cannot open link file '{$linkFileName}'");
    }
    $openBracePos = strpos($linkFile, '<');
    $closeBracePos = strpos($linkFile, '>', $openBracePos);
    $done = $closeBracePos == 0 || $linkFile[$openBracePos] != '<';
    while (!$done) {
        if ($linkFile[$openBracePos + 1] == '/') {
            $closeTag = strtolower(substr($linkFile, $openBracePos + 2, $closeBracePos - $openBracePos - 2));
            DEBUG("closing tag '{$closeTag}' detected.\n");
            if ($closeTag == $openTag) {
                $tagElementEnd = $openBracePos;
                $tagElement = substr($linkFile, $tagElementStart, $tagElementEnd - $tagElementStart);
                DEBUG("tag element = '{$tagElement}'\n");
            }
            switch ($closeTag) {
                case "h2":
                    $category = trim($tagElement);
                    break;
                case "a":
                    $description = trim($tagElement);
                    break;
                case "li":
                    DEBUG("creating new link ({$url}, {$description}, {$category})\n");
                    array_push($links, new CLinkClass($url, $description, $category, $createdTimestamp, $lastVisitedTimestamp, $visitCount, $index));
                    $index++;
                    break;
            }
        } else {
            $openTag = substr($linkFile, $openBracePos + 1, $closeBracePos - $openBracePos - 1);
            $tagElementStart = $closeBracePos + 1;
            preg_match_all('/\\s(\\S*)\\s*=\\s*"([^"]*)"/', $openTag, $matches, PREG_SET_ORDER);
            // 	array_shift($matches);
            foreach ($matches as $match) {
                $attributes[strtolower($match[1])] = $match[2];
                DEBUG("Set attrib[{$match['1']}] = '{$match['2']}'\n");
            }
            $spacePos = strpos($openTag, ' ');
            if ($spacePos > 0) {
                $openTag = substr($openTag, 0, $spacePos);
            }
            $openTag = strtolower($openTag);
            DEBUG("opening tag '{$openTag}' detected\n");
            switch ($openTag) {
                case 'a':
                    $url = $attributes['href'];
                    $createdTimestamp = $attributes['createdtimestamp'];
                    $lastVisitedTimestamp = $attributes['lastvisitedtimestamp'];
                    $visitCount = $attributes['visitcount'];
                    break;
            }
        }
        if (!($openBracePos = strpos($linkFile, '<', $closeBracePos))) {
            DEBUG("done (no more open braces found).\n");
            $done = TRUE;
        }
        if (!($closeBracePos = strpos($linkFile, '>', $openBracePos))) {
            DEBUG("done (no more close braces found).\n");
            $done = TRUE;
        }
    }
    return $links;
}