//--------------------------------------------
//   "AddressBook"
//
//    
// "    "
//
// (c) Voolkan
//--------------------------------------------

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.DateField;
import javax.microedition.lcdui.TextBox;
import java.util.Date;
import java.util.Calendar;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream; 
import java.io.IOException;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordComparator;
import javax.microedition.rms.RecordFilter;
import javax.microedition.rms.RecordStoreException;

public class AddressBook extends MIDlet implements CommandListener
{
private Display display;                 //  
private RecordStore recordStore;         //  
private List nameList;                   //  
private int recIndexes[];                //  ID ,
                                         //   
private Command add,ok,next,back;        //    
private TextBox tbName,tbPhone,tbEMail;  //    
private Form dateForm;                   //    
private DateField dateField;             //    

public void destroyApp(boolean destroy) {
   notifyDestroyed();
}

public void pauseApp() {}

public void startApp() {
   try {
      //      "Address-Book"
      recordStore = RecordStore.openRecordStore("Address-Book", true);
   } catch (RecordStoreException rse) {}

   //     
   display = Display.getDisplay(this);

   //   
   ok = new Command("Ok", Command.OK, 1);
   add = new Command("Add", Command.BACK, 1);
   next = new Command("Next", Command.OK, 1);
   back = new Command("Back", Command.BACK, 1);

   //   
   tbName = new TextBox("Name:","",15,TextField.ANY);
   tbName.addCommand(next);
   tbName.addCommand(back);
   tbName.setCommandListener(this);

   //    
   tbPhone = new TextBox("Number:","",15,TextField.PHONENUMBER);
   tbPhone.addCommand(next);
   tbPhone.addCommand(back);
   tbPhone.setCommandListener(this);

   //    
   tbEMail = new TextBox("E-Mail:","",35,TextField.EMAILADDR);
   tbEMail.addCommand(next);
   tbEMail.addCommand(back);
   tbEMail.setCommandListener(this);
      
   //    
   dateField = new DateField("Birthday",DateField.DATE);
   dateForm = new Form("");
   dateForm.append(dateField);
   dateForm.addCommand(next);
   dateForm.addCommand(back);
   dateForm.setCommandListener(this);   

   //   
   BuildNameList();
   //  
   String name = SearchBirthday();
   //   
   if(name!=null) {
      //   
      Form remindForm = new Form("Reminder");
      //    
      remindForm.append(name + " has a birthday today!");
      //   
      remindForm.addCommand(ok);
      remindForm.setCommandListener(this);
      //  
      display.setCurrent(remindForm);
   } else
      //     
      display.setCurrent(nameList);
   }

//  SearchBirthday,     
//      ,   null    
private String SearchBirthday() {
   String name = null;
   try {
      //      
      BirthdayFilter filter = new BirthdayFilter(); 
      //    c   
      RecordEnumeration re = recordStore.enumerateRecords(filter, null,
                                                          false);
      //  ID 
      int id = re.nextRecordId();
      //    ID
      byte[] record = recordStore.getRecord(id);
      //     
      ByteArrayInputStream bais = new   ByteArrayInputStream(record);
      //  ,    
      DataInputStream dis = new DataInputStream(bais);
      //      
      name = dis.readUTF();
   }
   catch(RecordStoreException rse) {}
   catch(IOException ioe) {}
   //   
   return name;
} 

//  BuildNameList;      
private void BuildNameList() {
   //   
   nameList = new List("Address-Book", List.IMPLICIT);
   nameList.setCommandListener(this);
   //   
   nameList.addCommand(add);
   //    
   nameList.addCommand(ok);
   try {
      //   
      int size = recordStore.getNumRecords();
      //     ID 
      recIndexes = new int[size];
      //      
      AlphabeticalOrdering comparator = new AlphabeticalOrdering(); 
      //    
      RecordEnumeration re = recordStore.enumerateRecords(null, comparator,
                                                          false);
      //    ID 
      int i=0;
      //  ;     
      //    ID  ,
      //      ID  
      while(true) {
         //  ID  
         int id = re.nextRecordId();
         //  ID  
         recIndexes[i++]=id;
         //    ID
         byte[] record = recordStore.getRecord(id);
         //     
         ByteArrayInputStream bais=new ByteArrayInputStream(record);
         //  ,    
         DataInputStream dis = new DataInputStream(bais);
         //         
         nameList.append(dis.readUTF(),null);
      }
   }
   catch(RecordStoreException rse) {}
   catch(IOException ioe) {}
}

//   
public void commandAction(Command c, Displayable d) {
   //  Add    
   if(c==add) 
      display.setCurrent(tbName);
      //  Ok
   if(c==ok) {
      //        
      if(d==nameList) {
      try {
         //    recIndexes ID  
         int id = recIndexes[nameList.getSelectedIndex()];
         //   
         byte[] record = recordStore.getRecord(id);
         //     
         ByteArrayInputStream bais=new ByteArrayInputStream(record);
         //  ,    
         DataInputStream dis = new DataInputStream(bais);
         //     
         Form infoForm = new Form("");
         //        
         infoForm.append(dis.readUTF()+"\n");
         infoForm.append(dis.readUTF()+"\n");
         infoForm.append(dis.readUTF());
         //    
         Date birthday = new Date(dis.readLong());
         //     
         DateField df = new DateField("",DateField.DATE);
         //       
         df.setDate(birthday);
         //       
         infoForm.append(df);
         //      
         infoForm.addCommand(ok);
         infoForm.setCommandListener(this);
         //    
         display.setCurrent(infoForm);
      }
      catch(RecordStoreException rse) {}
      catch(IOException ioe) {}
      } else {       //       
         //    
         display.setCurrent(nameList);
      }
}

   //  Next:     
   if(c==next) {
      //     -     
      if(d==tbName) display.setCurrent(tbPhone);
      //      -    e-mail
      if(d==tbPhone) display.setCurrent(tbEMail);
      //    e-mail -   
      if(d==tbEMail) display.setCurrent(dateForm);
      //     
      if(d==dateForm) {
         //    
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         //   ,    
         DataOutputStream dos = new DataOutputStream(baos);   
         try {
            //      
            dos.writeUTF(tbName.getString());
            dos.writeUTF(tbPhone.getString());
            dos.writeUTF(tbEMail.getString());
            dos.writeLong(dateField.getDate().getTime());
            //    
            recordStore.addRecord(baos.toByteArray(), 0, baos.size());
         } 
         catch(IOException ioe) {}
         catch (RecordStoreException rse) {}
         //   
         BuildNameList();
         //     
         display.setCurrent(nameList);
      }
   }

   //  Back:     
   if(c==back) {
      //     -   
      if(d==tbName) display.setCurrent(nameList);
      //      -    
      if(d==tbPhone) display.setCurrent(tbName);
      //    e-mail -     
      if(d==tbEMail) display.setCurrent(tbPhone);
      //      -    e-mail
      if(d==dateForm) display.setCurrent(tbEMail);
   }
}

//      
private class BirthdayFilter implements RecordFilter {

   //   
   public boolean matches(byte[] candidate) {
      //     
      ByteArrayInputStream bais = new ByteArrayInputStream(candidate);
      //      
      DataInputStream dis = new DataInputStream(bais);
      //  
      Date birthDate = new Date();
      try {
         //    
         dis.readUTF(); 
         dis.readUTF();
         dis.readUTF();
         //   
         birthDate.setTime(dis.readLong());
      }
      catch (IOException ioe) { return false; }

      //      
      Calendar rightNow = Calendar.getInstance();
      Calendar birthday = Calendar.getInstance();
      //    
      birthday.setTime(birthDate);
      //        
      if(rightNow.get(Calendar.DAY_OF_MONTH)==
               birthday.get(Calendar.DAY_OF_MONTH) &&
         rightNow.get(Calendar.MONTH)==
               birthday.get(Calendar.MONTH))
         return true;
      else
         return false;
   }
}



//     
private class AlphabeticalOrdering implements RecordComparator {
   //   
   public int compare(byte[] rec1, byte[] rec2) {
      //     
      ByteArrayInputStream baisl = new ByteArrayInputStream(rec1);
      ByteArrayInputStream bais2 = new ByteArrayInputStream(rec2);
      //  ,    
      DataInputStream disl = new DataInputStream(baisl);
      DataInputStream dis2 = new DataInputStream(bais2);
      //  
      String namel = null;
      String name2 = null;
      try {
         //    
         namel = disl.readUTF ();
         name2 = dis2.readUTF ();
      }
      catch (IOException ioe) {}
      //   
      int result = namel.compareTo(name2);
      if (result < 0)
         //    
         return RecordComparator.PRECEDES; 
      else          
         if (result == 0) 
            //    
            return RecordComparator.EQUIVALENT;
         else 
            //    
            return RecordComparator.FOLLOWS;
   }
}
} // class AddressBook
