<?xml version="1.0"?>
<!-- $Id$ -->
<!DOCTYPE script PUBLIC
	"-//Apache Software Foundation//Tapestry Script Specification 3.0//EN"
	"http://jakarta.apache.org/tapestry/dtd/Script_3_0.dtd">
	
<!-- 

  Creates a script for validating that a field is required and/or has a minimum
  field length.
  
  Input symbols:
     field, form, validator:  As normal for a validation script.
     formatMessage: Message displayed if the input is not valid.
	 requiredMessage: Message to display if the field is required yet blank.
	 rangeMessage: Message to display if the field is not in the expected range. 
     formatExpression: Regular expression for the field.
-->
	
<script>

<include-script resource-path="/org/apache/tapestry/valid/Validator.js"/>

<input-symbol key="field" class="org.apache.tapestry.valid.ValidField" required="yes"/>
<input-symbol key="form" class="org.apache.tapestry.IForm" required="yes"/>
<input-symbol key="validator" class="org.apache.tapestry.valid.NumberValidator" required="yes"/>
<input-symbol key="formatMessage" class="java.lang.String" required="yes"/>
<input-symbol key="requiredMessage" class="java.lang.String"/>
<input-symbol key="rangeMessage" class="java.lang.String"/>

<let key="function" unique="yes">
validate_${field.name}
</let>

<body>
function ${function}()
{
  var field = document.${form.name}.${field.name}; 
  var stringValue = field.value;  
<if expression="validator.required">
  if (stringValue.length == 0)
     return validator_invalid_field(field, "${requiredMessage}");
</if>
<if-not expression="validator.required">
  if (stringValue.length == 0)
     return true;
</if-not>
  var value = stringValue * 1;
  if (isNaN(value))
      return validator_invalid_field(field, "${formatMessage}");
<if expression="validator.integerNumber">
  var regex = /\./;
  if (stringValue.search(regex) != -1)
      return validator_invalid_field(field, "${formatMessage}");
</if>
<if expression="validator.minimum != null">
  if (value &lt; ${validator.minimum})
     return validator_invalid_field(field, "${rangeMessage}");
</if>
<if expression="validator.maximum != null">
  if (value &gt; ${validator.maximum})
     return validator_invalid_field(field, "${rangeMessage}");
</if>
  return true;
}
</body>

</script>