function b_update_notice($options)
{
    global $xoopsDB, $xoopsUser;
    $pkg = $xoopsDB->prefix('update_package');
    $res = $xoopsDB->query("SELECT a.pname, b.name, b.pversion\nFROM {$pkg} a, {$pkg} b WHERE a.pversion='HEAD' AND a.parent=b.pkgid");
    $pkgs = array();
    while ($data = $xoopsDB->fetchArray($res)) {
        $pkgs[$data['pname']] = array('name' => $data['name'], 'pversion' => $data['pversion']);
    }
    $modpath = dirname(dirname(__FILE__));
    $dirname = basename($modpath);
    include_once $modpath . '/functions.php';
    $module_handler =& xoops_gethandler('module');
    $module =& $module_handler->getByDirname($dirname);
    // only for admin this module
    if (!is_object($xoopsUser) || !$xoopsUser->isAdmin($module->getVar('mid'))) {
        return array('admin' => false);
    }
    $config_handler =& xoops_gethandler('config');
    $config =& $config_handler->getConfigsByCat(0, $module->getVar('mid'));
    $svr = $config['update_server'];
    if (!preg_match('/^\\w+:/', $svr)) {
        return null;
    }
    $url = $svr . "/modules/server/list.php?pkg=all&ext=1";
    $block = array('admin' => true, 'dirname' => $dirname);
    $updates = array();
    if (empty($pkgs)) {
        $msg = _BL_UPDATE_NOPKGS;
    } else {
        $list = file_get_url($url, 'list');
        if (empty($list)) {
            return null;
        }
        foreach (split("\n", $list) as $ln) {
            if (empty($ln)) {
                continue;
            }
            list($pname, $ver, $date, $vcheck, $name) = split_csv($ln);
            if (isset($pkgs[$pname])) {
                if ($ver != $pkgs[$pname]['pversion']) {
                    $time = strtotime_tz($date);
                    $date = formatTimestamp($time, 'm/d h:i');
                    $updates[] = array('pname' => $pname, 'pversion' => $ver, 'time' => $time, 'date' => $date, 'vcheck' => $vcheck, 'name' => $name);
                }
            }
        }
        $msg = empty($updates) ? "" : _BL_UPDATE_EXIST;
    }
    $block['message'] = $msg;
    $block['updates'] = $updates;
    return $block;
}
function pkg_info_csv($ln)
{
    $ln = trim($ln);
    if (empty($ln)) {
        return false;
    }
    $F = split_csv(trim($ln));
    return array('pname' => $F[0], 'pversion' => $F[1], 'dtime' => strtotime_tz($F[2]), 'vcheck' => $F[3], 'name' => $F[4], 'delegate' => empty($F[5]) ? "" : $F[5]);
}
function process_form(module_add_view $view, module_add_form $form, $formdata)
{
    global $DB;
    // Course list
    $courserows = split_csv($form->get_file_content('courses'));
    // Check basic validity of course list file
    $i = 1;
    foreach ($courserows as $courserow) {
        if (count($courserow) != 2) {
            $view->maincsv_error('Incorrect number of fields on line ' . $i);
        }
        $i++;
    }
    // Parameters XML file
    $moduleparamsstr = $form->get_file_content('moduleparams');
    if (empty($moduleparamsstr)) {
        $moduleparamsstr = '<paramitems></paramitems>';
    }
    libxml_use_internal_errors(true);
    $paramsxmlobj = simplexml_load_string($moduleparamsstr, null, LIBXML_NOCDATA);
    $errors = libxml_get_errors();
    if (count($errors) > 0) {
        $errorstr = '';
        foreach ($errors as $error) {
            $errorstr .= '\\non line ' . ($error->line - 1) . ' - ' . $error->message;
        }
        $view->moduleparams_error($errorstr);
    } else {
        $numparamitems = count($paramsxmlobj->paramitem);
        if ($numparamitems != 1 && $numparamitems != count($courserows)) {
            $view->moduleparams_error('Module parameters file must have exactly one or same number of items as course list file');
        }
    }
    // If permissions override file exists, check it is valid
    $permissionscsvrows = split_csv($form->get_file_content('permsfile'));
    $capabilities_check = new capabilities_check();
    $i = 1;
    foreach ($permissionscsvrows as $csvrow) {
        if (!$capabilities_check->valid_role($csvrow[0])) {
            $msg = 'Invalid role ID found on line ' . $i . ', ' . $csvrow[0];
            $view->permissions_override_error($msg);
        } else {
            if (!$capabilities_check->valid_capability($csvrow[1])) {
                $msg = 'Invalid capability found on line ' . $i . ', ' . $csvrow[1];
                $view->permissions_override_error($msg);
            } else {
                if (!$capabilities_check->valid_permission($csvrow[2])) {
                    $msg = 'Invalid permission found on line ' . $i . ', ' . $csvrow[2];
                    $view->permissions_override_error($msg);
                }
            }
        }
        $i++;
    }
    $module = $formdata->module;
    $atstart = isset($formdata->atstart) ? true : false;
    $view->output_processing_start();
    $i = 0;
    foreach ($courserows as $courserow) {
        // If course ID is set, pass this to course_mod_add otherwise get course IDs for module code
        $courseid = (int) $courserow[0];
        if ($courseid > 0) {
            $courseIDs = array($courseid);
        } else {
            $like = $courserow[1] . '%';
            $rows = $DB->get_records_sql('SELECT id FROM {course} WHERE shortname LIKE ?', array($like));
            $courseIDs = array();
            foreach ($rows as $row) {
                $courseIDs[] = $row->id;
            }
        }
        // Select correct module parameters for current course
        if ($numparamitems == 1) {
            $moduleparams = $paramsxmlobj->paramitem[0];
        } else {
            $moduleparams = $paramsxmlobj->paramitem[$i];
        }
        $visible = isset($formdata->visible) ? 1 : 0;
        foreach ($courseIDs as $courseID) {
            $tablefields = array($courseID, $courserow[1]);
            $ret = course_mod_add::add($module, $courseID, $atstart, (int) $formdata->ifexists, $moduleparams, 0, $visible, $permissionscsvrows);
            if (!$ret[0]) {
                $tablefields[] = $ret[1];
            } else {
                $tablefields[] = 'Done';
            }
            $view->output_processing_row($tablefields);
            sleep(1);
        }
        $i++;
    }
    $view->output_processing_end();
}