Project

General

Profile

« Previous | Next » 

Revision 5385

starting point for semtools skin. augmenting default skin with Annotation documents.
not yet semantically enhanced search capabilities, but you can see a listing of both EML and Annotations on the server.

View differences:

lib/style/skins/semtools/semtools.js
1
 /*
2
  *     Purpose: Default style sheet for KNB project web pages 
3
  *              Using this stylesheet rather than placing styles directly in 
4
  *              the KNB web documents allows us to globally change the 
5
  *              formatting styles of the entire site in one easy place.
6
  *   Copyright: 2000 Regents of the University of California and the
7
  *               National Center for Ecological Analysis and Synthesis
8
  *     Authors: Matt Jones
9
  *
10
  *    '$Author$'
11
  *      '$Date$'
12
  *  '$Revision$'
13
  *
14
  * This program is free software; you can redistribute it and/or modify
15
  * it under the terms of the GNU General Public License as published by
16
  * the Free Software Foundation; either version 2 of the License, or
17
  * (at your option) any later version.
18
  *
19
  * This program is distributed in the hope that it will be useful,
20
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
  * GNU General Public License for more details.
23
  *
24
  * You should have received a copy of the GNU General Public License
25
  * along with this program; if not, write to the Free Software
26
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
27
  */
28

  
29
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
30
 * * * * * *  CONFIGURATION SETTINGS - EDIT THESE FOR YOUR ENVIRONMENT * * * * 
31
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
32

  
33
 
34
//  These settings allow you to include and display common content (eg a common 
35
//  header) on all your pages, in much the same way as a frameset allows you to 
36
//  do, but through the use of iframes and a table instead. You can include up 
37
//  to 4 external pages, each one within the header, footer, left or right areas
38
//
39
//  looks like this (if you're using a fixed width font to display these notes):
40
//    ___________________
41
//    |     header      |
42
//    |-----------------|
43
//    | |             | |
44
//    | |             | |
45
//    |L|   content   |R|
46
//    | |             | |
47
//    | |             | |
48
//    |-----------------|
49
//    |     footer      | 
50
//    -------------------
51
//
52
//  Each area may display another page on the local site, or a page on a 
53
//  different server, or may be set to display nothing (in which case an iframe 
54
//  will not be drawn, although the containing table cell will still need to be 
55
//  resized using the css style - see below) 
56
//
57
//  NOTES:
58
//
59
//  1) if you have any links in the included documents, the target attribute for 
60
//     these *MUST* be set to _top, otherwise the new document will be displayed 
61
//     inside the small iframe areas, instead of replacing the entire page!
62
//     - example: <a href="index.html" target="_top">HOME</a>
63
//   
64
//  2) you will need to set the correct iframe size, in order to accomodate 
65
//     each of these areas on the page. The default location for these size 
66
//     settings is in the default.css file - see the "IFRAME_XXXXXX_CLASS" 
67
//     variables (below) for the name of the style to edit
68
//
69
//  3) you will also need to set the correct table cell sizes and/or overall 
70
//     table size for similar reasons. The default location for these size 
71
//     settings is in the default.css file - see the "TEMPLATE_XXXXXX_CLASS" 
72
//     variables (below) for the name of the style to edit
73

  
74

  
75

  
76
////////////////////////////////////////////////////////////////////////////////
77
//  Edit these variables to define the content that will be loaded into the 
78
//  various iframes. Each may be a relative path to another page on the local 
79
//  site, or a full URL to a page on a remote server, or may be set to the empty 
80
//  string if no content is required at that position on the page (and in which  
81
//  case an iframe will not be drawn, although an empty table cell will still  
82
//  exist unless it is resized smaller) . 
83
//  ( e.g. if you do not want a header to be included, set: HEADER_URL="";)
84
////////////////////////////////////////////////////////////////////////////////
85

  
86
//  Location of the header that will be displayed at the top of the page
87
var HEADER_URL 
88
  = "style/skins/semtools/include_header.jsp";
89

  
90
// Location of the search box that will be displayed above the  
91
//  results on the results page (optional)
92
var SEARCHBOX_URL 
93
  = "style/skins/semtools/include_searchbox.jsp";
94

  
95
// Location of the advanced search box
96
var ADVANCED_SEARCHBOX_URL 
97
  = "style/skins/semtools/include_advancedsearch.jsp";
98

  
99
var LOGINBOX_URL
100
  = "style/skins/semtools/include_login.jsp";
101

  
102
var MAP_URL
103
  = "style/skins/semtools/include_map.jsp";
104

  
105
//  Location of the header that will be displayed at the top of the page
106
var LEFTCOL_URL 
107
  = "";
108
  
109
//  Location of the header that will be displayed at the top of the page
110
var RIGHTCOL_URL 
111
  = "";
112
  
113
//  Location of the header that will be displayed at the top of the page
114
var FOOTER_URL 
115
  = "";
116
  
117

  
118

  
119

  
120
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
121
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
122
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
123
/* * * * * * * * *  MAY CHANGE THE FOLLOWING, BUT SHOULDN'T NEED TO* * * * * */ 
124
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
125
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
126
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
127

  
128
  
129
////////////////////////////////////////////////////////////////////////////////
130
//  Edit the default.css file to set the correct iframe sizes to accomodate the 
131
//  header, footer, left and right areas.
132
//  The following variables set the names of the styles that will be applied to 
133
//  each of the iframes - they can be anythign you wish, provided you use the 
134
//  same names for your classes in the css file
135
//  NOTE: these styles apply only to each container frame, *NOT* to the document 
136
//  within it!
137
////////////////////////////////////////////////////////////////////////////////
138

  
139
//header iframe class
140
var IFRAME_HEADER_CLASS         = "iframeheaderclass";
141

  
142
//(metacat only) search box iframe class
143
var IFRAME_SEARCHBOX_CLASS      = "iframesearchboxclass";
144

  
145
//(metacat only) advanced search box iframe class
146
var IFRAME_ADVANCED_SEARCHBOX_CLASS = "iframeadvancedsearchboxclass";
147

  
148
// Interactive Map
149
var IFRAME_MAP_CLASS            = "iframemapclass";
150

  
151
//(metacat only) login box iframe class
152
var IFRAME_LOGINBOX_CLASS      = "iframeloginboxclass";
153

  
154
//left column iframe class
155
var IFRAME_LEFTCOL_CLASS        = "iframeleftcolclass";
156

  
157
//right column iframe class
158
var IFRAME_RIGHTCOL_CLASS       = "iframerightcolclass";
159

  
160
//footer iframe class
161
var IFRAME_FOOTER_CLASS         = "iframefooterclass";
162

  
163

  
164
////////////////////////////////////////////////////////////////////////////////
165
//  Edit the default.css file to set the correct table sizes to accomodate the 
166
//  header, footer, left and right iframes.
167
//  The following variables set the names of the styles that will be applied to 
168
//  each of the table cells (or the table itself - see below) - they can be 
169
//  anything you wish, provided you use the same names for your classes in the 
170
//  css file
171
//  NOTE: these styles apply only to each table cell, *NOT* to the document 
172
//  inside the iframe that is nested within it! (the exception is 
173
//  TEMPLATE_CONTENTAREA_CLASS, since the content probably isn't within an 
174
//  iframe - so style elements in this class will apply to the content istelf)
175
////////////////////////////////////////////////////////////////////////////////
176

  
177
//entire table class
178
var TEMPLATE_TABLE_CLASS        = "templatetableclass";
179

  
180
//header table-cell class. Note you should not set css "width" on this, since it 
181
//includes a colspan
182
var TEMPLATE_HEADERROW_CLASS    = "templateheaderrowclass";
183

  
184
//left column table-cell class. Note that restricting css "height" on this may 
185
//affect visibility of the main content, since it's in the same table row 
186
var TEMPLATE_LEFTCOL_CLASS      = "templateleftcolclass";
187

  
188
//main central content table-cell class. Note that css attributes set here may 
189
//apply to the content nested inside this cell
190
var TEMPLATE_CONTENTAREA_CLASS  = "templatecontentareaclass";
191

  
192
//rigth column table-cell class. Note that restricting css "height" on this may 
193
//affect visibility of the main content, since it's in the same table row 
194
var TEMPLATE_RIGHTCOL_CLASS     = "templaterightcolclass";
195

  
196
//footer table-cell class. Note you should not set "width" on this, since it 
197
//includes a colspan
198
var TEMPLATE_FOOTERROW_CLASS    = "templatefooterrowclass";
199

  
200

  
0 201

  
lib/style/skins/semtools/include_header.jsp
1
<%@ page    language="java" %>
2
<!--
3
  *  '$RCSfile$'
4
  *      Authors: Matt Jones, CHad Berkley
5
  *    Copyright: 2000 Regents of the University of California and the
6
  *               National Center for Ecological Analysis and Synthesis
7
  *  For Details: http://www.nceas.ucsb.edu/
8
  *
9
  *   '$Author$'
10
  *     '$Date$'
11
  * '$Revision$'
12
  * 
13
  * This program is free software; you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License as published by
15
  * the Free Software Foundation; either version 2 of the License, or
16
  * (at your option) any later version.
17
  *
18
  * This program is distributed in the hope that it will be useful,
19
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
  * GNU General Public License for more details.
22
  *
23
  * You should have received a copy of the GNU General Public License
24
  * along with this program; if not, write to the Free Software
25
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26
  *
27
-->
28
<%@ include file="settings.jsp"%>
29
<%@ include file="session_vars.jsp"%>
30
<head>
31
  <title>Metacat Data Catalog</title>
32
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
33
  <link href="<%=STYLE_SKINS_URL%>/semtools/semtools.css" 
34
    rel="stylesheet" type="text/css">
35
  <script language="javascript" type="text/javascript" 
36
    src="<%=STYLE_SKINS_URL%>/dsemtools/semtools.js"></script>
37
  </head>
38

  
39
<body leftmargin="0" topmargin="0" marginwidth="O" marginheight="0">
40

  
41
<table width="100%"  border="0" cellpadding="0" cellspacing="0">
42
  <tr>
43
    <td align="left"  class="title">
44
      <p leftmargin="40px" >&#160;&#160;&#160;&#160;&#160;&#160;Data Catalog Search</p>
45
    </td>
46
  </tr>
47
  <tr>
48

  
49
    <td align="left" valign="middle" class="sectionheader" style="text-align: left">
50
    &#160;&#160;&#160;
51
    <a target="_top" href="<%=STYLE_SKINS_URL%>/semtools/index.jsp"
52
    class="toollink">Home</a></td>
53
  </tr>
54
</table>
55
</body>
56
</html>
0 57

  
lib/style/skins/semtools/index_advanced.jsp
1
<%@ page    language="java" %>
2
<% 
3
 /**
4
  *  '$RCSfile$'
5
  *    Copyright: 2000 Regents of the University of California and the
6
  *               National Center for Ecological Analysis and Synthesis
7
  *  For Details: http://www.nceas.ucsb.edu/
8
  *
9
  *   '$Author$'
10
  *     '$Date$'
11
  * '$Revision$'
12
  * 
13
  * This program is free software; you can redistribute it and/or modify
14
  * it under the terms of the GNU General Public License as published by
15
  * the Free Software Foundation; either version 2 of the License, or
16
  * (at your option) any later version.
17
  *
18
  * This program is distributed in the hope that it will be useful,
19
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
  * GNU General Public License for more details.
22
  *
23
  * You should have received a copy of the GNU General Public License
24
  * along with this program; if not, write to the Free Software
25
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26
  *
27
  * This is an XSLT (http://www.w3.org/TR/xslt) stylesheet designed to
28
  * convert an XML file showing the resultset of a query
29
  * into an HTML format suitable for rendering with modern web browsers.
30
  */
31
%>
32
<%@ include file="settings.jsp"%>
33
<%@ include file="session_vars.jsp"%>
34
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
35

  
36
<html>
37

  
38
<head>
39
<title>Metacat Data Catalog </title>
40
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
41
	<link rel="stylesheet" type="text/css" href="<%=STYLE_SKINS_URL%>/semtools/semtools.css">
42
	<script language="javascript" type="text/javascript" src="<%=STYLE_SKINS_URL%>/semtools/semtools.js"></script>
43
	<script language="javascript" type="text/javascript" src="<%=STYLE_COMMON_URL%>/branding.js"></script>
44
</head>
45

  
46
<body>
47
  <script language="javascript">
48
	  insertTemplateOpening("<%=CONTEXT_URL%>");
49
	  insertAdvancedSearchBox("<%=CONTEXT_URL%>");
50
      insertTemplateClosing("<%=CONTEXT_URL%>");
51
  </script>
52
</body>
53

  
54
</html>
0 55

  
lib/style/skins/semtools/include_advancedsearch.jsp
1
<%@ page     language="java" %>
2
<!--
3
/**
4
  *  '$RCSfile$'
5
  *      Authors:     Duane Costa
6
  *      Copyright:   2005 University of New Mexico and
7
  *                   Regents of the University of California and the
8
  *                   National Center for Ecological Analysis and Synthesis
9
  *      For Details: http://www.nceas.ucsb.edu/
10
  *
11
  *   '$Author$'
12
  *     '$Date$'
13
  * '$Revision$'
14
  * 
15
  * This program is free software; you can redistribute it and/or modify
16
  * it under the terms of the GNU General Public License as published by
17
  * the Free Software Foundation; either version 2 of the License, or
18
  * (at your option) any later version.
19
  *
20
  * This program is distributed in the hope that it will be useful,
21
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
  * GNU General Public License for more details.
24
  *
25
  * You should have received a copy of the GNU General Public License
26
  * along with this program; if not, write to the Free Software
27
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28
  *
29
  */
30
-->
31
<%@ include file="settings.jsp"%>
32
<%@ include file="session_vars.jsp"%>
33
<!-- *********************** START SEARCHBOX TABLE ************************* -->
34
<html>
35
<head>
36
  <title>Metacat Data Catalog Advanced Search Page</title>
37
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
38
  <link href="<%=STYLE_SKINS_URL%>/semtools/semtools.css" rel="stylesheet" type="text/css">
39

  
40
  <script language="javascript" 
41
    type="text/javascript" src="<%=STYLE_SKINS_URL%>/semtools/semtools.js">
42
  </script>
43

  
44
  <script language="javascript" type="text/javascript">
45

  
46
      function trim(stringToTrim) {
47
        return stringToTrim.replace(/^\s*/, '').replace(/\s*$/,'');
48
      }
49

  
50
      function submitRequest(form) {
51
        var canSearch = true;
52
        var x_range = document.map.get_x_range();
53
        var y_range = document.map.get_y_range();
54
        var x_index = x_range.indexOf(' ');
55
        var y_index = y_range.indexOf(' ');
56
        var x_length = x_range.length;
57
        var y_length = y_range.length;
58
        var x_lo = x_range.substring(0, x_index);
59
        var x_hi = x_range.substring(x_index + 1, x_length);
60
        var y_lo = y_range.substring(0, y_index);
61
        var y_hi = y_range.substring(y_index + 1, y_length);
62

  
63
        if (trim(form.subjectValue.value) == "" &&
64
            trim(form.creatorSurname.value) == "" &&
65
            trim(form.creatorOrganization.value) == "" &&
66
            trim(form.locationName.value) == "" &&
67
            (x_range == "-180.0 180.0") &&
68
            (y_range == "-90.0 90.0") &&            
69
            trim(form.taxon.value) == "" &&
70
            form.siteValue.value == "ALLSITES"
71
           ) {              
72
          canSearch = 
73
             confirm("Show *all* data in the catalog?\n(This may take some time!)");
74
        }
75

  
76
        if (canSearch) {        
77
          // Re-initialize the hidden form values prior to submitting
78
          form.northBound.value = "";
79
          form.southBound.value = "";
80
          form.eastBound.value = "";
81
          form.westBound.value = "";
82

  
83
          if ((x_range != "-180.0 180.0") || (y_range != "-90.0 90.0")) {     
84
            form.northBound.value = y_hi;
85
            form.southBound.value = y_lo;
86
            form.eastBound.value = x_hi;
87
            form.westBound.value = x_lo;
88
          }
89
          
90
          return(validateAdvancedSearchForm(form));
91
        }
92
        else {
93
          return false;
94
        }
95
      }
96
  </script>
97
</head>
98

  
99
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
100
  <table width="750px" align="center" cellspacing="0" cellpadding="0">
101
    <tr> 
102
      <td width="10" align="right" valign="top">
103
        <img src="<%=STYLE_SKINS_URL%>/semtools/images/panelhead_bg_lcorner.gif" 
104
          width="10" height="21">
105
      </td>
106
      <td class="sectionheader">
107
        advanced search 
108
      </td>
109
      <td width="10" align="left" valign="top"> 
110
        <img src="<%=STYLE_SKINS_URL%>/semtools/images/panelhead_bg_rcorner.gif" 
111
          width="10" height="21">
112
      </td>
113
    </tr>
114
    <tr> 
115
      <td colspan="3">
116
        <table width="100%" border="0" cellpadding="0" cellspacing="0" 
117
          class="subpanel">
118
          <tr> 
119
            <td colspan="2"></td>
120
          </tr>
121
          <tr valign="baseline"> 
122
            <td colspan="2">
123
    <form name="advancedSearchForm"
124
          method="POST"
125
          action="<%=STYLE_SKINS_URL%>/semtools/advancedsearchforward.jsp"
126
          onsubmit="return submitRequest(this)"
127
          target="_top">
128
      <table width="100%" border="0" cellpadding="0" cellspacing="0" >
129
        <tr>
130
          <td colspan="2"><hr/></td>
131
        </tr>
132
        <tr>
133
          <td colspan="2">
134
            <h3>Subject</h3>
135
          </td>
136
        </tr>
137
        <tr>
138
          <td>&nbsp;</td>
139
          <td>&nbsp;</td>
140
        </tr>
141
        <tr>
142
          <td align="right" nowrap>
143
            <select name="subjectField">
144
              <option value="ALL">Subject</option>
145
              <option value="TITLE">Title Only</option>
146
              <option value="ABSTRACT">Abtract Only</option>
147
              <option value="KEYWORDS">Keywords Only</option>
148
            </select>
149
          </td>
150
          <td>
151
            <select name="subjectQueryType">
152
              <option value="0" selected="selected">contains</option>
153
              <option value="1">matches exactly</option>
154
              <option value="2">starts with</option>
155
              <option value="3">ends with</option>
156
            </select>
157
            <input type="text" name="subjectValue" value="">
158
            <input type="radio" name="subjectAllAny" value="0" checked="checked">All Terms
159
            <input type="radio" name="subjectAllAny" value="1">Any Term
160
          </td>
161
        </tr>
162
        <tr>
163
          <td>&nbsp;</td>
164
          <td>&nbsp;</td>
165
        </tr>
166
        <tr>
167
          <td colspan="2"><hr/></td>
168
        </tr>
169
        <tr>
170
          <td colspan="2">
171
            <h3>Author</h3>
172
          </td>
173
        </tr>
174
        <tr>
175
          <td>&nbsp;</td>
176
          <td>&nbsp;</td>
177
        </tr>
178
        <tr>
179
          <td nowrap align="right">Individual's Last Name:
180
          </td>
181
          <td>
182
            <select name="creatorSurnameQueryType">
183
              <option value="0" selected="selected">contains</option>
184
              <option value="1">matches exactly</option>
185
              <option value="2">starts with</option>
186
              <option value="3">ends with</option></select>
187
            <input type="text" name="creatorSurname" value="">
188
          </td>
189
        </tr>
190
        <tr>
191
          <td>&nbsp;</td>
192
          <td>&nbsp;</td>
193
        </tr>
194
        <tr>
195
          <td align="right" nowrap>Organization:
196
          </td>
197
          <td>
198
            <select name="creatorOrganizationQueryType">
199
              <option value="0" selected="selected">contains</option>
200
              <option value="1">matches exactly</option>
201
              <option value="2">starts with</option>
202
              <option value="3">ends with</option></select>
203
            <input type="text" name="creatorOrganization" value="">
204
          </td>
205
        </tr>
206
        <tr>
207
          <td>&nbsp;</td>
208
          <td>&nbsp;</td>
209
        </tr>
210
        <tr>
211
          <td colspan="2"><hr/></td>
212
        </tr>
213
        <tr>
214
          <td colspan="2">
215
            <h3>Spatial Criteria</h3>
216
          </td>
217
        </tr>
218
        <tr>
219
          <td>&nbsp;</td>
220
          <td>&nbsp;</td>
221
        </tr>
222
        <tr>
223
          <td align="right">Geographic Boundaries:</td>
224
        </tr>
225
        <tr>
226
          <td>&nbsp;</td>
227
          <td>
228
            <applet
229
              CODEBASE="<%= request.getContextPath() %>/LiveMap_30"
230
              CODE="LiveMap_30.class"
231
              ARCHIVE="LiveMap_30.jar"
232
              NAME="map" 
233
              MAYSCRIPT 
234
              width=500 
235
              height=160>
236
              <param name=base_image value="gifs/java_0_world_20k.jpg">
237
              <param name=img_x_domain value="-180 180">
238
              <param name=img_y_domain value="-90 90">
239
              <param name=toolType value="XY">
240
              <param name=tool_x_range value="-180 180">
241
              <param name=tool_y_range value="-90 90">
242
            </applet>
243
          </td>
244
        </tr>
245
        <tr>
246
          <td>&nbsp;</td>
247
          <td>
248
            <!--
249
             The underlying property value associated with checkbox
250
             should be of type boolean, and any value you specify 
251
             should correspond to one of the strings that indicate a 
252
             true value ("true", "yes", or "on").
253
            -->
254
            <input type="checkbox" name="boundaryContained" value="on">
255
            Dataset must be fully contained within boundaries
256
          </td>
257
        </tr>
258
        <tr>
259
          <td>&nbsp;</td>
260
          <td>&nbsp;</td>
261
        </tr>
262
        <tr>
263
          <td align="right">Geographic Place Name: 
264
          </td>
265
          <td><input type="text" name="locationName" value="">
266
          </td>
267
        </tr>
268
        <tr>
269
          <td>&nbsp;</td>
270
          <td>&nbsp;</td>
271
        </tr>
272
        <tr>
273
          <td colspan="2"><hr/></td>
274
        </tr>
275
        <!-- Temporal Criteria section is disabled because Metacat is
276
             not able to search date ranges. An enhancement request has
277
             been entered in Bugzilla (see 
278
             http://bugzilla.ecoinformatics.org/show_bug.cgi?id=2084 )
279
        <tr>
280
          <td colspan="2">
281
            <h3>Temporal Criteria</h3>
282
          </td>
283
        </tr>
284
        <tr>
285
          <td>&nbsp;</td>
286
          <td>&nbsp;</td>
287
        </tr>
288
        <tr>
289
          <td align="right">
290
            <select name="dateField">
291
              <option value="ALL">All Dates</option>
292
              <option value="COLLECTION">Collection Date</option>
293
              <option value="PUBLICATION">Publication Date</option>
294
            </select>
295
          </td>
296
          <td colspan="2">
297
            <input type="text" name="startDate" maxlength="10" size="10" value="" style="font-family:monospace;">
298
            to
299
            <input type="text" name="endDate" maxlength="10" size="10" value="" style="font-family:monospace;">
300
          </td>
301
        </tr>
302
        <tr>
303
          <td>&nbsp;</td>
304
          <td>&nbsp;</td>
305
        </tr>
306
        <tr>
307
          <td align="right">Named Timescale:
308
            <select name="namedTimescaleQueryType">
309
              <option value="0" selected="selected">contains</option>
310
              <option value="1">matches exactly</option>
311
              <option value="2">starts with</option>
312
              <option value="3">ends with</option>
313
            </select>
314
          </td>
315
          <td>
316
            <input type="text" name="namedTimescale" value="">
317
          </td>
318
        </tr>
319
        <tr>
320
          <td>&nbsp;</td>
321
          <td>&nbsp;</td>
322
        </tr>
323
        <tr>
324
          <td colspan="2"><hr/></td>
325
        </tr>
326
        -->
327
        <tr>
328
          <td colspan="2">
329
            <h3>Taxonomic Criteria</h3>
330
          </td>
331
        </tr>
332
        <tr>
333
          <td>&nbsp;</td>
334
          <td>&nbsp;</td>
335
        </tr>
336
        <tr>
337
          <td align="right">Taxon:
338
          </td>
339
          <td>
340
            <select name="taxonQueryType">
341
              <option value="0" selected="selected">contains</option>
342
              <option value="1">matches exactly</option>
343
              <option value="2">starts with</option>
344
              <option value="3">ends with</option>
345
            </select>
346
            <input type="text" name="taxon" value="">
347
          </td>
348
        </tr>
349
        <tr>
350
          <td>&nbsp;</td>
351
          <td>&nbsp;
352
            <input type="hidden" name="siteValue" value="ALLSITES"/>
353
          </td>
354
        </tr>
355

  
356
<!--   
357
    Un-comment the following section to include an input box that allows the
358
    user to restrict the search to a specific LTER site. Obviously, this is
359
    probably useful only within LTER. If uncommenting this section, 
360
    be sure to comment-out the hidden siteValue input above.
361
-->
362
       
363
<!--
364
        <tr>
365
          <td colspan="2"><hr/></td>
366
        </tr>
367
        <tr>
368
          <td colspan="2">
369
            <h3>LTER Site</h3>
370
          </td>
371
        </tr>
372
        <tr>
373
          <td>&nbsp;</td>
374
          <td>&nbsp;</td>
375
        </tr>
376
        <tr>
377
          <td align="right">Limit search to LTER site:</td>
378
          <td>
379
            <select name="siteValue">
380
              <option value="ALLSITES">All LTER Sites</option>
381
              <option value="AND">Andrews LTER</option>
382
              <option value="ARC">Arctic LTER</option>
383
              <option value="BES">Baltimore Ecosystem Study</option>
384
              <option value="BNZ">Bonanza Creek LTER</option>
385
              <option value="CAP">Central Arizona - Phoenix Urban LTER</option>
386
              <option value="CCE">California Current Ecosystem</option>
387
              <option value="CDR">Cedar Creek Natural History Area</option>
388
              <option value="CWT">Coweeta LTER</option>
389
              <option value="FCE">Florida Coastal Everglades LTER</option>
390
              <option value="GCE">Georgia Coastal Ecosystems LTER</option>
391
              <option value="HBR">Hubbard Brook LTER</option>
392
              <option value="HFR">Harvard Forest LTER</option>
393
              <option value="JRN">Jornada Basin LTER</option>
394
              <option value="KBS">Kellogg Biological Station LTER</option>
395
              <option value="KNZ">Konza Prairie LTER</option>
396
              <option value="LNO">LTER Network Office</option>
397
              <option value="LUQ">Luquillo LTER</option>
398
              <option value="MCM">McMurdo Dry Valleys LTER</option>
399
              <option value="MCR">Moorea Coral Reef</option>
400
              <option value="NTL">North Temperate Lakes LTER</option>
401
              <option value="NWT">Niwot Ridge LTER</option>
402
              <option value="PAL">Palmer Station LTER</option>
403
              <option value="PIE">Plum Island Ecosystem LTER</option>
404
              <option value="SBC">Santa Barbara Coastal LTER</option>
405
              <option value="SEV">Sevilleta LTER</option>
406
              <option value="SGS">Shortgrass Steppe</option>
407
              <option value="VCR">Virginia Coastal Reserve LTER</option>
408
            </select>
409
          </td>
410
       </tr>
411
        <tr>
412
          <td>&nbsp;</td>
413
          <td>&nbsp;</td>
414
        </tr>
415
-->
416
        <tr>
417
          <td colspan="2"><hr/></td>
418
        </tr>
419
        <tr>
420
          <td colspan="2">
421
            <h3>Search Options</h3>
422
          </td>
423
        </tr>
424
        <tr>
425
          <td colspan="2" align="center">
426
            <table>
427
              <tr>
428
                <td>
429
                  <input type="radio" name="formAllAny" value="0" checked="checked">"And" all search items&nbsp;
430
                </td>
431
                <td>
432
                  <input type="radio" name="formAllAny" value="1">"Or" all search items&nbsp;
433
                </td>
434
                <td>
435
                  <input type="checkbox" name="caseSensitive" value="on">Case sensitive
436
                </td>
437
              </tr>
438
            </table>
439
          </td>
440
        </tr>
441
        <tr>
442
          <td>&nbsp;</td>
443
          <td>&nbsp;</td>
444
        </tr>
445
        <tr>
446
          <td colspan="2"><hr/></td>
447
        </tr>
448
        <tr>
449
          <td colspan="2" align="center">
450
            <input type="submit" value="Search">&nbsp;&nbsp;
451
            <!-- <input type="reset" value="Reset"> -->
452
          </td>
453
        </tr>
454
      </table>
455
      <input type="hidden" name="northBound" value=""/>
456
      <input type="hidden" name="southBound" value=""/>
457
      <input type="hidden" name="eastBound" value=""/>
458
      <input type="hidden" name="westBound" value=""/>
459
    </form>
460
    
461
    <script type="text/javascript" language="Javascript1.1"> 
462

  
463
    <!-- Begin JavaScript input validation checking code.
464
    var bCancel = false; 
465

  
466
    function validateAdvancedSearchForm(form) {                                                                   
467
        if (bCancel) 
468
            return true; 
469
        else 
470
            var formValidationResult;
471
            formValidationResult = validateFloat(form) && validateFloatRange(form); 
472
            return (formValidationResult == 1);
473
    } 
474

  
475
    function advancedSearchForm_FloatValidations () { 
476
      this.a0 = new Array("westBound", "West Boundary must be a number.", new Function ("varName", "this.min='-180.0'; this.max='180.0';  return this[varName];"));
477
      this.a1 = new Array("eastBound", "East Boundary must be a number.", new Function ("varName", "this.min='-180.0'; this.max='180.0';  return this[varName];"));
478
      this.a2 = new Array("northBound", "North Boundary must be a number.", new Function ("varName", "this.min='-90.0'; this.max='90.0';  return this[varName];"));
479
      this.a3 = new Array("southBound", "South Boundary must be a number.", new Function ("varName", "this.min='-90.0'; this.max='90.0';  return this[varName];"));
480
    } 
481

  
482
    function advancedSearchForm_DateValidations () { 
483
      this.a0 = new Array("startDate", "Start Date must be a date (YYYY-MM-DD).", new Function ("varName", "this.datePattern='yyyy-MM-dd';  return this[varName];"));
484
      this.a1 = new Array("endDate", "End Date must be a date (YYYY-MM-DD).", new Function ("varName", "this.datePattern='yyyy-MM-dd';  return this[varName];"));
485
    } 
486

  
487
    function advancedSearchForm_floatRange () { 
488
      this.a0 = new Array("westBound", "West Boundary must be in the range -180.0 through 180.0.", new Function ("varName", "this.min='-180.0'; this.max='180.0';  return this[varName];"));
489
      this.a1 = new Array("eastBound", "East Boundary must be in the range -180.0 through 180.0.", new Function ("varName", "this.min='-180.0'; this.max='180.0';  return this[varName];"));
490
      this.a2 = new Array("northBound", "North Boundary must be in the range -90.0 through 90.0.", new Function ("varName", "this.min='-90.0'; this.max='90.0';  return this[varName];"));
491
      this.a3 = new Array("southBound", "South Boundary must be in the range -90.0 through 90.0.", new Function ("varName", "this.min='-90.0'; this.max='90.0';  return this[varName];"));
492
    } 
493

  
494
    /**
495
    * Check to see if fields are in a valid float range.
496
    * Fields are not checked if they are disabled.
497
    * <p>
498
    * @param form The form validation is taking place on.
499
    */
500
    function validateFloatRange(form) {
501
        var isValid = true;
502
        var focusField = null;
503
        var i = 0;
504
        var fields = new Array();
505
        var formName = form.getAttributeNode("name"); 
506

  
507
        oRange = eval('new ' + formName.value + '_floatRange()');
508
        for (x in oRange) {
509
            var field = form[oRange[x][0]];
510
            
511
            if ((field.type == 'hidden' ||
512
                field.type == 'text' || field.type == 'textarea') &&
513
                (field.value.length > 0)  &&
514
                 field.disabled == false) {
515
        
516
                var fMin = parseFloat(oRange[x][2]("min"));
517
                var fMax = parseFloat(oRange[x][2]("max"));
518
                var fValue = parseFloat(field.value);
519
                if (!(fValue >= fMin && fValue <= fMax)) {
520
                    if (i == 0) {
521
                        focusField = field;
522
                    }
523
                    fields[i++] = oRange[x][1];
524
                    isValid = false;
525
                }
526
            }
527
        }
528
        if (fields.length > 0) {
529
            focusField.focus();
530
            alert(fields.join('\n'));
531
        }
532
        return isValid;
533
    }
534

  
535

  
536
  /**
537
  * This is a place holder for common utilities used across the javascript validation
538
  *
539
  **/
540

  
541

  
542
    /**
543
    * Check to see if fields are a valid byte.
544
    * Fields are not checked if they are disabled.
545
    * <p>
546
    * @param form The form validation is taking place on.
547
    */
548
    function validateByte(form) {
549
        var bValid = true;
550
        var focusField = null;
551
        var i = 0;
552
        var fields = new Array();
553
        var formName = form.getAttributeNode("name"); 
554
        oByte = eval('new ' + formName.value + '_ByteValidations()');
555

  
556
        for (x in oByte) {
557
            var field = form[oByte[x][0]];
558

  
559
            if ((field.type == 'hidden' ||
560
                field.type == 'text' ||
561
                field.type == 'textarea' ||
562
                field.type == 'select-one' ||
563
                field.type == 'radio')  &&
564
                field.disabled == false) {
565

  
566
                var value = '';
567
                // get field's value
568
                if (field.type == "select-one") {
569
                    var si = field.selectedIndex;
570
                    if (si >= 0) {
571
                        value = field.options[si].value;
572
                    }
573
                } else {
574
                    value = field.value;
575
                }
576

  
577
                if (value.length > 0) {
578
                    if (!isAllDigits(value)) {
579
                        bValid = false;
580
                        if (i == 0) {
581
                            focusField = field;
582
                        }
583
                        fields[i++] = oByte[x][1];
584

  
585
                    } else {
586

  
587
                        var iValue = parseInt(value);
588
                        if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
589
                            if (i == 0) {
590
                                focusField = field;
591
                            }
592
                            fields[i++] = oByte[x][1];
593
                            bValid = false;
594
                        }
595
                    }
596
                }
597

  
598
            }
599
        }
600
        if (fields.length > 0) {
601
           focusField.focus();
602
           alert(fields.join('\n'));
603
        }
604
        return bValid;
605
    }
606

  
607

  
608
    /**
609
    * A field is considered valid if less than the specified maximum.
610
    * Fields are not checked if they are disabled.
611
    * <p>
612
    * <strong>Caution:</strong> Using <code>validateMaxLength</code> on a password field in a 
613
    *  login page gives unnecessary information away to hackers. While it only slightly
614
    *  weakens security, we suggest using it only when modifying a password.</p>
615
    * @param form The form validation is taking place on.
616
    */
617
    function validateMaxLength(form) {
618
        var isValid = true;
619
        var focusField = null;
620
        var i = 0;
621
        var fields = new Array();
622
        var formName = form.getAttributeNode("name"); 
623

  
624
        oMaxLength = eval('new ' + formName.value + '_maxlength()');        
625
        for (x in oMaxLength) {
626
            var field = form[oMaxLength[x][0]];
627

  
628
            if ((field.type == 'hidden' ||
629
                field.type == 'text' ||
630
                field.type == 'password' ||
631
                field.type == 'textarea') &&
632
                field.disabled == false) {
633

  
634
                var iMax = parseInt(oMaxLength[x][2]("maxlength"));
635
                if (field.value.length > iMax) {
636
                    if (i == 0) {
637
                        focusField = field;
638
                    }
639
                    fields[i++] = oMaxLength[x][1];
640
                    isValid = false;
641
                }
642
            }
643
        }
644
        if (fields.length > 0) {
645
           focusField.focus();
646
           alert(fields.join('\n'));
647
        }
648
        return isValid;
649
    }
650

  
651

  
652
    /**
653
    *  Check to see if fields must contain a value.
654
    * Fields are not checked if they are disabled.
655
    * <p>
656
    * @param form The form validation is taking place on.
657
    */
658

  
659
    function validateRequired(form) {
660
        var isValid = true;
661
        var focusField = null;
662
        var i = 0;
663
        var fields = new Array();
664
        var formName = form.getAttributeNode("name");
665

  
666
        oRequired = eval('new ' + formName.value + '_required()');
667

  
668
        for (x in oRequired) {
669
            var field = form[oRequired[x][0]];
670

  
671
            if ((field.type == 'hidden' ||
672
                field.type == 'text' ||
673
                field.type == 'textarea' ||
674
                field.type == 'file' ||
675
                field.type == 'checkbox' ||
676
                field.type == 'select-one' ||
677
                field.type == 'password') &&
678
                field.disabled == false) {
679

  
680
                var value = '';
681
                // get field's value
682
                if (field.type == "select-one") {
683
                    var si = field.selectedIndex;
684
                    if (si >= 0) {
685
                        value = field.options[si].value;
686
                    }
687
                } else if (field.type == 'checkbox') {
688
                    if (field.checked) {
689
                        value = field.value;
690
                    }
691
                } else {
692
                    value = field.value;
693
                }
694

  
695
                if (trim(value).length == 0) {
696

  
697
                    if (i == 0) {
698
                        focusField = field;
699
                    }
700
                    fields[i++] = oRequired[x][1];
701
                    isValid = false;
702
                }
703
            } else if (field.type == "select-multiple") { 
704
                var numOptions = field.options.length;
705
                lastSelected=-1;
706
                for(loop=numOptions-1;loop>=0;loop--) {
707
                    if(field.options[loop].selected) {
708
                        lastSelected = loop;
709
                        value = field.options[loop].value;
710
                        break;
711
                    }
712
                }
713
                if(lastSelected < 0 || trim(value).length == 0) {
714
                    if(i == 0) {
715
                        focusField = field;
716
                    }
717
                    fields[i++] = oRequired[x][1];
718
                    isValid=false;
719
                }
720
            } else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
721
                isChecked=-1;
722
                for (loop=0;loop < field.length;loop++) {
723
                    if (field[loop].checked) {
724
                        isChecked=loop;
725
                        break; // only one needs to be checked
726
                    }
727
                }
728
                if (isChecked < 0) {
729
                    if (i == 0) {
730
                        focusField = field[0];
731
                    }
732
                    fields[i++] = oRequired[x][1];
733
                    isValid=false;
734
                }
735
            }
736
        }
737
        if (fields.length > 0) {
738
           focusField.focus();
739
           alert(fields.join('\n'));
740
        }
741
        return isValid;
742
    }
743
    
744
    // Trim whitespace from left and right sides of s.
745
    function trim(s) {
746
        return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
747
    }
748

  
749

  
750
    /**
751
    * Check to see if fields are a valid integer.
752
    * Fields are not checked if they are disabled.
753
    * <p>
754
    * @param form The form validation is taking place on.
755
    */
756
    function validateInteger(form) {
757
        var bValid = true;
758
        var focusField = null;
759
        var i = 0;
760
        var fields = new Array();
761
        var formName = form.getAttributeNode("name"); 
762

  
763
        oInteger = eval('new ' + formName.value + '_IntegerValidations()');
764
        for (x in oInteger) {
765
            var field = form[oInteger[x][0]];
766

  
767
            if ((field.type == 'hidden' ||
768
                field.type == 'text' ||
769
                field.type == 'textarea' ||
770
                field.type == 'select-one' ||
771
                field.type == 'radio') &&
772
                field.disabled == false) {
773

  
774
                var value = '';
775
                // get field's value
776
                if (field.type == "select-one") {
777
                    var si = field.selectedIndex;
778
                    if (si >= 0) {
779
                        value = field.options[si].value;
780
                    }
781
                } else {
782
                    value = field.value;
783
                }
784

  
785
                if (value.length > 0) {
786

  
787
                    if (!isAllDigits(value)) {
788
                        bValid = false;
789
                        if (i == 0) {
790
                            focusField = field;
791
                        }
792
                        fields[i++] = oInteger[x][1];
793

  
794
                    } else {
795
                        var iValue = parseInt(value);
796
                        if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
797
                            if (i == 0) {
798
                                focusField = field;
799
                            }
800
                            fields[i++] = oInteger[x][1];
801
                            bValid = false;
802
                       }
803
                   }
804
               }
805
            }
806
        }
807
        if (fields.length > 0) {
808
           focusField.focus();
809
           alert(fields.join('\n'));
810
        }
811
        return bValid;
812
    }
813

  
814
    function isAllDigits(argvalue) {
815
        argvalue = argvalue.toString();
816
        var validChars = "0123456789";
817
        var startFrom = 0;
818
        if (argvalue.substring(0, 2) == "0x") {
819
           validChars = "0123456789abcdefABCDEF";
820
           startFrom = 2;
821
        } else if (argvalue.charAt(0) == "0") {
822
           validChars = "01234567";
823
           startFrom = 1;
824
        } else if (argvalue.charAt(0) == "-") {
825
            startFrom = 1;
826
        }
827

  
828
        for (var n = startFrom; n < argvalue.length; n++) {
829
            if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
830
        }
831
        return true;
832
    }
833

  
834

  
835
    /**
836
    * Check to see if fields are a valid date.
837
    * Fields are not checked if they are disabled.
838
    * <p>
839
    * @param form The form validation is taking place on.
840
    */
841
    function validateDate(form) {
842
       var bValid = true;
843
       var focusField = null;
844
       var i = 0;
845
       var fields = new Array();
846
       var formName = form.getAttributeNode("name"); 
847

  
848
       oDate = eval('new ' + formName.value + '_DateValidations()');
849

  
850
       for (x in oDate) {
851
           var field = form[oDate[x][0]];
852
           var value = field.value;
853
           var datePattern = oDate[x][2]("datePatternStrict");
854
           // try loose pattern
855
           if (datePattern == null)
856
               datePattern = oDate[x][2]("datePattern");
857
           if ((field.type == 'hidden' ||
858
                field.type == 'text' ||
859
                field.type == 'textarea') &&
860
               (value.length > 0) && (datePattern.length > 0) &&
861
                field.disabled == false) {
862
                 var MONTH = "MM";
863
                 var DAY = "dd";
864
                 var YEAR = "yyyy";
865
                 var orderMonth = datePattern.indexOf(MONTH);
866
                 var orderDay = datePattern.indexOf(DAY);
867
                 var orderYear = datePattern.indexOf(YEAR);
868
                 if ((orderDay < orderYear && orderDay > orderMonth)) {
869
                     var iDelim1 = orderMonth + MONTH.length;
870
                     var iDelim2 = orderDay + DAY.length;
871
                     var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
872
                     var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
873
                     if (iDelim1 == orderDay && iDelim2 == orderYear) {
874
                        dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
875
                     } else if (iDelim1 == orderDay) {
876
                        dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
877
                     } else if (iDelim2 == orderYear) {
878
                        dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
879
                     } else {
880
                        dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
881
                     }
882
                     var matched = dateRegexp.exec(value);
883
                     if(matched != null) {
884
                        if (!isValidDate(matched[2], matched[1], matched[3])) {
885
                           if (i == 0) {
886
                               focusField = field;
887
                           }
888
                           fields[i++] = oDate[x][1];
889
                           bValid =  false;
890
                        }
891
                     } else {
892
                        if (i == 0) {
893
                            focusField = field;
894
                        }
895
                        fields[i++] = oDate[x][1];
896
                        bValid =  false;
897
                     }
898
                 } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
899
                     var iDelim1 = orderDay + DAY.length;
900
                     var iDelim2 = orderMonth + MONTH.length;
901
                     var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
902
                     var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
903
                     if (iDelim1 == orderMonth && iDelim2 == orderYear) {
904
                         dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
905
                     } else if (iDelim1 == orderMonth) {
906
                         dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
907
                     } else if (iDelim2 == orderYear) {
908
                         dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
909
                     } else {
910
                         dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
911
                     }
912
                     var matched = dateRegexp.exec(value);
913
                     if(matched != null) {
914
                         if (!isValidDate(matched[1], matched[2], matched[3])) {
915
                             if (i == 0) {
916
                         focusField = field;
917
                             }
918
                             fields[i++] = oDate[x][1];
919
                             bValid =  false;
920
                          }
921
                     } else {
922
                         if (i == 0) {
923
                             focusField = field;
924
                         }
925
                         fields[i++] = oDate[x][1];
926
                         bValid =  false;
927
                     }
928
                 } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
929
                     var iDelim1 = orderYear + YEAR.length;
930
                     var iDelim2 = orderMonth + MONTH.length;
931
                     var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
932
                     var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);
933
                     if (iDelim1 == orderMonth && iDelim2 == orderDay) {
934
                         dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
935
                     } else if (iDelim1 == orderMonth) {
936
                         dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
937
                     } else if (iDelim2 == orderDay) {
938
                         dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
939
                     } else {
940
                         dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
941
                     }
942
                     var matched = dateRegexp.exec(value);
943
                     if(matched != null) {
944
                         if (!isValidDate(matched[3], matched[2], matched[1])) {
945
                             if (i == 0) {
946
                                 focusField = field;
947
                             }
948
                             fields[i++] = oDate[x][1];
949
                             bValid =  false;
950
                         }
951
                     } else {
952
                          if (i == 0) {
953
                              focusField = field;
954
                          }
955
                          fields[i++] = oDate[x][1];
956
                          bValid =  false;
957
                     }
958
                 } else {
959
                     if (i == 0) {
960
                         focusField = field;
961
                     }
962
                     fields[i++] = oDate[x][1];
963
                     bValid =  false;
964
                 }
965
          }
966
       }
967
       if (fields.length > 0) {
968
          focusField.focus();
969
          alert(fields.join('\n'));
970
       }
971
       return bValid;
972
    }
973
    
974
    function isValidDate(day, month, year) {
975
        if (month < 1 || month > 12) {
976
            return false;
977
        }
978
        if (day < 1 || day > 31) {
979
            return false;
980
        }
981
        if ((month == 4 || month == 6 || month == 9 || month == 11) &&
982
            (day == 31)) {
983
            return false;
984
        }
985
        if (month == 2) {
986
            var leap = (year % 4 == 0 &&
987
               (year % 100 != 0 || year % 400 == 0));
988
            if (day>29 || (day == 29 && !leap)) {
989
                return false;
990
            }
991
        }
992
        return true;
993
    }
994

  
995

  
996
    /**
997
    * Check to see if fields are a valid creditcard number based on Luhn checksum.
998
    * Fields are not checked if they are disabled.
999
    * <p>
1000
    * @param form The form validation is taking place on.
1001
    */
1002
    function validateCreditCard(form) {
1003
        var bValid = true;
1004
        var focusField = null;
1005
        var i = 0;
1006
        var fields = new Array();
1007
        var formName = form.getAttributeNode("name");
1008

  
1009
        oCreditCard = eval('new ' + formName.value + '_creditCard()');
1010

  
1011
        for (x in oCreditCard) {
1012
            if ((form[oCreditCard[x][0]].type == 'text' ||
1013
                 form[oCreditCard[x][0]].type == 'textarea') &&
1014
                (form[oCreditCard[x][0]].value.length > 0)  &&
1015
                 form[oCreditCard[x][0]].disabled == false) {
1016
                if (!luhnCheck(form[oCreditCard[x][0]].value)) {
1017
                    if (i == 0) {
1018
                        focusField = form[oCreditCard[x][0]];
1019
                    }
1020
                    fields[i++] = oCreditCard[x][1];
1021
                    bValid = false;
1022
                }
1023
            }
1024
        }
1025
        if (fields.length > 0) {
1026
            focusField.focus();
1027
            alert(fields.join('\n'));
1028
        }
1029
        return bValid;
1030
    }
1031

  
1032
    /**
1033
     * Checks whether a given credit card number has a valid Luhn checksum.
1034
     * This allows you to spot most randomly made-up or garbled credit card numbers immediately.
1035
     * Reference: http://www.speech.cs.cmu.edu/~sburke/pub/luhn_lib.html
1036
     */
1037
    function luhnCheck(cardNumber) {
1038
        if (isLuhnNum(cardNumber)) {
1039
            var no_digit = cardNumber.length;
1040
            var oddoeven = no_digit & 1;
1041
            var sum = 0;
1042
            for (var count = 0; count < no_digit; count++) {
1043
                var digit = parseInt(cardNumber.charAt(count));
1044
                if (!((count & 1) ^ oddoeven)) {
1045
                    digit *= 2;
1046
                    if (digit > 9) digit -= 9;
1047
                };
1048
                sum += digit;
1049
            };
1050
            if (sum == 0) return false;
1051
            if (sum % 10 == 0) return true;
1052
        };
1053
        return false;
1054
    }
1055

  
1056
    function isLuhnNum(argvalue) {
1057
        argvalue = argvalue.toString();
1058
        if (argvalue.length == 0) {
1059
            return false;
1060
        }
1061
        for (var n = 0; n < argvalue.length; n++) {
1062
            if ((argvalue.substring(n, n+1) < "0") ||
1063
                (argvalue.substring(n,n+1) > "9")) {
1064
                return false;
1065
            }
1066
        }
1067
        return true;
1068
    }
1069

  
1070

  
1071
    /**
1072
    * Check to see if fields is in a valid integer range.
1073
    * Fields are not checked if they are disabled.
1074
    * <p>
1075
    * @param form The form validation is taking place on.
1076
    */
1077
    function validateIntRange(form) {
1078
        var isValid = true;
1079
        var focusField = null;
1080
        var i = 0;
1081
        var fields = new Array();
1082
        var formName = form.getAttributeNode("name"); 
1083

  
1084
        oRange = eval('new ' + formName.value + '_intRange()');        
1085
        for (x in oRange) {
1086
            var field = form[oRange[x][0]];
1087
            if (field.disabled == false)  {
1088
                var value = '';
1089
                if (field.type == 'hidden' ||
1090
                    field.type == 'text' || field.type == 'textarea' ||
1091
                    field.type == 'radio' ) {
1092
                    value = field.value;
1093
                }
1094
                if (field.type == 'select-one') {
1095
                    var si = field.selectedIndex;
1096
                    if (si >= 0) {
1097
                        value = field.options[si].value;
1098
                    }
1099
                }
1100
                if (value.length > 0) {
1101
                    var iMin = parseInt(oRange[x][2]("min"));
1102
                    var iMax = parseInt(oRange[x][2]("max"));
1103
                    var iValue = parseInt(value);
1104
                    if (!(iValue >= iMin && iValue <= iMax)) {
1105
                        if (i == 0) {
1106
                            focusField = field;
1107
                        }
1108
                        fields[i++] = oRange[x][1];
1109
                        isValid = false;
1110
                    }
1111
                }
1112
            }
1113
        }
1114
        if (fields.length > 0) {
1115
            focusField.focus();
1116
            alert(fields.join('\n'));
1117
        }
1118
        return isValid;
1119
    }
1120

  
1121

  
1122
    /**
1123
    *  Check to see if fields are a valid short.
1124
    * Fields are not checked if they are disabled.
1125
    * <p>
1126
    * @param form The form validation is taking place on.
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff