function setup_package($dirname)
{
    $pkgs = new PackageList();
    $pkgs->load();
    $pkg = $pkgs->getVar($dirname);
    if (empty($pkg)) {
        $pkg = $pkgs->selectPackage($dirname);
    }
    $pname = $pkg ? $pkg['pname'] : _AM_PKG_NOCURRENT;
    // current package-name
    if ($dirname) {
        $modversion = get_modversion($dirname);
        if (empty($modversion)) {
            return;
        }
        // illigal dirname?
        $title = $modversion['name'] . " ({$dirname})";
    } else {
        $title = XOOPS_VERSION;
    }
    echo "<h1>" . htmlspecialchars($title) . "</h1>\n";
    echo "<table class='outer' border='0' cellspacing='1'>\n";
    $n = 0;
    $form = new XoopsThemeForm(_AM_REG_DETAIL, "CustomForm", 'pkgadmin.php');
    $form->addElement(new XoopsFormHidden('dirname', $dirname));
    $form->addElement(new XoopsFormLabel(_AM_PKG_NAME, $pkg['name']));
    $form->addElement(new XoopsFormLabel(_AM_PKG_DIRNAME, $dirname));
    $form->addElement(new XoopsFormLabel(_AM_PKG_CURRENT_PNAME, $pname));
    $select = new XoopsFormSelect(_AM_PKG_PNAME, 'pname');
    foreach ($pkgs->getAllPackages() as $pn => $apkg) {
        $select->addOption($pn);
    }
    $select->setValue($pname);
    $form->addElement($select);
    $form->addElement(new XoopsFormButton("", "custom", _AM_REG_SUBMIT, "submit"));
    echo $form->render();
}
function get_packages($pname = 'all', $local = true)
{
    $pkgs = new PackageList();
    $pkgs->load();
    $lists = array();
    foreach ($pkgs->pkgs as $dir => $pkg) {
        if (empty($dir)) {
            $pname = $pkgs->getBaseName();
            foreach ($pkg as $info) {
                if ($info['pname'] == $pname) {
                    $lists[$dir] = $info;
                    break;
                }
            }
        } else {
            if (count($pkg)) {
                $lists[$dir] = $pkg[0];
            }
        }
    }
    if (!$local) {
        return $lists;
    }
    // add inactive modules
    $base = XOOPS_ROOT_PATH . "/modules";
    $dh = opendir($base);
    $mlist = array();
    while ($dir = readdir($dh)) {
        if ($dir == '.' || $dir == '..' || !is_dir("{$base}/{$dir}")) {
            continue;
        }
        if (isset($lists[$dir])) {
            continue;
        }
        $modversion = get_modversion($dir);
        if ($modversion == false) {
            continue;
        }
        $mlist[$dir] = array('name' => $modversion['name'] . " " . $modversion['version'], 'pname' => $dir, 'pversion' => '', 'dtime' => 0, 'vcheck' => $dir);
    }
    ksort($mlist);
    global $xoopsDB;
    $llist = array();
    $que = "";
    foreach ($mlist as $dir => $v) {
        $hash = md5_file(XOOPS_ROOT_PATH . "/modules/{$dir}/xoops_version.php");
        $res = $xoopsDB->query("SELECT pkgref FROM " . UPDATE_FILE . " WHERE hash=" . $xoopsDB->quoteString($hash) . " AND path LIKE '%/xoops_version.php'");
        if ($xoopsDB->getRowsNum($res)) {
            // find package
            list($pkgid) = $xoopsDB->fetchRow($res);
            $res = $xoopsDB->query("SELECT * FROM " . UPDATE_PKG . " WHERE pkgid={$pkgid}");
            $data = $xoopsDB->fetchArray($res);
            if ($data['vcheck'] == '') {
                continue;
            }
            // include base module
            $v['pname'] = $data['pname'];
            $v['pversion'] = $data['pversion'];
            $v['dtime'] = $data['dtime'];
            $lists[$dir] = $v;
        } else {
            $que .= "{$hash} {$dir}\n";
            $llist[$hash] = $v;
        }
    }
    if ($que) {
        $server = get_update_server();
        if (!empty($server)) {
            $url = $server . "list2.php";
            $list = file_get_url($url, 'list', array('que' => $que), 0);
            if (empty($list)) {
                foreach (preg_split('/\\n/', $list) as $ln) {
                    $pkg = pkg_info_csv($ln);
                    $hash = $pkg['delegate'];
                    if (isset($llist[$hash])) {
                        $pkg['dirname'] = $dir = $llist[$hash]['vcheck'];
                        unset($llist[$hash]);
                        $lists[$dir] = $pkg;
                    }
                }
            }
        }
    }
    ksort($lists);
    foreach ($llist as $v) {
        $lists[$v['vcheck']] = $v;
    }
    closedir($dh);
    return $lists;
}