Talk:Team:IvyTech-South Bend/Notebook

From 2010.igem.org

(Difference between revisions)
Line 31: Line 31:
   <!-- End Wrapper -->
   <!-- End Wrapper -->
-
    
+
   package com.hurlbert.jspwiki.plugin;
 +
 
 +
import java.io.*;
 +
import java.text.*;
 +
import java.util.*;
 +
import java.lang.IllegalArgumentException;
 +
 
 +
import org.apache.log4j.Category;
 +
 
 +
import com.ecyrd.jspwiki.WikiContext;
 +
import com.ecyrd.jspwiki.WikiEngine;
 +
import com.ecyrd.jspwiki.plugin.PluginException;
 +
import com.ecyrd.jspwiki.plugin.WikiPlugin;
 +
 
 +
public class CalendarList
 +
implements WikiPlugin
 +
{
 +
private static Category log = Category.getInstance(CalendarList.class);
 +
 +
private static final String FORMAT_LIST = "LIST";
 +
private static final String FORMAT_WEEKLY_CALENDAR = "WEEKLY";
 +
 +
public String execute( WikiContext context, Map params )
 +
throws PluginException
 +
{
 +
String htmlOutput = null;
 +
SchedProps schedProps = null;
 +
ArrayList entryList  = null;
 +
PropertiesManager propertiesManager = null;
 +
 +
schedProps = new PropertiesManager().getProperties(context, params);
 +
 
 +
DateRange visibleDateRange = getVisibleDateRange(schedProps);
 +
 +
// DateRange calendarDateRange = getCalendarDateRange(visibleDateRange);
 +
 
 +
entryList = getEvents(context, schedProps, visibleDateRange);
 +
 
 +
Collections.sort(entryList, new EventComparator());
 +
 +
log.debug("Items in the list: " + entryList.size());
 +
 
 +
if( FORMAT_LIST.equalsIgnoreCase(schedProps.format) )
 +
{
 +
return buildSimpleTable( context, schedProps, entryList.iterator() );
 +
}
 +
else if( FORMAT_WEEKLY_CALENDAR.equalsIgnoreCase(schedProps.format) )
 +
{
 +
// return weeklySchedule(visibleDateRange, schedProps, entryList);
 +
return buildWeeklyCal( context, visibleDateRange, schedProps, entryList );
 +
}
 +
else
 +
{
 +
return "Unknown format.  Adjust the format parameter. list or weekly";
 +
}
 +
}
 +
 +
 
 +
/*
 +
* This routine builds a weekly calendar in an HTML table.  It has several assumptions:
 +
*
 +
* - Weeks begin on Monday.
 +
* - A minimum of one week will be shown.
 +
*/
 +
private String buildWeeklyCal( WikiContext p_context,
 +
DateRange p_daterange,
 +
SchedProps p_schedProps,
 +
ArrayList p_entryList )
 +
throws PluginException
 +
{
 +
StringBuffer calTable = new StringBuffer("<table class=\""
 +
+ p_schedProps.stylePrefix + "CalendarList\" cellpadding=\"0\" cellspacing=\"0\">");
 +
 
 +
int offset = 0;
 +
boolean firstDay = true;
 +
Date currentDay = null;
 +
CalWeek  calWeek = null;
 +
 
 +
// Check the prerequisites - can't work with a null date range.
 +
if( p_daterange == null || p_daterange.end == null || p_daterange.start == null )
 +
{
 +
throw new PluginException("Invalid daterange parameter: null values passed.");
 +
}
 +
 +
// Start with the 'currentDay' being the first in our date range.
 +
currentDay = new Date( p_daterange.start.getYear(),
 +
p_daterange.start.getMonth(),
 +
p_daterange.start.getDate() );
 +
 
 +
calWeek = new CalWeek(p_context, currentDay, p_schedProps );
 +
 +
calTable.append(calWeek.getHeader());
 +
 
 +
offset = 0;
 +
firstDay = true;
 +
 +
try
 +
{
 +
while( ! currentDay.after(p_daterange.end) )
 +
{
 +
if( currentDay.getDay() == 1 && !firstDay )
 +
{
 +
// Add events to this week.
 +
calWeek.addEvents(p_context, p_schedProps, p_entryList);
 +
 
 +
 +
//TODO: Add a flag to determine if there is text, this is too slow.
 +
 
 +
String calWeekHTML = calWeek.toString();
 +
 +
if( calWeekHTML != null )
 +
{
 +
// Add this week to the HTML calendar.
 +
calTable.append(calWeekHTML);
 +
}
 +
 
 +
// Start a new week.
 +
calWeek = new CalWeek(p_context, currentDay, p_schedProps);
 +
}
 +
 +
// Go forward another day.
 +
offset++;
 +
currentDay = new Date( p_daterange.start.getYear(),
 +
p_daterange.start.getMonth(),
 +
p_daterange.start.getDate() + offset );
 +
firstDay = false;
 +
}
 +
}
 +
catch( Exception ex )
 +
{
 +
throw new PluginException("buildWeeklyCal failed: " + ex.getMessage());
 +
}
 +
 +
calTable.append("</table>");
 +
 +
return calTable.toString();
 +
}
 +
 
 +
 
 +
// private DateRange getCalendarDateRange(DateRange p_dateRange)
 +
// throws PluginException
 +
// {
 +
// int offset = 0;
 +
//
 +
// Date firstCalDate = null;
 +
// Date lastCalDate  = null;
 +
//
 +
// DateRange calDateRange  = null;
 +
//
 +
// // Get the number of days from the previous monday and start the calendar there.
 +
// offset = getDayNum(p_dateRange.start);
 +
//
 +
// firstCalDate = new Date( p_dateRange.start.getYear(),
 +
// p_dateRange.start.getMonth(),
 +
// p_dateRange.start.getDate() - offset );
 +
//
 +
// lastCalDate = new Date( p_dateRange.end.getYear(),
 +
// p_dateRange.end.getMonth(),
 +
// p_dateRange.end.getDate() );
 +
//
 +
// // Get the number of days to the sunday after the last event and end the calendar there.
 +
// offset = 6 - getDayNum(lastCalDate);
 +
//
 +
// lastCalDate = new Date( p_dateRange.end.getYear(),
 +
// p_dateRange.end.getMonth(),
 +
// p_dateRange.end.getDate() + offset );
 +
//
 +
// calDateRange = new DateRange(firstCalDate, lastCalDate);
 +
//
 +
// log.debug("Cal Start: " + calDateRange.start.toString() + "  Cal End: " + calDateRange.end.toString());
 +
//
 +
// return calDateRange ;
 +
// }
 +
 +
 +
private int getDayNum(Date p_date)
 +
{
 +
if( p_date.getDay() == 0 )
 +
{
 +
return 6;
 +
}
 +
else
 +
{
 +
return p_date.getDay() - 1 ;
 +
}
 +
}
 +
 +
 +
public DateRange getVisibleDateRange(SchedProps p_schedProps)
 +
{
 +
int year  = new Date().getYear();
 +
int month = new Date().getMonth();
 +
int dom  = new Date().getDate(); // day of the month, 1=1st 30=30th
 +
 +
DateRange daterange = new DateRange();
 +
 +
daterange.start = new Date( year, month, dom - p_schedProps.pastDays );
 +
daterange.end  = new Date( year, month, dom + p_schedProps.futureDays );
 +
 +
return daterange;
 +
}
 +
 +
 
 +
public class DateRange
 +
{
 +
Date start = new Date();
 +
Date end  = new Date();
 +
 +
public DateRange()
 +
{
 +
}
 +
 +
public DateRange(Date p_start, Date p_end)
 +
{
 +
start = p_start;
 +
end  = p_end;
 +
}
 +
 +
public boolean before(Date date)
 +
{
 +
if( date == null )
 +
{
 +
throw new IllegalArgumentException("Cannot except a null date.");
 +
}
 +
else
 +
{
 +
return date.before(start);
 +
}
 +
}
 +
 +
public boolean after(Date date)
 +
{
 +
if( date == null )
 +
{
 +
throw new IllegalArgumentException("Cannot except a null date.");
 +
}
 +
else
 +
{
 +
return date.after(end);
 +
}
 +
}
 +
 +
public boolean contains(Date date)
 +
{
 +
return (!before(date) & !after(date)) ;
 +
}
 +
}
 +
 +
 +
public class Event
 +
{
 +
public Event(Date p_date, String p_desc)
 +
{
 +
date = p_date;
 +
desc = p_desc;
 +
}
 +
 
 +
public Date  date = null;
 +
public String desc = null;
 +
 +
public Date getDayDate()
 +
{
 +
return new Date( date.getYear(), date.getMonth(), date.getDate() );
 +
}
 +
}
 +
 +
 +
public class EventComparator implements Comparator
 +
{
 +
public int compare( Object o1, Object o2 )
 +
{
 +
if( o1 == null || o2 == null )
 +
{
 +
return 0;
 +
}
 +
           
 +
Event event1 = (Event) o1;
 +
Event event2 = (Event) o2;
 +
 
 +
return event1.date.compareTo(event2.date);
 +
}
 +
}
 +
 
 +
 +
// /**
 +
// * This class decodes the event types and allows for the addition of custom
 +
// * start and end tags.  Each of these tags is a div with a special class to
 +
// * identify the event type.
 +
// */
 +
// public class EventType
 +
// {
 +
// String startTag = "";
 +
// String endTag = "";
 +
//
 +
// public EventType( Event pEvent )
 +
// {
 +
//
 +
// String content = m_context.getEngine().textToHTML(m_context, pEvent.desc);
 +
//
 +
// if( content != null && content.length() > 0 )
 +
// {
 +
// // Check for Scott Events.
 +
// if( content.indexOf("(S)") > 0 )
 +
// {
 +
// content = "<div class=\"ScottEvent"
 +
// }
 +
// }
 +
// else
 +
// {
 +
// content = "";
 +
// }
 +
//
 +
// return content;
 +
// }
 +
//
 +
//
 +
//
 +
//
 +
// }
 +
//
 +
// public String getStartTag()
 +
// {
 +
// return startTag;
 +
// }
 +
//
 +
// public String getEndTag()
 +
// {
 +
// return endTag;
 +
// }
 +
// }
 +
 +
public class CalDay
 +
{
 +
private SimpleDateFormat dowFormatter  = new SimpleDateFormat( "EEE");
 +
private SimpleDateFormat monthNameFormatter = new SimpleDateFormat( "MMMMMMMMMMMMMMMM");
 +
private SimpleDateFormat timeFormatter = new SimpleDateFormat( "hh:mm a");
 +
 
 +
public SchedProps m_schedProps = null;
 +
public Date m_date = null;
 +
public String m_event = null;
 +
private ArrayList m_events = new ArrayList();
 +
private WikiContext m_context = null;
 +
 +
public CalDay(WikiContext p_context, Date p_calDate, SchedProps p_schedProps)
 +
{
 +
if( p_calDate != null )
 +
{
 +
m_date = p_calDate;
 +
}
 +
else
 +
{
 +
throw new IllegalArgumentException("calDate cannot be null.");
 +
}
 +
 +
if( p_schedProps != null )
 +
{
 +
m_schedProps = p_schedProps;
 +
}
 +
else
 +
{
 +
throw new IllegalArgumentException("calDate cannot be null.");
 +
}
 +
 +
if( p_context != null )
 +
{
 +
m_context = p_context;
 +
}
 +
else
 +
{
 +
throw new IllegalArgumentException("calDate cannot be null.");
 +
}
 +
}
 +
 +
public String getEvents()
 +
{
 +
StringBuffer eventsHTML = new StringBuffer();
 +
 +
addEventsHeader( eventsHTML );
 +
 
 +
if( isToday() )
 +
{
 +
eventsHTML.append( "<div class=\"" + m_schedProps.stylePrefix + "DayEvents " + m_schedProps.stylePrefix + "TodayEvents\">");
 +
}
 +
else
 +
{
 +
eventsHTML.append( "<div class=\"" + m_schedProps.stylePrefix + "DayEvents\">");
 +
}
 +
 +
Collections.sort(m_events, new EventComparator());
 +
 +
Iterator iterator = m_events.iterator();
 +
 +
if( !iterator.hasNext() )
 +
{
 +
addEmptyEventToHTML( eventsHTML );
 +
}
 +
else
 +
{
 +
while( iterator.hasNext() )
 +
{
 +
addEventToHTML( eventsHTML, (Event) iterator.next() );
 +
}
 +
}
 +
 +
eventsHTML.append( "</div>" );
 +
 
 +
return eventsHTML.toString();
 +
}
 +
 +
public void addEventsHeader( StringBuffer pEventsHTML )
 +
{
 +
pEventsHTML.append( "<div class=\"" + m_schedProps.stylePrefix + "DayHeader"
 +
+ ((isWeekDay()) ? " " + m_schedProps.stylePrefix + "WeekDayDayHeader" : " " + m_schedProps.stylePrefix + "WeekEndDayHeader")
 +
+ ((isToday()) ? " " + m_schedProps.stylePrefix + "TodayDayHeader" : "")
 +
+ "\">" );
 +
 +
if( m_date.getDate() == 1 )
 +
{
 +
pEventsHTML.append( "<span class=\"" + m_schedProps.stylePrefix + "MonthName\" >"
 +
+ monthNameFormatter.format(m_date).trim() + " " + "</span>");
 +
}
 +
 
 +
pEventsHTML.append( "<span class=\"" + m_schedProps.stylePrefix + "DayNumber\" >"
 +
+ Integer.toString(m_date.getDate()) + "</span>");
 +
 
 +
pEventsHTML.append("</div>");
 +
 
 +
}
 +
 
 +
public void addEventToHTML( StringBuffer pEventsHTML, Event pEvent )
 +
{
 +
if( pEvent == null )
 +
{
 +
addEmptyEventToHTML( pEventsHTML );
 +
}
 +
else
 +
{
 +
// TODO:Fix -- Change this to use a flag -- .isUntimed() or something
 +
 
 +
if( timeFormatter.format(pEvent.date).toLowerCase().indexOf("12:00 am") > -1 )
 +
{
 +
pEventsHTML.append( "<div class=\"" + m_schedProps.stylePrefix + "UntimedEventDesc"
 +
+ ((isWeekDay()) ? " " + m_schedProps.stylePrefix + "WeekDayUntimedEventDesc" : " " + m_schedProps.stylePrefix + "WeekEndUntimedEventDesc")
 +
+ ((isToday())  ? " " + m_schedProps.stylePrefix + "TodayUntimedEventDesc" : "")
 +
+ "\">" );
 +
pEventsHTML.append( m_context.getEngine().textToHTML(m_context, pEvent.desc) );
 +
pEventsHTML.append( "</div>" );
 +
}
 +
else
 +
{
 +
pEventsHTML.append( "<div class=\"" + m_schedProps.stylePrefix + "TimedEventDate"
 +
+ ((isWeekDay()) ? " " + m_schedProps.stylePrefix + "WeekDayTimedEventDate" : " " + m_schedProps.stylePrefix + "WeekEndTimedEventDate")
 +
+ ((isToday()) ? " " + m_schedProps.stylePrefix + "TodayTimedEventDate" : "")
 +
+ "\">" );
 +
pEventsHTML.append( timeFormatter.format(pEvent.date).toLowerCase() + "" );
 +
pEventsHTML.append( "</div>" );
 +
 +
pEventsHTML.append( "<div class=\"" + m_schedProps.stylePrefix + "TimedEventDesc"
 +
+ ((isWeekDay()) ? " " + m_schedProps.stylePrefix + "WeekDayTimedEventDesc" : " " + m_schedProps.stylePrefix + "WeekEndTimedEventDesc")
 +
+ ((isToday()) ? " " + m_schedProps.stylePrefix + "TodayTimedEventDesc" : "")
 +
+ "\">" );
 +
pEventsHTML.append( m_context.getEngine().textToHTML(m_context, pEvent.desc) );
 +
pEventsHTML.append( "</div>" );
 +
}
 +
}
 +
}
 +
 +
public void addEmptyEventToHTML( StringBuffer pEventsHTML )
 +
{
 +
if( isToday() )
 +
{
 +
pEventsHTML.append("<div class=\"" + m_schedProps.stylePrefix + "TodayEmptyEvent\"></div>");
 +
}
 +
else
 +
{
 +
pEventsHTML.append("<div class=\"" + m_schedProps.stylePrefix + "EmptyEvent\"></div>");
 +
}
 +
 
 +
}
 +
 +
public void addEvent(WikiContext p_context, Event p_event)
 +
{
 +
m_events.add(p_event);
 +
}
 +
 +
 +
public boolean isToday()
 +
{
 +
return isSameDay( new Date(new Date().getYear(), new Date().getMonth(), new Date().getDate()) );
 +
}
 +
 +
public boolean isSameDay(Date p_date)
 +
{
 +
return m_date.equals(p_date);
 +
}
 +
 +
private boolean isWeekDay()
 +
{
 +
return ( m_date.getDay() > 0 & m_date.getDay() < 6 );
 +
}
 +
}
 +
 +
 +
public class CalWeek
 +
{
 +
public CalDay mon = null;
 +
public CalDay tue = null;
 +
public CalDay wed = null;
 +
public CalDay thu = null;
 +
public CalDay fri = null;
 +
public CalDay sat = null;
 +
public CalDay sun = null;
 +
 +
private SchedProps m_schedProps = null;
 +
 +
/*
 +
* This constructor initializes each day of the week so we don't have to
 +
* be concerned with null days later.
 +
*
 +
* The date passed is supposed to be the MONDAY WHICH STARTS THE WEEK. 
 +
* However, if it's not, to draw the calendar correctly, we backup until
 +
* we find the previous monday and fill in each of the days for the week.
 +
*/
 +
public CalWeek(WikiContext p_context, Date p_date, SchedProps p_schedProps)
 +
{
 +
if( p_schedProps != null )
 +
{
 +
m_schedProps = p_schedProps;
 +
}
 +
else
 +
{
 +
throw new IllegalArgumentException("calDate cannot be null.");
 +
}
 +
 +
SimpleDateFormat dowFormatter = new SimpleDateFormat( "EEE");
 +
 
 +
CalDay calDay = null;
 +
 +
Date currentDay = null;
 +
Date startingMonday = null;
 +
 
 +
startingMonday = p_date;
 +
//
 +
// If this isn't monday, back up until we find the previous monday.
 +
//
 +
while( ! "MON".equalsIgnoreCase(dowFormatter.format(startingMonday)) )
 +
{
 +
startingMonday = new Date( startingMonday.getYear(),
 +
startingMonday.getMonth(),
 +
startingMonday.getDate() - 1 );
 +
}
 +
 +
for(int i = 0; i < 7; i++)
 +
{
 +
currentDay = new Date( startingMonday.getYear(),
 +
startingMonday.getMonth(),
 +
startingMonday.getDate() + i );
 +
 
 +
calDay = new CalDay(p_context, currentDay, p_schedProps );
 +
 
 +
try
 +
{
 +
updateDay( calDay );
 +
}
 +
catch( PluginException pe )
 +
{
 +
// ignore
 +
}
 +
}
 +
}
 +
 +
public void updateDay(CalDay p_calDay)
 +
throws PluginException
 +
{
 +
if( p_calDay != null && p_calDay.m_date != null )
 +
{
 +
switch(p_calDay.m_date.getDay())
 +
{
 +
case 1:
 +
mon = p_calDay;
 +
break;
 +
case 2:
 +
tue = p_calDay;
 +
break;
 +
case 3:
 +
wed = p_calDay;
 +
break;
 +
case 4:
 +
thu = p_calDay;
 +
break;
 +
case 5:
 +
fri = p_calDay;
 +
break;
 +
case 6:
 +
sat = p_calDay;
 +
break;
 +
case 0:
 +
sun = p_calDay;
 +
break;
 +
default:
 +
throw new PluginException("updateDay did not recieve a valid calDay parameter.");
 +
}
 +
}
 +
}
 +
 +
public void addEvents(WikiContext p_context, SchedProps p_oSchedProps, ArrayList p_entryList)
 +
throws PluginException
 +
{
 +
String dateString = null;
 +
String eventDesc = null;
 +
String inputLine = null;
 +
 +
Date datetime = null;
 +
Date eventDay = null;
 +
 +
Event event = null;
 +
 
 +
try
 +
{
 +
Iterator iterator = p_entryList.iterator();
 +
 +
while( iterator.hasNext() )
 +
{
 +
event = (Event) iterator.next();
 +
 +
if( event != null )
 +
{
 +
eventDay = event.getDayDate();
 +
 +
if( mon.isSameDay(eventDay) )
 +
{
 +
mon.addEvent(p_context, event);
 +
}
 +
else if( tue.isSameDay(eventDay) )
 +
{
 +
tue.addEvent(p_context, event);
 +
}
 +
else if( wed.isSameDay(eventDay) )
 +
{
 +
wed.addEvent(p_context, event);
 +
}
 +
else if( thu.isSameDay(eventDay) )
 +
{
 +
thu.addEvent(p_context, event);
 +
}
 +
else if( fri.isSameDay(eventDay) )
 +
{
 +
fri.addEvent(p_context, event);
 +
}
 +
else if( sat.isSameDay(eventDay) )
 +
{
 +
sat.addEvent(p_context, event);
 +
}
 +
else if( sun.isSameDay(eventDay) )
 +
{
 +
sun.addEvent(p_context, event);
 +
}
 +
 
 +
} // if( event != null )
 +
 +
} // while( iterator.hasNext() )
 +
}
 +
catch( Exception ex )
 +
{
 +
throw new PluginException("addEvents failed: " + ex.getMessage());
 +
}
 +
}
 +
 +
private String getTodayClassName( CalDay pCalDay)
 +
{
 +
String className = "";
 +
 +
    if( pCalDay != null )
 +
    {
 +
    if( pCalDay.isToday() )
 +
    {
 +
    className = " " + m_schedProps.stylePrefix + "Today";
 +
    }
 +
    }
 +
   
 +
    return className;
 +
}
 +
 
 +
public String toString()
 +
{
 +
StringBuffer out = new StringBuffer("");
 +
 
 +
out.append("<tr class=\"" + m_schedProps.stylePrefix + "Week\">");
 +
 
 +
    out.append("<td  class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Mon" + getTodayClassName(mon) + "\">");
 +
    out.append("<div class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Mon" + getTodayClassName(mon) + "\">");
 +
out.append((mon != null) ? mon.getEvents() : "");
 +
out.append("</div></td>");
 +
 +
    out.append("<td  class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Tue" + getTodayClassName(tue) + "\">");
 +
    out.append("<div class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Tue" + getTodayClassName(tue) + "\">");
 +
out.append((tue != null) ? tue.getEvents() : "");
 +
out.append("</div></td>");
 +
 
 +
    out.append("<td  class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Wed" + getTodayClassName(wed) + "\">");
 +
    out.append("<div class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Wed" + getTodayClassName(wed) + "\">");
 +
out.append((wed != null) ? wed.getEvents() : "");
 +
out.append("</div></td>");
 +
 +
    out.append("<td  class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Thu" + getTodayClassName(thu) + "\">");
 +
    out.append("<div class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Thu" + getTodayClassName(thu) + "\">");
 +
out.append((thu != null) ? thu.getEvents() : "");
 +
out.append("</div></td>");
 +
 
 +
    out.append("<td  class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Fri" + getTodayClassName(fri) + "\">");
 +
    out.append("<div class=\"" + m_schedProps.stylePrefix + "WeekDay " + m_schedProps.stylePrefix + "Fri" + getTodayClassName(fri) + "\">");
 +
out.append((fri != null) ? fri.getEvents() : "");
 +
out.append("</div></td>");
 +
 
 +
    out.append("<td  class=\"" + m_schedProps.stylePrefix + "WeekEnd " + m_schedProps.stylePrefix + "Sat" + getTodayClassName(sat) + "\">");
 +
    out.append("<div class=\"" + m_schedProps.stylePrefix + "WeekEnd " + m_schedProps.stylePrefix + "Sat" + getTodayClassName(sat) + "\">");
 +
out.append((sat != null) ? sat.getEvents() : "");
 +
out.append("</div></td>");
 +
 
 +
    out.append("<td  class=\"" + m_schedProps.stylePrefix + "WeekEnd " + m_schedProps.stylePrefix + "Sun" + getTodayClassName(sun) + "\">");
 +
    out.append("<div class=\"" + m_schedProps.stylePrefix + "WeekEnd " + m_schedProps.stylePrefix + "Sun" + getTodayClassName(sun) + "\">");
 +
out.append((sun != null) ? sun.getEvents() : "");
 +
out.append("</div></td>");
 +
 +
out.append("</tr>");
 +
 
 +
return out.toString();
 +
}
 +
 +
public String getHeader()
 +
{
 +
StringBuffer out = new StringBuffer("");
 +
 
 +
out.append("<tr id=\"" + m_schedProps.stylePrefix + "DOWHeader\">");
 +
out.append("<div class=\"" + m_schedProps.stylePrefix + "DOWHeader\">");
 +
out.append("<th class=\"" + m_schedProps.stylePrefix + "DOWWeekDayColHeader\"><div class=\"" + m_schedProps.stylePrefix + "DOWWeekDayHeader\">Mon</div></th>");
 +
out.append("<th class=\"" + m_schedProps.stylePrefix + "DOWWeekDayColHeader\"><div class=\"" + m_schedProps.stylePrefix + "DOWWeekDayHeader\">Tue</div></th>");
 +
out.append("<th class=\"" + m_schedProps.stylePrefix + "DOWWeekDayColHeader\"><div class=\"" + m_schedProps.stylePrefix + "DOWWeekDayHeader\">Wed</div></th>");
 +
out.append("<th class=\"" + m_schedProps.stylePrefix + "DOWWeekDayColHeader\"><div class=\"" + m_schedProps.stylePrefix + "DOWWeekDayHeader\">Thu</div></th>");
 +
out.append("<th class=\"" + m_schedProps.stylePrefix + "DOWWeekDayColHeader\"><div class=\"" + m_schedProps.stylePrefix + "DOWWeekDayHeader\">Fri</div></th>");
 +
out.append("<th class=\"" + m_schedProps.stylePrefix + "DOWWeekEndColHeader\"><div class=\"" + m_schedProps.stylePrefix + "DOWWeekEndHeader\">Sat</div></th>");
 +
out.append("<th class=\"" + m_schedProps.stylePrefix + "DOWWeekEndColHeader\"><div class=\"" + m_schedProps.stylePrefix + "DOWWeekEndHeader\">Sun</div></th>");
 +
out.append("</div>");
 +
out.append("</tr>");
 +
 
 +
return out.toString();
 +
}
 +
}
 +
 +
 +
private String buildSimpleTable( WikiContext p_context,
 +
  SchedProps p_oSchedProps,
 +
  Iterator p_iterator)
 +
throws PluginException
 +
{
 +
String inputLine = null;
 +
String dateString = null;
 +
String eventDesc = null;
 +
String begCellFormat = null;
 +
String endCellFormat = null;
 +
 
 +
StringBuffer entriesAsHTML = new StringBuffer();
 +
 +
ArrayList entryList = null;
 +
 +
Event event = null;
 +
 +
int daysDiff  = 0;
 +
 +
Date datetime = null;
 +
Date now = new Date();
 +
Date today = null;
 +
 
 +
// ----------------------------------------------------------------------------------- //
 +
 
 +
WikiEngine engine = p_context.getEngine();
 +
 +
entriesAsHTML = new StringBuffer();
 +
 +
today = new Date( new Date().getYear(), new Date().getMonth(), new Date().getDate());
 +
 
 +
entriesAsHTML.append("<DIV CLASS=\"" + p_oSchedProps.stylePrefix + "calendarList\">\n");
 +
entriesAsHTML.append("<table class=\"" + p_oSchedProps.stylePrefix + "calendarListTable\" border=1 cellspacing=0>");
 +
 
 +
while( p_iterator.hasNext())
 +
{
 +
event = (Event) p_iterator.next();
 +
 
 +
Date eventDay = event.getDayDate();
 +
 
 +
Double daysUntilDue = new Double( (((eventDay.getTime() - today.getTime() ) / (1000*60*60))/24.0) );
 +
 
 +
daysDiff = (int) Math.round( daysUntilDue.doubleValue() ) ;
 +
 +
begCellFormat = "";
 +
endCellFormat = "";
 +
 +
if( daysDiff <= p_oSchedProps.futureDays && daysDiff >= ( p_oSchedProps.pastDays * -1 ) )
 +
{
 +
entriesAsHTML.append("<tr>");
 +
 +
if( p_oSchedProps.boldToday && daysDiff == 0 )
 +
{
 +
begCellFormat = begCellFormat + "<b>";
 +
endCellFormat = "</font></b>";
 +
}
 +
 
 +
if( daysDiff <= p_oSchedProps.hotDays && daysDiff >= 0)
 +
{
 +
begCellFormat = begCellFormat + "<font color=\"" + p_oSchedProps.hotColor + "\">";
 +
}
 +
else if( daysDiff <= p_oSchedProps.warmDays && daysDiff >= 0 )
 +
{
 +
begCellFormat = begCellFormat + "<font color=\"" + p_oSchedProps.warmColor + "\">";
 +
}
 +
else if( daysDiff <= p_oSchedProps.coldDays && daysDiff >= 0 )
 +
{
 +
begCellFormat = begCellFormat + "<font color=\"" + p_oSchedProps.coldColor + "\">";
 +
}
 +
else
 +
{
 +
begCellFormat = begCellFormat + "<font color=\"" + p_oSchedProps.listColor + "\">";
 +
}
 +
 +
entriesAsHTML.append( "<td>" + begCellFormat + "( due in " + daysDiff + " days )"                + endCellFormat + "</td>"  );
 +
entriesAsHTML.append( "<td>" + begCellFormat + p_oSchedProps.outputDateFormatter.format(event.date)  + endCellFormat + "</td>" );
 +
entriesAsHTML.append( "<td>" + begCellFormat + engine.textToHTML(p_context, event.desc)            + endCellFormat + "</td>" );
 +
entriesAsHTML.append("</tr>");
 +
}
 +
}
 +
 
 +
entriesAsHTML.append("</table>");
 +
entriesAsHTML.append("</DIV>\n");
 +
 +
return entriesAsHTML.toString();
 +
}
 +
 +
 
 +
private ArrayList getEvents(WikiContext p_context, SchedProps p_oSchedProps, DateRange dateRange)
 +
throws PluginException
 +
{
 +
String pageContent = null;
 +
String inputLine = null;
 +
String dateString = null;
 +
String eventDesc = null;
 +
 +
Date datetime = null;
 +
 +
ArrayList entryList = new ArrayList();
 +
 +
CalendarList.Event event = null;
 +
 +
StringReader oSR = null;
 +
BufferedReader oBR = null;
 +
 
 +
WikiEngine engine = p_context.getEngine();
 +
 +
pageContent = engine.getText(p_context, engine.getPage(p_oSchedProps.listPageName)) ;
 +
 +
oSR = new StringReader(pageContent);
 +
oBR = new BufferedReader(oSR);
 +
 
 +
try
 +
{
 +
while( (inputLine = oBR.readLine()) != null )
 +
{
 +
// Verify the basic imput format of the events (should be in a table and non blank)
 +
if( inputLine != null && inputLine.indexOf("|") > -1 && inputLine.indexOf("|", 2) > 0 )
 +
{
 +
 +
dateString = inputLine.substring(inputLine.indexOf("|") + 1, inputLine.indexOf("|", 2));
 +
eventDesc = inputLine.substring(inputLine.indexOf("|", 2) + 1);
 +
 +
try
 +
{
 +
if( dateString.length() == 17 )
 +
{
 +
datetime = p_oSchedProps.dateTimeFormatter.parse(dateString);
 +
}
 +
else if( dateString.length() == 8 )
 +
{
 +
datetime = p_oSchedProps.dateFormatter.parse(dateString);
 +
}
 +
else
 +
{
 +
throw new PluginException("unparseable dateString, must be 17 char or 8 chars: " + dateString);
 +
}
 +
 +
if( datetime != null && eventDesc != null )
 +
{
 +
if( dateRange.contains(datetime) )
 +
{
 +
event = new Event(datetime, eventDesc);
 +
 +
entryList.add(event);
 +
}
 +
else
 +
{
 +
log.debug(datetime.toString() + " was found to be outside the range (" + dateRange.start.toString() + ", " + dateRange.end.toString() );
 +
}
 +
}
 +
}
 +
catch (ParseException e)
 +
{
 +
throw new PluginException("unparseable dateString: " + dateString);
 +
}
 +
}
 +
}
 +
 +
oSR.close( );
 +
 +
// Collections.sort( entryList );
 +
 
 +
}
 +
catch(IOException ioex)
 +
{
 +
throw new PluginException("oops, something happened.  " + ioex.getMessage());
 +
}
 +
catch( Exception ex )
 +
{
 +
throw new PluginException("oops, here's what we know at this time: " + ex.getMessage());
 +
}
 +
 
 +
return entryList;
 +
}
 +
 +
 +
public class SchedProps
 +
{
 +
public String listPageName = null;
 +
public String pastColor = null;
 +
public String hotColor = null;
 +
public String warmColor = null;
 +
public String coldColor = null;
 +
public String listColor = null;
 +
public String todayBgColor = null;
 +
public String dayBgColor = null;
 +
public String headerBgColor = null;
 +
public String todayHeaderBgColor = null;
 +
public String format = null;
 +
 +
public int futureDays = 0;
 +
public int pastDays  = 0;
 +
 +
public int hotDays  = 0;
 +
public int warmDays = 0;
 +
public int coldDays = 0;
 +
 +
public boolean boldToday = true;
 +
 
 +
public SimpleDateFormat dateTimeFormatter = new SimpleDateFormat ("MM/dd/yy hh:mm a");
 +
public SimpleDateFormat dateFormatter = new SimpleDateFormat ("MM/dd/yy");
 +
public SimpleDateFormat outputDateFormatter = new SimpleDateFormat( "EEE, MMM dd 'at' hh:mm a");
 +
 +
public String stylePrefix = null;
 +
}
 +
 +
 +
/*
 +
* This is some sort of DTO to organize all these options.
 +
*/
 +
public class PropertiesManager
 +
{
 +
private String PARAM_CALENDAR_LIST_PAGE_NAME = "listpagename";
 +
private String PARAM_FUTURE_DAYS = "futuredays";
 +
private String PARAM_PAST_DAYS = "pastdays";
 +
 +
private String PARAM_STYLE_PREFIX = "stylename";
 +
 
 +
private String PARAM_HOT_DAYS  = "hotdays";
 +
private String PARAM_WARM_DAYS = "warmdays";
 +
private String PARAM_COLD_DAYS = "colddays";
 +
 
 +
private String PARAM_PAST_COLOR = "pastcolor";
 +
private String PARAM_HOT_COLOR  = "hotcolor";
 +
private String PARAM_WARM_COLOR  = "warmcolor";
 +
private String PARAM_COLD_COLOR  = "coldcolor";
 +
private String PARAM_LIST_COLOR  = "listcolor";
 +
private String PARAM_TODAY_BGCOLOR = "todaybgcolor";
 +
private String PARAM_TODAY_HEADER_BGCOLOR = "todayheaderbgcolor";
 +
private String PARAM_HEADER_BGCOLOR = "headerbgcolor";
 +
private String PARAM_DAY_BGCOLOR = "daybgcolor";
 +
 +
private String PARAM_BOLD_TODAY = "boldtoday";
 +
 +
private String PARAM_FORMAT = "format";
 +
 
 +
private int DEFAULT_PAST_DAYS  = 1;
 +
private int DEFAULT_FUTURE_DAYS = 3;
 +
 
 +
private String DEFAULT_PAST_COLOR = "#999999";
 +
private String DEFAULT_HOT_COLOR  = "red";
 +
private String DEFAULT_WARM_COLOR = "brown";
 +
private String DEFAULT_COLD_COLOR = "black";
 +
private String DEFAULT_LIST_COLOR = "lightgrey";
 +
private String DEFAULT_TODAY_BGCOLOR = "lightblue";
 +
private String DEFAULT_DAY_BGCOLOR = "#FOFOFO"; // grey
 +
private String DEFAULT_HEADER_BGCOLOR = "#FOFOFO"; // dark grey
 +
private String DEFAULT_TODAY_HEADER_BGCOLOR = "lightblue"; // dark grey
 +
 +
private String DEFAULT_FORMAT = "list";
 +
 +
private int DEFAULT_HOT_DAYS  =  1;
 +
private int DEFAULT_WARM_DAYS =  7;
 +
private int DEFAULT_COLD_DAYS = 14;
 +
 +
private boolean DEFAULT_BOLD_TODAY = true;
 +
 +
private String DEFAULT_STYLE_PREFIX = "";
 +
 +
public PropertiesManager()
 +
{
 +
}
 +
 +
public SchedProps getProperties(WikiContext p_context, Map p_params)
 +
throws PluginException
 +
{
 +
SchedProps schedProps = new SchedProps();
 +
 
 +
String futureDaysString = null;
 +
String pastDaysString = null;
 +
String hotDaysString  = null;
 +
String warmDaysString = null;
 +
String coldDaysString = null;
 +
String boldTodayString  = null;
 +
 +
schedProps.listPageName = (String) p_params.get( PARAM_CALENDAR_LIST_PAGE_NAME );
 +
 
 +
futureDaysString = (String) p_params.get( PARAM_FUTURE_DAYS );
 +
pastDaysString = (String) p_params.get( PARAM_PAST_DAYS );
 +
 
 +
schedProps.pastColor  = (String) p_params.get( PARAM_PAST_COLOR  );
 +
schedProps.hotColor  = (String) p_params.get( PARAM_HOT_COLOR  );
 +
schedProps.warmColor = (String) p_params.get( PARAM_WARM_COLOR );
 +
schedProps.coldColor = (String) p_params.get( PARAM_COLD_COLOR );
 +
schedProps.listColor = (String) p_params.get( PARAM_LIST_COLOR );
 +
schedProps.todayBgColor = (String) p_params.get( PARAM_TODAY_BGCOLOR );
 +
schedProps.dayBgColor = (String) p_params.get( PARAM_DAY_BGCOLOR );
 +
schedProps.headerBgColor = (String) p_params.get( PARAM_HEADER_BGCOLOR );
 +
schedProps.todayHeaderBgColor = (String) p_params.get( PARAM_TODAY_HEADER_BGCOLOR );
 +
   
 +
hotDaysString  = (String) p_params.get( PARAM_HOT_DAYS  );
 +
warmDaysString = (String) p_params.get( PARAM_WARM_DAYS );
 +
coldDaysString = (String) p_params.get( PARAM_COLD_DAYS );
 +
 +
schedProps.format = (String) p_params.get( PARAM_FORMAT );
 +
 +
boldTodayString = (String) p_params.get( PARAM_BOLD_TODAY );
 +
 +
schedProps.stylePrefix = (String) p_params.get( PARAM_STYLE_PREFIX );
 +
//
 +
// Check prerequisites
 +
//
 +
 
 +
if( schedProps.listPageName == null || schedProps.listPageName.length() < 1 )
 +
{
 +
throw new PluginException("Mandatory 'listpagename' parameter not found.");
 +
}
 +
 +
if( futureDaysString == null || futureDaysString.length() < 1 )
 +
{
 +
schedProps.futureDays = DEFAULT_FUTURE_DAYS;
 +
}
 +
else
 +
{
 +
schedProps.futureDays = Integer.valueOf(futureDaysString).intValue();
 +
}
 +
 
 +
if( pastDaysString == null || pastDaysString.length() < 1 )
 +
{
 +
schedProps.pastDays = DEFAULT_PAST_DAYS;
 +
}
 +
else
 +
{
 +
schedProps.pastDays = Integer.valueOf(pastDaysString).intValue();
 +
}
 +
 +
if( schedProps.pastDays < 0 || schedProps.futureDays < 0 )
 +
{
 +
throw new PluginException("Invalid values for pastdays or futuredays.");
 +
}
 +
 
 +
if( hotDaysString == null || hotDaysString.length() < 1 )
 +
{
 +
schedProps.hotDays = DEFAULT_HOT_DAYS;
 +
}
 +
else
 +
{
 +
schedProps.hotDays = Integer.valueOf(hotDaysString).intValue();
 +
}
 +
 +
if( warmDaysString == null || warmDaysString.length() < 1 )
 +
{
 +
schedProps.warmDays = DEFAULT_WARM_DAYS;
 +
}
 +
else
 +
{
 +
schedProps.warmDays = Integer.valueOf(warmDaysString).intValue();
 +
}
 +
 +
if( coldDaysString == null || coldDaysString.length() < 1 )
 +
{
 +
schedProps.coldDays = DEFAULT_COLD_DAYS;
 +
}
 +
else
 +
{
 +
schedProps.coldDays = Integer.valueOf(coldDaysString).intValue();
 +
}
 +
 +
if( schedProps.pastColor == null || schedProps.pastColor.length() < 1 )
 +
{
 +
schedProps.pastColor = DEFAULT_PAST_COLOR;
 +
}
 +
 +
if( schedProps.hotColor == null || schedProps.hotColor.length() < 1 )
 +
{
 +
schedProps.hotColor = DEFAULT_HOT_COLOR;
 +
}
 +
 +
if( schedProps.warmColor == null || schedProps.warmColor.length() < 1 )
 +
{
 +
schedProps.warmColor = DEFAULT_WARM_COLOR;
 +
}
 +
 +
if( schedProps.coldColor == null || schedProps.coldColor.length() < 1 )
 +
{
 +
schedProps.coldColor = DEFAULT_COLD_COLOR;
 +
}
 +
 +
if( schedProps.listColor == null || schedProps.listColor.length() < 1 )
 +
{
 +
schedProps.listColor = DEFAULT_LIST_COLOR;
 +
}
 +
 +
if( schedProps.todayBgColor == null || schedProps.todayBgColor.length() < 1 )
 +
{
 +
schedProps.todayBgColor = DEFAULT_TODAY_BGCOLOR;
 +
}
 +
 +
if( schedProps.dayBgColor == null || schedProps.dayBgColor.length() < 1 )
 +
{
 +
schedProps.dayBgColor = DEFAULT_DAY_BGCOLOR;
 +
}
 +
 +
if( schedProps.headerBgColor == null || schedProps.headerBgColor.length() < 1 )
 +
{
 +
schedProps.headerBgColor = DEFAULT_HEADER_BGCOLOR;
 +
}
 +
 +
if( schedProps.todayHeaderBgColor == null || schedProps.todayHeaderBgColor.length() < 1 )
 +
{
 +
schedProps.todayHeaderBgColor = DEFAULT_TODAY_HEADER_BGCOLOR;
 +
}
 +
 +
if( schedProps.format == null || schedProps.format.length() < 1 )
 +
{
 +
schedProps.format = DEFAULT_FORMAT;
 +
}
 +
 +
if( boldTodayString == null || boldTodayString.length() < 1 )
 +
{
 +
schedProps.boldToday = DEFAULT_BOLD_TODAY;
 +
}
 +
else
 +
{
 +
if( boldTodayString.equalsIgnoreCase("NO")
 +
|| boldTodayString.equalsIgnoreCase("N")
 +
|| boldTodayString.equalsIgnoreCase("FALSE") )
 +
{
 +
schedProps.boldToday = false;
 +
}
 +
else if( boldTodayString.equalsIgnoreCase("YES")
 +
|| boldTodayString.equalsIgnoreCase("Y")
 +
|| boldTodayString.equalsIgnoreCase("TRUE"))
 +
{
 +
schedProps.boldToday = true;
 +
}
 +
else
 +
{
 +
schedProps.boldToday = DEFAULT_BOLD_TODAY;
 +
}
 +
}
 +
 +
if( schedProps.stylePrefix != null )
 +
{
 +
schedProps.stylePrefix = schedProps.stylePrefix.trim();
 +
}
 +
if( schedProps.stylePrefix == null || schedProps.stylePrefix.length() < 1 )
 +
{
 +
schedProps.stylePrefix = DEFAULT_STYLE_PREFIX;
 +
}
 +
 +
return schedProps;
 +
}
 +
}
 +
}
 +
 
</body>
</body>

Revision as of 12:33, 29 September 2010

package com.hurlbert.jspwiki.plugin; import java.io.*; import java.text.*; import java.util.*; import java.lang.IllegalArgumentException; import org.apache.log4j.Category; import com.ecyrd.jspwiki.WikiContext; import com.ecyrd.jspwiki.WikiEngine; import com.ecyrd.jspwiki.plugin.PluginException; import com.ecyrd.jspwiki.plugin.WikiPlugin; public class CalendarList implements WikiPlugin { private static Category log = Category.getInstance(CalendarList.class); private static final String FORMAT_LIST = "LIST"; private static final String FORMAT_WEEKLY_CALENDAR = "WEEKLY"; public String execute( WikiContext context, Map params ) throws PluginException { String htmlOutput = null; SchedProps schedProps = null; ArrayList entryList = null; PropertiesManager propertiesManager = null; schedProps = new PropertiesManager().getProperties(context, params); DateRange visibleDateRange = getVisibleDateRange(schedProps); // DateRange calendarDateRange = getCalendarDateRange(visibleDateRange); entryList = getEvents(context, schedProps, visibleDateRange); Collections.sort(entryList, new EventComparator()); log.debug("Items in the list: " + entryList.size()); if( FORMAT_LIST.equalsIgnoreCase(schedProps.format) ) { return buildSimpleTable( context, schedProps, entryList.iterator() ); } else if( FORMAT_WEEKLY_CALENDAR.equalsIgnoreCase(schedProps.format) ) { // return weeklySchedule(visibleDateRange, schedProps, entryList); return buildWeeklyCal( context, visibleDateRange, schedProps, entryList ); } else { return "Unknown format. Adjust the format parameter. list or weekly"; } } /* * This routine builds a weekly calendar in an HTML table. It has several assumptions: * * - Weeks begin on Monday. * - A minimum of one week will be shown. */ private String buildWeeklyCal( WikiContext p_context, DateRange p_daterange, SchedProps p_schedProps, ArrayList p_entryList ) throws PluginException { StringBuffer calTable = new StringBuffer(""); int offset = 0; boolean firstDay = true; Date currentDay = null; CalWeek calWeek = null; // Check the prerequisites - can't work with a null date range. if( p_daterange == null || p_daterange.end == null || p_daterange.start == null ) { throw new PluginException("Invalid daterange parameter: null values passed."); } // Start with the 'currentDay' being the first in our date range. currentDay = new Date( p_daterange.start.getYear(), p_daterange.start.getMonth(), p_daterange.start.getDate() ); calWeek = new CalWeek(p_context, currentDay, p_schedProps ); calTable.append(calWeek.getHeader()); offset = 0; firstDay = true; try { while( ! currentDay.after(p_daterange.end) ) { if( currentDay.getDay() == 1 && !firstDay ) { // Add events to this week. calWeek.addEvents(p_context, p_schedProps, p_entryList); //TODO: Add a flag to determine if there is text, this is too slow. String calWeekHTML = calWeek.toString(); if( calWeekHTML != null ) { // Add this week to the HTML calendar. calTable.append(calWeekHTML); } // Start a new week. calWeek = new CalWeek(p_context, currentDay, p_schedProps); } // Go forward another day. offset++; currentDay = new Date( p_daterange.start.getYear(), p_daterange.start.getMonth(), p_daterange.start.getDate() + offset ); firstDay = false; } } catch( Exception ex ) { throw new PluginException("buildWeeklyCal failed: " + ex.getMessage()); } calTable.append("
"); return calTable.toString(); } // private DateRange getCalendarDateRange(DateRange p_dateRange) // throws PluginException // { // int offset = 0; // // Date firstCalDate = null; // Date lastCalDate = null; // // DateRange calDateRange = null; // // // Get the number of days from the previous monday and start the calendar there. // offset = getDayNum(p_dateRange.start); // // firstCalDate = new Date( p_dateRange.start.getYear(), // p_dateRange.start.getMonth(), // p_dateRange.start.getDate() - offset ); // // lastCalDate = new Date( p_dateRange.end.getYear(), // p_dateRange.end.getMonth(), // p_dateRange.end.getDate() ); // // // Get the number of days to the sunday after the last event and end the calendar there. // offset = 6 - getDayNum(lastCalDate); // // lastCalDate = new Date( p_dateRange.end.getYear(), // p_dateRange.end.getMonth(), // p_dateRange.end.getDate() + offset ); // // calDateRange = new DateRange(firstCalDate, lastCalDate); // // log.debug("Cal Start: " + calDateRange.start.toString() + " Cal End: " + calDateRange.end.toString()); // // return calDateRange ; // } private int getDayNum(Date p_date) { if( p_date.getDay() == 0 ) { return 6; } else { return p_date.getDay() - 1 ; } } public DateRange getVisibleDateRange(SchedProps p_schedProps) { int year = new Date().getYear(); int month = new Date().getMonth(); int dom = new Date().getDate(); // day of the month, 1=1st 30=30th DateRange daterange = new DateRange(); daterange.start = new Date( year, month, dom - p_schedProps.pastDays ); daterange.end = new Date( year, month, dom + p_schedProps.futureDays ); return daterange; } public class DateRange { Date start = new Date(); Date end = new Date(); public DateRange() { } public DateRange(Date p_start, Date p_end) { start = p_start; end = p_end; } public boolean before(Date date) { if( date == null ) { throw new IllegalArgumentException("Cannot except a null date."); } else { return date.before(start); } } public boolean after(Date date) { if( date == null ) { throw new IllegalArgumentException("Cannot except a null date."); } else { return date.after(end); } } public boolean contains(Date date) { return (!before(date) & !after(date)) ; } } public class Event { public Event(Date p_date, String p_desc) { date = p_date; desc = p_desc; } public Date date = null; public String desc = null; public Date getDayDate() { return new Date( date.getYear(), date.getMonth(), date.getDate() ); } } public class EventComparator implements Comparator { public int compare( Object o1, Object o2 ) { if( o1 == null || o2 == null ) { return 0; } Event event1 = (Event) o1; Event event2 = (Event) o2; return event1.date.compareTo(event2.date); } } // /** // * This class decodes the event types and allows for the addition of custom // * start and end tags. Each of these tags is a div with a special class to // * identify the event type. // */ // public class EventType // { // String startTag = ""; // String endTag = ""; // // public EventType( Event pEvent ) // { // // String content = m_context.getEngine().textToHTML(m_context, pEvent.desc); // // if( content != null && content.length() > 0 ) // { // // Check for Scott Events. // if( content.indexOf("(S)") > 0 ) // { // content = "
"); } else { eventsHTML.append( "
"); } Collections.sort(m_events, new EventComparator()); Iterator iterator = m_events.iterator(); if( !iterator.hasNext() ) { addEmptyEventToHTML( eventsHTML ); } else { while( iterator.hasNext() ) { addEventToHTML( eventsHTML, (Event) iterator.next() ); } } eventsHTML.append( "
" ); return eventsHTML.toString(); } public void addEventsHeader( StringBuffer pEventsHTML ) { pEventsHTML.append( "
" ); if( m_date.getDate() == 1 ) { pEventsHTML.append( "" + monthNameFormatter.format(m_date).trim() + " " + ""); } pEventsHTML.append( "" + Integer.toString(m_date.getDate()) + ""); pEventsHTML.append("
"); } public void addEventToHTML( StringBuffer pEventsHTML, Event pEvent ) { if( pEvent == null ) { addEmptyEventToHTML( pEventsHTML ); } else { // TODO:Fix -- Change this to use a flag -- .isUntimed() or something if( timeFormatter.format(pEvent.date).toLowerCase().indexOf("12:00 am") > -1 ) { pEventsHTML.append( "
" ); pEventsHTML.append( m_context.getEngine().textToHTML(m_context, pEvent.desc) ); pEventsHTML.append( "
" ); } else { pEventsHTML.append( "
" ); pEventsHTML.append( timeFormatter.format(pEvent.date).toLowerCase() + "" ); pEventsHTML.append( "
" ); pEventsHTML.append( "
" ); pEventsHTML.append( m_context.getEngine().textToHTML(m_context, pEvent.desc) ); pEventsHTML.append( "
" ); } } } public void addEmptyEventToHTML( StringBuffer pEventsHTML ) { if( isToday() ) { pEventsHTML.append("
"); } else { pEventsHTML.append("
"); } } public void addEvent(WikiContext p_context, Event p_event) { m_events.add(p_event); } public boolean isToday() { return isSameDay( new Date(new Date().getYear(), new Date().getMonth(), new Date().getDate()) ); } public boolean isSameDay(Date p_date) { return m_date.equals(p_date); } private boolean isWeekDay() { return ( m_date.getDay() > 0 & m_date.getDay() < 6 ); } } public class CalWeek { public CalDay mon = null; public CalDay tue = null; public CalDay wed = null; public CalDay thu = null; public CalDay fri = null; public CalDay sat = null; public CalDay sun = null; private SchedProps m_schedProps = null; /* * This constructor initializes each day of the week so we don't have to * be concerned with null days later. * * The date passed is supposed to be the MONDAY WHICH STARTS THE WEEK. * However, if it's not, to draw the calendar correctly, we backup until * we find the previous monday and fill in each of the days for the week. */ public CalWeek(WikiContext p_context, Date p_date, SchedProps p_schedProps) { if( p_schedProps != null ) { m_schedProps = p_schedProps; } else { throw new IllegalArgumentException("calDate cannot be null."); } SimpleDateFormat dowFormatter = new SimpleDateFormat( "EEE"); CalDay calDay = null; Date currentDay = null; Date startingMonday = null; startingMonday = p_date; // // If this isn't monday, back up until we find the previous monday. // while( ! "MON".equalsIgnoreCase(dowFormatter.format(startingMonday)) ) { startingMonday = new Date( startingMonday.getYear(), startingMonday.getMonth(), startingMonday.getDate() - 1 ); } for(int i = 0; i < 7; i++) { currentDay = new Date( startingMonday.getYear(), startingMonday.getMonth(), startingMonday.getDate() + i ); calDay = new CalDay(p_context, currentDay, p_schedProps ); try { updateDay( calDay ); } catch( PluginException pe ) { // ignore } } } public void updateDay(CalDay p_calDay) throws PluginException { if( p_calDay != null && p_calDay.m_date != null ) { switch(p_calDay.m_date.getDay()) { case 1: mon = p_calDay; break; case 2: tue = p_calDay; break; case 3: wed = p_calDay; break; case 4: thu = p_calDay; break; case 5: fri = p_calDay; break; case 6: sat = p_calDay; break; case 0: sun = p_calDay; break; default: throw new PluginException("updateDay did not recieve a valid calDay parameter."); } } } public void addEvents(WikiContext p_context, SchedProps p_oSchedProps, ArrayList p_entryList) throws PluginException { String dateString = null; String eventDesc = null; String inputLine = null; Date datetime = null; Date eventDay = null; Event event = null; try { Iterator iterator = p_entryList.iterator(); while( iterator.hasNext() ) { event = (Event) iterator.next(); if( event != null ) { eventDay = event.getDayDate(); if( mon.isSameDay(eventDay) ) { mon.addEvent(p_context, event); } else if( tue.isSameDay(eventDay) ) { tue.addEvent(p_context, event); } else if( wed.isSameDay(eventDay) ) { wed.addEvent(p_context, event); } else if( thu.isSameDay(eventDay) ) { thu.addEvent(p_context, event); } else if( fri.isSameDay(eventDay) ) { fri.addEvent(p_context, event); } else if( sat.isSameDay(eventDay) ) { sat.addEvent(p_context, event); } else if( sun.isSameDay(eventDay) ) { sun.addEvent(p_context, event); } } // if( event != null ) } // while( iterator.hasNext() ) } catch( Exception ex ) { throw new PluginException("addEvents failed: " + ex.getMessage()); } } private String getTodayClassName( CalDay pCalDay) { String className = ""; if( pCalDay != null ) { if( pCalDay.isToday() ) { className = " " + m_schedProps.stylePrefix + "Today"; } } return className; } public String toString() { StringBuffer out = new StringBuffer(""); out.append(""); out.append(""); out.append("
"); out.append((mon != null) ? mon.getEvents() : ""); out.append("
"); out.append(""); out.append("
"); out.append((tue != null) ? tue.getEvents() : ""); out.append("
"); out.append(""); out.append("
"); out.append((wed != null) ? wed.getEvents() : ""); out.append("
"); out.append(""); out.append("
"); out.append((thu != null) ? thu.getEvents() : ""); out.append("
"); out.append(""); out.append("
"); out.append((fri != null) ? fri.getEvents() : ""); out.append("
"); out.append(""); out.append("
"); out.append((sat != null) ? sat.getEvents() : ""); out.append("
"); out.append(""); out.append("
"); out.append((sun != null) ? sun.getEvents() : ""); out.append("
"); out.append(""); return out.toString(); } public String getHeader() { StringBuffer out = new StringBuffer(""); out.append(""); out.append("
"); out.append("
Mon
"); out.append("
Tue
"); out.append("
Wed
"); out.append("
Thu
"); out.append("
Fri
"); out.append("
Sat
"); out.append("
Sun
"); out.append("
"); out.append(""); return out.toString(); } } private String buildSimpleTable( WikiContext p_context, SchedProps p_oSchedProps, Iterator p_iterator) throws PluginException { String inputLine = null; String dateString = null; String eventDesc = null; String begCellFormat = null; String endCellFormat = null; StringBuffer entriesAsHTML = new StringBuffer(); ArrayList entryList = null; Event event = null; int daysDiff = 0; Date datetime = null; Date now = new Date(); Date today = null; // ----------------------------------------------------------------------------------- // WikiEngine engine = p_context.getEngine(); entriesAsHTML = new StringBuffer(); today = new Date( new Date().getYear(), new Date().getMonth(), new Date().getDate()); entriesAsHTML.append("
\n"); entriesAsHTML.append(""); while( p_iterator.hasNext()) { event = (Event) p_iterator.next(); Date eventDay = event.getDayDate(); Double daysUntilDue = new Double( (((eventDay.getTime() - today.getTime() ) / (1000*60*60))/24.0) ); daysDiff = (int) Math.round( daysUntilDue.doubleValue() ) ; begCellFormat = ""; endCellFormat = ""; if( daysDiff <= p_oSchedProps.futureDays && daysDiff >= ( p_oSchedProps.pastDays * -1 ) ) { entriesAsHTML.append(""); if( p_oSchedProps.boldToday && daysDiff == 0 ) { begCellFormat = begCellFormat + ""; endCellFormat = ""; } if( daysDiff <= p_oSchedProps.hotDays && daysDiff >= 0) { begCellFormat = begCellFormat + ""; } else if( daysDiff <= p_oSchedProps.warmDays && daysDiff >= 0 ) { begCellFormat = begCellFormat + ""; } else if( daysDiff <= p_oSchedProps.coldDays && daysDiff >= 0 ) { begCellFormat = begCellFormat + ""; } else { begCellFormat = begCellFormat + ""; } entriesAsHTML.append( "" ); entriesAsHTML.append( "" ); entriesAsHTML.append( "" ); entriesAsHTML.append(""); } } entriesAsHTML.append("
" + begCellFormat + "( due in " + daysDiff + " days )" + endCellFormat + "" + begCellFormat + p_oSchedProps.outputDateFormatter.format(event.date) + endCellFormat + "" + begCellFormat + engine.textToHTML(p_context, event.desc) + endCellFormat + "
"); entriesAsHTML.append("
\n"); return entriesAsHTML.toString(); } private ArrayList getEvents(WikiContext p_context, SchedProps p_oSchedProps, DateRange dateRange) throws PluginException { String pageContent = null; String inputLine = null; String dateString = null; String eventDesc = null; Date datetime = null; ArrayList entryList = new ArrayList(); CalendarList.Event event = null; StringReader oSR = null; BufferedReader oBR = null; WikiEngine engine = p_context.getEngine(); pageContent = engine.getText(p_context, engine.getPage(p_oSchedProps.listPageName)) ; oSR = new StringReader(pageContent); oBR = new BufferedReader(oSR); try { while( (inputLine = oBR.readLine()) != null ) { // Verify the basic imput format of the events (should be in a table and non blank) if( inputLine != null && inputLine.indexOf("|") > -1 && inputLine.indexOf("|", 2) > 0 ) { dateString = inputLine.substring(inputLine.indexOf("|") + 1, inputLine.indexOf("|", 2)); eventDesc = inputLine.substring(inputLine.indexOf("|", 2) + 1); try { if( dateString.length() == 17 ) { datetime = p_oSchedProps.dateTimeFormatter.parse(dateString); } else if( dateString.length() == 8 ) { datetime = p_oSchedProps.dateFormatter.parse(dateString); } else { throw new PluginException("unparseable dateString, must be 17 char or 8 chars: " + dateString); } if( datetime != null && eventDesc != null ) { if( dateRange.contains(datetime) ) { event = new Event(datetime, eventDesc); entryList.add(event); } else { log.debug(datetime.toString() + " was found to be outside the range (" + dateRange.start.toString() + ", " + dateRange.end.toString() ); } } } catch (ParseException e) { throw new PluginException("unparseable dateString: " + dateString); } } } oSR.close( ); // Collections.sort( entryList ); } catch(IOException ioex) { throw new PluginException("oops, something happened. " + ioex.getMessage()); } catch( Exception ex ) { throw new PluginException("oops, here's what we know at this time: " + ex.getMessage()); } return entryList; } public class SchedProps { public String listPageName = null; public String pastColor = null; public String hotColor = null; public String warmColor = null; public String coldColor = null; public String listColor = null; public String todayBgColor = null; public String dayBgColor = null; public String headerBgColor = null; public String todayHeaderBgColor = null; public String format = null; public int futureDays = 0; public int pastDays = 0; public int hotDays = 0; public int warmDays = 0; public int coldDays = 0; public boolean boldToday = true; public SimpleDateFormat dateTimeFormatter = new SimpleDateFormat ("MM/dd/yy hh:mm a"); public SimpleDateFormat dateFormatter = new SimpleDateFormat ("MM/dd/yy"); public SimpleDateFormat outputDateFormatter = new SimpleDateFormat( "EEE, MMM dd 'at' hh:mm a"); public String stylePrefix = null; } /* * This is some sort of DTO to organize all these options. */ public class PropertiesManager { private String PARAM_CALENDAR_LIST_PAGE_NAME = "listpagename"; private String PARAM_FUTURE_DAYS = "futuredays"; private String PARAM_PAST_DAYS = "pastdays"; private String PARAM_STYLE_PREFIX = "stylename"; private String PARAM_HOT_DAYS = "hotdays"; private String PARAM_WARM_DAYS = "warmdays"; private String PARAM_COLD_DAYS = "colddays"; private String PARAM_PAST_COLOR = "pastcolor"; private String PARAM_HOT_COLOR = "hotcolor"; private String PARAM_WARM_COLOR = "warmcolor"; private String PARAM_COLD_COLOR = "coldcolor"; private String PARAM_LIST_COLOR = "listcolor"; private String PARAM_TODAY_BGCOLOR = "todaybgcolor"; private String PARAM_TODAY_HEADER_BGCOLOR = "todayheaderbgcolor"; private String PARAM_HEADER_BGCOLOR = "headerbgcolor"; private String PARAM_DAY_BGCOLOR = "daybgcolor"; private String PARAM_BOLD_TODAY = "boldtoday"; private String PARAM_FORMAT = "format"; private int DEFAULT_PAST_DAYS = 1; private int DEFAULT_FUTURE_DAYS = 3; private String DEFAULT_PAST_COLOR = "#999999"; private String DEFAULT_HOT_COLOR = "red"; private String DEFAULT_WARM_COLOR = "brown"; private String DEFAULT_COLD_COLOR = "black"; private String DEFAULT_LIST_COLOR = "lightgrey"; private String DEFAULT_TODAY_BGCOLOR = "lightblue"; private String DEFAULT_DAY_BGCOLOR = "#FOFOFO"; // grey private String DEFAULT_HEADER_BGCOLOR = "#FOFOFO"; // dark grey private String DEFAULT_TODAY_HEADER_BGCOLOR = "lightblue"; // dark grey private String DEFAULT_FORMAT = "list"; private int DEFAULT_HOT_DAYS = 1; private int DEFAULT_WARM_DAYS = 7; private int DEFAULT_COLD_DAYS = 14; private boolean DEFAULT_BOLD_TODAY = true; private String DEFAULT_STYLE_PREFIX = ""; public PropertiesManager() { } public SchedProps getProperties(WikiContext p_context, Map p_params) throws PluginException { SchedProps schedProps = new SchedProps(); String futureDaysString = null; String pastDaysString = null; String hotDaysString = null; String warmDaysString = null; String coldDaysString = null; String boldTodayString = null; schedProps.listPageName = (String) p_params.get( PARAM_CALENDAR_LIST_PAGE_NAME ); futureDaysString = (String) p_params.get( PARAM_FUTURE_DAYS ); pastDaysString = (String) p_params.get( PARAM_PAST_DAYS ); schedProps.pastColor = (String) p_params.get( PARAM_PAST_COLOR ); schedProps.hotColor = (String) p_params.get( PARAM_HOT_COLOR ); schedProps.warmColor = (String) p_params.get( PARAM_WARM_COLOR ); schedProps.coldColor = (String) p_params.get( PARAM_COLD_COLOR ); schedProps.listColor = (String) p_params.get( PARAM_LIST_COLOR ); schedProps.todayBgColor = (String) p_params.get( PARAM_TODAY_BGCOLOR ); schedProps.dayBgColor = (String) p_params.get( PARAM_DAY_BGCOLOR ); schedProps.headerBgColor = (String) p_params.get( PARAM_HEADER_BGCOLOR ); schedProps.todayHeaderBgColor = (String) p_params.get( PARAM_TODAY_HEADER_BGCOLOR ); hotDaysString = (String) p_params.get( PARAM_HOT_DAYS ); warmDaysString = (String) p_params.get( PARAM_WARM_DAYS ); coldDaysString = (String) p_params.get( PARAM_COLD_DAYS ); schedProps.format = (String) p_params.get( PARAM_FORMAT ); boldTodayString = (String) p_params.get( PARAM_BOLD_TODAY ); schedProps.stylePrefix = (String) p_params.get( PARAM_STYLE_PREFIX ); // // Check prerequisites // if( schedProps.listPageName == null || schedProps.listPageName.length() < 1 ) { throw new PluginException("Mandatory 'listpagename' parameter not found."); } if( futureDaysString == null || futureDaysString.length() < 1 ) { schedProps.futureDays = DEFAULT_FUTURE_DAYS; } else { schedProps.futureDays = Integer.valueOf(futureDaysString).intValue(); } if( pastDaysString == null || pastDaysString.length() < 1 ) { schedProps.pastDays = DEFAULT_PAST_DAYS; } else { schedProps.pastDays = Integer.valueOf(pastDaysString).intValue(); } if( schedProps.pastDays < 0 || schedProps.futureDays < 0 ) { throw new PluginException("Invalid values for pastdays or futuredays."); } if( hotDaysString == null || hotDaysString.length() < 1 ) { schedProps.hotDays = DEFAULT_HOT_DAYS; } else { schedProps.hotDays = Integer.valueOf(hotDaysString).intValue(); } if( warmDaysString == null || warmDaysString.length() < 1 ) { schedProps.warmDays = DEFAULT_WARM_DAYS; } else { schedProps.warmDays = Integer.valueOf(warmDaysString).intValue(); } if( coldDaysString == null || coldDaysString.length() < 1 ) { schedProps.coldDays = DEFAULT_COLD_DAYS; } else { schedProps.coldDays = Integer.valueOf(coldDaysString).intValue(); } if( schedProps.pastColor == null || schedProps.pastColor.length() < 1 ) { schedProps.pastColor = DEFAULT_PAST_COLOR; } if( schedProps.hotColor == null || schedProps.hotColor.length() < 1 ) { schedProps.hotColor = DEFAULT_HOT_COLOR; } if( schedProps.warmColor == null || schedProps.warmColor.length() < 1 ) { schedProps.warmColor = DEFAULT_WARM_COLOR; } if( schedProps.coldColor == null || schedProps.coldColor.length() < 1 ) { schedProps.coldColor = DEFAULT_COLD_COLOR; } if( schedProps.listColor == null || schedProps.listColor.length() < 1 ) { schedProps.listColor = DEFAULT_LIST_COLOR; } if( schedProps.todayBgColor == null || schedProps.todayBgColor.length() < 1 ) { schedProps.todayBgColor = DEFAULT_TODAY_BGCOLOR; } if( schedProps.dayBgColor == null || schedProps.dayBgColor.length() < 1 ) { schedProps.dayBgColor = DEFAULT_DAY_BGCOLOR; } if( schedProps.headerBgColor == null || schedProps.headerBgColor.length() < 1 ) { schedProps.headerBgColor = DEFAULT_HEADER_BGCOLOR; } if( schedProps.todayHeaderBgColor == null || schedProps.todayHeaderBgColor.length() < 1 ) { schedProps.todayHeaderBgColor = DEFAULT_TODAY_HEADER_BGCOLOR; } if( schedProps.format == null || schedProps.format.length() < 1 ) { schedProps.format = DEFAULT_FORMAT; } if( boldTodayString == null || boldTodayString.length() < 1 ) { schedProps.boldToday = DEFAULT_BOLD_TODAY; } else { if( boldTodayString.equalsIgnoreCase("NO") || boldTodayString.equalsIgnoreCase("N") || boldTodayString.equalsIgnoreCase("FALSE") ) { schedProps.boldToday = false; } else if( boldTodayString.equalsIgnoreCase("YES") || boldTodayString.equalsIgnoreCase("Y") || boldTodayString.equalsIgnoreCase("TRUE")) { schedProps.boldToday = true; } else { schedProps.boldToday = DEFAULT_BOLD_TODAY; } } if( schedProps.stylePrefix != null ) { schedProps.stylePrefix = schedProps.stylePrefix.trim(); } if( schedProps.stylePrefix == null || schedProps.stylePrefix.length() < 1 ) { schedProps.stylePrefix = DEFAULT_STYLE_PREFIX; } return schedProps; } } }


June
MTWTFSS
  [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/1_June_2010&action=edit 1] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/2_June_2010&action=edit 2] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/3_June_2010&action=edit 3] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/4_June_2010&action=edit 4] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/5_June_2010&action=edit 5] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/6_June_2010&action=edit 6]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/7_June_2010&action=edit 7] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/8_June_2010&action=edit 8] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/9_June_2010&action=edit 9] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/10_June_2010&action=edit 10] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/11_June_2010&action=edit 11] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/12_June_2010&action=edit 12] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/13_June_2010&action=edit 13]
[http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/14_June_2010 14] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/15_June_2010&action=edit 15] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/16_June_2010&action=edit 16] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/17_June_2010&action=edit 17] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/18_June_2010&action=edit 18] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/19_June_2010&action=edit 19] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/20_June_2010&action=edit 20]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/21_June_2010&action=edit 21] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/22_June_2010&action=edit 22] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/23_June_2010&action=edit 23] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/24_June_2010&action=edit 24] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/25_June_2010&action=edit 25] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/26_June_2010&action=edit 26] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/27_June_2010&action=edit 27]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/28_June_2010&action=edit 28] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/29_June_2010&action=edit 29] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/30_June_2010&action=edit 30]
July
MTWTFSS
      [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/1_July_2010&action=edit 1] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/2_July_2010&action=edit 2] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/3_July_2010&action=edit 3] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/4_July_2010&action=edit 4]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/5_July_2010&action=edit 5] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/6_July_2010&action=edit 6] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/7_July_2010&action=edit 7] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/8_July_2010&action=edit 8] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/9_July_2010&action=edit 9] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/10_July_2010&action=edit 10] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/11_July_2010&action=edit 11]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/12_July_2010&action=edit 12] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/13_July_2010&action=edit 13] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/14_July_2010&action=edit 14] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/15_July_2010&action=edit 15] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/16_July_2010&action=edit 16] [http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/17_July_2010 17] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/18_July_2010&action=edit 18]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/19_July_2010&action=edit 19] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/20_July_2010&action=edit 20] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/21_July_2010&action=edit 21] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/22_July_2010&action=edit 22] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/23_July_2010&action=edit 23] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/24_July_2010&action=edit 24] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/25_July_2010&action=edit 25]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/26_July_2010&action=edit 26] [http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/27_July_2010 27] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/28_July_2010&action=edit 28] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/29_July_2010&action=edit 29] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/30_July_2010&action=edit 30] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/31_July_2010&action=edit 31]
August
MTWTFSS
            [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/1_August_2010&action=edit 1]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/2_August_2010&action=edit 2] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/3_August_2010&action=edit 3] [http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/4_August_2010 4] [http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/5_August_2010 5] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/6_August_2010&action=edit 6] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/7_August_2010&action=edit 7] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/8_August_2010&action=edit 8]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/9_August_2010&action=edit 9] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/10_August_2010&action=edit 10] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/11_August_2010&action=edit 11] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/12_August_2010&action=edit 12] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/13_August_2010&action=edit 13] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/14_August_2010&action=edit 14] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/15_August_2010&action=edit 15]
[http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/16_August_2010 16] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/17_August_2010&action=edit 17] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/18_August_2010&action=edit 18] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/19_August_2010&action=edit 19] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/20_August_2010&action=edit 20] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/21_August_2010&action=edit 21] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/22_August_2010&action=edit 22]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/23_August_2010&action=edit 23] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/24_August_2010&action=edit 24] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/25_August_2010&action=edit 25] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/26_August_2010&action=edit 26] [http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/27_August_2010 27] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/28_August_2010&action=edit 28] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/29_August_2010&action=edit 29]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/30_August_2010&action=edit 30] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/31_August_2010&action=edit 31]


September
MTWTFSS
    [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/1_September_2010&action=edit 1] [http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/2_September_2010 2] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/3_September_2010&action=edit 3] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/4_September_2010&action=edit 4] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/5_September_2010&action=edit 5]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/6_September_2010&action=edit 6] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/7_September_2010&action=edit 7] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/8_September_2010&action=edit 8] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/9_September_2010&action=edit 9] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/10_September_2010&action=edit 10] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/11_September_2010&action=edit 11] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/12_September_2010&action=edit 12]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/13_September_2010&action=edit 13] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/14_September_2010&action=edit 14] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/15_September_2010&action=edit 15] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/16_September_2010&action=edit 16] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/17_September_2010&action=edit 17] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/18_September_2010&action=edit 18] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/19_September_2010&action=edit 19]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/20_September_2010&action=edit 20] [http://2010.igem.org/Talk:Team:IvyTech-South_Bend/Notebook/21_September_2010 21] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/22_September_2010&action=edit 22] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/23_September_2010&action=edit 23] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/24_September_2010&action=edit 24] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/25_September_2010&action=edit 25] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/26_September_2010&action=edit 26]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/27_September_2010&action=edit 27] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/28_September_2010&action=edit 28] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/29_September_2010&action=edit 29] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/30_September_2010&action=edit 30]
October
MTWTFSS
        [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/1_October_2010&action=edit 1] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/2_October_2010&action=edit 2] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/3_October_2010&action=edit 3]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/4_October_2010&action=edit 4] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/5_October_2010&action=edit 5] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/6_October_2010&action=edit 6] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/7_October_2010&action=edit 7] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/8_October_2010&action=edit 8] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/9_October_2010&action=edit 9] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/10_October_2010&action=edit 10]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/11_October_2010&action=edit 11] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/12_October_2010&action=edit 12] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/13_October_2010&action=edit 13] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/14_October_2010&action=edit 14] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/15_October_2010&action=edit 15] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/16_October_2010&action=edit 16] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/17_October_2010&action=edit 17]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/18_October_2010&action=edit 18] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/19_October_2010&action=edit 19] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/20_October_2010&action=edit 20] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/21_October_2010&action=edit 21] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/22_October_2010&action=edit 22] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/23_October_2010&action=edit 23] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/24_October_2010&action=edit 24]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/25_October_2010&action=edit 25] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/26_October_2010&action=edit 26] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/27_October_2010&action=edit 27] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/28_October_2010&action=edit 28] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/29_October_2010&action=edit 29] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/30_October_2010&action=edit 30] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/31_October_2010&action=edit 31]
November
MTWTFSS
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/1_November_2010&action=edit 1] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/2_November_2010&action=edit 2] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/3_November_2010&action=edit 3] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/4_November_2010&action=edit 4] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/5_November_2010&action=edit 5] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/6_November_2010&action=edit 6] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/7_November_2010&action=edit 7]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/8_November_2010&action=edit 8] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/9_November_2010&action=edit 9] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/10_November_2010&action=edit 10] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/11_November_2010&action=edit 11] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/12_November_2010&action=edit 12] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/13_November_2010&action=edit 13] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/14_November_2010&action=edit 14]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/15_November_2010&action=edit 15] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/16_November_2010&action=edit 16] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/17_November_2010&action=edit 17] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/18_November_2010&action=edit 18] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/19_November_2010&action=edit 19] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/20_November_2010&action=edit 20] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/21_November_2010&action=edit 21]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/22_November_2010&action=edit 22] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/23_November_2010&action=edit 23] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/24_November_2010&action=edit 24] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/25_November_2010&action=edit 25] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/26_November_2010&action=edit 26] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/27_November_2010&action=edit 27] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/28_November_2010&action=edit 28]
[http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/29_November_2010&action=edit 29] [http://2010.igem.org/wiki/index.php?title=Talk:Team:IvyTech-South_Bend/Notebook/30_November_2010&action=edit 30]