<?xml version="1.0" encoding="UTF-8"?>
<fmxmlsnippet type="FMObjectList">
  <Group groupCollapsed="False" includeInMenu="False" id="127" name="MBS - RelationWebHookScripts">
    <Script includeInMenu="False" SiriShortcutVisible="False" runFullAccess="False" id="126" name="RelationWebHookStart">
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>RelationWebHookStart</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Version 1.2</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Purpose:</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>makes the links in saved relationship chains (HTML files) work,</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>without saving the chain again, e.g. after FileMaker was restarted.</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>What it does:</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>starts the MBS webhook on port 47123, or reuses the one</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>already running there, and lets it run RelationWebHookReceived in this</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>file. Only one file can receive the links at a time: the last one that</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>ran this script (or clicked Save in the chain view).</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Run it by hand or from an OnFirstWindowOpen script trigger.</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[47123]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$port</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS ( "WebHook.List" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$hooks</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[""]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$webhook</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[0]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$i</Name>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="71" name="Loop">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <FlushType value="Always"/>
      </Step>
      <Step enable="True" id="72" name="Exit Loop If">
        <DisableStepCollapsed state="False"/>
        <Calculation><![CDATA[not IsEmpty ( $webhook ) or $i >= ValueCount ( $hooks )]]></Calculation>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[$i + 1]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$i</Name>
      </Step>
      <Step enable="True" id="68" name="If">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Calculation><![CDATA[GetAsNumber ( MBS ( "WebHook.GetPort" ; GetValue ( $hooks ; $i ) ) ) = $port]]></Calculation>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[GetValue ( $hooks ; $i )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$webhook</Name>
      </Step>
      <Step enable="True" id="70" name="End If">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="73" name="End Loop">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="68" name="If">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Calculation><![CDATA[IsEmpty ( $webhook )]]></Calculation>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS ( "WebHook.Create" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$webhook</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS ( "WebHook.Listen" ; $webhook ; $port )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$r</Name>
      </Step>
      <Step enable="True" id="68" name="If">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Calculation><![CDATA[$r <> "OK"]]></Calculation>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Another program holds the port.</Text>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS ( "WebHook.Release" ; $webhook )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$x</Name>
      </Step>
      <Step enable="True" id="87" name="Show Custom Dialog">
        <DisableStepCollapsed state="False"/>
        <Title>
          <Calculation><![CDATA["Webhook"]]></Calculation>
        </Title>
        <Message>
          <Calculation><![CDATA["Port " & $port & " is not available: " & $r]]></Calculation>
        </Message>
        <Buttons>
          <Button CommitState="True">
            <Calculation><![CDATA["OK"]]></Calculation>
          </Button>
          <Button CommitState="False"/>
          <Button CommitState="False"/>
        </Buttons>
      </Step>
      <Step enable="True" id="103" name="Exit Script">
        <DisableStepCollapsed state="False"/>
        <Calculation><![CDATA[$r]]></Calculation>
      </Step>
      <Step enable="True" id="70" name="End If">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="70" name="End If">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Limit idle connections to 10 seconds; the receiver checks queued click timestamps.</Text>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS ( "WebHook.SetTimeOut" ; $webhook ; 10 )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$r</Name>
      </Step>
      <Step enable="True" id="68" name="If">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Calculation><![CDATA[$r <> "OK"]]></Calculation>
      </Step>
      <Step enable="True" id="103" name="Exit Script">
        <DisableStepCollapsed state="False"/>
        <Calculation><![CDATA[$r]]></Calculation>
      </Step>
      <Step enable="True" id="70" name="End If">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS ( "WebHook.SetScript" ; $webhook ; Get ( FileName ) ; "RelationWebHookReceived" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$r</Name>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="103" name="Exit Script">
        <DisableStepCollapsed state="False"/>
        <Calculation><![CDATA[$r]]></Calculation>
      </Step>
    </Script>
    <Script includeInMenu="False" SiriShortcutVisible="False" runFullAccess="False" id="125" name="RelationWebHookReceived">
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>RelationWebHookReceived</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Version 1.2</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Purpose:</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>navigates to the TO or field clicked in a saved relationship chain (HTML file)</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>What it does:</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>the MBS webhook runs it for each click; it reads the TO</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>name (table), the field name (field) and the file name (file) from the</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>link. If the link belongs to another file, it shows a dialog and stops;</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>otherwise it goes to the TO or field. Do not run it by hand.</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Parameter:</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>the request number of the webhook.</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[Get ( ScriptParameter )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$request</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[JSONGetElement ( MBS ( "WebRequest.URLComponents" ; $request ; "UTF-8" ) ; "Parameters" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$parameters</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[JSONGetElement ( $parameters ; "table" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$table</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[JSONGetElement ( $parameters ; "field" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$field</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[JSONGetElement ( $parameters ; "file" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$file</Name>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[JSONGetElement ( $parameters ; "timestamp" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$timestamp</Name>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Convert FileMaker UTC milliseconds (since year 1) to Unix milliseconds (since 1970).</Text>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[Get ( CurrentTimeUTCMilliseconds ) - 62135596800000 - GetAsNumber ( $timestamp )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$age</Name>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>The webhook has already answered (auto answer); free the request.</Text>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS ( "WebRequest.Release" ; $request )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$r</Name>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>Discard missing, invalid, future or over-10-second-old clicks before any UI action.</Text>
      </Step>
      <Step enable="True" id="68" name="If">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Calculation><![CDATA[IsEmpty ( $timestamp ) or Filter ( $timestamp ; "0123456789" ) <> $timestamp or $age < 0 or $age > 10000]]></Calculation>
      </Step>
      <Step enable="True" id="103" name="Exit Script">
        <DisableStepCollapsed state="False"/>
        <Calculation><![CDATA[""]]></Calculation>
      </Step>
      <Step enable="True" id="70" name="End If">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="68" name="If">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Calculation><![CDATA[IsEmpty ( $table )]]></Calculation>
      </Step>
      <Step enable="True" id="103" name="Exit Script">
        <DisableStepCollapsed state="False"/>
        <Calculation><![CDATA[""]]></Calculation>
      </Step>
      <Step enable="True" id="70" name="End If">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS( "Process.SetFrontMost" )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$r</Name>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="68" name="If">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Calculation><![CDATA[not IsEmpty ( $file ) and $file <> Get ( FileName )]]></Calculation>
      </Step>
      <Step enable="True" id="87" name="Show Custom Dialog">
        <DisableStepCollapsed state="False"/>
        <Title>
          <Calculation><![CDATA["Wrong file"]]></Calculation>
        </Title>
        <Message>
          <Calculation><![CDATA["This link belongs to the file " & $file & ", but the webhook runs in " & Get ( FileName ) & ".¶¶Open " & $file & " and run the script RelationWebHookStart there."]]></Calculation>
        </Message>
        <Buttons>
          <Button CommitState="False">
            <Calculation><![CDATA["OK"]]></Calculation>
          </Button>
          <Button CommitState="False"/>
          <Button CommitState="False"/>
        </Buttons>
      </Step>
      <Step enable="True" id="103" name="Exit Script">
        <DisableStepCollapsed state="False"/>
        <Calculation><![CDATA[True]]></Calculation>
      </Step>
      <Step enable="True" id="70" name="End If">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="68" name="If">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Calculation><![CDATA[IsEmpty ( $field )]]></Calculation>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS("FM.SelectTableOccurrence"; $table )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$r</Name>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>$table is a TO name: go to that TO.</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>TODO: MBS navigation function for a TO (ask MBS).</Text>
      </Step>
      <Step enable="True" id="69" name="Else">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="141" name="Set Variable">
        <DisableStepCollapsed state="False"/>
        <Value>
          <Calculation><![CDATA[MBS("FM.SelectFieldDefinition"; $table ; $field )]]></Calculation>
        </Value>
        <Repetition>
          <Calculation><![CDATA[1]]></Calculation>
        </Repetition>
        <Name>$r</Name>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>$table is the base table, $field the field name: go to that field.</Text>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
        <Text>TODO: MBS navigation function for a field (ask MBS).</Text>
      </Step>
      <Step enable="True" id="70" name="End If">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
      <Step enable="True" id="38" name="Open Manage Database">
        <DisableStepCollapsed state="False"/>
      </Step>
      <Step enable="True" id="89" name="# (comment)">
        <DisableStepCollapsed state="False"/>
        <Restore state="False"/>
      </Step>
    </Script>
  </Group>
</fmxmlsnippet>
