<?xml version="1.0" encoding="utf-8" ?>
<!-- Spring Manged Objects -->
<objects xmlns="http://www.springframework.net"
			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xmlns:v="http://www.springframework.net/validation"
			xsi:schemaLocation="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd
									  http://www.springframework.net Xsd/spring-validation-1.3.xsd" >

  <description>
	 Spring Validation
	 See this for more info:
	 http://www.springframework.net/doc-latest/reference/html/validation.html
  </description>

  <v:group id="emissionUnitValidationRules">
	 <v:ref name="euEmissionUnitValidationRules" context="Item" />

	 <v:group id="AgencyCustomFields" when="#this.Item is T(Sleis.Models.AgencyEmissionUnit)">
		<v:ref name ="agencyCustomFieldValidator" context="CustomFields" />
	 </v:group>

	 <v:group id="PublicCustomFields" when="#this.Item is T(Sleis.Models.PublicEmissionUnit)">
		<v:ref name ="publicCustomFieldValidator" context="CustomFields" />
	 </v:group>
  </v:group>


  <v:group id="euEmissionUnitValidationRules">
	 <v:required test="Identifier">
		<v:message id="valid.emission.unit.identifier.required" providers="Item.Identifier">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:regex test="Identifier" expression=".{1,20}" when="Identifier != null">
		<v:message id="valid.emission.unit.identifier.length" providers="Item.Identifier">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>

	 <v:required test="TypeCode">
		<v:message id="valid.emission.unit.typecode.required" providers="Item.TypeCode">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>

	 <v:required test="Description" when="#this is T(Sleis.Models.PublicEmissionUnit)">
		<v:message id="valid.emission.unit.description.required" providers="Item.Description">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:regex test="Description" expression=".{1,100}" when="Description != null">
		<v:message id="valid.emission.unit.desc.length" providers="Item.Description">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>

	 <v:required test="StatusCode">
		<v:message id="valid.control.device.status.code.required" providers="Item.StatusCode">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>

	 <v:required test="StatusEffectiveDate" when="StatusCode != 'OP'">
		<v:message id="valid.emission.unit.status.date.required" providers="Item.StatusEffectiveDate">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>

	 <!--
	 <v:required test="OperationDate">
		<v:message id="valid.emission.unit.operation.date.required" providers="Item.OperationDate">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 -->

	 <!-- Require Design Capacity if Type is in given list of codes -->
	 <!-- <v:validator test="DesignCapacity" type="Sleis.Validation.Spring.NullableDecimalValidator" when="TypeCode == '100' or TypeCode == '120' or TypeCode == '140' or TypeCode == '150' or TypeCode == '160' or TypeCode == '180' or TypeCode == '200' or TypeCode == '250' or TypeCode == '260'">
		<v:property name="MessageId" value="valid.emission.unit.designcapacity.required.when"/>
		<v:property name="Provider" value="Item.DesignCapacity"/>
	 </v:validator> -->
	 <!-- Require Design Capacity if adding a new record -->
	 <!-- <v:validator test="DesignCapacity" type="Sleis.Validation.Spring.NullableDecimalValidator" when="#this.Id == 0">
		<v:property name="MessageId" value="valid.emission.unit.designcapacity.required.when.add"/>
		<v:property name="Provider" value="Item.DesignCapacity"/>
	 </v:validator> -->
	 <!-- <v:validator test="DesignCapacity.ToString('G29')" type="Sleis.Validation.Spring.DecimalValidator" when="DesignCapacity != null">
		<v:property name="PrecisionFormat" value="15,4" />
		<v:message id="valid.emission.unit.designcapacity.format" providers="Item.DesignCapacity">
		  <v:param value="ValidationContxt"/>
		</v:message>
		<v:property name="AllowPartialMatching" value="true"/>
	 </v:validator> -->
	 <!-- <v:condition test ="DesignCapacity &gt;= .01 and DesignCapacity &lt;= 100000000" when="DesignCapacity != null">
		<v:message id="valid.emission.unit.designcapacity.range" providers="Item.DesignCapacity">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:condition>
	 <v:required test="UomCode" when="DesignCapacity != null">
		<v:message id="valid.emission.unit.uom.design.capacity.required.when" providers="Item.UomCode">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:required test="DesignCapacity" when="UomCode != null">
		<v:message id="valid.emission.unit.design.capacity.required.when" providers="Item.DesignCapacity">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required> -->

	 <!--
	 v:required test="Comment">
		<v:message id="valid.emission.unit.comment.required" providers="Item.Comment" >
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required
	 -->
	 <v:regex test="Comment" expression="^[\s\S]{0,4000}$" when="Comment != null">
		<v:message id="valid.emission.unit.comment.length" providers="Item.Comment">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>

	 <!-- Check for existence of regulatory programs, if required by agency, so they get flagged during Validate Report/Submission -->
	 <!--
	 <v:required test="EpaRegulationPrograms" when="'${app.enable.regulatory.program.in}' == 'emissionUnit'">
		<v:message id="valid.emission.unit.regulatory.program.code.required" providers="Item.EpaRegulationPrograms">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:condition test ="EpaRegulationPrograms.Count > 0" when="'${app.enable.regulatory.program.in}' == 'emissionUnit' and EpaRegulationPrograms != null">
		<v:message id="valid.emission.unit.regulatory.program.code.required" providers="Item.EpaRegulationPrograms">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:condition>
	 -->
	 <!-- Required field check for Regulatory Program(s) on page -->
	 <!-- 
	 <v:validator test="EpaRegulationPrograms" type="Sleis.Validation.Spring.ListValidator" when="'${app.enable.regulatory.program.in}' == 'emissionUnit' and EpaRegulationPrograms != null">
		<v:property name="ProviderFormat" value="Item.EpaRegulationPrograms[{0}]."/>
		<v:property name="Validator" ref="euRegulatoryProgramValidationRules" />
	 </v:validator>
	 -->

	 <v:ref name="euUniqueRegulatoryProgramValidationRules" />
	 <v:ref name="euEmissionUnitControlApproachValidationRules" />
  </v:group>


  <v:group id="euRegulatoryProgramValidationRules">
	 <v:required test="Value">
		<v:message id="valid.emission.unit.regulatory.program.code.required" providers="Value">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
  </v:group>


  <v:group id="euUniqueRegulatoryProgramValidationRules" when="'${app.enable.regulatory.program.in}' == 'emissionUnit' and EpaRegulationPrograms != null">
	 <v:validator test="EpaRegulationPrograms" type="Sleis.Validation.Spring.UniqueListValidator">
		<v:property name="ProviderFormat" value="Item.EpaRegulationPrograms[{0}]." />
		<v:property name="MessageId" value="valid.emission.unit.regulatory.program.code.unique" />
		<v:property name="Keys">
		  <dictionary key-type="string" value-type="string">
			 <!--
			 Key: What has to be uique
			 Value: What is the field name to be appended to the ProviderFormat
			 -->
			 <entry key="Value" value="Value" />
		  </dictionary>
		</v:property>
	 </v:validator>
  </v:group>


  <v:group id="euEmissionUnitControlApproachValidationRules" when="'${app.use.emission.unit.control.approach}' == 'true' and ControlApproach!=null">
	 <v:required test="ControlApproach.Description" when="ControlApproach!=null ">
		<v:message id="valid.emission.unit.control.approach.description.required" providers="Item.ControlApproach.Description">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:regex test="ControlApproach.Description" expression=".{0,200}" when="ControlApproach.Description != null">
		<v:message id="valid.emission.unit.control.approach.description.length" providers="Item.ControlApproach.Description">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:regex>

	 <v:validator test="ControlApproach.Efficency" type="Sleis.Validation.Spring.NullableDecimalValidator" when="ControlApproach.NotControlled == false">
		<v:property name="MessageId" value="valid.emission.unit.control.approach.efficency.required"/>
		<v:property name="Provider" value="Item.ControlApproach.Efficency"/>
	 </v:validator>
	 <v:validator id="unitProcessApproachDesignCapacityValidator" test="ControlApproach.Efficency.ToString('G29')" type="Sleis.Validation.Spring.DecimalValidator" when="ControlApproach.Efficency != null and ControlApproach.NotControlled == false">
		<v:property name="PrecisionFormat" value="3,1" />
		<v:message id="valid.emission.unit.control.approach.efficency.format" providers="Item.ControlApproach.Efficency">
		  <v:param value="ValidationContxt"/>
		</v:message>
		<v:property name="AllowPartialMatching" value="true"/>
	 </v:validator>
	 <v:condition test ="ControlApproach.Efficency &gt;= 1 and ControlApproach.Efficency &lt;= 100" when="ControlApproach.Efficency != null and ControlApproach.NotControlled == false">
		<v:message id="valid.emission.unit.control.approach.efficency.range" providers="Item.ControlApproach.Efficency">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:condition>

	 <!-- Check for existence of control devices, if required by agency, so they get flagged during Validate Report/Submission -->
	 <v:required test="ControlApproach.EntityControlDevices" when="ControlApproach.NotControlled == false">
		<v:message id="valid.emission.unit.control.device.identifier.required" providers="ControlApproach.EntityControlDevices">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
	 <v:condition test ="ControlApproach.EntityControlDevices.Count > 0" when="ControlApproach.NotControlled == false and ControlApproach.EntityControlDevices != null">
		<v:message id="valid.emission.unit.control.device.identifier.required" providers="ControlApproach.EntityControlDevices">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:condition>
	 <!-- Required field check for Control Device(s) on page -->
	 <v:validator test="ControlApproach.EntityControlDevices" type="Sleis.Validation.Spring.ListValidator" when="ControlApproach.NotControlled == false ">
		<v:property name="ProviderFormat" value="Item.ControlApproach.EntityControlDevices[{0}]."/>
		<v:property name="Validator" ref="euControlDeviceValidationRules" />
	 </v:validator>

	 <!-- Check for unique control devices -->
	 <v:validator test="ControlApproach.EntityControlDevices" type="Sleis.Validation.Spring.UniqueListValidator">
		<v:property name="ProviderFormat" value="Item.ControlApproach.EntityControlDevices[{0}]." />
		<v:property name="MessageId" value="valid.emission.unit.control.device.identifier.unique" />
		<v:property name="Keys">
		  <dictionary key-type="string" value-type="string">
			 <!--
			 Key: What has to be uique
			 Value: What is the field name to be appended to the ProviderFormat
			 -->
			 <entry key="ControlDeviceId" value="ControlDevice.Identifier" />
		  </dictionary>
		</v:property>
	 </v:validator>
  </v:group>


  <v:group id="euControlDeviceValidationRules">
	 <v:required test="ControlDeviceId">
		<v:message id="valid.emission.unit.control.device.identifier.required" providers="ControlDevice.Identifier">
		  <v:param value="ValidationContxt"/>
		</v:message>
	 </v:required>
  </v:group>
</objects>