function get_program_list_from_gdoc($source_url)
{
    $handle = @fopen($source_url, 'r');
    if (!$handle) {
        return FALSE;
        // failed
    }
    $program_list = array();
    while (($PROG = fgetcsv($handle)) !== FALSE) {
        $program = make_program($PROG);
        if (!validate_program_data($program)) {
            continue;
        }
        // use strtotime to convert to unix timestamp.
        $program['from'] = strtotime($program['from']);
        $program['to'] = strtotime($program['to']);
        // empty string or NULL will get 0
        $program['room'] = intval($program['room']);
        $program['type'] = intval($program['type']);
        $program['community'] = intval($program['community']);
        if (isset($program['bio'])) {
            $program['bio'] = Markdown_Without_Markup(linkify($program['bio']));
        }
        if (isset($program['abstract'])) {
            $program['abstract'] = Markdown_Without_Markup(linkify($program['abstract']));
        }
        if (isset($program['youtube'])) {
            $videos = array();
            foreach (explode("\n", $program['youtube']) as $url) {
                if (trim($url)) {
                    $videos[] = preg_replace('/^.+v=([^"&?\\/ ]{11}).*$/', '$1', trim($url));
                    // only get the ID
                }
            }
            $program['youtube'] = $videos;
        }
        // setting room = -1 and leaving speaker empty indicate a break session
        $program['isBreak'] = $program['room'] < 0 && !isset($program['speaker']) ? true : false;
        $program_list[] = $program;
    }
    fclose($handle);
    return $program_list;
}
function get_sponsors_list_from_gdoc($source_url)
{
    $handle = @fopen($source_url, 'r');
    if (!$handle) {
        return FALSE;
        // failed
    }
    $SPONS = array();
    // name, level, url, logoUrl, desc, enName, enDesc, zhCnName, zhCnDesc
    while (($SPON = fgetcsv($handle)) !== FALSE) {
        $sponsor = make_sponsor($SPON);
        if (!validate_sponsor_data($sponsor)) {
            continue;
        }
        $level = strtolower($sponsor['level']);
        if (!isset($SPONS[$level])) {
            $SPONS[$level] = array();
        }
        // Create JSON object
        $SPON_obj = array('name' => array('zh-tw' => $sponsor['name']), 'desc' => array('zh-tw' => Markdown_Without_Markup($sponsor['desc'])), 'url' => $sponsor['url'], 'logoUrl' => MARKSITE_ABSOLUTE_PATH . SPONSOR_LOGO_RELATIVE_PATH . $sponsor['logoUrl']);
        if ($sponsor['enName']) {
            $SPON_obj['name']['en'] = $sponsor['enName'];
        }
        if ($sponsor['enDesc']) {
            $SPON_obj['desc']['en'] = Markdown_Without_Markup($sponsor['enDesc']);
        }
        if ($sponsor['zhCnName']) {
            $SPON_obj['name']['zh-cn'] = $sponsor['zhCnName'];
        }
        if ($sponsor['zhCnDesc']) {
            $SPON_obj['desc']['zh-cn'] = Markdown_Without_Markup(linkify($sponsor['zhCnDesc']));
        }
        array_push($SPONS[$level], $SPON_obj);
    }
    fclose($handle);
    return $SPONS;
}