1:    2:    3:    4:    5:    6:    7:    8:    9:   10:   11:   12:   13:   14:   15:   16:   17:   18:   19:   20:   21:   22:   23:   24:   25:   26:   27:   28:   29:   30:   31:   32:   33:   34:   35:   36:   37:   38:   39:   40:   41:   42:   43:   44:   45:   46:   47:   48:   49:   50:   51:   52:   53:   54:   55:   56:   57:   58:   59:   60:   61:   62:   63:   64:   65:   66:   67:   68:   69:   70:   71:   72:   73:   74:   75:   76:   77:   78:   79:   80:   81:   82:   83:   84:   85:   86:   87:   88:   89:   90:   91:   92:   93:   94:   95:   96:   97:   98:   99:  100:  101:  102:  103:  104:  105:  106:  107:  108:  109:  110:  111:  112:  113:  114:  115:  116:  117:  118:  119:  120:  121:  122:  123:  124:  125:  126:  127:  128:  129:  130:  131:  132:  133:  134:  135:  136:  137:  138:  139:  140:  141:  142:  143:  144:  145:  146:  147:  148:  149:  150:  151:  152:  153:  154:  155:  156:  157:  158:  159:  160:  161:  162:  163:  164:  165:  166:  167:  168:  169:  170:  171:  172:  173:  174:  175:  176:  177:  178:  179:  180:  181:  182:  183:  184:  185:  186:  187:  188:  189:  190:  191:  192:  193:  194:  195:  196:  197:  198:  199:  200:  201:  202:  203:  204:  205:  206:  207:  208:  209:  210:  211:  212:  213:  214:  215:  216:  217:  218:  219:  220:  221:  222:  223:  224:  225:  226:  227:  228:  229:  230:  231:  232:  233:  234:  235:  236:  237:  238:  239:  240:  241:  242:  243:  244:  245:  246:  247:  248:  249:  250:  251:  252:  253:  254:  255:  256:  257:  258:  259:  260:  261:  262:  263:  264:  265:  266:  267:  268:  269:  270:  271:  272:  273:  274:  275:  276:  277:  278:  279:  280:  281:  282:  283:  284:  285:  286:  287:  288:  289:  290:  291:  292:  293:  294:  295:  296:  297:  298:  299:  300:  301:  302:  303:  304:  305:  306:  307:  308:  309:  310:  311:  312:  313:  314:  315:  316:  317:  318:  319:  320:  321:  322:  323:  324:  325:  326:  327:  328:  329:  330:  331:  332:  333:  334:  335:  336:  337:  338:  339:  340:  341:  342:  343:  344:  345:  346:  347:  348:  349:  350:  351:  352:  353:  354:  355:  356:  357:  358:  359:  360:  361:  362:  363:  364:  365:  366:  367:  368:  369:  370:  371:  372:  373:  374:  375:  376:  377:  378:  379:  380:  381:  382:  383:  384:  385:  386:  387:  388:  389:  390:  391:  392:  393:  394:  395:  396:  397:  398:  399:  400:  401:  402:  403:  404:  405:  406:  407:  408:  409:  410:  411:  412:  413:  414:  415:  416:  417:  418:  419:  420:  421:  422:  423:  424:  425:  426:  427:  428:  429:  430:  431:  432:  433:  434:  435:  436:  437:  438:  439:  440:  441:  442:  443:  444:  445:  446:  447:  448:  449:  450:  451:  452:  453:  454:  455:  456:  457:  458:  459:  460:  461:  462:  463:  464:  465:  466:  467:  468:  469:  470:  471:  472:  473:  474:  475:  476:  477:  478:  479:  480:  481:  482:  483:  484:  485:  486:  487:  488:  489:  490:  491:  492:  493:  494:  495:  496:  497:  498:  499:  500:  501:  502:  503:  504:  505:  506:  507:  508:  509:  510:  511:  512:  513:  514:  515:  516:  517:  518:  519:  520:  521:  522:  523:  524:  525:  526:  527:  528:  529:  530:  531:  532:  533:  534:  535:  536:  537:  538:  539:  540:  541:  542:  543:  544:  545:  546:  547:  548:  549:  550:  551:  552:  553:  554:  555:  556:  557:  558:  559:  560:  561:  562:  563:  564:  565:  566:  567:  568:  569:  570:  571:  572:  573:  574:  575:  576:  577:  578:  579:  580:  581:  582:  583:  584:  585:  586:  587:  588:  589:  590:  591:  592:  593:  594:  595:  596:  597:  598:  599:  600:  601:  602:  603:  604:  605:  606:  607:  608:  609:  610:  611:  612:  613:  614:  615:  616:  617:  618:  619:  620:  621:  622:  623:  624:  625:  626:  627:  628:  629:  630:  631:  632:  633:  634:  635:  636:  637:  638:  639:  640:  641:  642:  643:  644:  645:  646:  647:  648:  649:  650:  651:  652:  653:  654:  655:  656:  657:  658:  659:  660:  661:  662:  663:  664:  665:  666:  667:  668:  669:  670:  671:  672:  673:  674:  675:  676:  677:  678:  679:  680:  681:  682:  683:  684:  685:  686:  687:  688:  689:  690:  691:  692:  693:  694:  695:  696:  697:  698:  699:  700:  701:  702:  703:  704:  705:  706:  707:  708:  709:  710:  711:  712:  713:  714:  715:  716:  717:  718:  719:  720:  721:  722:  723:  724:  725:  726:  727:  728:  729:  730:  731:  732:  733:  734:  735:  736:  737:  738:  739:  740:  741:  742:  743:  744:  745:  746:  747:  748:  749:  750:  751:  752:  753:  754:  755:  756:  757:  758:  759:  760:  761:  762:  763:  764:  765:  766:  767:  768:  769:  770:  771:  772:  773:  774:  775:  776:  777:  778:  779:  780:  781:  782:  783:  784:  785:  786:  787:  788:  789:  790:  791:  792:  793:  794:  795:  796:  797:  798:  799:  800:  801:  802:  803:  804:  805:  806:  807:  808:  809:  810:  811:  812:  813:  814:  815:  816:  817:  818:  819:  820:  821:  822:  823:  824:  825:  826:  827:  828:  829:  830:  831:  832:  833:  834:  835:  836:  837:  838:  839:  840:  841:  842:  843:  844:  845:  846:  847:  848:  849:  850:  851:  852:  853:  854:  855:  856:  857:  858:  859:  860:  861:  862:  863:  864:  865:  866:  867:  868:  869:  870:  871:  872:  873:  874:  875:  876:  877:  878:  879:  880:  881:  882:  883:  884:  885:  886:  887:  888:  889:  890:  891:  892:  893:  894:  895:  896:  897:  898:  899:  900:  901:  902:  903:  904:  905:  906:  907:  908:  909:  910:  911:  912:  913:  914:  915:  916:  917:  918:  919:  920:  921:  922:  923:  924:  925:  926:  927:  928:  929:  930:  931:  932:  933:  934:  935:  936:  937:  938:  939:  940:  941:  942:  943:  944:  945:  946:  947:  948:  949:  950:  951:  952:  953:  954:  955:  956:  957:  958:  959:  960:  961:  962:  963:  964:  965:  966:  967:  968:  969:  970:  971:  972:  973:  974:  975:  976:  977:  978:  979:  980:  981:  982:  983:  984:  985:  986:  987:  988:  989:  990:  991:  992:  993:  994:  995:  996:  997:  998:  999: 1000: 1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050: 1051: 1052: 1053: 1054: 1055: 1056: 1057: 1058: 1059: 1060: 1061: 1062: 1063: 1064: 1065: 1066: 1067: 1068: 1069: 1070: 1071: 1072: 1073: 1074: 1075: 1076: 1077: 1078: 1079: 1080: 1081: 1082: 1083: 1084: 1085: 1086: 1087: 1088: 1089: 1090: 1091: 1092: 1093: 1094: 1095: 1096: 1097: 1098: 1099: 1100: 1101: 1102: 1103: 1104: 1105: 1106: 1107: 1108: 1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116: 1117: 1118: 1119: 1120: 1121: 1122: 1123: 1124: 1125: 1126: 1127: 1128: 1129: 1130: 1131: 1132: 1133: 1134: 1135: 1136: 1137: 1138: 1139: 1140: 1141: 1142: 1143: 1144: 1145: 1146: 1147: 1148: 1149: 1150: 1151: 1152: 1153: 1154: 1155: 1156: 1157: 1158: 1159: 1160: 1161: 1162: 1163: 1164: 1165: 1166: 1167: 1168: 1169: 1170: 1171: 1172: 1173: 1174: 1175: 1176: 1177: 1178: 1179: 1180: 1181: 1182: 1183: 1184: 1185: 1186: 1187: 1188: 1189: 1190: 1191: 1192: 1193: 1194: 1195: 1196: 1197: 1198: 1199: 1200: 1201: 1202: 1203: 1204: 1205: 1206: 1207: 1208: 1209: 1210: 1211: 1212: 1213: 1214: 1215: 1216: 1217: 1218: 1219: 1220: 1221: 1222: 1223: 1224: 1225: 1226: 1227: 1228: 1229: 1230: 1231: 1232: 1233: 1234: 1235: 1236: 1237: 1238: 1239: 1240: 1241: 1242: 1243: 1244: 1245: 1246: 1247: 1248: 1249: 1250: 1251: 1252: 1253: 1254: 1255: 1256: 1257: 1258: 1259: 1260: 1261: 1262: 1263: 1264: 1265: 1266: 1267: 1268: 1269: 1270: 1271: 1272: 1273: 1274: 1275: 1276: 1277: 1278: 1279: 1280: 1281: 1282: 1283: 1284: 1285: 1286: 1287: 1288: 1289: 1290: 1291: 1292: 1293: 1294: 1295: 1296: 1297: 1298: 1299: 1300: 1301: 1302: 1303: 1304: 1305: 1306: 1307: 1308: 1309: 1310: 1311: 1312: 1313: 1314: 1315: 1316: 1317: 1318: 1319: 1320: 1321: 1322: 1323: 1324: 1325: 1326: 1327: 1328: 1329: 1330: 1331: 1332: 1333: 1334: 1335: 1336: 1337: 1338: 1339: 1340: 1341: 1342: 1343: 1344: 1345: 1346: 1347: 1348: 
<?php
$plugin_is_filter = 5 | ADMIN_PLUGIN | THEME_PLUGIN;
$plugin_description = gettext("A menu creation facility. The <em>Menu</em> tab admin interface lets you create arbitrary menu trees.");
$plugin_author = "Stephen Billard (sbillard), Malte Müller (acrylian)";
$plugin_category = gettext('Media');
$option_interface = 'menu_manager';
if (OFFSET_PATH) {
    require_once(dirname(dirname(__FILE__)) . '/template-functions.php');
    zp_register_filter('admin_tabs', 'menu_tabs');
} else {
    zp_register_filter('admin_toolbox_global', 'menu_admin_toolbox_global');
}
class menu_manager {
    
    function __construct() {
        setOptionDefault('menu_truncate_string', 0);
        setOptionDefault('menu_truncate_indicator', '');
    }
    function getOptionsSupported() {
        global $_common_truncate_handler;
        $options = array(
                gettext('Truncate indicator*') => array(
                        'key' => 'menu_truncate_indicator',
                        'type' => OPTION_TYPE_TEXTBOX,
                        'order' => 2,
                        'disabled' => $_common_truncate_handler,
                        'desc' => gettext('Append this string to truncated titles.')),
                gettext('Truncate titles*') => array(
                        'key' => 'menu_truncate_string',
                        'type' => OPTION_TYPE_TEXTBOX,
                        'order' => 1,
                        'desc' => gettext('Limit titles to this many characters. Zero means no limit.'))
        );
        if ($_common_truncate_handler) {
            $options['note'] = array(
                    'key' => 'menu_truncate_note',
                    'type' => OPTION_TYPE_NOTE,
                    'order' => 8,
                    'desc' => '<p class="notebox">' . $_common_truncate_handler . '</p>');
        } else {
            $_common_truncate_handler = gettext('* These options may be set via the <a href="javascript:gotoName(\'menu_manager\');"><em>menu_manager</em></a> plugin options.');
            $options['note'] = array(
                    'key' => 'menu_truncate_note',
                    'type' => OPTION_TYPE_NOTE,
                    'order' => 8,
                    'desc' => gettext('<p class="notebox">*<strong>Note:</strong> The setting of these options are shared with other plugins.</p>'));
        }
        return $options;
    }
    function handleOption($option, $currentValue) {
        
    }
}
function menu_admin_toolbox_global($zf) {
    if (zp_loggedin(ADMIN_RIGHTS)) {
        echo "<li>";
        printLinkHTML($zf . '/' . PLUGIN_FOLDER . '/menu_manager/menu_tab.php', gettext("Menu"), NULL, NULL, NULL);
        echo "</li>\n";
    }
}
function menu_tabs($tabs) {
    if (zp_loggedin()) {
        $newtabs = array();
        foreach ($tabs as $key => $tab) {
            if ($key == 'tags') {
                $newtabs['menu'] = array(
                        'text' => gettext("menu"),
                        'link' => FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER . '/menu_manager/menu_tab.php?page=menu&tab=menu',
                        'default' => 'menu',
                        'subtabs' => NULL);
            }
            $newtabs[$key] = $tab;
        }
        return $newtabs;
    }
    return $tabs;
}
$_menu_manager_items = array();
function getMenuItems($menuset, $visible) {
    global $_menu_manager_items;
    if (array_key_exists($menuset, $_menu_manager_items) &&
                    array_key_exists($visible, $_menu_manager_items[$menuset])) {
        return $_menu_manager_items[$menuset][$visible];
    }
    switch ($visible) {
        case 'visible':
            $where = " WHERE `show` = 1 AND menuset = " . db_quote($menuset);
            break;
        case 'hidden':
            $where = " WHERE `show` = 0 AND menuset = " . db_quote($menuset);
            break;
        default:
            $where = " WHERE menuset = " . db_quote($menuset);
            $visible = 'all';
            break;
    }
    $result = query_full_array("SELECT * FROM " . prefix('menu') . $where . " ORDER BY sort_order", false);
    $_menu_manager_items[$menuset][$visible] = $result;
    return $_menu_manager_items[$menuset][$visible];
}
function getItem($id) {
    $menuset = checkChosenMenuset();
    $result = query_single_row("SELECT * FROM " . prefix('menu') . " WHERE menuset = " . db_quote($menuset) . " AND id = " . $id);
    return $result;
}
function checkChosenMenuset($default = 'default') {
    if (isset($_GET['menuset'])) {
        $menuset = sanitize($_GET['menuset']);
    } else if (isset($_POST['menuset'])) {
        $menuset = sanitize($_POST['menuset']);
    } else {
        $menuset = $default;
    }
    return $menuset;
}
function checkChosenItemStatus() {
    if (isset($_GET['visible'])) {
        return sanitize($_GET['visible']);
    } else {
        return 'all';
    }
}
function getItemTitleAndURL($item) {
    global $_zp_gallery;
    $themename = $_zp_gallery->getCurrentTheme();
    $array = array(
            "title" => '', 
            "url" => '', 
            "name" => '', 
            'protected' => false, 
            'theme' => $themename);
    $valid = true;
    $title = get_language_string($item['title']);
    switch ($item['type']) {
        case 'homepage':
            $array = array(
                    "title" => get_language_string($item['title']), 
                    "url" => WEBPATH, 
                    "name" => WEBPATH, 
                    'protected' => false, 
                    'theme' => $themename);
            break;
        case "galleryindex":
            $array = array(
                    "title" => get_language_string($item['title']), 
                    "url" => getGalleryIndexURL(), 
                    "name" => WEBPATH, 
                    'protected' => false, 
                    'theme' => $themename);
            break;
        case "album":
            $folderFS = internalToFilesystem($item['link']);
            $localpath = ALBUM_FOLDER_SERVERPATH . $folderFS;
            $dynamic = hasDynamicAlbumSuffix($folderFS) && !is_dir($folderFS);
            $valid = file_exists($localpath) && ($dynamic || is_dir($localpath));
            if (!$valid || strpos($localpath, '..') !== false) {
                $valid = false;
                $url = '';
                $protected = 0;
            } else {
                $obj = newAlbum($item['link']);
                $url = $obj->getLink(0);
                $protected = $obj->isProtected();
                $title = $obj->getTitle();
            }
            $array = array(
                    "title" => $title, 
                    "url" => $url, 
                    "name" => $item['link'], 
                    'protected' => $protected, 
                    'theme' => $themename);
            break;
        case "zenpagepage":
            if(class_exists('zenpage')) {
                $sql = 'SELECT * FROM ' . prefix('pages') . ' WHERE `titlelink`="' . $item['link'] . '"';
                $result = query_single_row($sql);
                if (is_array($result)) {
                    $obj = new ZenpagePage($item['link']);
                    $url = $obj->getLink(0);
                    $protected = $obj->isProtected();
                    $title = $obj->getTitle();
                } else {
                    $valid = false;
                    $url = '';
                    $protected = 0;
                }
                $array = array(
                        "title" => $title, 
                        "url" => $url, 
                        "name" => $item['link'], 
                        'protected' => $protected, 
                        'theme' => $themename);
            }
            break;
        case "zenpagenewsindex":
            if(class_exists('zenpage')) {
                $url = getNewsIndexURL();
                $array = array(
                        "title" => get_language_string($item['title']), 
                        "url" => $url, 
                        "name" => $url, 
                        'protected' => false);
            }
            break;
        case "zenpagecategory":
            if(class_exists('zenpage')) {
                $sql = "SELECT title FROM " . prefix('news_categories') . " WHERE titlelink = '" . $item['link'] . "'";
                $obj = query_single_row($sql, false);
                if ($obj) {
                    $obj = new ZenpageCategory($item['link']);
                    $title = $obj->getTitle();
                    $protected = $obj->isProtected();
                    $url = $obj->getLink(0);
                } else {
                    $valid = false;
                    $url = '';
                    $protected = 0;
                }
                $array = array(
                        "title" => $title, 
                        "url" => $url, 
                        "name" => $item['link'], 
                        'protected' => $protected, 
                        'theme' => $themename);
            }
            break;
        case "custompage":
            $root = SERVERPATH . '/' . THEMEFOLDER . '/' . $themename . '/';
            if (file_exists($root . $item['link'] . '.php')) {
                $url = getCustomPageURL($item['link']);
            } else {
                $valid = false;
                $url = '';
            }
            $array = array(
                    "title" => $title, 
                    "url" => $url, 
                    "name" => $item['link'], 
                    'protected' => false, 
                    'theme' => $themename);
            break;
        case "customlink":
            $array = array(
                    "title" => get_language_string($item['title']), 
                    "url" => $item['link'], 
                    "name" => $item['link'], 
                    'protected' => false, 
                    'theme' => $themename);
            break;
        case 'menulabel':
            $array = array(
                    "title" => get_language_string($item['title']), 
                    "url" => NULL, 
                    'name' => $item['title'], 
                    'protected' => false, 
                    'theme' => $themename);
            break;
        default:
            $array = array(
                    "title" => get_language_string($item['title']), 
                    "url" => $item['link'], 
                    "name" => $item['link'], 
                    'protected' => false, 
                    'theme' => $themename);
            break;
    }
    $limit = MENU_TRUNCATE_STRING;
    $array['valid'] = $valid;
    if ($limit) {
        $array['title'] = shortenContent($array['title'], $limit, MENU_TRUNCATE_INDICATOR);
    }
    return $array;
}
function getMenuVisibility() {
    if (zp_loggedin(VIEW_ALL_RIGHTS)) {
        return "all";
    } else {
        return "visible";
    }
}
function inventMenuItem($menuset, $visibility, $field = 'sort_order') {
    global $_zp_gallery_page, $_zp_current_album, $_zp_current_image, $_zp_current_search, $_menu_manager_items,
    $_zp_current_zenpage_news, $_zp_current_zenpage_page;
    $currentkey = $insertpoint = NULL;
    $newitems = array();
    switch ($_zp_gallery_page) {
        case 'image.php':
            $name = '';
            if (in_context(ZP_SEARCH_LINKED) && !in_context(ZP_ALBUM_LINKED)) {
                $dynamic = $_zp_current_search->getDynamicAlbum();
                if (empty($dynamic)) { 
                    foreach ($_menu_manager_items[$menuset][$visibility] as $key => $item) {
                        if ($item['type'] == 'custompage' && $item['link'] == 'search') {
                            $insertpoint = $item['sort_order'];
                            $currentkey = $insertpoint . '-9999';
                            break;
                        }
                    }
                }
            } else {
                $name = $_zp_current_album->name;
            }
            if (!empty($name)) {
                foreach ($_menu_manager_items[$menuset][$visibility] as $key => $item) {
                    if ($item['type'] == 'album' && $item['title'] == $name) {
                        $insertpoint = $item['sort_order'];
                        $currentkey = $insertpoint . '-9999';
                        break;
                    }
                }
            }
            if (!empty($currentkey)) {
                $item = array(
                        'id' => 9999,
                        'sort_order' => $currentkey,
                        'parentid' => $item['id'],
                        'type' => 'image',
                        'include_li' => true,
                        'title' => $_zp_current_image->getTitle(),
                        'show' => 1,
                        'link' => '',
                        'menuset' => $menuset,
                        'span_class' => '',
                        'span_id' => '');
            }
            break;
        case 'news.php':
            if (in_context(ZP_SEARCH_LINKED)) {
                foreach ($_menu_manager_items[$menuset][$visibility] as $key => $item) {
                    if ($item['type'] == 'custompage' && $item['link'] == 'search') {
                        $insertpoint = $item['sort_order'];
                        $currentkey = $insertpoint . '-9999';
                        break;
                    }
                }
            } else {
                foreach ($_menu_manager_items[$menuset][$visibility] as $key => $item) {
                    if ($item['type'] == 'zenpagenewsindex') {
                        $insertpoint = $item['sort_order'];
                        $currentkey = $insertpoint . '-9999';
                        break;
                    }
                }
            }
            if (!empty($currentkey)) {
                if (is_NewsArticle()) {
                    $item = array(
                            'id' => 9999,
                            'sort_order' => $currentkey,
                            'parentid' => $item['id'],
                            'type' => 'zenpagenews',
                            'include_li' => true,
                            'title' => $_zp_current_zenpage_news->getTitle(),
                            'show' => 1,
                            'link' => '',
                            'menuset' => $menuset,
                            'span_class' => '',
                            'span_id' => '');
                } else {
                    $currentkey = false; 
                }
            }
            break;
        case 'pages.php':
            if (in_context(ZP_SEARCH_LINKED)) {
                foreach ($_menu_manager_items[$menuset][$visibility] as $key => $item) {
                    if ($item['type'] == 'custompage' && $item['link'] == 'search') {
                        $insertpoint = $item['sort_order'];
                        $currentkey = $insertpoint . '-9999';
                        $item = array(
                                'id' => 9999,
                                'sort_order' => $currentkey,
                                'parentid' => $item['id'],
                                'type' => 'zenpagepage',
                                'include_li' => true,
                                'title' => $_zp_current_zenpage_page->getTitle(),
                                'show' => 1,
                                'link' => '',
                                'menuset' => $menuset,
                                'span_class' => '',
                                'span_id' => '');
                        break;
                    }
                }
            }
            break;
    }
    if (!empty($currentkey)) {
        foreach ($_menu_manager_items[$menuset][$visibility] as $key => $olditem) {
            $newitems[$key] = $olditem;
            if ($olditem['sort_order'] == $insertpoint) {
                $newitems[$currentkey] = $item;
            }
        }
        $_menu_manager_items[$menuset][$visibility] = $newitems;
        switch ($field) {
            default:
                if (isset($item[$field])) {
                    return $item[$field];
                }
                break;
            case 'all':
                if (isset($item)) {
                    return $item;
                }
                break;
            case "key":
                return $currentkey;
        }
    }
}
function getCurrentMenuItem($menuset, $field = 'sort_order') {
    $currentpageURL = rtrim(str_replace('\\', '/', html_encode(getRequestURI())), '/');
    if (isset($_GET['page'])) { 
        if (MOD_REWRITE) {
            if (isset($_GET['album'])) {
                $target = '/' . _PAGE_ . '/' . sanitize($_GET['page']);
            } else {
                $target = '/' . sanitize($_GET['page']);
            }
            $i = strrpos($currentpageURL, $target);
            if ($i == (strlen($currentpageURL) - strlen($target))) {
                $currentpageURL = substr($currentpageURL, 0, $i);
            }
        } else {
            $target = '&page=' . sanitize($_GET['page']);
            $i = strpos($currentpageURL, $target);
            if ($i !== false) {
                $currentpageURL = substr($currentpageURL, 0, $i) . substr($currentpageURL, $i + strlen($target));
            }
        }
    }
    $visibility = 'all';
    $items = getMenuItems($menuset, $visibility);
    $currentkey = NULL;
    foreach ($items as $key => $item) {
        switch ($item['type']) {
            case 'menulabel':
            case 'menufunction':
            case 'html':
                break;
            default:
                $checkitem = getItemTitleAndURL($item);
                if ($currentpageURL == html_encode(rtrim($checkitem['url'], '/'))) {
                    $currentkey = $key;
                    break 2;
                }
                break;
        }
    }
    $inventeditem = false;
    if (is_null($currentkey)) {
        $inventeditem = inventMenuItem($menuset, $visibility, 'all');
    }
    switch ($field) {
        default:
            if($inventeditem) {
                if (isset($inventeditem[$field])) {
                    return $inventeditem[$field];
                }
            } else if (isset($items[$currentkey][$field])) {
                return $items[$currentkey][$field];
            }
            break;
        case 'all':
            if ($inventeditem) {
                return $inventeditem;
            } else if (isset($items[$currentkey])) {
                return $items[$currentkey];
            }
            break;
        case "key":
            return $currentkey;
    }
}
function getMenumanagerPredicessor($menuset = 'default') {
    $sortorder = getCurrentMenuItem($menuset);
    $items = getMenuItems($menuset, getMenuVisibility());
    if (count($items) == 0)
        return NULL;
    if (empty($sortorder))
        return NULL;
    $order = explode('-', $sortorder);
    $next = array_pop($order) - 1;
    $saveorder = $order;
    while ($next >= 0) {
        $order = $saveorder;
        array_push($order, sprintf('%03u', $next));
        $sortorder = implode('-', $order);
        if (array_key_exists($sortorder, $items) && $items[$sortorder]['type'] != 'menulabel') { 
            return getItemTitleAndURL($items[$sortorder]);
        }
        $next--;
    }
    return NULL;
}
function printMenumanagerPrevLink($text, $menuset = 'default', $title = NULL, $class = NULL, $id = NULL) {
    $itemarray = getMenumanagerPredicessor($menuset);
    if (is_array($itemarray)) {
        if (is_null($title))
            $title = $itemarray['title'];
        printLinkHTML($itemarray['url'], $text, $title, $class, $id);
    } else {
        echo '<span class="disabledlink">' . html_encode($text) . '</span>';
    }
}
function getMenumanagerSuccessor($menuset = 'default') {
    $sortorder = getCurrentMenuItem($menuset);
    $items = getMenuItems($menuset, getMenuVisibility());
    if (count($items) == 0)
        return NULL;
    if (empty($sortorder))
        return NULL;
    $order = explode('-', $sortorder);
    $next = array_pop($order) + 1;
    $short_order = $order;
    array_push($order, sprintf('%03u', $next));
    $sortorder = implode('-', $order);
    while ($next <= 999) {
        $order = $short_order;
        array_push($order, sprintf('%03u', $next));
        $sortorder = implode('-', $order);
        if (array_key_exists($sortorder, $items)) {
            if ($items[$sortorder]['type'] != 'menulabel') { 
                return getItemTitleAndURL($items[$sortorder]);
            }
        }
        $next++;
    }
    return NULL;
}
function printMenumanagerNextLink($text, $menuset = 'default', $title = NULL, $class = NULL, $id = NULL) {
    $itemarray = getMenumanagerSuccessor($menuset);
    if (is_array($itemarray)) {
        if (is_null($title))
            $title = $itemarray['title'];
        printLinkHTML($itemarray['url'], $text, $title, $class, $id);
    } else {
        echo '<span class="disabledlink">' . html_encode($text) . '</span>';
    }
}
function printMenuemanagerPageListWithNav($prevtext, $nexttext, $menuset = 'default', $class = 'pagelist', $nextprev = true, $id = NULL, $firstlast = true, $navlen = 9) {
    $currentitem = getMenuFromLink(html_encode(urldecode(getRequestURI())), $menuset);
    if (is_null($currentitem))
        return; 
    $orders = explode('-', $currentitem['sort_order']);
    array_pop($orders);
    $lookfor = implode('-', $orders) . '-';
    $sql = 'SELECT `sort_order` FROM ' . prefix('menu') . ' WHERE `sort_order` LIKE "' . $lookfor . '%" ORDER BY `sort_order` ASC';
    $result = query_full_array($sql, false, 'sort_order');
    if (is_array($result)) {
        $l = strlen($lookfor) + 3;
        foreach ($result as $key => $item) { 
            if (strlen($key) > $l)
                unset($result[$key]);
        }
        $itemlist = array_keys($result);
        $total = count($itemlist);
        $current = array_search($currentitem['sort_order'], $itemlist) + 1;
        if ($total < 2) {
            $class .= ' disabled_nav';
        }
        if ($navlen == 0)
            $navlen = $total;
        $extralinks = 2;
        if ($firstlast)
            $extralinks = $extralinks + 2;
        $len = floor(($navlen - $extralinks) / 2);
        $j = max(round($extralinks / 2), min($current - $len - (2 - round($extralinks / 2)), $total - $navlen + $extralinks - 1));
        $ilim = min($total, max($navlen - round($extralinks / 2), $current + floor($len)));
        $k1 = round(($j - 2) / 2) + 1;
        $k2 = $total - round(($total - $ilim) / 2);
        $items = getMenuItems($menuset, getMenuVisibility());
        echo "<div" . (($id) ? " id=\"$id\"" : "") . " class=\"$class\">\n";
        echo "<ul class=\"$class\">\n";
        if ($nextprev) {
            echo "<li class=\"prev\">";
            printMenumanagerPrevLink($prevtext, $menuset, $prevtext, gettext("Previous Page"));
            echo "</li>\n";
        }
        if ($firstlast) {
            echo '<li class="' . ($current == 1 ? 'current' : 'first') . '">';
            $itemarray = getItemTitleAndURL($items[$itemlist[0]]);
            printLinkHTML($itemarray['url'], 1, gettext("Page 1"));
            echo "</li>\n";
            if ($j > 2) {
                echo "<li>";
                $itemarray = getItemTitleAndURL($items[$itemlist[$k1 - 1]]);
                printLinkHTML($itemarray['url'], ($j - 1 > 2) ? '...' : $k1, sprintf(ngettext('Page %u', 'Page %u', $k1), $k1));
                echo "</li>\n";
            }
        }
        for ($i = $j; $i <= $ilim; $i++) {
            echo "<li" . (($i == $current) ? " class=\"current\"" : "") . ">";
            $itemarray = getItemTitleAndURL($items[$itemlist[$i - 1]]);
            if ($i == $current) {
                $title = sprintf(ngettext('Page %1$u (Current Page)', 'Page %1$u (Current Page)', $i), $i);
            } else {
                $title = sprintf(ngettext('Page %1$u', 'Page %1$u', $i), $i);
            }
            printLinkHTML($itemarray['url'], $i, $title);
            echo "</li>\n";
        }
        if ($i < $total) {
            echo "<li>";
            $itemarray = getItemTitleAndURL($items[$itemlist[$k2 - 1]]);
            printLinkHTML($itemarray['url'], ($total - $i > 1) ? '...' : $k2, sprintf(ngettext('Page %u', 'Page %u', $k2), $k2));
            echo "</li>\n";
        }
        if ($firstlast && $i <= $total) {
            echo "\n  <li class=\"last\">";
            $itemarray = getItemTitleAndURL($items[$itemlist[$total - 1]]);
            printLinkHTML($itemarray['url'], $total, sprintf(ngettext('Page {%u}', 'Page {%u}', $total), $total));
            echo "</li>";
        }
        if ($nextprev) {
            echo "<li class=\"next\">";
            printMenumanagerNextLink($nexttext, gettext("Next Page"));
            echo "</li>\n";
        }
        echo "</ul>\n";
        echo "</div>\n";
    }
}
function printMenuemanagerPageList($menuset = 'default', $class = 'pagelist', $id = NULL, $firstlast = true, $navlen = 9) {
    printMenuemanagerPageListWithNav(null, null, $menuset, false, $class, $id, false, $navlen);
}
function getParentMenuItems($menuset = 'default') {
    $currentitem = getCurrentMenuItem($menuset, 'all');
    $items = getMenuItems($menuset, getMenuVisibility());
    if (count($items) > 0) {
        if ($currentitem) {
            $sortorder = $currentitem['sort_order'];
            $parents = array();
            $currentorder = explode('-', $sortorder);
            foreach($items as $item) {
                $itemorder = explode('-', $item['sort_order']);
                if($itemorder[0] == $currentorder[0] && $item['id'] != $currentitem['id'] && $currentitem['parentid'] != 0) {
                    $parents[] = $item;
                }
            }
            if (!empty($parents)) {
                sortMultiArray($parents, 'sort_order', $descending = false, $natsort = false, $case_sensitive = false);
                return $parents;
            }
        }
    }
    return false;
}
function printMenumanagerBreadcrumb($menuset = 'default', $before = '', $between = ' | ', $after = ' | ') {
    $parents = getParentMenuItems($menuset);
    if ($parents) {
        if ($before) {
            echo '<span class="beforetext">' . html_encode($before) . '</span>';
        }
        if ($between) {
            $between = '<span class="betweentext">' . html_encode($between) . '</span>';
        }
        $i = 0;
        foreach ($parents as $item) {
            if ($i > 0) {
                echo $between;
            }
            $itemarray = getItemTitleAndURL($item);
            if ($item['type'] == 'menulabel') {
                echo html_encode($itemarray['title']);
            } else {
                printLinkHTML($itemarray['url'], $itemarray['title'], $itemarray['title']);
            }
            $i++;
        }
        if ($after) {
            echo '<span class="aftertext">' . html_encode($after) . '</span>';
        }
    }
}
function getMenuFromLink($link, $menuset = 'default') {
    $link = rtrim(str_replace('\\', '/', $link), '/');
    $items = getMenuItems($menuset, getMenuVisibility());
    foreach ($items as $item) {
        $itemarray = getItemTitleAndURL($item);
        if ($itemarray['url'] == $link)
            return $item;
    }
    return NULL;
}
function submenuOf($link, $menuset = 'default') {
    $link_menu = getMenuFromLink($link, $menuset);
    if (is_array($link_menu)) {
        $current = getCurrentMenuItem($menuset);
        $items = getMenuItems($menuset, getMenuVisibility());
        if (!is_null($current)) {
            $sortorder = $link_menu['sort_order'];
            if (strlen($current) > strlen($sortorder)) {
                $p = strpos($current, $sortorder);
                return $p === 0;
            }
        }
    }
    return false;
}
function createMenuIfNotExists($menuitems, $menuset = 'default') {
    $count = db_count('menu', 'WHERE menuset=' . db_quote($menuset));
    if ($count == 0) { 
        require_once(dirname(__FILE__) . '/menu_manager/menu_manager-admin-functions.php');
        $success = 1;
        $orders = array();
        foreach ($menuitems as $key => $result) {
            if (array_key_exists('nesting', $result)) {
                $nesting = $result['nesting'];
            } else {
                $nesting = 0;
            }
            while ($nesting + 1 < count($orders))
                array_pop($orders);
            while ($nesting + 1 > count($orders))
                array_push($orders, -1);
            $result['id'] = 0;
            if (isset($result['include_li'])) {
                $includeli = $result['include_li'];
            } else {
                $includeli = 1;
            }
            $type = $result['type'];
            switch ($type) {
                case 'all_items':
                    $orders[$nesting] ++;
                    query("INSERT INTO " . prefix('menu') . " (`title`,`link`,`type`,`show`,`menuset`,`sort_order`) " .
                                    "VALUES ('" . gettext('Home') . "', '" . WEBPATH . '/' . "','galleryindex','1'," . db_quote($menuset) . ',' . db_quote($orders), true);
                    $orders[$nesting] = addAlbumsToDatabase($menuset, $orders);
                    if (extensionEnabled('zenpage')) {
                        $orders[$nesting] ++;
                        query("INSERT INTO " . prefix('menu') . " (title`,`link`,`type`,`show`,`menuset`,`sort_order`) " .
                                        "VALUES ('" . gettext('News index') . "', '" . getNewsIndexURL() . "','zenpagenewsindex','1'," . db_quote($menuset) . ',' . db_quote(sprintf('%03u', $base + 1)), true);
                        $orders[$nesting] = addPagesToDatabase($menuset, $orders) + 1;
                        $orders[$nesting] = addCategoriesToDatabase($menuset, $orders);
                    }
                    $type = false;
                    break;
                case 'all_albums':
                    $orders[$nesting] ++;
                    $orders[$nesting] = addAlbumsToDatabase($menuset, $orders);
                    $type = false;
                    break;
                case 'all_zenpagepages':
                    $orders[$nesting] ++;
                    $orders[$nesting] = addPagesToDatabase($menuset, $orders);
                    $type = false;
                    break;
                case 'all_zenpagecategorys':
                    $orders[$nesting] ++;
                    $orders[$nesting] = addCategoriesToDatabase($menuset, $orders);
                    $type = false;
                    break;
                case 'album':
                    $result['title'] = NULL;
                    if (empty($result['link'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty link.'), $key));
                    }
                    break;
                case 'homepage':
                    $result['link'] = NULL;
                    if (empty($result['title'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty title.'), $key));
                    }
                    break;
                case 'galleryindex':
                    $result['link'] = NULL;
                    if (empty($result['title'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty title.'), $key));
                    }
                    break;
                case 'zenpagepage':
                    $result['title'] = NULL;
                    if (empty($result['link'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty link.'), $key));
                    }
                    break;
                case 'zenpagenewsindex':
                    $result['link'] = NULL;
                    if (empty($result['title'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty title.'), $key));
                    }
                    break;
                case 'zenpagecategory':
                    $result['title'] = NULL;
                    if (empty($result['link'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty link.'), $key));
                    }
                    break;
                case 'custompage':
                    if (empty($result['title']) || empty($result['link'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty title or link.'), $key));
                    }
                    break;
                case 'customlink':
                    if (empty($result['title'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty title.'), $key));
                    } else if (empty($result['link'])) {
                        $result['link'] = seoFriendly(get_language_string($result['title']));
                    }
                    break;
                case 'menulabel':
                    if (empty($result['title'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty title.'), $key));
                    }
                    $result['link'] = sha1($result['title']);
                    break;
                case 'menufunction':
                    if (empty($result['title']) || empty($result['link'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty title or link.'), $key));
                    }
                    break;
                case 'html':
                    if (empty($result['title']) || empty($result['link'])) {
                        $success = -1;
                        debugLog(sprintf(gettext('createMenuIfNotExists item %s has an empty title or link.'), $key));
                    }
                    break;
                default:
                    $success = -1;
                    debugLog(sprintf(gettext('createMenuIfNotExists item %s has an invalid type.'), $key));
                    break;
            }
            if ($success > 0 && $type) {
                $orders[$nesting] ++;
                $sort_order = '';
                for ($i = 0; $i < count($orders); $i++) {
                    $sort_order .= sprintf('%03u', $orders[$i]) . '-';
                }
                $sort_order = substr($sort_order, 0, -1);
                $sql = "INSERT INTO " . prefix('menu') . " (`title`,`link`,`type`,`show`,`menuset`,`sort_order`,`include_li`) " .
                                "VALUES (" . db_quote($result['title']) .
                                ", " . db_quote($result['link']) .
                                "," . db_quote($result['type']) . "," . $result['show'] .
                                "," . db_quote($menuset) . "," . db_quote($sort_order) . ",$includeli)";
                if (!query($sql, false)) {
                    $success = -2;
                    debugLog(sprintf(gettext('createMenuIfNotExists item %1$s query (%2$s) failed: %3$s.'), $key, $sql, db_error()));
                }
            }
        }
    } else {
        $success = 0;
    }
    if ($success < 0) {
        trigger_error(gettext('createMenuIfNotExists has posted processing errors to your debug log.'), E_USER_NOTICE);
    }
    return $success;
}
function getMenuItemChilds($menuset = 'default', $allchilds = false) {
  $sortorder = getCurrentMenuItem($menuset);
  $items = getMenuItems($menuset, getMenuVisibility());
  if (count($items) > 0) {
    if ($sortorder) { 
      $length = strlen($sortorder);
      $level = explode('-', $sortorder);
      $level = count($level);
      $childs = array();
      foreach ($items as $item) {
        $itemlevel = explode('-', $item['sort_order']);
        $itemlevel = count($itemlevel);
        if ($allchilds) {
          $is_validchild = true;
        } else {
          if ($itemlevel == $level + 1) {
            $is_validchild = true;
          } else {
            $is_validchild = false;
          }
        }
        if (substr($item['sort_order'], 0, $length) == $sortorder && $item['sort_order'] != $sortorder && $is_validchild) {
          array_push($childs, $item);
        }
      }
      if (!empty($childs)) {
        return $childs;
      }
    }
  }
  return false;
}
function isCurrentitemParent($menuset = 'default', $item) {
    $currentid = getCurrentMenuItem($menuset, 'id');
    $allparents = getParentMenuItems($menuset);
    foreach($allparents as $parent) {
        if($item['id'] != $currentid && $parent['id'] == $item['id']) {
            return true;
        }
        return false;
    } 
    
}
function printCustomMenu($menuset = 'default', $option = 'list', $css_id = '', $css_class_topactive = '', $css_class = '', $css_class_active = '', $showsubs = 0, $counter = false) {
    global $_zp_zenpage, $_zp_gallery_page, $_zp_current_zenpage_page, $_zp_current_category;
    $itemcounter = '';
    if ($css_id != "") {
        $css_id = " id='" . $css_id . "'";
    }
    if ($showsubs === true)
        $showsubs = 9999999999;
    $currentitem = getCurrentMenuItem($menuset, 'all');
    $sortorder = '';
    $currentitem_parentid = '';
    $pageid = '';
    if(is_array($currentitem)) {
        $sortorder = $currentitem['sort_order'];
        $currentitem_parentid = $currentitem['parentid'];
        $pageid = $currentitem['id'];
    }
    $items = getMenuItems($menuset, getMenuVisibility());
    if (count($items) == 0)
        return; 
    
    if ($startlist = !($option == 'omit-top' || $option == 'list-sub')) {
        echo "<ul$css_id>";
    }
    $baseindent = max(1, count(explode("-", $sortorder)));
    $indent = 1;
    $open = array($indent => 0);
    $parents = array(NULL);
    $order = explode('-', $sortorder);
    $mylevel = count($order);
    $myparentsort = array_shift($order);
    for ($c = 0; $c <= $mylevel; $c++) {
        $parents[$c] = NULL;
    }
    foreach ($items as $item) {
        $itemarray = getItemTitleAndURL($item);
        $itemURL = $itemarray['url'];
        $itemtitle = $itemarray['title'];
        $level = max(1, count(explode('-', $item['sort_order'])));
        $process = (($level <= $showsubs && $option == "list") 
                        || ($option == 'list' || $option == 'list-top') && $level == 1 
                        || (($option == 'list' || ($option == 'omit-top' && $level > 1)) && (($item['id'] == $pageid) 
                        || ($item['parentid'] == $pageid) 
                        || ($level < $mylevel && $level > 1 && strpos($item['sort_order'], $myparentsort) === 0)) 
                        || (($level == $mylevel) && ($currentitem_parentid == $item['parentid'])) 
                        ) || ($option == 'list-sub' && ($item['parentid'] == $pageid) 
                        )
                        );
        if ($process) {
            if ($level > $indent) {
                echo "\n" . str_pad("\t", $indent, "\t") . "<ul class=\"$css_class menu_{$item['type']}\">\n";
                $indent++;
                $parents[$indent] = NULL;
                $open[$indent] = 0;
            } else if ($level < $indent) {
                $parents[$indent] = NULL;
                while ($indent > $level) {
                    if ($open[$indent]) {
                        $open[$indent] --;
                        echo "</li>\n";
                    }
                    $indent--;
                    echo str_pad("\t", $indent, "\t") . "</ul>\n";
                }
            } else { 
                if ($open[$indent]) { 
                    echo str_pad("\t", $indent, "\t") . "</li>\n";
                    $open[$indent] --;
                } else {
                    echo "\n";
                }
            }
            if ($open[$indent]) { 
                echo "</li>\n";
                $open[$indent] --;
            }
            echo str_pad("\t", $indent - 1, "\t");
            $open[$indent] += $item['include_li'];
            $parents[$indent] = $item['id'];
            if ($counter) {
                switch ($item['type']) {
                    case'album':
                        $albumobj = newAlbum($item['link']);
                        $numimages = $albumobj->getNumImages();
                        $numsubalbums = $albumobj->getNumAlbums();
                        $itemcounter = ' <span style="white-space:nowrap;"><small>(';
                        if ($numsubalbums != 0) {
                            $itemcounter .= sprintf(ngettext('%u album', '%u albums', $numsubalbums), $numsubalbums);
                        }
                        if ($numimages != 0) {
                            if ($numsubalbums != 0) {
                                $itemcounter .= ' ';
                            }
                            $itemcounter .= sprintf(ngettext('%u image', '%u images', $numimages), $numimages);
                        }
                        $itemcounter .= ')</small></span>';
                        break;
                    case'zenpagecategory':
                        if ((zp_loggedin(ZENPAGE_NEWS_RIGHTS | ALL_NEWS_RIGHTS))) {
                            $published = "all";
                        } else {
                            $published = "published";
                        }
                        $catobj = new ZenpageCategory($item['link']);
                        $catcount = count($catobj->getArticles(0, $published));
                        $itemcounter = "<small> (" . $catcount . ")</small>";
                        break;
                }
            }
            if ($item['id'] == $pageid && !is_null($pageid)) {
                if ($level == 1) { 
                    $class = ' ' . $css_class_topactive;
                } else {
                    $class = ' ' . $css_class_active .'-' . $level;
                }
                echo '<li class="menu_' . trim($item['type'] . ' ' . $class) . '">' . $itemtitle . $itemcounter;
            } else {
                if (strpos($sortorder, $item['sort_order']) === 0) { 
                    if ($level == 1) { 
                        $class = ' ' . $css_class_topactive;
                    } else {
                        $class = ' ' . $css_class_active .'-' . $level;
                    }
                } else {
                    $class = '';
                }
                if ($item['include_li']) {
                    echo '<li class="menu_' . $item['type'] . $class . '">';
                }
                if ($item['span_id'] || $item['span_class']) {
                    echo '<span';
                    if ($item['span_id'])
                        echo ' id="' . $item['span_id'] . '"';
                    if ($item['span_class'])
                        echo ' class="' . $item['span_class'] . '"';
                    echo '>';
                }
                switch ($item['type']) {
                    case 'html':
                        echo $item['link'];
                        break;
                    case 'menufunction':
                        $i = strpos($itemURL, '(');
                        if ($i) {
                            if (function_exists(trim(substr($itemURL, 0, $i)))) {
                                eval($itemURL);
                            }
                        }
                        break;
                    case 'menulabel':
                        echo $itemtitle;
                        break;
                    default:
                        if (empty($itemURL)) {
                            $itemURL = FULLWEBPATH;
                        }
                        echo '<a href="' . $itemURL . '" title="' . getBare($itemtitle) . '">' . $itemtitle . '</a>' . $itemcounter;
                        break;
                }
                if ($item['span_id'] || $item['span_class']) {
                    echo '</span>';
                }
            }
        }
    }
    
    while ($indent > 1) {
        if ($open[$indent]) {
            echo "</li>\n";
            $open[$indent] --;
        }
        $indent--;
        echo str_pad("\t", $indent, "\t") . "</ul>";
    }
    if ($open[$indent]) {
        echo "</li>\n";
        $open[$indent] --;
    } else {
        echo "\n";
    }
    if ($startlist) {
        echo "</ul>\n";
    }
}
?>