package e4s.tutorial;

import e4s.html.*;
import e4s.html.input.extended.*;
import e4s.servlet.E4ModuleImplementation;
import e4s.translate.E4LabelApp;
import e4s.translate.E4Label_Intf;


/**
 * A form for entering values using different types of fields.
 *
 * {@tutorial Example_FormValidator}
 */
public class Example_FormValidator extends E4ModuleImplementation
{
   public static E4Method start = null;
   public static E4Method submitted = null;

   private final static E4InputFieldName PARAM_NAME_TEST = new E4InputFieldName("TEST");

   private final static String SESSION_OBJ_NAME_4_FORM = "TUTORIAL.FORM";

   /**
    * Validator: do not accept A,E,I,O or U characters.
    */
   private static class MyValidator implements AEP_ValidationObject_Intf
   {
      public MyValidator()
      {
         TRACE();
      }
      public boolean isMandatory()
      {
         return false;
      }

      public void setFieldset(char mode, E4Fieldset fieldset)
      {
      }
      
      public E4Label_Intf validate(E4InputFieldName_Intf fieldname, E4Label_Intf label, String value)
      {
         final String BADCHARS[] = {"A","E","I","O","U"};
         
         if (value != null)
         {
TRACE(value);            
            for( int i = 0; i < BADCHARS.length; i++ )
            {
               int pos = value.toUpperCase().indexOf(BADCHARS[i]);
               
               if (pos >= 0)
               {
TRACE("NOK");                  
                  // return an error message (will be translated)
                  return new E4LabelApp("May not contain character # at position #",BADCHARS[i],Integer.toString(pos));
               }
            }
         }
TRACE("OK");
         // o.k.
         return null;
      }
      
   }
   
   public void start( HTML html )
   {
      BODY body = html.BODY();
      
      // create a form
      FORM form = body.FORM(submitted);
      form.preventFromRemoving();
      
      form.Message(E4Message.CAPTION,"Do not enter A,E,I,O or U");
      form.P();
      
      // store the form for possible re-display
      setSessionObject(SESSION_OBJ_NAME_4_FORM,form);
      
      // add a textfield to the form
      TEXTFIELD fTest = form.TEXTFIELD(PARAM_NAME_TEST,"Your Input Field",50);
      fTest.setValidator(new MyValidator());
      
      // add a submit button
      form.P();
      form.BUTTON_Submit("Execute");
   }

   public void submitted( HTML html, E4CgiParams params ) 
   throws Exception
   {
      BODY body = html.BODY();
      FORM form = (FORM)getSessionObject(SESSION_OBJ_NAME_4_FORM,true);
      
      if (! form.validate(params,getServlet()))
      {
         body.Message(E4Message.ERROR,"There are some errors!");
         body.P();
         
         body.addElement(form);
      }
      else
      {
         String val = params.get(PARAM_NAME_TEST);
         
         body.Message(E4Message.INFO,new E4LabelApp("You have entered #. Thank you.",val));
         
         removeSessionObject(SESSION_OBJ_NAME_4_FORM);
         
         body.A(start).SMALL().print("start again");
      }
   }

}