001    /** =====================================================================       
002     *
003     *  File Name : $Id: FaultDBForm.java,v 1.11 2007/12/14 12:18:50 cb Exp $
004     *
005     *  Description
006     *  -----------
007     *
008     *  See javadoc comment 
009     * 
010     *  =====================================================================
011     *
012     *   @Author : Craige Bevil 
013     *             Control Software Group
014     *             Isaac Newton Group of Telescopes
015     *
016     *  =====================================================================
017     *
018     *     Modification Log
019     *
020     *     Vers         Date        Author       Reason
021     *     ----         ----        ------       ------
022     *      1                       C.Bevil      First Release
023     *
024     *     Commissioning Notes
025     *     -------------------
026     *
027     *     None
028     *     
029     *  =====================================================================
030     *
031     *     @Version   : $Id: FaultDBForm.java,v 1.11 2007/12/14 12:18:50 cb Exp $
032     *
033     *     @Author    : $Author: cb $
034     *
035     *     Header     : $Header: /opt/INGsrc/src/CVS/softproj/FaultDatabase/src/FaultDatabase/FaultDatabase/src/GWTApplication/client/FaultDBForm.java,v 1.11 2007/12/14 12:18:50 cb Exp $
036     *
037     *     Log        : $Log: FaultDBForm.java,v $
038     *     Log        : Revision 1.11  2007/12/14 12:18:50  cb
039     *     Log        : Modified the code which determines if a text field is empty to be more
040     *     Log        : strict.
041     *     Log        :
042     *     Log        : Revision 1.10  2007/12/12 15:26:16  cb
043     *     Log        : Added new javascript library which allows fancy message boxes to be
044     *     Log        : displayed.
045     *     Log        :
046     *     Log        : Revision 1.9  2007/10/18 08:43:50  cb
047     *     Log        : Support for decommissioned instruments has been added to the system
048     *     Log        :
049     *     Log        : Revision 1.8  2007/08/20 11:51:34  cb
050     *     Log        : Added method which will check if a date which has been entered by a
051     *     Log        : user is in the future.
052     *     Log        :
053     *     Log        : Revision 1.7  2007/08/17 14:25:11  cb
054     *     Log        : Change the checking of some of the dates to allow them to be a bit
055     *     Log        : more flexible
056     *     Log        :
057     *     Log        : Revision 1.6  2007/08/13 10:03:39  cb
058     *     Log        : Made some speed optimsations in order to try and speed the update form
059     *     Log        : up
060     *     Log        :
061     *     Log        : Revision 1.5  2007/08/02 12:22:55  cb
062     *     Log        : Modified to support the extra tabs in the quick view tab panel to
063     *     Log        : include the different groups of outstanding faults.
064     *     Log        :
065     *     Log        : Revision 1.4  2007/08/01 13:00:08  cb
066     *     Log        : First prototype after import
067     *     Log        :
068     *     Log        : Revision 1.3  2007/07/24 08:24:48  cb
069     *     Log        : Added the initialisation of the printer list
070     *     Log        :
071     *     Log        : Revision 1.2  2007/07/13 10:54:08  cb
072     *     Log        : Complete interface prototype
073     *     Log        :
074     *     Log        : Revision 1.1.1.1  2007/06/01 08:33:26  cb
075     *     Log        : Imported using TkCVS
076     *     Log        :
077     *
078     * =====================================================================*/
079    
080    package GWTApplication.client;
081    
082    import com.google.gwt.user.client.*;
083    import com.google.gwt.user.client.rpc.*;
084    import com.google.gwt.user.client.ui.*;
085    import com.google.gwt.core.client.GWT;
086    import com.google.gwt.user.client.ui.FlexTable.*;
087    
088    import com.gwtext.client.core.EventObject;
089    import com.gwtext.client.util.Format;
090    import com.gwtext.client.widgets.MessageBox;
091    import com.gwtext.client.widgets.MessageBoxConfig;
092    
093    import java.util.*;
094    
095    /**
096     * This is a base class which supports the forms which are to be
097     * displayed by the application. Most of the forms in the application
098     * subclass this class. 
099     * @author Craige Bevil
100     * @version $Id: FaultDBForm.java,v 1.11 2007/12/14 12:18:50 cb Exp $
101     */
102     
103    class FaultDBForm extends Composite {
104    
105        /**
106         * This is a panel which will be used to indicate to the user that
107         * we are busy at the moment doing something 
108         */
109    
110        protected BusyIndicator busyIndicator = new BusyIndicator();
111        
112        /**
113         * Indicates that we should not check the length of the string 
114         */
115        
116        public final static int NOLENGTHCHECK = -1;
117        
118        /**
119         * This is the list of fault states
120         */
121        
122        private static ArrayList FaultStateList = null;
123    
124        /**
125         * This is the list of faults 
126         */
127        
128        private static  ArrayList FaultTypeList = null;
129    
130        /**
131         * This is a list of all of the staff members
132         */
133        
134        private static  ArrayList StaffMemberList = null;
135    
136        /**
137         * This is the list of severities 
138         */
139    
140        private static ArrayList SeverityList = null;
141        
142        /**
143         * This is the list of systems which can be selected 
144         */
145        
146        private static ArrayList SystemList = null;
147    
148        /**
149         * This is the list of all instruments which can be selected 
150         */
151        
152        private static ArrayList InstrumentList = null;
153    
154        /**
155         * This is the list of current instruments which can be selected
156         */
157        
158        private static ArrayList CurrentInstrumentList = null;
159        
160        /**
161         * This is the list of sites which can be selected 
162         */
163        
164        private static ArrayList SiteList = null;
165        
166        /**
167         * This is a list static list of the TOs. We cache the list of the
168         * TOs so we do not have to get the list from the servlet all of
169         * the time
170         */
171        
172        private static ArrayList TOList = null;
173    
174        /**
175         * This is a list static list of the SAs. We cache the list of the
176         * SAs so we do not have to get the list from the servlet all of
177         * the time
178         */
179        
180        private static ArrayList SAList = null;
181    
182        /**
183         * This is a list static list of the DEs. We cache the list of the
184         * DEs so we do not have to get the list from the servlet all of
185         * the time
186         */
187        
188        private static ArrayList DEList = null;
189    
190        /**
191         * This is a list static list of the TOs. We cache the list of the
192         * TOs so we do not have to get the list from the servlet all of
193         * the time. This includes everybody who has been part of this
194         * group whether they are in the organisation or not.
195         */
196        
197        private static ArrayList FullTOList = null;
198    
199        /**
200         * This is a list static list of the SAs. We cache the list of the
201         * SAs so we do not have to get the list from the servlet all of
202         * the time. This includes everybody who has been part of this
203         * group whether they are in the organisation or not.
204         */
205        
206        private static ArrayList FullSAList = null;
207    
208        /**
209         * This is a list static list of the DEs. We cache the list of the
210         * DEs so we do not have to get the list from the servlet all of
211         * the time. This includes everybody who has been part of this
212         * group whether they are in the organisation or not.
213         */
214        
215        private static ArrayList FullDEList = null;
216    
217        /**
218         * This is a list static list of the staff. We cache the list of the
219         * staff  so we do not have to get the list from the servlet all of
220         * the time. This includes everybody who has been part of this
221         * group whether they are in the organisation or not. 
222         */
223        
224        private static ArrayList FullStaffMemberList = null;
225    
226        /**
227         * This is the user authentication details which were provided by
228         * the user
229         */
230        
231        protected AuthenticationDetails UserAuthentication;
232        
233        /**
234         * This class will be used for internationalization so that we can
235         * flick between the locales of English and Spanish.
236         */
237    
238        protected InternationalizationConstants internationalizationConstants = (InternationalizationConstants) GWT.create(InternationalizationConstants.class);
239    
240        /** 
241         * This is the service which will be used to access the servlet
242         * which is running in the tomcat container
243         */
244    
245        protected FaultServiceAsync svc;
246    
247        /**
248         * Holds a list of the printers that the servlet knows about. This
249         * variable is shared amongst the instances of this class to save
250         * continually having to refer to the servlet for the information.
251         */
252        
253        protected static ArrayList PrinterList;
254    
255        /**
256         * A static initialiser which will get the all of the lists from
257         * the servlet to make sure that we are not pulling them across
258         * from the servlet all of the time otherwise we end up with a
259         * load of syncronisation problems. It should be noted that this
260         * static initialiser is only called the first time that we
261         * instantiate an object which uses this class. 
262         */
263    
264        static {
265            
266            final FaultServiceAsync svc       = (FaultServiceAsync) GWT.create(FaultService.class);
267            final ServiceDefTarget endPoint = (ServiceDefTarget) svc;
268    
269            endPoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "/faultService");
270    
271            // Get a list of all current staff members
272            
273            svc.getStaffMembers (false,new AsyncCallback() {
274                    
275                    public void onSuccess (final Object result) {
276                        StaffMemberList = (ArrayList)result;
277                    }       
278                    
279                    public void onFailure (Throwable ex)
280                    {
281                        MessageBox.alert("Information","Failed to get the list of staff members");
282                    }
283                });
284            
285            // Get the list of the current telescope operators back from the database 
286            
287            svc.getTelescopeOperators (false,new AsyncCallback() {
288                                    
289                    public void onSuccess (final Object result) {
290                        TOList = (ArrayList)result;
291                    }
292                    
293                    public void onFailure (final Throwable ex)
294                    { 
295                        MessageBox.alert("Information","Failed to get the list of telescope operators");                                
296                    }
297                });
298            
299            
300            // Now get the current support astronomers 
301            
302            svc.getSupportAstronomers (false,new AsyncCallback() {
303                    
304                    public void onSuccess (final Object result) {
305                        SAList = (ArrayList)result;
306                    }
307                    
308                    public void onFailure (final Throwable ex)
309                    {
310                        MessageBox.alert("Information","Failed to get the list of support astronomers");
311                    }
312                });
313            
314            // Now get the list of current DEs from the servlet
315            
316            svc.getDutyTechnicians (false,new AsyncCallback() {             
317                    
318                    public void onSuccess (final Object result) {
319                        DEList = (ArrayList)result;
320                    }
321                    
322                    public void onFailure (final Throwable ex)
323                    {
324                        MessageBox.alert("Information","Failed to get the list of duty technicians");                                   
325                    }
326                });
327            
328            // Now get the list of instruments of all instruments
329            
330            svc.getInstruments (true, new AsyncCallback() {
331                    
332                    public void onSuccess (final Object result) {
333                        InstrumentList = (ArrayList)result;
334                    }
335                    
336                    public void onFailure (final Throwable ex)
337                    {
338                        MessageBox.alert("Information","Failed to get the list of instruments " + ex.getMessage());
339                    }
340                });
341    
342            // Get a list of only those instruments which are in use 
343    
344            svc.getInstruments (false, new AsyncCallback() {
345                    
346                    public void onSuccess (final Object result) {
347                        CurrentInstrumentList = (ArrayList)result;
348                    }
349                    
350                    public void onFailure (final Throwable ex)
351                    {
352                        MessageBox.alert("Information","Failed to get the list of instruments " + ex.getMessage());
353                    }
354                });
355            
356            // Get a list of all staff members whether here or not
357            
358            svc.getStaffMembers (true,new AsyncCallback() {
359                    
360                    public void onSuccess (final Object result) {
361                        FullStaffMemberList = (ArrayList)result;
362                    }       
363                    
364                    public void onFailure (final Throwable ex)
365                    {
366                        MessageBox.alert("Information","Failed to get the list of staff members");
367                    }
368                });
369            
370            // Get the list of the telescope operators back from the database whether here or not
371            
372            svc.getTelescopeOperators (true,new AsyncCallback() {
373                                    
374                    public void onSuccess (final Object result) {               
375                        FullTOList = (ArrayList)result;                 
376                    }
377                    
378                    public void onFailure (final Throwable ex)
379                    { 
380                        MessageBox.alert("Information","Failed to get the list of telescope operators");                                
381                    }
382                });
383            
384            
385            // Now get the current support astronomers whether here or not
386            
387            svc.getSupportAstronomers (true,new AsyncCallback() {
388                    
389                    public void onSuccess (final Object result) {
390                        FullSAList = (ArrayList)result;
391                    }
392                    
393                    public void onFailure (final Throwable ex)
394                    {
395                        MessageBox.alert("Information","Failed to get the list of support astronomers");
396                    }
397                });
398            
399            // Now get the list of current DEs from the servlet whether here or not
400            
401            svc.getDutyTechnicians (true,new AsyncCallback() {              
402                    
403                    public void onSuccess (final Object result) {
404                        FullDEList = (ArrayList)result;
405                    }
406                    
407                    public void onFailure (final Throwable ex)
408                    {
409                        MessageBox.alert("Information","Failed to get the list of duty technicians");                                   
410                    }
411                });
412            
413            
414            // Now get the list of sites 
415            
416            svc.getSites (new AsyncCallback() {
417                    
418                    public void onSuccess (final Object result) {
419                        SiteList  = (ArrayList)result;
420                    }
421                    
422                    public void onFailure (final Throwable ex)
423                    {
424                        MessageBox.alert("Information","Failed to get the list of sites" + ex.getMessage());                                    
425                    }
426                });
427            
428            // Now get the lsit of systems
429    
430            svc.getSystems (new AsyncCallback() {
431                    
432                    public void onSuccess (final Object result) {               
433                        SystemList = (ArrayList)result;
434                    }
435                    
436                    public void onFailure (final Throwable ex)
437                    {
438                        MessageBox.alert("Information","Failed to get the list of systems" + ex.getMessage());                                                                  
439                    }
440                });
441            
442            // Get the list of severities from the servlet 
443            
444            svc.getSeverity (new AsyncCallback() {
445                    
446                    public void onSuccess (final Object result) {               
447                        SeverityList = (ArrayList)result;               
448                    }
449                    
450                    public void onFailure (final Throwable ex)
451                    {
452                        MessageBox.alert("Information","Failed to get the list of severity");
453                    }
454                });
455            
456            
457            // Get a list of the fault types
458            
459            svc.getFaultType (new AsyncCallback() {
460                    
461                    public void onSuccess (final Object result) {
462                        FaultTypeList = (ArrayList)result;
463                    }       
464                    
465                    public void onFailure (final Throwable ex)
466                    {
467                        MessageBox.alert("Information","Failed to get the list of the fault types ");
468                    }
469                });
470    
471            // Get the fault states which are allowed 
472            
473            svc.getStates (new AsyncCallback() {
474                    
475                    public void onSuccess (final Object result) {
476                        FaultStateList = (ArrayList)result;
477                    }       
478                    
479                    public void onFailure (final Throwable ex)
480                    {
481                        MessageBox.alert("Information","Failed to get the list of the fault states");
482                    }
483                }); 
484    
485            // Get the details of the printers from the servlet and store
486            // them for later use
487            
488            svc.getPostscriptPrinters(new AsyncCallback() {
489                    
490                    public void onSuccess (final Object result) {
491    
492                        PrinterList = new ArrayList();                  
493                                        
494                        final ArrayList temp = (ArrayList)result;
495                        
496                        for (int i=0; i < temp.size() ;i++) { 
497                            PrinterList.add((String)temp.get(i));
498                        }
499                    }
500    
501                    public void onFailure (final Throwable ex){
502                        MessageBox.alert("Information","Unable to get printer list" + ex.getMessage());
503                    }
504                    
505                });
506        }
507        
508        /**
509         * Gets a list of the telescope operators from the tomcat faultdb
510         * servlet and initialises the list of the telescope operators in
511         * the list box which was provided by the caller. 
512         * @param listBox This is the listbox widget which is to have it's list populated
513         * @param defaultUser This is the default value in the list to be
514         * selected. 
515         * @param IncludeStaffWhichHaveLeft Include all of the staff in
516         * this group which have left the organisation. =     
517         */
518        
519        void fillListBoxWithTelescopeOperators (final ListBox listBox,
520                                                final String defaultUser,
521                                                final boolean IncludeStaffWhichHaveLeft) {
522            
523            // Now clear out the listbox of it's existing contents
524            
525            listBox.clear();
526            
527            ArrayList staffList;
528            
529            if (IncludeStaffWhichHaveLeft) {
530                staffList = FullTOList;                 
531            } else {
532                staffList = TOList;
533            }
534    
535            createDropDownList (staffList,defaultUser,listBox);                         
536            
537        }
538    
539    
540        /**
541         * Gets a list of the support astronomer from the tomcat faultdb
542         * servlet and initialises the list box which was provided by the caller. 
543         * @param listBox This is the listbox widget which is to have it's list populated
544         * @param defaultUser This is the default value in the list to be
545         * selected.
546         * @param IncludeStaffWhichHaveLeft Whether to include staff that
547         * have already left the ING in the list 
548         */
549        
550        protected void fillListBoxWithSupportAstronomers (final ListBox listBox,final String defaultUser,final boolean IncludeStaffWhichHaveLeft) {
551            
552            // Now clear out the listbox of it's existing contents
553    
554            listBox.clear();
555    
556            ArrayList staffList;
557            
558            if (IncludeStaffWhichHaveLeft) {
559                staffList = FullSAList;                 
560            } else {
561                staffList = SAList;
562            }
563            
564            createDropDownList (staffList,defaultUser,listBox);                         
565        }
566        
567        /**
568         * Adds the names of the people into the list provided. If the
569         * defaultUser cannot be found then if the option
570         * FaultDatabaseConstants.DEFAULTUSER can be found in the list
571         * then that is selected instead. 
572         * @param staffList An array of type person which is to be
573         * included in the list. 
574         * @param defaultUser This is the default value in the list to be
575         * @param listBox This is the listbox widget which is to have it's list populated
576         */
577        
578        private void createDropDownList (final ArrayList staffList, 
579                                         final String defaultUser,
580                                         final ListBox listBox) {
581            
582            // The index in the list if unknown is specified. 
583    
584            final int NOTKNOWN = -1;
585            
586            int unknownIndex = NOTKNOWN;
587    
588            boolean optionSelected = false;
589    
590            for (int i=0; i < staffList.size(); i++) { 
591                
592                final Person newPerson = (Person)staffList.get(i);
593                
594                // Now add the name of the person to the list
595                
596                listBox.addItem(newPerson.getName() + " " + newPerson.getSurname(),newPerson.getEmailAddress());
597                
598                if (defaultUser != null) {
599                    
600                    // Record where unknown is in the list if it is present,
601                    // this is an alternative if we cannot find the default
602                    // item in the list 
603                    
604                    if (optionSelected == false && newPerson.getEmailAddress().equalsIgnoreCase(FaultDatabaseConstants.DEFAULTUSER)) {
605                        unknownIndex = i;
606                    }
607                    
608                    if (!optionSelected && defaultUser.equals(newPerson.getEmailAddress())) {
609                        optionSelected = true;
610                        listBox.setSelectedIndex(i);
611                    }
612                }
613            }       
614            
615            // If we could not find the default user (if specified) in the
616            // list then we select unknown
617            
618            if (unknownIndex != NOTKNOWN && !optionSelected) {
619                listBox.setSelectedIndex(unknownIndex);
620            }
621        }
622        
623        /**
624         * Gets a list of the duty technician from the tomcat faultdb
625         * servlet and initialises the list box which was provided by the caller. 
626         * @param listBox This is the listbox widget which is to have it's list populated
627         * @param defaultUser This is the default value in the list to be
628         * selected.   
629         * @param IncludeStaffWhichHaveLeft Include all of the staff in
630         * this group which have left the organisation. 
631         */
632        
633        protected void fillListBoxWithDutyTechnicians (final ListBox listBox,
634                                                       final String defaultUser,
635                                                       final boolean IncludeStaffWhichHaveLeft) {
636            
637            // Now clear out the listbox of it's existing contents
638    
639            listBox.clear();
640    
641            ArrayList staffList;
642            
643            if (IncludeStaffWhichHaveLeft) {
644                staffList = FullDEList;                 
645            } else {
646                staffList = DEList;
647            }
648    
649            createDropDownList (staffList,defaultUser,listBox);                         
650        }
651    
652        /**
653         * Called to set the default option in a list box widget. 
654         * @param KeyValue This is the option which is to be selected 
655         * @param TargetList This is the list in which the option is to be
656         * selected 
657         */
658        
659        public void selectDefaultListOption (final String KeyValue, final ListBox TargetList) {
660    
661            if (KeyValue == null) {
662                return;
663            }
664    
665            for (int i=0; i < TargetList.getItemCount(); i++) { 
666                
667                final String value = TargetList.getValue(i);
668                
669                if (value.equals(KeyValue)) {
670                    TargetList.setSelectedIndex(i);
671                    return;
672                }
673            }
674        }
675    
676        /**
677         * Gets a list of the staff members from the tomcat faultdb
678         * servlet and initialises the list box which was provided by the
679         * caller.
680         * @param listBox This is the listbox widget which is to have it's
681         * list populated
682         * @param defaultUser This is the default value in the list to be
683         * selected. 
684         * @param IncludeStaffWhichHaveLeft Include all of the staff in
685         * this group which have left the organisation. 
686         */
687        
688        protected void fillListBoxWithStaffMembers (final ListBox listBox,
689                                                    final String defaultUser,
690                                                    final boolean IncludeStaffWhichHaveLeft) {
691            
692            // Now clear out the listbox of it's existing contents
693    
694            listBox.clear();
695    
696            ArrayList staffList;
697            
698            if (IncludeStaffWhichHaveLeft) {
699                staffList = FullStaffMemberList;                
700            } else {
701                staffList = StaffMemberList;
702            }
703            
704            createDropDownList (staffList,defaultUser,listBox);                         
705        }
706    
707    
708        /**
709         * Gets a list of the all instruments from the tomcat faultdb
710         * servlet and initialises the list box which was provided by the
711         * caller.
712         * @param listBox This is the listbox widget which is to have it's list populated
713         */
714        
715        protected void fillListBoxWithInstruments (final ListBox listBox, final String CurrentLocale) {
716            
717            // Now clear out the listbox of it's existing contents
718    
719            listBox.clear();
720                            
721            for (int i=0; i < InstrumentList.size(); i++) { 
722                
723                final Instrument newInstrument = (Instrument)InstrumentList.get(i);
724                
725                // Now add the name of the instrument to the list 
726                
727                if (CurrentLocale.equalsIgnoreCase("en")) {
728                    listBox.addItem(newInstrument.getEn_description(),newInstrument.getId());
729                } else {
730                    listBox.addItem(newInstrument.getSp_description(),newInstrument.getId());
731                }
732            }
733        }
734    
735        /**
736         * Gets a list of only the current instruments (not
737         * decommissioned) from the tomcat faultdb servlet and initialises
738         * the list box which was provided by the caller.
739         * @param listBox This is the listbox widget which is to have it's list populated
740         */
741        
742        protected void fillListBoxWithCurrentInstruments (final ListBox listBox, final String CurrentLocale) {
743            
744            // Now clear out the listbox of it's existing contents
745    
746            listBox.clear();
747                            
748            for (int i=0; i < CurrentInstrumentList.size(); i++) { 
749                
750                final Instrument newInstrument = (Instrument)CurrentInstrumentList.get(i);
751                
752                // Now add the name of the instrument to the list 
753                
754                if (CurrentLocale.equalsIgnoreCase("en")) {
755                    listBox.addItem(newInstrument.getEn_description(),newInstrument.getId());
756                } else {
757                    listBox.addItem(newInstrument.getSp_description(),newInstrument.getId());
758                }
759            }
760        }
761    
762        /**
763         * Gets a list of the sites from the tomcat faultdb servlet and
764         * initialises the list box which was provided by the caller.
765         * @param listBox This is the listbox widget which is to have it's
766         * list populated
767         */
768        
769        protected void fillListBoxWithSites (final ListBox listBox, final String CurrentLocale) {
770            
771            // Now clear out the listbox of its existing contents
772    
773            listBox.clear();
774            
775            for (int i=0; i < SiteList.size(); i++) { 
776                            
777                final Site newSite = (Site)SiteList.get(i);
778                
779                // Now add the name of the site to the list 
780                
781                if (CurrentLocale.equalsIgnoreCase("en")) {
782                    listBox.addItem(newSite.getEn_description(),newSite.getId());
783                } else {
784                    listBox.addItem(newSite.getSp_description(),newSite.getId());                                               
785                }
786            }       
787        }
788    
789        /**
790         * Gets a list of the systems from the tomcat faultdb servlet and
791         * initialises the list box which was provided by the caller.
792         * @param listBox This is the listbox widget which is to have it's
793         * list populated
794         */
795        
796        protected void fillListBoxWithSystems (final ListBox listBox, final String CurrentLocale) {
797            
798            // Now clear out the listbox of it's existing contents
799    
800            listBox.clear();
801                            
802            for (int i=0; i < SystemList.size(); i++) { 
803                
804                final FDBSystem newSystem = (FDBSystem)SystemList.get(i);
805                
806                // Now add the name of the system to the list 
807                
808                if (CurrentLocale.equalsIgnoreCase("en")) {
809                    listBox.addItem(newSystem.getEn_description(),newSystem.getId());
810                } else {
811                    listBox.addItem(newSystem.getSp_description(),newSystem.getId());                                                   
812                }
813            }
814        }
815    
816        /**
817         * Gets a list of the severities from the tomcat faultdb servlet and
818         * initialises the list box which was provided by the caller.
819         * @param listBox This is the listbox widget which is to have it's
820         * list populated
821         */
822        
823        protected void fillListBoxWithSeverity (final ListBox listBox, final String CurrentLocale) {
824            
825            // Now clear out the listbox of it's existing contents
826    
827            listBox.clear();
828            
829            for (int i=0; i < SeverityList.size(); i++) { 
830                            
831                final Severity newSeverity = (Severity)SeverityList.get(i);
832                            
833                // Now add the name of the severity to the list 
834                
835                if (CurrentLocale.equalsIgnoreCase("en")) {
836                    listBox.addItem(newSeverity.getEn_description(),newSeverity.getId());
837                } else {
838                    listBox.addItem(newSeverity.getSp_description(),newSeverity.getId());                                               
839                }
840            }
841        }
842    
843        /**
844         * Used to verify that a field which represents the time has been
845         * entered in the correct format of HH:MM in 24 hour clock
846         * @param TimeToVerify This is a string which contains the time
847         * which is to be verified
848         * @return boolean True if the time is in the correct format,
849         * false otherwise
850         */
851        
852        protected boolean verifyTimeFormat (final String TimeToVerify) {
853            
854            // If the field is empty reject the time 
855    
856            if (TimeToVerify == null) {
857                return false;
858            }               
859            
860            // Thank the lord for regex .....
861    
862            return TimeToVerify.matches("(2[0-3]|[0-1]?[0-9]):[0-5][0-9]");
863        }
864    
865        /**
866         * Verify that the date that has been specified is not after the
867         * current date
868         * @param DateToTest This is the date to test specified in the
869         * format DD/MM/YYYY
870         * @return boolean True if the date is valid and not after the
871         * current date
872         */
873        
874        protected boolean verifyDateNotInFuture (final String DateToTest) {
875            
876            final Date currentDate = new Date();
877            
878            // Now split up the date string into it's components. 
879            
880            final String[] dateComponents = DateToTest.split("/");
881    
882            try {
883                
884                // Note that the order that we check to see if the year,
885                // month and date is in the future is important. 
886    
887                // Verify that the year the user has specified is not in the
888                // future. 
889                
890                int yearSpecified = Integer.parseInt(dateComponents[2]);
891                
892                if (yearSpecified >= 1900) {
893                    yearSpecified -= 1900;
894                } else {
895                    
896                    // If the user specified a two digit year then we add
897                    // 100 years to the date as the date that we get back
898                    // from the Date object is year after 1900
899    
900                    if (dateComponents[2].length() == 2 ) {
901                        yearSpecified += 100;
902                    }
903                }
904    
905                if (yearSpecified > currentDate.getYear()) {
906                    return false;
907                } else if (yearSpecified < currentDate.getYear()) {
908                    
909                    // If the year is from last year then we do not need
910                    // to check the month and date fields 
911    
912                    return true;
913                }
914    
915                // Verify that the user has not specified a month in the
916                // future 
917    
918                int monthSpecified = Integer.parseInt(dateComponents[1]);
919                
920                if (monthSpecified > (currentDate.getMonth() + 1)) {
921                    return false;
922                } else if (monthSpecified <  (currentDate.getMonth() + 1)) {
923                    
924                    // If the month is from a previous month to the one
925                    // that we are in at the moment then there is no point
926                    // in checking the date
927                    
928                    return true;
929                }
930    
931                // Verify that the user has not specified a day of month
932                // in the future in the future
933    
934                int daySpecified = Integer.parseInt(dateComponents[0]);
935                
936                if (daySpecified > currentDate.getDate()) {
937                    return false;
938                }
939                
940            } catch (NumberFormatException e) {
941                return false;
942            }
943    
944            return true;
945        }
946    
947        /**
948         * Used to verify that a field which represents the date has been
949         * entered in the correct format of DD/MM/YYYY
950         * @param DateToVerify This is a string which contains the time
951         * which is to be verified
952         * @return boolean True if the time is in the correct format,
953         * false otherwise
954         */
955        
956        protected boolean verifyDateFormat (final String DateToVerify) {
957            
958            if (DateToVerify == null) {
959                return false;
960            }               
961            
962            if (DateToVerify.matches("(3[0-1]|[0-2]?[0-9])/(1[0-2]|0[1-9]|[1-9])/([0-9]{2})")) {
963                return true;
964            }
965                    
966            return DateToVerify.matches("(3[0-1]|[0-2]?[0-9])/(1[0-2]|0[1-9]|[1-9])/([0-9]{4})");
967        }   
968        
969        /**
970         * Get current date in the format DD/MM/YYYY and return it to the
971         * caller. 
972         */
973        
974        protected String getCurrentDate () {
975    
976            final Date date = new Date();
977            
978            String DOM = Integer.toString(date.getDate());
979            
980            String MOY = Integer.toString(date.getMonth() + 1);
981            
982            if (DOM.length() == 1) {
983                DOM = "0" + date.getDate();
984            }
985    
986            if (MOY.length() == 1) {
987                MOY = "0" + (date.getMonth() + 1);
988            }
989    
990            return DOM + "/" + MOY + "/" + (date.getYear() + 1900);
991            
992        }
993    
994        /**
995         * Get current time in the format HH:MM and return it to the
996         * caller
997         */
998        
999        protected String getCurrentTime () {
1000    
1001            final Date time = new Date();
1002            
1003            String hours = Integer.toString(time.getHours());
1004            
1005            String minutes = Integer.toString(time.getMinutes());
1006            
1007            if (hours.length() == 1) {
1008                hours = "0" + time.getHours();
1009            }
1010    
1011            if (minutes.length() == 1) {
1012                minutes = "0" + time.getMinutes();
1013            }
1014    
1015            return hours + ":" + minutes;
1016        }
1017        
1018        /**
1019         * Gets a list of the fault types from the tomcat faultdb servlet and
1020         * initialises the list box which was provided by the caller.
1021         * @param listBox This is the listbox widget which is to have it's
1022         * list populated
1023         */
1024        
1025        protected void fillListBoxWithFaultType (final ListBox listBox, final String CurrentLocale) {
1026            
1027            // Now clear out the listbox of it's existing contents
1028    
1029            listBox.clear();
1030                    
1031            for (int i=0; i < FaultTypeList.size(); i++) { 
1032                
1033                final FaultType newFaultType = (FaultType)FaultTypeList.get(i);
1034                
1035                // Now add the name of the FaultType to the list 
1036                
1037                if (CurrentLocale.equalsIgnoreCase("en")) {
1038                    listBox.addItem(newFaultType.getEn_description(),newFaultType.getId());
1039                } else {
1040                    listBox.addItem(newFaultType.getSp_description(),newFaultType.getId());                                             
1041                }
1042            }
1043        }
1044        
1045        /**
1046         * Gets a list of the fault states from the tomcat faultdb servlet and
1047         * initialises the list box which was provided by the caller.
1048         * @param listBox This is the listbox widget which is to have it's
1049         * list populated
1050         */
1051        
1052        protected void fillListBoxWithStates (final ListBox listBox, final String CurrentLocale) {
1053            
1054            // Now clear out the listbox of it's existing contents
1055    
1056            listBox.clear();
1057                            
1058            for (int i=0; i < FaultStateList.size(); i++) { 
1059                            
1060                final State newState = (State)FaultStateList.get(i);
1061                            
1062                // Now add the name of the state to the list
1063                
1064                if (CurrentLocale.equalsIgnoreCase("en")) {
1065                    listBox.addItem(newState.getEn_description(),newState.getId());
1066                } else {
1067                    listBox.addItem(newState.getSp_description(),newState.getId());                                             
1068                }
1069            }
1070        }
1071    
1072        /**
1073         * This method will be used to set the selected value in the
1074         * listbox specified to the value which has been provided by the
1075         * caller.
1076         * @param list This is the list widget which contains the value which is to be selected. 
1077         * @param value This is the value which is to be selected in the list. 
1078         * @return boolean True if we managed to select the value in the
1079         * list which was specified by the value parameter.
1080         */
1081        
1082        protected boolean setSelectedItemInListbox(final ListBox list, final String value) {
1083    
1084            final int NOTKNOWN = -1;
1085            
1086            int unknownIndex = NOTKNOWN;
1087    
1088            boolean optionSelected = false;
1089    
1090            if (value == null) {
1091                return false;
1092            }
1093    
1094            for (int i=0; i < list.getItemCount() ;i++) { 
1095    
1096                String listValue = list.getValue(i);
1097    
1098                // Record where unknown is in the list just in case we
1099                // cannot find the value that we are looking for
1100                
1101                if (unknownIndex == NOTKNOWN && listValue.equalsIgnoreCase(FaultDatabaseConstants.DEFAULTUSER)) {
1102                    unknownIndex = i;
1103                }
1104                
1105                if (listValue.equalsIgnoreCase(value)) {
1106                    list.setSelectedIndex(i);
1107                    return true;
1108                }
1109            }
1110    
1111            // If we found the unknown option in the list and we could not
1112            // find the default value which we were given then set the
1113            // default option to unknown
1114    
1115            if (unknownIndex != NOTKNOWN) {
1116                list.setSelectedIndex(unknownIndex);
1117            }
1118    
1119            return false;
1120        }     
1121    
1122        /**
1123         * Check to see if the string which has been specified is actually
1124         * empty after being stripped of HTML markup and &nbsp; symbols.
1125         * @param stringToCheck This is the string to be checked
1126         * @return boolean True if the string contains some text otherwise false. 
1127         */
1128        
1129        protected boolean stringContainsText (final String stringToCheck) {
1130    
1131            String textToVerify = stringToCheck;
1132            
1133            // Remove all HTML characters before checking the length of
1134            // the string
1135            
1136            textToVerify = textToVerify.replaceAll("<.*?>","");
1137            
1138            // Remove all &nbsp; symbols as well 
1139            
1140            textToVerify = textToVerify.replaceAll("&nbsp;","");
1141    
1142            // Remove all space characters symbols as well
1143            
1144            textToVerify = textToVerify.replaceAll(" ","");
1145    
1146            textToVerify = textToVerify.trim();
1147    
1148            if (textToVerify.length() == 0) {
1149                return false;
1150            }
1151            
1152            return true;
1153        }
1154    
1155        /**
1156         * This will verify that the text field is not empty or too full
1157         * to fit in the database. 
1158         * @param FieldName This is the name of the field 
1159         * @param MaxLength This is the maximum number of characters that
1160         * are allowed in the field. If this is set to {@link
1161         * #NOLENGTHCHECK NOLENGTHCHECK} then
1162         * we do not perform the check. 
1163         * @param TextToVerify This is the text which is to be verified 
1164         * @throws FieldInvalidException Throw if the field is not valid 
1165         * @return True if the field is okay 
1166         */
1167        
1168        protected boolean verifyText (final String FieldName, final int MaxLength, final String TextToVerify) throws FieldInvalidException {
1169    
1170            String textToVerify = TextToVerify;
1171    
1172            // Check to see if the text contains any real characters.
1173    
1174            if (!stringContainsText(TextToVerify)) {
1175                throw new FieldInvalidException(internationalizationConstants.textFieldEmpty(FieldName));
1176            }
1177    
1178            // Verify that it does not contain more than allocated number
1179            // of characters
1180            
1181            if (MaxLength != NOLENGTHCHECK && textToVerify.length() > MaxLength) {
1182                throw new FieldInvalidException(internationalizationConstants.textFieldFull(FieldName,MaxLength));
1183            }
1184            
1185            return true;
1186        }
1187    
1188        /**
1189         * Take an email address and return the full name of the
1190         * person. It does this by going through the <@link
1191         * #StaffMemberList> array. 
1192         * @param emailAddress
1193         * @return String The full name of the person. It returns unknown
1194         * if the name is not known. 
1195         */
1196         
1197        protected String getFullUserNameFromEmailAddress (final String emailAddress) {
1198            
1199            for (int i=0; i < StaffMemberList.size(); i++) { 
1200                
1201                final Person temp = (Person)StaffMemberList.get(i);
1202                
1203                if (temp.getEmailAddress().equals(emailAddress)) {
1204                    return temp.getName() + " " + temp.getSurname();
1205                }
1206            }
1207            
1208            return "Unknown";
1209        }
1210         
1211         
1212         /**
1213         * This method will be used to return a HTML which can be clicked
1214         * on to create an email.
1215         * @param emailAddress Email address of recipient
1216         * @param faultId Defect number of fault which the email is
1217         * associated
1218         * @param faultTitle This is the title of the fault 
1219         * @param linkText This is the text of the link 
1220         * @return This is the link which can then be dropped into some
1221         * HTML
1222         */
1223        
1224        public static String createEmailLink (final String emailAddress, 
1225                                              final int faultId, 
1226                                              final String faultTitle, 
1227                                              final String linkText) {
1228    
1229            // If the user is not guest or unknown then we allow a link so
1230            // he can be emailed. 
1231    
1232            if (!emailAddress.equalsIgnoreCase(FaultDatabaseConstants.GUEST) && !emailAddress.equalsIgnoreCase(FaultDatabaseConstants.DEFAULTUSER)) {
1233                return "<a href=\"mailto:" + emailAddress + "?Subject=DR " + faultId + " - " + faultTitle + "\">" + linkText + "</a>";
1234            } else {
1235                return linkText;
1236            }
1237        }
1238    }