import java.lang.String;
import java.util.StringTokenizer;
import java.util.Hashtable;
import java.util.GregorianCalendar;

/*A simple Java program that illustrates simple I/O for a browser form */

public class javaVisits {
  /*
   * Record brief history of Web interactions, using cgi framework.
   */

  public static Hashtable<String, String> 
        generatePairs (String baseString, String separator){
      /* divide the query strings into name=value pieces */

      StringTokenizer nameValue = new StringTokenizer (baseString, separator);

      /* put name=value pieces into hash table for easy retrieval */
      Hashtable<String, String> baseElements=new Hashtable<String, String>();
      while (nameValue.hasMoreTokens()) {
          String pair = nameValue.nextToken();
          if (pair.charAt(0) == ' ') {
              pair = pair.substring(1, pair.length());
          }
          int pos = pair.indexOf("=");
          baseElements.put(pair.substring(0, pos), pair.substring(pos+1));
      }

      return baseElements;
 }

  public static void main(String[] args) 
         throws Exception {

      /************************* http header ********************************/ 

      System.out.println("Content-type: text/html");

      /************************* cookie processing **************************/ 
      /*** must set any new cookies before printing page <!DOCTYPE  header **/
      Hashtable<String, String> cookieElements = generatePairs (args[1], ";");

      /* retrieve previous cookie, if it exists */
      String numVisitsStr = cookieElements.get("numVisits");
      String lastDate = cookieElements.get("lastDate");
      /* GregorianCalendar defaults to the current date and time */
      GregorianCalendar todaysDate = new GregorianCalendar();

      /* next week is 7 days from the current date and time */
      GregorianCalendar nextWeek   = new GregorianCalendar();
      nextWeek.roll(GregorianCalendar.DAY_OF_YEAR, 7);

      int numVisits;
      if (numVisitsStr == null) {
         numVisits = 0;
      }
      else {
         numVisits = new Integer(numVisitsStr).intValue();
      }

      if (lastDate == null) {
         lastDate = "not known";
      }

      System.out.println("Set-Cookie:  numVisits=" + (numVisits+1));
      System.out.println("Set-Cookie:  lastDate=" + todaysDate.getTime()
                         +"; expires=" + nextWeek.getTime());
      System.out.println();

      /************************* page header ********************************/ 

      System.out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
      System.out.println("<html>");
      System.out.println("<head>");
      System.out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">");
      System.out.println("<title>");
      System.out.println("Title for Visit History");
      System.out.println("</title>");
      System.out.println("</head>");
      System.out.println("<body>");

      /**********************************************************************/
      /* page title */

      System.out.println("<h1>History of Your Interaction with this Web Page</h1>");

      /**********************************************************************/
      System.out.println("<h2>Query String Information</h2>");

      /* processing to put the form data values into a Hashtable */
      /* args[0] contains the browser information as composite string */
      System.out.println("Here is the query string: " + args[0]);

      Hashtable<String, String> queryElements = generatePairs (args[0], "&");

      /**********************************************************************/
      /* access query-string fields as desired */

      System.out.println("<br><br>");
      System.out.println ("myText field: " + queryElements.get("myText"));
      System.out.println("<br>");
      System.out.println ("myNumber field: " + queryElements.get("myNumber"));
      System.out.println("<br>");
      System.out.println ("mySecret field: " + queryElements.get("mySecret"));
      System.out.println("<br><br>");

      /**********************************************************************/
      System.out.println("<h2>Cookie Information</h2>");

      /* cookies identified as part of header processing */
      System.out.println("Here is a listing of previously-set cookies: " 
                         + args[1]);
      System.out.println("<br>");
      System.out.println ("numVisits: " + numVisits);
      System.out.println("<br>");
      System.out.println ("lastDate: " + lastDate);

      /**********************************************************************/
      System.out.println("<h2>Date Information</h2>");

      /* date information determined under cookie processing */
      System.out.println ("today's date: " + todaysDate.getTime());
      System.out.println("<br>");
      System.out.println ("next week's date: " + nextWeek.getTime());

      /********************** html/browser footer ***************************/ 

      System.out.println("</body>");
      System.out.println("</html>");

  } // main(String[])
} // javaVisits

