<script type="text/javascript">
// Calculation takes two controls, either TimeOfDayTextBox or DurationTextBox
// Returns the time in milliseconds or null if either is blank
function GetDuration(pStartTmId, pEndTmId)
{
   var vStartTime = DES_GetDTTBValue(pStartTmId);
   var vEndTime = DES_GetDTTBValue(pEndTmId);
   if ((vStartTime == null) || (vEndTime == null))
      return null;
         
   return Math.abs(vEndTime - vStartTime);
}
// Calculation takes two TimeOfDayTextBox controls.
// Each MUST be connected to a DateTextBox control.
// Calculates the difference in seconds between two Date+Time pairs.
// Returns the time in milliseconds or null if any are blank or have illegal values.
function GetDurationWithDates(pStartTmId, pEndTmId)
{
   var vStartTime = DES_DnTMTBGetSecs(pStartTmId);
   var vEndTime = DES_DnTMTBGetSecs(pEndTmId);
   if ((vStartTime == window.gDES_GetNativeInvalid) ||  // illegal values or one of the pair is empty
      (vEndTime == window.gDES_GetNativeInvalid))
      return null;
   if ((vStartTime == null) ||  // both textboxes are empty
      (vEndTime == null))
      return null;
   return Math.abs(vEndTime - vStartTime);
}
// Attached to the onchange event via the OnChangeFunctionName property.
// The parameters are ignored here. This is simply a way to hookup this event.
// It is called by both TimeOfDayTextBoxes.
function Demo1Update(ID, Seconds, Error)
{
   var vLabel = DES_GetById('<% = Demo1Result.ClientID %>');
   var vDuration = GetDuration('<%= StartTODDemo1.ClientID %>', '<%= EndTODDemo1.ClientID %>');
   if (vDuration == null)
      vLabel.innerHTML = "n/a";
   else
      vLabel.innerHTML = DES_FmtTime(vDuration, 7, false);
}
// Attached to the TimeOfDayTextBox's onchange event via the OnChangeFunctionName property.
// The parameters are ignored here. This is simply a way to hookup this event.
// It is called by both TimeOfDayTextBoxes.
function Demo2UpdateTOD(ID, Seconds, Error)
{
   Demo2Update();
}
// Attached to the DateTextBox's onchange event via the OnChangeFunctionName property.
// The parameters are ignored here. This is simply a way to hookup this event.
// It is called by both DateTextBoxes.
function Demo2UpdateDTB(ID, Seconds, Error)
{
   Demo2Update();
}
// For Demo2: does the actual work.
function Demo2Update()
{
   var vDurationTB = DES_GetById('<% = DurationDemo2.ClientID %>');
   var vDuration = GetDurationWithDates('<%= StartTODDemo2.ClientID %>', '<%= EndTODDemo2.ClientID %>');
   if (vDuration == null)
      vDurationTB.style.display = "none";
   else
   {
      vDurationTB.style.display = "inline";
      DES_SetDTTBValue('<% = DurationDemo2.ClientID %>', vDuration, true);
   }
}
</script>
<h2>TimeOfDayTextBoxes updating a label</h2>
Start Time: <des:TimeOfDayTextBox id="StartTODDemo1" runat="server" OnChangeFunctionName="Demo1Update" OnChangeFunctionAlways="True"/> -
End Time: <des:TimeOfDayTextBox id="EndTODDemo1" runat="server" OnChangeFunctionName="Demo1Update" OnChangeFunctionAlways="True"/> =
<asp:Label id="Demo1Result" runat="server" />
<br/>
<des:CompareTwoFieldsValidator id="CompareValDemo1" runat="server" 
   ControlIDToEvaluate="StartTODDemo1" SecondControlIDToEvaluate="EndTODDemo1" Operator="LessThanEqual"
   ErrorMessage="End Time must be greater or equal to Start Time" >
   <ErrorFormatterContainer>
      <des:TextErrorFormatter Display="Dynamic" />
   </ErrorFormatterContainer>
</des:CompareTwoFieldsValidator>
<des:DataTypeCheckValidator id="DTCValTOD1Demo1" runat="server" ControlIDToEvaluate="StartTODDemo1"
   ErrorMessage="Start time is invalid">
   <ErrorFormatterContainer>
      <des:TextErrorFormatter Display="Dynamic" />
   </ErrorFormatterContainer>
</des:DataTypeCheckValidator>
<des:DataTypeCheckValidator id="DTCValTOD2Demo1" runat="server" ControlIDToEvaluate="EndTODDemo1"
   ErrorMessage="End time is invalid">
   <ErrorFormatterContainer>
      <des:TextErrorFormatter Display="Dynamic" />
   </ErrorFormatterContainer>
</des:DataTypeCheckValidator>
<br/>
<h2>Date + TimeOfDayTextBoxes updating a DurationTextBox</h2>
Start Date+Time: <des:DateTextBox id="StartDateDemo2" runat="server" 
   OnChangeFunctionName="Demo2UpdateDTB" OnChangeFunctionAlways="True" CommandsFireOnChangeFunction="true" />
<des:TimeOfDayTextBox id="StartTODDemo2" runat="server" DateTextBoxControlID="StartDateDemo2"
   OnChangeFunctionName="Demo2UpdateTOD" OnChangeFunctionAlways="True" CommandsFireOnChangeFunction="true" /> -
End Date+Time: <des:DateTextBox id="EndDateDemo2" runat="server" 
   OnChangeFunctionName="Demo2UpdateDTB" OnChangeFunctionAlways="True" CommandsFireOnChangeFunction="true" />
<des:TimeOfDayTextBox id="EndTODDemo2" runat="server" DateTextBoxControlID="EndDateDemo2"
   OnChangeFunctionName="Demo2UpdateTOD" OnChangeFunctionAlways="True" CommandsFireOnChangeFunction="true"/> =
<des:DurationTextBox id="DurationDemo2" runat="server" />
<br/>
<des:CompareTwoFieldsValidator id="CompareValDemo2" runat="server" 
   ControlIDToEvaluate="StartTODDemo2" SecondControlIDToEvaluate="EndTODDemo2" Operator="LessThanEqual"
   DataType="DateTime"
   ErrorMessage="End Time must be greater or equal to Start Time" >
   <ErrorFormatterContainer>
      <des:TextErrorFormatter Display="Dynamic" />
   </ErrorFormatterContainer>
</des:CompareTwoFieldsValidator>
<des:DataTypeCheckValidator id="DTCValTOD1Demo2" runat="server" ControlIDToEvaluate="StartTODDemo2"
   DataType="DateTime"
   ErrorMessage="Start date+time is invalid" >
   <ErrorFormatterContainer>
      <des:TextErrorFormatter Display="Dynamic" />
   </ErrorFormatterContainer>
</des:DataTypeCheckValidator>
<des:DataTypeCheckValidator id="DTCValTOD2Demo2" runat="server" ControlIDToEvaluate="EndTODDemo2"
   DataType="DateTime"
   ErrorMessage="End date+time is invalid">
   <ErrorFormatterContainer>
      <des:TextErrorFormatter Display="Dynamic" />
   </ErrorFormatterContainer>
</des:DataTypeCheckValidator>