<?php
// Yes, this script is a mess.  I'm planning to rewrite it
// from scratch this winter, using a nicely structured library
// to generate XHTML.  I haven't finished the library yet,
// and at the moment, tidying my house is a higher priority
// than tidying my scripts.


// Parse an interval in weeks/days/hours format
function parse_interval($s)
{
    
$val 0;
    
    
$a sscanf($s," %d %s %d %s %d %s %d %s");
//    print_r($a);
    
for ($i=0$i<8$i+=2) {
        
$v $a[$i];
        
$u $a[$i+1];
        switch(
$u) {
        case 
'min':
        case 
'mins':
            
$val += $v 60;
            break;
        case 
'hour':
        case 
'hours':
            
$val += $v 3600;
            break;
        case 
'day':
        case 
'days':
            
$val += $v 3600 24;
            break;
        case 
'week':
        case 
'weeks':
            
$val += $v 3600 24 7;
            break;
        }
    }
    
    return 
$val;
}


$TITLE="Eric Wilner: upcoming events";

$select $_GET['select'];
$plain $_GET['plain'];
$single_listing 0;

    if (
eregi("id",$select)) {
//      $NOLOG_REF = 1;
        
$NOLOG_BROWS 1;
    }

    if (
$select == "all") {
        
$TITLE "Eric Wilner: events archive (WARNING: large!)";
    }

    
$RETURN_TO[0]->name "Gumbyware";
    
$RETURN_TO[0]->dest "/";
    
$RETURN_TO[1]->name "Eric's home page";
    
$RETURN_TO[1]->dest "/~eric/";
    if (
$select) {
        
$RETURN_TO[2]->name "Upcoming events";
        
$RETURN_TO[2]->dest "upcoming.php";
    }

    
$STYLES "base twocolumn events";

    include(
"browserid.inc");
    include(
"header.inc");

    
$modern $browser->css_ok;
    
?>

<?php
if ($modern) {
    print(
'<div id="leftcol">');
}
?>

<?php
/*
if ($select=="all" || ereg("candlelight",$REQ)) {
    print("<h3>As seen on ba.food!  Norman Invasion Weekend, 2002</h3>\n");
    print("If you're looking for candlelight dinners (featuring Alpine Inn\n" .
          "greaseburgers and rickety ancient picnic tables), check the archive\n" .
          "(linked below).  I'll be leading that event again in the spring,\n" .
          "when the evenings get longer.\n"
    );
    print("<hr>\n");
}
*/
?>

<?php
if (!$select || $select == "all") {
    print(<<<EOD
<div>
Terror alert level:
<a href="http://www.geekandproud.net/terror/">
<img alt="Terror Alert Level" border="0" src="http://www.geekandproud.net/terror/terror.php" />
</a>
</div>
<hr />
See also my <a href="http://siliconvalleyredneck.typepad.com/">blog</a>.
<hr />
EOD
    );
    print(
"<p> <font size=\"+1\">\n");
    print(
"These are events where I may likely be found, or which may be of interest.\n");
    print(
"</font>");
    print(
"In some cases, I'm the organizer. Others are run by other people or\n");
    print(
"organizations, and some just happen all by themselves.  Generally, they're\n");
    print(
"somewhere around the San Francisco Bay Area, especially the south end.\n");
    print(
"</p>\n");
    include(
'notes.inc');
    print(
"Questions? <a href=\"mailto:eric@gumbyware.com\">"
        
"eric@gumbyware.com</a>\n");
}
?>

<?php
if ($select == "all") {
    if (
eregi("crawler"$HTTP_USER_AGENT)
     || 
eregi("archiver"$HTTP_USER_AGENT)
       ) {
        print(
"We don't serve droids in here!<br>\n");
        print(
"(If you're not a droid, please\n");
        print(
"<a href=\"mailto:eric@gumbyware.com\">drop me a note</a>\n");
        print(
"so I can update my spider-proofing.)\n");
        print(
"</body></html>\n");
        exit;
    }

    print(
"<p>Note: this is a list of all events on my public calendar,\n" .
          
"past, present, and future.  Owing to the way the database\n" .
          
"is organized, some past listings may differ from their original\n" .
          
"forms -- when I recycle a writeup, I often make topical\n" .
          
"changes to it, which will appear, confusingly, in past\n" .
          
"instances.<br/ >\n" .
          
"As a further refinement, events more than a week old are shown\n" .
          
"only by date, time, and title, with a link to the\n" .
          
"writeup.  This should reduce the number of misguided searches\n" .
          
"which hit the archive.  ESPECIALLY the ones looking for\n" .
          
"network-related sofware with arboreal names!  I know NOTHING\n" .
          
"of J*n*p*r Networks programs with names like Ol*ve or C*pr*ss,\n" .
          
"though I have been known to mention the names of those trees\n" .
          
"(and/or bushes) from time to time.</p>\n"
    
);
} else if (!
$select && $HTTP_USER_AGENT
           
&& !eregi("crawler"$HTTP_USER_AGENT)
           && !
eregi("archiver"$HTTP_USER_AGENT)
          ) {
    print(
"<p>Note: if you got here via a search engine, you may have been\n" .
          
"looking for something that's already gone past.\n" .
          
"In this case, you can check the\n" .
          
"<a href=\"${_SERVER['PHP_SELF']}?select=all\">archive.</a></p>\n"
    
);
}

if (!
$plain) {

    if (!
$modern) {
        print(
"<center><img src=\"test/icons/lines/tracks.gif\"".
              
" alt=\"Divider\"></center>\n");
    }
}

if (
$modern) {
    print(
'</div>');
    print(
'<div id="maincol">');
}

// Here are the guts of the database-looker-upper...

// First we need to connect to the PostgreSQL server on ridcully:
$dbase=pg_connect("host=ridcully port=5432 dbname=test");

// The date isn't going to be visible to the user, but strtodate() seems
// to like the SQL format best.
pg_exec($dbase,"set DateStyle to 'SQL'");
// pg_exec($dbase,"set DateStyle to 'ISO'");

// Do a database query to find applicable events
if ($select=="all") {
    
$condition "";
} else if (
$select && eregi(";",$select)) {
    print(
"You naughty boy, you can't hack my database that way!\n");
    exit;
} else if (
$select) {
    
$condition "where $select";
} else {
    
// Events that happen today or later
//    $today = date("M j Y");
//    $condition = "where event_date >= '$today'";
    // Events a week ago or later
    
$condition "where event_date >= date 'today' - interval '1 week'";
}
$result pg_exec($dbase,"select * from instances
                          
$condition
                          order by event_date, start_time"
);

if (
pg_numrows($result) == 0) {
    
// Whoops -- no answers
    
if ($select) {
        print(
"Oops!  No results for query \"$select\".\n");
    } else {
        print(
"Hmm... looks like I don't have anything on my schedule.\n" .
              
" Either that, or something's broken.\n"
        
);
    }
} else if (
pg_numrows($result) == 1) {
    
$single_listing 1;
}

$NOW time();
$TOMORROW $NOW 24 3600;
$LAST_WEEK $NOW 24 3600;

// Now we generate HTML for each row returned by the query...
for ($row=0$row<pg_numrows($result); $row++) {
    
// Get the row as a PHP object for ease of reference
    
$instance=pg_fetch_object($result,$row);
    
$organization=NULL;
    
$leader=NULL;
    if (
$instance->content_link) {
        
// There should also be a content record, indexed by ID, which
        // is a unique key.
        
$res2=pg_exec($dbase,"select * from contents " .
                             
"where id=$instance->content_link");
        
$content=pg_fetch_object($res2,0);
        if (
$content->meeting_link) {
        
// There's a further link to the directions to the meeting place.
            
$res2=pg_exec($dbase,"select * from meeting_places " .
                                 
"where id=$content->meeting_link");
            
$meeting=pg_fetch_object($res2,0);
        } else {
            
$meeting=NULL;
        }
        if (
$content->leader_link) {
        
// Get the record for the event leader, if any
            
$res2=pg_exec($dbase,"select * from users " .
                                 
"where id=$content->leader_link");
            
$leader=pg_fetch_object($res2,0);
        }
        if (
$content->organization) {
            
$res2=pg_exec($dbase,"select * from organizations " .
                                 
"where short_name='$content->organization'");
            if (
pg_numrows($res2)) {
                
$organization=pg_fetch_object($res2,0);
            }
        }
    } else {
        
$content=NULL;
    }

    
// For convenience, we convert the date back into internal format, so
    // we can format it ourselves.
    
$event_start strtotime("$instance->start_time $instance->event_date");

    if (
$content->duration) {
//        $duration=strtotime(substr($content->duration,1,99),0);
    
$d substr($content->duration,1,99);
//        $duration=strtotime($d,0);
        
$duration=parse_interval($d);
    } else {
        
$duration=0;
    }
    
$event_end=$event_start+$duration;
    
$start_date date("D M j",$event_start);
    
$end_date=date("D M j",$event_end-1);
    
$yeardate("Y",$event_start);
    if (
$instance->start_time) {
        
$start_time date("g:i A",$event_start);
    } else {
        
$start_time "";
    }
    if (
$event_start $NOW) {
        
$class="missed";
    } else if (
$event_start $TOMORROW) {
        
$class="today";
    } else {
        
$class="future";
    }

    print(
"<div class=\"event-$class\">\n");
    print(
"<div class=\"ev-caption\">\n");
    if (
$plain && $content != NULL) {
        if (
$duration 24 3600) {
            print(
"$start_date - $end_date $content->title<BRr>\n");
        } else {
            print(
"$start_date$content->title &nbsp;&nbsp;&nbsp;$start_time<BR>\n");
        }
    } else {
        
$print_time NULL;
        if (
$duration 24 3600) {
            
$print_date "$start_date - $end_date$year";
        } else {
            
$print_date "$start_date$year";
            if (
$start_time && ($duration || $start_time != "12:00 AM")) {
                
$print_time $start_time;
            }
        }
        print(
"<span class=\"ev-date\">");
        print(
"<span class=\"$class\">");
        print(
$print_date);
        print(
"</span>\n");
        print(
"</span>\n");

        if (
$print_time) {
            print(
"<span class=\"ev-time\">$print_time</span>\n");
        }
    
        if (
$content != NULL) {
            print(
"<span class=\"ev-title\">");
            if (
$select == "all" && $event_start $LAST_WEEK) {
                print(
"<a href=\"${_SERVER['PHP_SELF']}?select=id=".$instance->id.
                
"\">$content->title</a>\n");
                print(
"</span></div></div>");
                continue;
            } else {
                print(
"$content->title");
            }
            print(
"</span>\n");
//        } else if ($instance->comments) {
//            print("<span class=\"ev-nocontent\">\n");
//            print("$instance->comments");
//            print("</span>\n");
        
}
    }

    if(
$instance->status) {
        print(
"<span style=\"font-size:125%; font-weight: bold; border:4px gray groove; padding:3px; float:right;\">$instance->status</span>\n");
    }

    if (
$organization && !$plain) {
        print(
"<div class=\"ev-org\">");
        if (
$organization->www) {
            print(
"(<a href=\"$organization->www\">");
            print(
"$organization->long_name</a>");
            if (
$single_listing) {
                print(
": $organization->www");
            }
            print(
")\n");
        } else {
            print(
"($organization->long_name)\n");
        }
        print(
"</div>");    // organization
    
}
    print(
"</div>\n");    // caption

    
if (!$content && $instance->comments) {
          print(
"<span class=\"ev-nocontent\">\n");
          print(
"$instance->comments");
          print(
"</span>\n");
    }
    if (
$content && $content->writeup) {
        print(
"<div class=\"content\">\n");

        if (!
$select) {
            print(
"<a href=\"${_SERVER['PHP_SELF']}?plain=1&select=id=".$instance->id.
                  
"\"><img class=\"ev-print\" border=0 alt=printable ".
                  
"src=mail.png></a>");
            print(
"<a href=\"${_SERVER['PHP_SELF']}?select=id=".$instance->id.
                  
"\"><img class=\"ev-print\" border=0 alt=printable ".
                  
"src=print2.gif></a>");
        }

        if (
$content->icon) {
            print(
"<img class=\"ev-icon\" src=\"test/icons/$content->icon\">");
        }

        if (
strlen($content->writeup) < 50) {
            
// The 'writeup' field should point to an HTML body (no header)
            // in the leader's subdirectory.
            
print("<p>");
            
$fp fopen("/home/lpss/$leader->username/$content->writeup","r");
            while (
1) {
                
$ch fgetc($fp);
                if (
feof($fp)) break;
                print(
$ch);
            }
            
fclose($fp);
        } else { 
            
// The 'writeup' field contains the actual writeup.
            
print("<p>$content->writeup");
        }
        
// Now see if there's a standard meeting place specified
        
if ($meeting) {
            if (
$plain && $start_time) {
                print(
" <b>Meet</b> at <a href=\"meeting.php?WHICH=$meeting->id\">");
                print(
"$meeting->name</a> at $start_time.\n");
            } else {
                print(
" <b>Meet</b> at <a href=\"meeting.php?WHICH=$meeting->id\">");
                print(
"$meeting->name</a>.\n");
            }
        }
        
// Is there additionally a comment?
        
if ($instance->comments) {
            print(
"<br /><i>$instance->comments</i>\n");
        }
        
// If there's a meeting place, _and_ a single event is being
        // shown, show the directions.
        
if ($meeting && $single_listing) {
            print(
"</p><p><b>Directions</b> to $meeting->description:\n");
            print(
"$meeting->directions\n");
        }
        print(
"</p>");
        print(
"</div>\n");    // content
    
}
    print(
"</div>\n");    // event
}

if (
$single_listing
 
&& !eregi("gumbyware"$_SERVER['HTTP_REFERER'])
 && 
$class == "missed" ) {
    
// Single listing, and we got here via search engine, and it's in the past
    // Be nice, and check the database for future instances
    
$result pg_exec($dbase,"select * from instances"
                           
" where event_date > 'now'"
                           
" and content_link = $instance->content_link"
                           
" order by event_date");
    if (
pg_numrows($result)) {
        print(
"You've missed this one, but you may care to check out future instances:\n");
        print(
"<br />");
        for (
$row=0$row<pg_numrows($result); $row++) {
            
$instance=pg_fetch_object($result,$row);
            print(
"<a href=\"${_SERVER['PHP_SELF']}?select=id=".$instance->id."\">");
            print(
$instance->event_date."</a><br />\n");
        }
    } else {
        print(
"Sorry, you've missed this one, and there are no future instances\n" .
              
"on the schedule yet.\n"
        
);
    }
}

pg_close($dbase);

if (
$modern) {
    print(
'</div>');
}

?>


<?php
    
if (&& !$plain) {
        
// Drop in some token silliness here...
        
srand(time());

        print(
"<hr />\n");

if (
0) {
        
$dir=opendir("test/icons/the-corporation");
        
readdir($dir); readdir($dir);    // discard . and ..
        
$numicons 0;
        while (
$fname=readdir($dir)) {
            
$icons[$numicons++] = $fname;
        }
        
closedir($dir);

        if (
$numicons) {
            
sort($icons);

            
$which rand(0,$numicons-1);
            print(
"<a href=\"http://www.thecorporation.com/\">\n");
            print(
"<img src=\"test/icons/the-corporation/$icons[$which]\"></a>\n");
        }

        print(
"&nbsp;&nbsp;");
}

        
$dir=opendir("test/icons/valleyofthegeeks");
        
readdir($dir); readdir($dir);    // discard . and ..
        
$numicons 0;
        while (
$fname=readdir($dir)) {
            
$icons[$numicons++] = $fname;
        }
        
closedir($dir);

        if (
$numicons) {
            
sort($icons);

            
$which rand(0,$numicons-1);
            print(
"<a href=\"http://www.valleyofthegeeks.com/\">\n");
            print(
"<img src=\"test/icons/valleyofthegeeks/$icons[$which]\"></a>\n");
        }
    }
?>
</body>
</html>