package edu.byu.cs.roots.opg.model;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.StringTokenizer;
public class Event implements Serializable{
static final long serialVersionUID = 1000L;
public EventType type;
public String date;
public String place;
public String yearString = null;
public String monthString = null;
public String dayString = null;
boolean eraAD = true; //ignore unless yearString is not null
public int yearInt; //only used for comparison, to generate a quick guess of
//which person in the tree was the most recently born.
public String place1;//
public String place2;//
public Date sortDate;
public Event(EventType type){
this.type = type;
this.date = null;
this.place = null;
this.place1 = null;
this.place2 = null;
this.sortDate = null;
}
public Event(){
this.date = null;
this.place = null;
this.place1 = null;
this.place2 = null;
this.sortDate = null;
}
public String toString(){
StringBuilder s = new StringBuilder();
s.append("\n DATE: "+date+"\n");
s.append(" PLACE: "+place);
return s.toString();
}
public String getplaceCityState()
{
String retValue = "";
if(place!=null)
{
String[] places = place.split(",");
if (places[0].equals(""))
{
places[0] = places[1];
places[1] = "";
}
switch (places.length)
{
case 0:
break;
case 1:
retValue = abbrState(places[0].trim());
break;
case 2:
retValue = abbrState(places[0].trim()) + ", " + abbrState(places[1].trim());
break;
case 3:
retValue = abbrState(places[0].trim()) + ", " + abbrState(places[2].trim());
break;
case 4:
retValue = abbrState(places[0].trim()) + ", " + abbrState(places[2].trim());
break;
default:
retValue = abbrState(places[0].trim()) + ", " + abbrState(places[2].trim());
break;
}
}
return retValue;
}
public String abbrState(String state)
{
if(state.compareTo("Alabama") == 0) return "AL";
if(state.compareTo("Alaska") == 0) return "AK";
if(state.compareTo("Arizona") == 0) return "AZ";
if(state.compareTo("Arkansas") == 0) return "AR";
if(state.compareTo("California") == 0) return "CA";
if(state.compareTo("Colorado") == 0) return "CO";
if(state.compareTo("Florida") == 0) return "FL";
if(state.compareTo("Georgia") == 0) return "GA";
if(state.compareTo("Hawaii") == 0) return "HI";
if(state.compareTo("Idaho") == 0) return "ID";
if(state.compareTo("Illinois") == 0) return "IL";
if(state.compareTo("Indiana") == 0) return "IN";
if(state.compareTo("Iowa") == 0) return "IA";
if(state.compareTo("Kansas") == 0) return "KS";
if(state.compareTo("Lousiana") == 0) return "LA";
if(state.compareTo("Maryland") == 0) return "MD";
if(state.compareTo("Massachusetts") == 0) return "MA";
if(state.compareTo("Michigan") == 0) return "MI";
if(state.compareTo("Minnesota") == 0) return "MN";
if(state.compareTo("Mississippi") == 0) return "MS";
if(state.compareTo("Missouri") == 0) return "MO";
if(state.compareTo("Montana") == 0) return "MT";
if(state.compareTo("Nebraska") == 0) return "NE";
if(state.compareTo("Nevada") == 0) return "NV";
if(state.compareTo("New Mexico") == 0) return "NM";
if(state.compareTo("New York") == 0) return "NY";
if(state.compareTo("North Carolina") == 0) return "NC";
if(state.compareTo("North Dakota") == 0) return "ND";
if(state.compareTo("Ohio") == 0) return "OH";
if(state.compareTo("Oregon") == 0) return "OR";
if(state.compareTo("Oklahoma") == 0) return "OK";
if(state.compareTo("Pennsylvania") == 0) return "PA";
if(state.compareTo("South Carolina") == 0) return "SC";
if(state.compareTo("South Dakota") == 0) return "SD";
if(state.compareTo("Tennessee") == 0) return "TN";
if(state.compareTo("Texas") == 0) return "TX";
if(state.compareTo("Utah") == 0) return "UT";
if(state.compareTo("Virginia") == 0) return "VA";
if(state.compareTo("Washington") == 0) return "WA";
if(state.compareTo("Washington DC") == 0) return "DC";
if(state.compareTo("West Virginia") == 0) return "WV";
if(state.compareTo("Wisconsin") == 0) return "WI";
if(state.compareTo("Wyoming") == 0) return "WY";
if(state.compareTo("New Zealand") == 0) return "NZ";
// if(place2.length() > 1)System.out.println("|"+place2+"|");
if(state.contains("Parish")) return state.replace("Parish", "");
if(state.contains("Area")) return state.replace("Area", "");
return state;
}
public void parseDateParts() {
if (date == null || date.equals(""))
return;
Integer year, month, day;
boolean AD = true;
year = month = day = null;
StringTokenizer t = new StringTokenizer(date, " \t\n\r\f,/-<>()[]{}|");
while (t.hasMoreTokens())
{
String temp = t.nextToken().toLowerCase();
try
{
int num = Integer.parseInt(temp);
if (year == null)
{
if (day != null)
year = num;
else if (num > 31)
year = num;
else
day = num;
}
else if (day == null)
{
if (num <= 31 && num > 0)
day = num;
}
}
catch (NumberFormatException e)
{
//assume token is a string
//see if it's a month (must be 3 characters or longer)
if (temp.length() > 2 && month == null)
{
String monthAbbr = temp.substring(0,3);
for (int i = 0; i < months.length; ++i)
{
if (monthAbbr.equals(months[i].toLowerCase()) )
{
month = i;
break;
}
}
}
//check to see if it's BC or B.C.
if (temp.equals("bc") || temp.equals("b.c."))
AD = false;
//if it's not a month or era indicator, then ignore it
}
}
if (year == null && day != null){
year = day;
day = null;
}
//if a field is missing, then substitute the possible midpoint for lower fields
// ie. if month is missing, set month & day corresponding to midpoint of year
Calendar calendar = new GregorianCalendar();
if (year != null)
calendar.set(Calendar.YEAR, year);
if (!AD && year > 0)
calendar.set(Calendar.ERA, GregorianCalendar.BC);
else
calendar.set(Calendar.ERA, GregorianCalendar.AD);
if (month == null)
{
calendar.set(Calendar.DAY_OF_YEAR, calendar.getActualMaximum(Calendar.DAY_OF_YEAR)/2);
}
else if (day == null)
{
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)/2);
}
else
{
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DAY_OF_MONTH, day);
}
if (year != null) {
yearString = calendar.get(Calendar.YEAR) + "";
eraAD = AD;
}
if (month != null)
monthString = months[calendar.get(Calendar.MONTH)];
if (day != null)
dayString = calendar.get(Calendar.DAY_OF_MONTH) + "";
// yearInt is assigned either the year, or a value (1 or -1)
// that will mean since we don't know their birth year, don't worry about
// giving them a birth year integer to compare against others.
yearInt = calendar.get(Calendar.YEAR);
if(!AD)
yearInt = -yearInt;
if(year == null)
yearInt /= Math.abs(yearInt);
}
public static final String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
}