Beispiel #1
0
    /**
     * Vis en node
     */
    public static function parse_node()
    {
        if (!self::$node_id) {
            page_not_found();
        }
        // deaktivert?
        if (self::$node_info['node_enabled'] == 0 || self::$node_info['parent_enabled'] == 0) {
            if (!access::has("crewet", null, null, "login")) {
                page_not_found();
            }
            // gi tilgang
            if (self::$node_info['node_enabled'] > 0) {
                ess::$b->page->add_message("En av foreldrene til denne siden er deaktivert og derfor er også denne siden deaktivert. Du kan vise den fordi du er logget inn.");
            } else {
                ess::$b->page->add_message("Denne siden er egentlig deaktivert. Du kan vise den fordi du er logget inn.");
            }
        }
        $filter = " AND ni_enabled > 0";
        if (isset($_GET['show_disabled_units']) && access::has("crewet")) {
            // hvor mange enheter er deaktivert?
            $result = \Kofradia\DB::get()->query("SELECT COUNT(ni_id) FROM nodes_items WHERE ni_node_id = " . self::$node_id . " AND ni_enabled = 0 AND ni_deleted = 0");
            $ant = $result->fetchColumn(0);
            if ($ant == 0) {
                ess::$b->page->add_message("Det finnes ingen deaktiverte enheter på denne siden.");
            } else {
                ess::$b->page->add_message("Viser <b>{$ant}</b> deaktivert" . ($ant == 1 ? '' : 'e') . " enheter.");
            }
            $filter = "";
        }
        // tittel
        if (!self::$node_params->get("hide_title")) {
            echo '
<h1>' . htmlspecialchars(self::$node_info['node_title']) . '</h1>';
        }
        // vis enhetene
        $result = \Kofradia\DB::get()->query("SELECT ni_id, ni_type, nir_content, nir_params, nir_time FROM nodes_items LEFT JOIN nodes_items_rev ON nir_id = ni_nir_id WHERE ni_node_id = " . self::$node_id . $filter . " AND ni_deleted = 0 ORDER BY ni_priority");
        while ($row = $result->fetch()) {
            echo nodes::content_build($row);
        }
        if (!self::$node_params->get("hide_time_change")) {
            echo '
<p align="right" style="color:#AAAAAA;font-size:10px">
	Sist endret ' . ess::$b->date->get(self::$node_info['node_change'])->format() . '
</p>';
        }
        // linker
        if (access::has("crewet")) {
            $url = $_SERVER['REQUEST_URI'];
            if (($pos = mb_strpos($url, "?")) !== false) {
                $url = mb_substr($url, 0, $pos);
            }
            echo '
<p style="color:#AAA;text-align:right;font-size:10px">[<a href="' . ess::$s['relative_path'] . '/node/a?node_id=' . self::$node_id . '">rediger side</a>]' . (isset($_GET['show_disabled_units']) ? ' [<a href="' . game::address($url, $_GET, array("show_disabled_units")) . '">skjul deaktiverte enheter</a>]' : ' [<a href="' . game::address($url, $_GET, array(), array("show_disabled_units" => true)) . '">vis deaktiverte enheter</a>]') . '</p>';
        }
    }
Beispiel #2
0
 /**
  * Nodesøk
  */
 protected function node_search($cid, $dest, $search)
 {
     $search = utf8_decode($search);
     // hent all informasjon
     $result = \Kofradia\DB::get()->query("SELECT node_id, node_parent_node_id, node_title, node_type, node_params, node_show_menu, node_expand_menu, node_enabled, node_priority, node_change FROM nodes");
     $nodes = array();
     while ($row = $result->fetch()) {
         $row['params'] = new params($row['node_params']);
         $row['enheter'] = array();
         $row['plain'] = "";
         $nodes[$row['node_id']] = $row;
     }
     if (count($nodes) == 0) {
         $this->msg($cid, $dest, "Ingen siden eksisterer.");
         return;
     }
     // sett opp søkekriteriene
     $search_list = search_query($search);
     $search_list = $search_list[1];
     $search_list2 = $search_list;
     // for delvise treff
     foreach ($search_list as &$q) {
         $q = '/(\\P{L}|^)' . preg_replace(array('/([\\/\\\\\\[\\]()$.+?|{}])/', '/\\*\\*+/', '/\\*/'), array('\\\\$1', '*', '\\S*'), $q) . '(\\P{L}|$)/i';
     }
     // sett opp søkeliste hvor vi søker med * på slutten av ordene
     foreach ($search_list2 as &$q) {
         $q = '/' . preg_replace(array('/([\\/\\\\\\[\\]()$.+?|{}])/', '/\\*\\*+/', '/\\*/'), array('\\\\$1', '*', '\\S*'), $q) . '/i';
     }
     // hent alle enhetene
     $result = \Kofradia\DB::get()->query("SELECT ni_id, ni_node_id, ni_type, nir_content, nir_params, nir_time FROM nodes_items LEFT JOIN nodes_items_rev ON nir_id = ni_nir_id WHERE ni_enabled != 0 AND ni_deleted = 0 ORDER BY ni_priority");
     while ($row = $result->fetch()) {
         if (!isset($nodes[$row['ni_node_id']])) {
             continue;
         }
         $data = nodes::content_build($row);
         $nodes[$row['ni_node_id']]['enheter'][] = $data;
         // bygg opp plain tekst
         $plain = preg_replace("/<br[^\\/>]*\\/?>/", "\n", $data);
         $plain = preg_replace("/(<\\/?(h[1-6]|p)[^>]*>)/", "\n\\1", $plain);
         $plain = html_entity_decode(strip_tags($plain));
         $plain = preg_replace("/(^ +| +\$|\\r)/m", "", $plain);
         #$plain = preg_replace("/(?<![!,.\\n ])\\n/", " ", $plain);
         $plain = preg_replace("/\\n/", " ", $plain);
         $plain = preg_replace("/  +/", " ", $plain);
         $plain = trim($plain);
         $nodes[$row['ni_node_id']]['plain'] .= $plain . " ";
     }
     // sett opp riktige referanser og lag tree
     $sub = array();
     foreach (nodes::$nodes as $row) {
         if ($row['node_enabled'] != 0) {
             $sub[$row['node_parent_node_id']][] = $row['node_id'];
         }
     }
     $tree = new tree($sub);
     $data = $tree->generate(0, NULL, $nodes);
     // sett opp paths
     $paths = array();
     $path = array();
     $number = 1;
     foreach ($data as $row) {
         for (; $row['number'] <= $number; $number--) {
             // fjern fra path
             array_pop($path);
         }
         if ($row['number'] >= $number) {
             // legg til i path
             $path[] = $row['data']['node_title'];
         }
         $paths[$row['data']['node_id']] = $path;
         $number = $row['number'];
     }
     // sett opp søkeresultater
     $result = array();
     $points = array();
     $points2 = array();
     foreach ($data as $row) {
         if ($row['data']['node_type'] != "container") {
             continue;
         }
         // utfør søk
         $found = true;
         $p = 0;
         $p2 = 0;
         foreach ($search_list as $key => $regex) {
             $ok = false;
             $matches = null;
             // søk i teksten
             if (preg_match_all($regex, $row['data']['plain'], $matches)) {
                 $ok = true;
                 $p += count($matches[0]);
             }
             if (preg_match_all($search_list2[$key], $row['data']['plain'], $matches)) {
                 $ok = true;
                 $p2 += count($matches[0]);
             }
             // søk i tittelen
             if (preg_match_all($regex, $row['data']['node_title'], $matches)) {
                 $ok = true;
                 $p += count($matches[0]);
             }
             if (preg_match_all($search_list2[$key], $row['data']['node_title'], $matches)) {
                 $ok = true;
                 $p2 += count($matches[0]);
             }
             if ($ok) {
                 continue;
             }
             $found = false;
             break;
         }
         // fant?
         if ($found) {
             $result[] = $row;
             $points[] = $p;
             $points2[] = $p2;
         }
     }
     // vis søkeresultater
     if (count($result) == 0) {
         $this->msg($cid, $dest, "Ingen treff ble funnet.");
     }
     // sorter søkeresultatene
     array_multisort($points, SORT_DESC, SORT_NUMERIC, $points2, SORT_DESC, SORT_NUMERIC, $result);
     $this->msg($cid, $dest, count($result) . " treff ble funnet - " . ess::$s['path'] . '/node/search?q=' . urlencode($search));
     $i = 0;
     foreach ($result as $key => $row) {
         if ($i++ == 3) {
             break;
         }
         $partial = $points2[$key] - $points[$key];
         if ($row['data']['node_id'] == nodes::$default_node) {
             $url = ess::$s['path'] . '/node';
         } else {
             $url = ess::$s['path'] . '/node/' . $row['data']['node_id'];
         }
         $m = array();
         if ($points[$key] > 0) {
             $m[] = $points[$key] . ' treff';
         }
         if ($partial > 0) {
             $m[] = fwords("%d delvis treff", "%d delvise treff", $partial);
         }
         $this->msg($cid, $dest, implode(", ", $m) . ": " . implode(" -> ", $paths[$row['data']['node_id']]) . " {$url}");
     }
 }
Beispiel #3
0
    public static function main()
    {
        // har vi ikke tilgang?
        if (!access::has("crewet", null, null, "login")) {
            redirect::handle("/node", redirect::ROOT);
        }
        ess::$b->page->add_title("Innholdsredigering");
        nodes::add_node(0, "Innholdsredigering", ess::$s['relative_path'] . "/node/a");
        if (isset($_POST['abort']) && !isset($_GET['node_id'])) {
            ess::$b->page->add_message("Handlingen ble avbrutt.");
            redirect::handle();
        }
        // opprette ny node?
        if (isset($_GET['new_node'])) {
            $parent_node = getval("parent_node", 0);
            $previous_node = getval("previous_node", 0);
            // kontroller parent node
            if ($parent_node != 0 && !isset(nodes::$nodes[$parent_node])) {
                ess::$b->page->add_message("Fant ikke forelder til elementet. Prøv på nytt.", "error");
                redirect::handle();
            }
            // kontroller previous node
            $siblings = isset(nodes::$nodes_sub[$parent_node]) ? nodes::$nodes_sub[$parent_node] : array();
            if ($previous_node != 0 && !in_array($previous_node, $siblings)) {
                ess::$b->page->add_message("Fant ikke forrige side. Prøv på nytt.", "error");
                redirect::handle();
            }
            // finn priority
            if ($previous_node == 0) {
                $priority = 1;
                $priority_num = 1;
            } else {
                // hent priority til previous node
                $result = \Kofradia\DB::get()->query("SELECT node_priority FROM nodes WHERE node_parent_node_id = {$parent_node} AND node_id = {$previous_node} AND node_deleted = 0");
                if ($result->rowCount() == 0) {
                    ess::$b->page->add_message("Noe gikk galt. Prøv igjen.", "error");
                    redirect::handle();
                }
                $priority = $result->fetchColumn(0);
                // hent priority til den vi skal "erstatte"
                $result = \Kofradia\DB::get()->query("SELECT node_priority FROM nodes WHERE node_parent_node_id = {$parent_node} AND node_priority > {$priority} AND node_deleted = 0 ORDER BY node_priority LIMIT 1");
                if ($result->rowCount() > 0) {
                    $priority = $result->fetchColumn(0);
                } else {
                    $priority++;
                }
                // hent nummer
                $result = \Kofradia\DB::get()->query("SELECT COUNT(node_id) FROM nodes WHERE node_parent_node_id = {$parent_node} AND node_priority < {$priority} AND node_deleted = 0");
                $priority_num = $result->fetchColumn(0) + 1;
            }
            // legge til?
            if (isset($_POST['title']) && isset($_POST['type'])) {
                // ok tittel?
                $title = trim(postval("title"));
                $type = postval("type");
                if (empty($title)) {
                    ess::$b->page->add_message("Du må fylle ut en tittel.", "error");
                } elseif (!isset(nodes::$types[$type])) {
                    ess::$b->page->add_message("Ugyldig type. Prøv på nytt.", "error");
                } else {
                    // sett opp prioritys
                    \Kofradia\DB::get()->exec("UPDATE nodes SET node_priority = node_priority + 1 WHERE node_parent_node_id = {$parent_node} AND node_priority >= {$priority}");
                    // legg til side
                    \Kofradia\DB::get()->exec("INSERT INTO nodes SET node_parent_node_id = {$parent_node}, node_title = " . \Kofradia\DB::quote($title) . ", node_type = " . \Kofradia\DB::quote(mb_strtolower($type)) . ", node_priority = {$priority}, node_change = " . time());
                    $iid = \Kofradia\DB::get()->lastInsertId();
                    ess::$b->page->add_message("Siden ble lagt til.");
                    redirect::handle("node/a?node_id={$iid}", redirect::ROOT);
                }
            }
            $parent_title = isset(nodes::$nodes[$parent_node]) ? nodes::$nodes[$parent_node]['node_title'] : 'Toppnivå';
            echo '
<h1>Ny side</h1>
<form action="" method="post">
	<dl class="dd_right dl_2x">
		<dt>Forelder</dt>
		<dd>' . htmlspecialchars($parent_title) . '</dd>
		<dt>Plassering</dt>
		<dd>' . $priority_num . '</dd>
		<dt>Tittel</dt>
		<dd><input type="text" name="title" class="styled w100" value="' . htmlspecialchars(postval("title")) . '" /></dd>
		<dt>Type</dt>
		<dd>
			<select name="type">';
            $selected = postval("type");
            if (!isset(nodes::$types[$selected])) {
                $selected = false;
            }
            foreach (nodes::$types as $key => $value) {
                echo '
				<option value="' . htmlspecialchars($key) . '"' . ($selected == $key ? ' selected="selected"' : '') . '>' . htmlspecialchars($value) . '</option>';
            }
            echo '
			</select>
		</dd>
	</dl>
	<p>' . show_sbutton("Opprett side") . ' ' . show_sbutton("Avbryt", 'name="abort"') . '</p>
</form>';
            page_node::load_page();
        }
        $node = false;
        if (isset($_GET['node_id'])) {
            $result = nodes::load_node($_GET['node_id'], false);
            if (!$result) {
                ess::$b->page->add_message("Fant ikke enheten.");
                redirect::handle();
            }
            $node = true;
            #ess::$b->page->add_title(nodes::$node_info['node_title']);
            redirect::store("node/a?node_id=" . nodes::$node_id, redirect::ROOT);
            if (isset($_POST['abort'])) {
                ess::$b->page->add_message("Handlingen ble avbrutt.");
                redirect::handle();
            }
            // flytt
            if (isset($_GET['move'])) {
                // hent tree
                $root = array(0 => array("number" => 0, "prefix" => "", "prefix_node" => "", "data" => array("node_id" => 0, "node_parent_node_id" => 0, "node_title" => "Innhold (toppnivå)", "node_type" => NULL, "node_params" => NULL, "node_show_menu" => NULL, "node_expand_menu" => NULL, "node_enabled" => true, "node_priority" => 0)));
                $tree = new tree(nodes::$nodes_sub);
                $data = $tree->generate(0, $root, nodes::$nodes);
                // sett opp data og finn ut hvor ting kan plasseres
                $number_last = 1;
                $disabled = 0;
                $list = array(0 => 0);
                foreach ($data as &$row) {
                    if ($disabled != 0 && $row['number'] <= $disabled) {
                        $disabled = 0;
                    }
                    $number_last = $row['number'];
                    $row['inside'] = $disabled == 0 && nodes::$node_id != $row['data']['node_id'];
                    $row['under'] = $disabled == 0 && nodes::$node_id != $row['data']['node_id'];
                    if (nodes::$node_id == $row['data']['node_id']) {
                        if (isset($list[$row['number']])) {
                            $active = array("under", $list[$row['number']]);
                        } else {
                            $active = array("inside", $list[$row['number'] - 1]);
                        }
                        $disabled = $row['number'];
                    }
                    $list[$row['number']] = $row['data']['node_id'];
                }
                unset($row);
                $data[0]['under'] = false;
                // lagre endringer?
                if (isset($_POST['destination_node_id'])) {
                    $match = preg_match("/^(under_)?(\\d+)\$/u", postval("destination_node_id"), $matches);
                    $type = $match && $matches[1] == "under_" ? "under" : "inside";
                    $dest_node_id = $match ? $matches[2] : -1;
                    $parent_node_id = $type == "inside" ? $dest_node_id : nodes::$nodes[$dest_node_id]['node_parent_node_id'];
                    // finnes?
                    if (!isset($data[$dest_node_id])) {
                        ess::$b->page->add_message("Fant ikke målsiden.", "error");
                    } elseif (!$data[$dest_node_id][$type]) {
                        ess::$b->page->add_message("Du kan ikke plassere siden her.", "error");
                    } elseif ($type == $active[0] && $dest_node_id == $active[1]) {
                        ess::$b->page->add_message("Du må velge en ny plassering.", "error");
                    } else {
                        \Kofradia\DB::get()->beginTransaction();
                        // flytt de andre kategoriene
                        \Kofradia\DB::get()->exec("UPDATE nodes SET node_priority = node_priority - 1 WHERE node_parent_node_id = " . nodes::$node_info['node_parent_node_id'] . " AND node_priority > " . nodes::$node_info['node_priority']);
                        \Kofradia\DB::get()->exec("UPDATE nodes SET node_priority = node_priority + 1 WHERE node_parent_node_id = {$parent_node_id}" . ($type == "under" ? " AND node_priority > " . nodes::$nodes[$dest_node_id]['node_priority'] : ""));
                        // flytt den valgte siden
                        \Kofradia\DB::get()->exec("UPDATE nodes SET node_parent_node_id = {$parent_node_id}, node_priority = " . ($type == "inside" ? 0 : nodes::$nodes[$dest_node_id]['node_priority'] + 1) . " WHERE node_id = " . nodes::$node_id);
                        \Kofradia\DB::get()->commit();
                        ess::$b->page->add_message("Siden ble flyttet.");
                        redirect::handle();
                    }
                }
                // sett opp plasseringen
                $items = array();
                $parent_node = nodes::$node_info['node_parent_node_id'];
                while (isset(nodes::$nodes[$parent_node]) && ($item = nodes::$nodes[$parent_node])) {
                    $items[] = $item['node_title'];
                    $parent_node = $item['node_parent_node_id'];
                }
                $items[] = "Toppnivå";
                // tittel
                ess::$b->page->add_title("Flytt side");
                nodes::add_node(0, "Flytt side", ess::$s['relative_path'] . "/node/a?node_id=" . nodes::$node_id . "&amp;move");
                echo '
<h1>' . htmlspecialchars(nodes::$node_info['node_title']) . '</h1>
<p><a href="' . ess::$s['relative_path'] . '/node/a?node_id=' . nodes::$node_id . '">Tilbake</a></p>

<h2>Flytt side</h2>
<form action="" method="post">
	<dl class="dl_2x dd_right">
		<dt>Nåværende plassering</dt>
		<dd>' . implode("\\", array_reverse($items)) . '</dd>
		
		<dt>Ny plassering</dt>
		<dd>
			<table class="table" style="margin-left: auto">
				<thead>
					<tr>
						<th>Side</th>
						<th>Inni</th>
						<th>Nedenfor</th>
					</tr>
				</thead>
				<tbody class="c">';
                $i = 0;
                foreach ($data as $row) {
                    $i++;
                    $class = nodes::$node_id == $row['data']['node_id'] ? ' class="highlight"' : ($i % 2 == 0 ? ' class="color"' : '');
                    $link = $row['data']['node_id'] == 0 ? $row['data']['node_title'] : '<a href="' . ess::$s['relative_path'] . '/node/a?node_id=' . $row['data']['node_id'] . '">' . htmlspecialchars($row['data']['node_title']) . '</a>';
                    echo '
					<tr' . $class . '>
						<td class="l"><span class="plain">' . $row['prefix'] . $row['prefix_node'] . '</span> ' . $link . '</td>
						<td>' . ($row['inside'] ? '<input type="radio" name="destination_node_id" value="' . $row['data']['node_id'] . '"' . ($active[0] == "inside" && $active[1] == $row['data']['node_id'] ? ' checked="checked"' : '') : ' x') . '</td>
						<td>' . ($row['under'] ? '<input type="radio" name="destination_node_id" value="under_' . $row['data']['node_id'] . '"' . ($active[0] == "under" && $active[1] == $row['data']['node_id'] ? ' checked="checked"' : '') : ' x') . '</td>
					</tr>';
                }
                echo '
				</tbody>
			</table>
		</dd>
		
		<dt>&nbsp;</dt>
		<dd>' . show_sbutton("Lagre endringer") . '</dd>
	</dl>
</form>';
                page_node::load_page();
            }
            // rediger tittel
            if (isset($_GET['edit_title'])) {
                // lagre?
                if (isset($_POST['title'])) {
                    $title = postval('title');
                    if (empty($title)) {
                        ess::$b->page->add_message("Du må skrive inn en tittel.", "error");
                    } else {
                        // oppdater
                        \Kofradia\DB::get()->exec("UPDATE nodes SET node_title = " . \Kofradia\DB::quote($title) . " WHERE node_id = " . nodes::$node_id);
                        ess::$b->page->add_message("Tittelen ble endret fra &laquo;" . htmlspecialchars(nodes::$node_info['node_title']) . "&raquo; til &laquo;" . htmlspecialchars($title) . "&raquo;.");
                        redirect::handle();
                    }
                }
                echo '
<h1>Rediger tittel</h1>
<form action="" method="post">
	<dl class="dd_right dl_2x">
		<dt>Nåværende tittel</dt>
		<dd>' . htmlspecialchars(nodes::$node_info['node_title']) . '</dd>
		<dt>Ny tittel</dt>
		<dd><input type="text" name="title" class="styled w100" value="' . htmlspecialchars(postval("title", nodes::$node_info['node_title'])) . '" /></dd>
	</dl>
	<p>' . show_sbutton("Lagre") . ' ' . show_sbutton("Avbryt", 'name="abort"') . '</p>
</form>';
                page_node::load_page();
            }
            // aktiver/deaktiver
            if (isset($_GET['enabled'])) {
                $update = false;
                if ($_GET['enabled'] == "false") {
                    // deaktiver
                    if (nodes::$node_info['node_enabled'] > 0) {
                        $update = 0;
                        ess::$b->page->add_message("Siden er nå deaktivert. Alle undersider vil også være utilgjengelige.");
                    }
                } else {
                    // aktiver
                    if (nodes::$node_info['node_enabled'] == 0) {
                        $update = 1;
                        ess::$b->page->add_message("Siden er nå aktivert. Alle undersider som ikke er deaktivert vil også være tilgjengelige.");
                    }
                }
                // oppdater?
                if ($update !== false) {
                    \Kofradia\DB::get()->exec("UPDATE nodes SET node_enabled = {$update} WHERE node_id = " . nodes::$node_id);
                }
                redirect::handle();
            }
            // skjul fra/vis i menyen
            if (isset($_GET['show_menu'])) {
                $update = false;
                if ($_GET['show_menu'] == "false") {
                    // deaktiver
                    if (nodes::$node_info['node_show_menu'] > 0) {
                        $update = 0;
                        ess::$b->page->add_message("Siden blir ikke lengre vist i menyen. Alle undersider vil også bli skjult fra menyen.");
                    }
                } else {
                    // aktiver
                    if (nodes::$node_info['node_show_menu'] == 0) {
                        $update = 1;
                        ess::$b->page->add_message("Siden blir nå vist i menyen. Alle undersider som ikke er skjult vil også bli vist i menyen.");
                    }
                }
                // oppdater?
                if ($update !== false) {
                    \Kofradia\DB::get()->exec("UPDATE nodes SET node_show_menu = {$update} WHERE node_id = " . nodes::$node_id);
                }
                redirect::handle();
            }
            // vis/skjul undersider
            if (isset($_GET['expand_menu'])) {
                $update = false;
                if ($_GET['expand_menu'] == "false") {
                    // deaktiver
                    if (nodes::$node_info['node_expand_menu'] > 0) {
                        $update = 0;
                        ess::$b->page->add_message("Undersidene blir ikke lengre vist i menyen.");
                    }
                } else {
                    // aktiver
                    if (nodes::$node_info['node_expand_menu'] == 0) {
                        $update = 1;
                        ess::$b->page->add_message("Undersidene blir nå vist i menyen.");
                    }
                }
                // oppdater?
                if ($update !== false) {
                    \Kofradia\DB::get()->exec("UPDATE nodes SET node_expand_menu = {$update} WHERE node_id = " . nodes::$node_id);
                }
                redirect::handle();
            }
            // slett side
            if (isset($_GET['delete'])) {
                $table_check = "";
                $where_check = "";
                // sjekk om det er noen elementer under denne
                $result = \Kofradia\DB::get()->query("SELECT COUNT(node_id) FROM nodes WHERE node_parent_node_id = " . nodes::$node_id . " AND node_deleted = 0");
                $ant = $result->fetchColumn(0);
                if ($ant > 0) {
                    ess::$b->page->add_message("Du kan ikke slette en side som inneholder undersider. Flytt eller fjern undersidene og prøv på nytt.", "error");
                    redirect::handle();
                }
                $table_check .= ", (SELECT COUNT(node_id) AS ant FROM nodes WHERE node_parent_node_id = " . nodes::$node_id . " AND node_deleted = 0) AS ref_subnodes";
                $where_check .= " AND ref_subnodes.ant = 0";
                // sjekk type og spesiell info
                switch (nodes::$node_info['node_type']) {
                    case "container":
                        // sjekk antall enheter
                        $result = \Kofradia\DB::get()->query("SELECT COUNT(ni_id) FROM nodes_items WHERE ni_node_id = " . nodes::$node_id . " AND ni_deleted = 0");
                        $ant = $result->fetchColumn(0);
                        if ($ant > 0) {
                            ess::$b->page->add_message("Du kan ikke slette en side som inneholder noen enheter. Fjern enhetene og prøv på nytt.", "error");
                            redirect::handle();
                        }
                        $table_check .= ", (SELECT COUNT(ni_id) AS ant FROM nodes_items WHERE ni_node_id = " . nodes::$node_id . " AND ni_deleted = 0) AS ref_items";
                        $where_check .= " AND ref_items.ant = 0";
                        break;
                }
                // godkjenn?
                if (isset($_POST['delete'])) {
                    // marker som slettet
                    $a = \Kofradia\DB::get()->exec("UPDATE nodes{$table_check} SET node_deleted = " . time() . " WHERE node_id = " . nodes::$node_id . $where_check);
                    if ($a == 0) {
                        ess::$b->page->add_message("Noe gikk galt. Prøv på nytt.", "error");
                        redirect::handle();
                    }
                    ess::$b->page->add_message("Siden ble markert som slettet og er ikke lenger tilgjengelig.");
                    redirect::handle("node/a", redirect::ROOT);
                }
                echo '
<h1>Slett side</h1>
<form action="" method="post">
	<dl class="dd_right dl_2x">
		<dt>Side</dt>
		<dd>' . htmlspecialchars(nodes::$node_info['node_title']) . '</dd>
	</dl>
	<p>' . show_sbutton("Slett", 'name="delete"') . ' ' . show_sbutton("Avbryt", 'name="abort"') . '</p>
</form>';
                page_node::load_page();
            }
            // vanlig side
            if (nodes::$node_info['node_type'] == "container") {
                // vis/skjul tittel
                if (isset($_GET['hide_title'])) {
                    $hide = NULL;
                    if ($_GET['hide_title'] == "false") {
                        // vis tittel
                        if (nodes::$node_params->get("hide_title")) {
                            $hide = false;
                            ess::$b->page->add_message("Tittelen blir nå vist øverst på siden.");
                        }
                    } else {
                        // skjul tittel
                        if (!nodes::$node_params->get("hide_title")) {
                            $hide = true;
                            ess::$b->page->add_message("Tittelen blir ikke lengre vist øverst på siden.");
                        }
                    }
                    // oppdater?
                    if (!is_null($hide)) {
                        // hent friske params
                        $result = \Kofradia\DB::get()->query("SELECT node_params FROM nodes WHERE node_id = " . nodes::$node_id . " FOR UPDATE");
                        $params = new params($result->fetchColumn(0));
                        if ($hide) {
                            $params->update("hide_title", "1");
                        } else {
                            $params->remove("hide_title");
                        }
                        // oppdater
                        \Kofradia\DB::get()->exec("UPDATE nodes SET node_params = " . \Kofradia\DB::quote($params->build()) . " WHERE node_id = " . nodes::$node_id);
                    }
                    redirect::handle();
                }
                // vis/skjul sist endret dato
                if (isset($_GET['hide_time_change'])) {
                    $hide = NULL;
                    if ($_GET['hide_time_change'] == "false") {
                        // vis tittel
                        if (nodes::$node_params->get("hide_time_change")) {
                            $hide = false;
                            ess::$b->page->add_message("Dato for sist endret blir nå vist nederst på siden.");
                        }
                    } else {
                        // skjul tittel
                        if (!nodes::$node_params->get("hide_time_change")) {
                            $hide = true;
                            ess::$b->page->add_message("Dato for sist endret blir ikke lengre vist nederst på siden.");
                        }
                    }
                    // oppdater?
                    if (!is_null($hide)) {
                        // hent friske params
                        $result = \Kofradia\DB::get()->query("SELECT node_params FROM nodes WHERE node_id = " . nodes::$node_id . " FOR UPDATE");
                        $params = new params($result->fetchColumn(0));
                        if ($hide) {
                            $params->update("hide_time_change", "1");
                        } else {
                            $params->remove("hide_time_change");
                        }
                        // oppdater
                        \Kofradia\DB::get()->exec("UPDATE nodes SET node_params = " . \Kofradia\DB::quote($params->build()) . " WHERE node_id = " . nodes::$node_id);
                    }
                    redirect::handle();
                }
                // aktiver/deaktiver enhet
                if (isset($_GET['unit_enable']) || isset($_GET['unit_disable'])) {
                    if (isset($_GET['unit_enable'])) {
                        $value = 1;
                        $msg = "Enheten er nå aktivert og blir vist.";
                        $unit_id = intval($_GET['unit_enable']);
                    } else {
                        $value = 0;
                        $msg = "Enheten er nå deaktivert og blir ikke vist.";
                        $unit_id = intval($_GET['unit_disable']);
                    }
                    // oppdater
                    $affected = \Kofradia\DB::get()->exec("UPDATE nodes_items SET ni_enabled = {$value} WHERE ni_node_id = " . nodes::$node_id . " AND ni_id = {$unit_id} AND ni_deleted = 0");
                    if ($affected > 0) {
                        \Kofradia\DB::get()->exec("UPDATE nodes SET node_change = " . time() . " WHERE node_id = " . nodes::$node_id);
                        ess::$b->page->add_message($msg);
                    }
                    redirect::handle("node/a?node_id=" . nodes::$node_id . "&unit_highlight={$unit_id}", redirect::ROOT);
                }
                // slett enhet
                if (isset($_GET['unit_delete'])) {
                    // hent enheten
                    $unit_id = \Kofradia\DB::quote($_GET['unit_delete']);
                    $result = \Kofradia\DB::get()->query("SELECT ni_id, ni_type, nir_content, nir_params, nir_description, ni_priority, ni_enabled, nir_time FROM nodes_items LEFT JOIN nodes_items_rev ON nir_id = ni_nir_id WHERE ni_node_id = " . nodes::$node_id . " AND ni_id = {$unit_id} AND ni_deleted = 0");
                    // fant ikke?
                    if ($result->rowCount() == 0) {
                        ess::$b->page->add_message("Fant ikke enheten. Prøv på nytt.", "error");
                        redirect::handle();
                    }
                    $unit = $result->fetch();
                    // slette?
                    if (isset($_POST['delete'])) {
                        // marker som slettet
                        \Kofradia\DB::get()->exec("UPDATE nodes_items SET ni_deleted = " . time() . " WHERE ni_node_id = " . nodes::$node_id . " AND ni_id = {$unit_id} AND ni_deleted = 0");
                        ess::$b->page->add_message("Enheten ble markert som slettet og er ikke lenger tilgjengelig.");
                        redirect::handle();
                    }
                    echo '
<h1>Slett enhet</h1>
<form action="" method="post">
	<dl class="dd_right dl_2x">
		<dt>Side</dt>
		<dd>' . htmlspecialchars(nodes::$node_info['node_title']) . '</dd>
	</dl>
	<p>' . show_sbutton("Slett enhet", 'name="delete"') . ' ' . show_sbutton("Avbryt", 'name="abort"') . '</p>
</form>
<h2>Innhold av enhet</h2>' . nodes::content_build($unit);
                    page_node::load_page();
                }
                // rediger enhet
                if (isset($_GET['unit_edit'])) {
                    // hent enheten
                    $unit_id = \Kofradia\DB::quote($_GET['unit_edit']);
                    $result = \Kofradia\DB::get()->query("SELECT ni_id, ni_type, nir_content, nir_params, nir_description, ni_priority, ni_enabled, nir_time FROM nodes_items LEFT JOIN nodes_items_rev ON nir_id = ni_nir_id WHERE ni_node_id = " . nodes::$node_id . " AND ni_id = {$unit_id} AND ni_deleted = 0");
                    // fant ikke?
                    if ($result->rowCount() == 0) {
                        ess::$b->page->add_message("Fant ikke enheten. Prøv på nytt.", "error");
                        redirect::handle();
                    }
                    $unit = $result->fetch();
                    // kan endres?
                    if (!isset(nodes::$item_types[$unit['ni_type']]) || !nodes::$item_types[$unit['ni_type']][1]) {
                        ess::$b->page->add_message("Denne enheten kan ikke redigeres.", "error");
                        redirect::handle();
                    }
                    $params = new params($unit['nir_params']);
                    // lagre endringer?
                    if (isset($_POST['description']) && isset($_POST['content'])) {
                        // ingenting endret?
                        if (trim($_POST['description']) == $unit['nir_description'] && trim($_POST['content']) == $unit['nir_content']) {
                            ess::$b->page->add_message("Ingen endringer ble utført.", "error");
                        } else {
                            \Kofradia\DB::get()->exec("INSERT INTO nodes_items_rev SET nir_ni_id = {$unit['ni_id']}, nir_params = " . \Kofradia\DB::quote($params->build()) . ", nir_content = " . \Kofradia\DB::quote($_POST['content']) . ", nir_description = " . \Kofradia\DB::quote($_POST['description']) . ", nir_time = " . time());
                            $nir_id = \Kofradia\DB::get()->lastInsertId();
                            \Kofradia\DB::get()->exec("UPDATE nodes_items SET ni_nir_id = {$nir_id}, ni_nir_count = ni_nir_count + 1 WHERE ni_id = {$unit['ni_id']}");
                            \Kofradia\DB::get()->exec("UPDATE nodes SET node_change = " . time() . " WHERE node_id = " . nodes::$node_id);
                            putlog("CREWCHAN", "NODE REDIGERT: " . login::$user->player->data['up_name'] . " redigerte %u" . nodes::$node_info['node_title'] . "%u " . ess::$s['spath'] . "/node/" . nodes::$node_id);
                            ess::$b->page->add_message("Enheten ble oppdatert.");
                            redirect::handle("node/a?node_id=" . nodes::$node_id . "&unit_highlight={$unit['ni_id']}", redirect::ROOT);
                        }
                    }
                    // vis form osv
                    echo '
<h1>Rediger enhet</h1>
<form action="" method="post">
	<dl class="dd_right dl_2x">
		<dt>Forelder</dt>
		<dd>' . htmlspecialchars(nodes::$node_info['node_title']) . '</dd>
		<dt>Type</dt>
		<dd>' . nodes::content_type($unit) . '</dd>
		<dt>Beskrivelse</dt>
		<dd>
			<textarea name="description" cols="30" rows="2">' . htmlspecialchars(postval("description", $unit['nir_description'])) . '</textarea>
		</dd>';
                    switch ($unit['ni_type']) {
                        case 1:
                            echo '
		<dt>Innhold (BB-kode)</dt>
		<dd>&nbsp;</dd>
	</dl>
	<p>
		<textarea name="content" cols="30" rows="2" style="width: 530px; height: 300px">' . htmlspecialchars(postval("content", $unit['nir_content'])) . '</textarea>
	</p>';
                            break;
                        case 2:
                            echo '
		<dt>Innhold (ren HTML)</dt>
		<dd>&nbsp;</dd>
	</dl>
	<p class="clear">
		<textarea name="content" cols="30" rows="2" style="width: 530px; height: 300px">' . htmlspecialchars(postval("content", $unit['nir_content'])) . '</textarea>
	</p>';
                            break;
                        case 3:
                            tinymce::add_element("ni_content", true);
                            echo '
		<dt>Innhold (HTML editor)</dt>
		<dd>&nbsp;</dd>
	</dl>
	<p class="clear">
		<textarea name="content" cols="30" rows="2" id="ni_content" style="width: 530px; height: 400px">' . htmlspecialchars(postval("content", $unit['nir_content'])) . '</textarea>
	</p>';
                            tinymce::load();
                            break;
                        case 4:
                            echo '
		<dt>Ren tekst</dt>
		<dd>&nbsp;</dd>
	</dl>
	<p class="clear">
		<textarea name="content" cols="30" rows="2" style="width: 530px; height: 300px">' . htmlspecialchars(postval("content", $unit['nir_content'])) . '</textarea>
	</p';
                            break;
                        default:
                            redirect::handle("node/a?node_id=" . nodes::$node_id . "&unit_highlight={$unit['ni_id']}", redirect::ROOT);
                    }
                    echo '
	<p>' . show_sbutton("Oppdater") . ' <a href="' . ess::$s['relative_path'] . '/node/a?node_id=' . nodes::$node_id . '&amp;unit_highlight=' . $unit['ni_id'] . '" class="button">Avbryt</a></p>
</form>';
                    page_node::load_page();
                }
                // opprette ny enhet?
                if (isset($_GET['unit_new'])) {
                    $previous_unit = getval("previous_unit", 0);
                    // hent info om previous unit
                    if ($previous_unit == 0) {
                        $priority = 1;
                        $priority_num = 1;
                    } else {
                        // hent priority til forrige
                        $result = \Kofradia\DB::get()->query("SELECT ni_priority FROM nodes_items WHERE ni_node_id = " . nodes::$node_id . " AND ni_id = {$previous_unit} AND ni_deleted = 0");
                        if ($result->rowCount() == 0) {
                            ess::$b->page->add_message("Noe gikk galt. Prøv igjen.", "error");
                            redirect::handle();
                        }
                        $priority = $result->fetchColumn(0);
                        // hent priority til den vi skal "erstatte"
                        $result = \Kofradia\DB::get()->query("SELECT ni_priority FROM nodes_items WHERE ni_node_id = " . nodes::$node_id . " AND ni_priority > {$priority} AND ni_deleted = 0 ORDER BY ni_priority LIMIT 1");
                        if ($result->rowCount() > 0) {
                            $priority = $result->fetchColumn(0);
                        } else {
                            $priority++;
                        }
                        // hent nummer
                        $result = \Kofradia\DB::get()->query("SELECT COUNT(ni_id) FROM nodes_items WHERE ni_node_id = " . nodes::$node_id . " AND ni_priority < {$priority} AND ni_deleted = 0");
                        $priority_num = $result->fetchColumn(0) + 1;
                    }
                    // legge til?
                    if (isset($_POST['type'])) {
                        // kontroller type
                        $type = postval("type");
                        if (!isset(nodes::$item_types[$type]) || !nodes::$item_types[$type][1]) {
                            ess::$b->page->add_message("Ugyldig type. Prøv på nytt.", "error");
                        } else {
                            $description = postval("description", NULL);
                            // sett opp prioritys
                            \Kofradia\DB::get()->exec("UPDATE nodes_items SET ni_priority = ni_priority + 1 WHERE ni_node_id = " . nodes::$node_id . " AND ni_priority >= {$priority} AND ni_deleted = 0");
                            // legg til enhet
                            \Kofradia\DB::get()->exec("INSERT INTO nodes_items SET ni_node_id = " . nodes::$node_id . ", ni_type = " . \Kofradia\DB::quote($type) . ", ni_priority = {$priority}");
                            $ni_id = \Kofradia\DB::get()->lastInsertId();
                            \Kofradia\DB::get()->exec("INSERT INTO nodes_items_rev SET nir_ni_id = {$ni_id}, nir_time = " . time() . ", nir_description = " . \Kofradia\DB::quote($description));
                            $nir_id = \Kofradia\DB::get()->lastInsertId();
                            \Kofradia\DB::get()->exec("UPDATE nodes_items SET ni_nir_id = {$nir_id} WHERE ni_id = {$ni_id}");
                            ess::$b->page->add_message("Enheten ble lagt til.");
                            redirect::handle("node/a?node_id=" . nodes::$node_id . "&unit_edit={$ni_id}", redirect::ROOT);
                        }
                    }
                    echo '
<h1>Ny enhet</h1>
<form action="" method="post">
	<dl class="dd_right dl_2x">
		<dt>Under side</dt>
		<dd>' . htmlspecialchars(nodes::$node_info['node_title']) . '</dd>
		<dt>Plassering</dt>
		<dd>' . $priority_num . '</dd>
		<dt>Type</dt>
		<dd>
			<select name="type">';
                    $selected = postval("type", 3);
                    if (!isset(nodes::$item_types[$selected]) || !nodes::$item_types[$selected][1]) {
                        $selected = false;
                    }
                    foreach (nodes::$item_types as $key => $info) {
                        // ikke i bruk?
                        if (!$info[1]) {
                            continue;
                        }
                        echo '
				<option value="' . htmlspecialchars($key) . '"' . ($selected == $key ? ' selected="selected"' : '') . '>' . htmlspecialchars($info[0]) . '</option>';
                    }
                    echo '
			</select>
		</dd>
		<dt>Beskrivelse</dt>
		<dd>
			<textarea name="description" cols="30" rows="2">' . htmlspecialchars(postval("description")) . '</textarea>
		</dd>
	</dl>
	<p>' . show_sbutton("Opprett enhet") . ' ' . show_sbutton("Avbryt", 'name="abort"') . '</p>
</form>';
                    page_node::load_page();
                }
            } elseif (nodes::$node_info['node_type'] == "url_relative" || nodes::$node_info['node_type'] == "url_relative") {
                // endre adresse
                if (isset($_GET['edit_url'])) {
                    // lagre?
                    if (isset($_POST['url'])) {
                        // hent friske params
                        $result = \Kofradia\DB::get()->query("SELECT node_params FROM nodes WHERE node_id = " . nodes::$node_id . " FOR UPDATE");
                        $params = new params($result->fetchColumn(0));
                        $params->update("url", $_POST['url']);
                        if (isset($_POST['new_window'])) {
                            $params->update("new_window", 1);
                        } else {
                            $params->remove("new_window");
                        }
                        // oppdater
                        \Kofradia\DB::get()->exec("UPDATE nodes SET node_params = " . \Kofradia\DB::quote($params->build()) . " WHERE node_id = " . nodes::$node_id);
                        ess::$b->page->add_message("Adressen ble oppdatert.");
                        redirect::handle();
                    }
                    if (nodes::$node_info['node_type'] == "url_relative") {
                        echo '
<h1>Rediger adresse</h1>
<form action="" method="post">
	<dl class="dd_right dl_2x">
		<dt>Nåværende adresse</dt>
		<dd>' . htmlspecialchars(ess::$s['path']) . htmlspecialchars(nodes::$node_params->get("url", " ???")) . '</dd>
		<dt>Ny adresse</dt>
		<dd>' . htmlspecialchars(ess::$s['path']) . ' <input type="text" name="url" class="styled w150" value="' . htmlspecialchars(nodes::$node_params->get("url", "")) . '" /></dd>
		<dt>Åpne i nytt vindu</dt>
		<dd><input type="checkbox" name="new_window"' . (nodes::$node_params->get("new_window") ? ' checked="checked"' : '') . ' /></dd>
	</dl>
	<p>' . show_sbutton("Lagre") . ' ' . show_sbutton("Avbryt", 'name="abort"') . '</p>
</form>';
                    } else {
                        echo '
<h1>Rediger adresse</h1>
<form action="" method="post">
	<dl class="dd_right dl_2x">
		<dt>Nåværende adresse</dt>
		<dd>' . htmlspecialchars(nodes::$node_params->get("url", "???")) . '</dd>
		<dt>Ny adresse</dt>
		<dd><input type="text" name="url" class="styled w250" value="' . htmlspecialchars(nodes::$node_params->get("url", "")) . '" /></Dd>
		<dt>Åpne i nytt vindu</dt>
		<dd><input type="checkbox" name="new_window"' . (nodes::$node_params->get("new_window") ? ' checked="checked"' : '') . ' /></dd>
	</dl>
	<p>' . show_sbutton("Lagre") . ' ' . show_sbutton("Avbryt", 'name="abort"') . '</p>
</form>';
                    }
                    page_node::load_page();
                }
            }
        }
        if ($node) {
            self::show_node_info($node);
        }
        self::show_nodes_list();
        page_node::load_page();
    }