<?xml version="1.0" encoding="UTF-8"?>
<actions>


<meta>
  <description>Template für das Sisis-System</description>
  <variable name="server"><description>Serveraddresse (inklusive Protokoll)</description></variable>
  <variable name="startparams" default=""><description>Parameter für den Aufruf des Web-OPACs, falls mehrere Bibliotheken auf dem Server existieren (inklusive "?")</description></variable>
</meta>

<action id="catalogue">
  <variable name="url" value="{$server}/start.do{get('startparams','')}"/>
</action>

<action id="connect">
  <s>
  declare function local:getpage($u){
    (extract($u, "anzPos=([0-9]+)", 1)[.], "1")[1]
  };  
  declare function local:pair-le($pair1, $pair2){
   let $p1 := local:getpage($pair1?page)
   let $p2 := local:getpage($pair2?page)
   return 
     if ($p1 lt $p2) then true()
     else if ($p1 > $p2) then false()
     else $pair1?pos le $pair2?pos
  };
  touchpoint := contains($server, "touchpoint")</s>
  <page url="{$server}/start.do{get('startparams','')}" templateFile="start"/>
</action>

<action id="login">
  <s>$user-account-page := if ($user-account-page) then $user-account-page 
                           else x"{$server}/userAccount.do;{$jsession}?methodToCall={if ($touchpoint) then "start" else "show&amp;typ=1&amp;type=1"}",
     $urgent-message := ()</s>
  <page url="{$user-account-page}"/>
  <pattern>
    <t:switch prioritized="true">
      <form t:condition="contains(@action, 'login.do')">
        {$request := form(., {"username": $username, "password": $password})}
      </form>
      <div t:condition="@id = ('tab-content','account-data')"><table class="data">
        {$request := ()}
      </table></div>    
      <table class="data" id="holdings_">{$request := ()}</table><!--see below???-->
      <div class="data"><div class="account-display-title"/>{$request := ()}</div> <!-- touchpoint 6 -->
      <div class="container-fluid"> <!-- bremen -->
          <div class="tableheader">{$request := ()}
          </div>
      </div>
      <div class="error">{vl:raise(.)}</div>
    </t:switch>
  </pattern>
  <page url="{$request}">   
    <template><t:switch prioritized="true">
    <body>
    <form t:condition="(@id,@name)='LoginBean'" t:optional="true">
      <t:switch>
      <div class="error">{vl:raise-login()}</div>
      <span class="error">{vl:raise-login()}</span>
      <div class="message-warning">{vl:raise-login()}</div>
      <div class="message-error">{vl:raise-login()}</div>
      </t:switch>
    </form>
    <div id="middle"><div class="box-container">
      <div class="alert">{$urgent-message}</div>
    </div></div>?
    </body>
    <table class="data" id="holdings_"></table> <!-- touch point sends us to the last AJAX request -->
    </t:switch>
    </template>
  </page>
  <if test="$urgent-message">
    <page url="{$server}/login.do?methodToCall=done"/>
<!--    <s>vl:raise($urgent-message)</s>-->
  </if>
</action>

<action id="update-all">
  <call action="login"/>
  
  <s>requestedUrl := (),
     orderedUrl := (),
     startUrl := $user-account-page,
     $lastRenew := $lastCancel := {"pos": "ZZZZZZZZ", "page": "ZZZZZZZZ&amp;anzPos=9999999"},
     nextPage := ()
  </s>
  
  <page url="{$startUrl}"  templateFile="loggedIn"/>
  <loop test="exists($nextPage)">
    <page url="{$nextPage}"  templateFile="loggedIn"/>
  </loop>

  <variable name="startUrl">resolve-uri($requestedUrl)</variable>
  <page url="{$startUrl}"  templateFile="loggedIn"/>
  <loop test="exists($nextPage)">
    <page url="{$nextPage}"  templateFile="loggedIn"/>
  </loop>

  <variable name="startUrl">resolve-uri($orderedUrl)</variable>
  <page url="{$startUrl}"  templateFile="loggedIn"/>
  <loop test="exists($nextPage)">
    <page url="{$nextPage}"  templateFile="loggedIn"/>
  </loop>
  <!--  <error templateFile="loginError"/>-->
</action>


<action id="internal-action-list">
  <s>
     need-update := false(),
     actionIDs := $list?actionID,
     switch ($action-mode) 
       case "renew"  return ( $last-pair := $lastRenew )
       case "cancel" return ( $last-pair := $lastCancel )
       default return vl:raise-internal("invalid action mode " || $action-mode),
     pages := for $p in distinct-values($list?_onPage) order by local:getpage($p) descending return $p,
     let $last-page := $pages[1] 
     return max-pair := {"page": $last-page, "pos": max($list[?_onPage eq $last-page]?actionURI) }
  </s>
  <if test="local:pair-le($last-pair, $max-pair)">
    <call action="update-all"/>
    <s>list := $list ! vl:select-book(.),
       last-pair := $lastRenew,
       pages := for $p in distinct-values($list?_onPage) order by local:getpage($p) descending return $p</s>
  </if>
  
  <loop var="p" list="$pages">
    <if test="exists($actionIDs)">
      <s>b := $list[?_onPage eq $p][1] </s>
      <page url="{$b._onPageStart}"/> 
      <page test="$b._onPage != $b._onPageStart" url="{$b._onPage}"/>  <!--???-->
      <pattern href="actionIDs-to-request"/>
      <page url="{$request}"/>
      <if test="$action-mode eq 'renew'"><pattern href="listExtended"/></if>
    </if>
    <else>
      <loop var="b" list="for $book in $list[?_onPage eq $p] order by $book.actionURI descending return $book">
        <page url="{$b._onPageStart}"/> 
        <page test="$b._onPage != $b._onPageStart" url="{$b._onPage}"/> 
        
        <page url="{$b.actionURI}"/> 
        <if test="$action-mode eq 'renew'"><pattern href="singleExtended"/></if>
      </loop>
    </else>
  </loop>
  
  <s>
   let $first-page := $pages[count($pages)] 
   let $min-pair := {"page": $first-page, "pos": min($list[?_onPage eq $first-page]?actionURI) }
   where local:pair-le($min-pair, $last-pair)
   return $last-pair := $min-pair,
   switch ($action-mode) 
      case "renew" return $lastRenew := $last-pair
      case "cancel" return $lastCancel := $last-pair
      default return ()
  </s>

  <if test="$need-update"><call action="update-all"/></if>
</action>
  
<action id="renew-list">
  <s>action-mode := "renew", $list := $renew-books</s>
  <call action="internal-action-list"/>
</action>
<action id="cancel-list">
  <s>action-mode := "cancel", $list := $cancel-books</s>
  <call action="internal-action-list"/>
</action>


<action id="search-connect">
  <call action="connect"/>
  <pattern href="start-search"/>
</action>


<action id="search">

  <s>
  oldSearchOptionCount := get("searchOptionCount", 0),
  searchOptions := (
    for $key in jn:keys($book) where $book($key) and $search-keys($key) 
    return [ $search-keys($key), $book($key) ]
  ),
  searchOptionCount := count($searchOptions),
  searchUrl :=  request-combine(
    $search-form, (
    { "searchCategories[0]": $searchOptions[1](1), "searchString[0]": $searchOptions[1](2) },
    if ($searchOptionCount > 1 or $oldSearchOptionCount > 1) then 
      { "combinationOperator[1]": "AND", "searchCategories[1]": $searchOptions[2](1), "searchString[1]": $searchOptions[2](2) } else (),
    if ($searchOptionCount > 2 or $oldSearchOptionCount > 2) then
      { "combinationOperator[2]": "AND", "searchCategories[2]": $searchOptions[3](1), "searchString[2]": $searchOptions[3](2) } else (),
    {"submitSearch": "Suchen", "callingPage": "searchParameters"},
    for $key in jn:keys($book) where $book($key) and $search-restriction-keys($key)
    return {$search-restriction-keys($key): $book($key)}
    )
  )
  </s>


  <s>$nextPage:=$singleBookResult:=speedPage:="", $curPos := 1</s>
  
  <page url="{$searchUrl}" templateFile="searchList"/>
  <page test="$speedPage != ''" url="{$speedPage}" templateFile="searchList"/>

  <page test="$singleBookResult != ''"  url="{$singleBookResult}" templateFile="searchSingle"/>
  
  <variable name="search-next-page-available">$nextPage != ''</variable>
</action>

<action id="search-next-page">
  <s>$oldNextPage:=$nextPage,$nextPage:=$singleBookResult:=speedPage:=""</s>
  <page url="{$oldNextPage}" templateFile="searchList"></page>
  <page test="$speedPage != ''" url="{$speedPage}" templateFile="searchList"/>
  <variable name="search-next-page-available">$nextPage != ''</variable>
</action>

<action id="search-details">
  <if test="$touchpoint">
    <page url="{$book._detail-url}" templateFile="searchSingle"/>
    <page url="{replace($book._detail-url,'(.*methodToCall)=[^&amp;]+(&amp;.*)identifier=(.*)', '$1=showHoldings$2hitlistIdentifier=$3')}" templateFile="searchSingleTPShowHolding"/>
    <page url="{replace($book._detail-url,'(.*methodToCall)=[^&amp;]+(&amp;.*)identifier=(.*)', '$1=showDocument$2hitlistIdentifier=$3')}" templateFile="searchSingleTPDocument"/>
    <!--{$server}/singleHit.do?methodToCall=showDocument&ajax=true-->
  </if>
  <if test="not($touchpoint)">
    <page url="{$book._detail-url}&amp;tab=showTitleActive" templateFile="searchSingle"/>
    <page url="{$book._detail-url}&amp;tab=showAvailabilityActive" templateFile="searchSingleAvailability"/>
    <page url="{$book._detail-url}&amp;tab=showExemplarActive" templateFile="searchSingleExemplar"/>
  </if>
</action>



<action id="order-single"> 
  <if test="not(get('loggedIn', false()))"> 
    <call action="login"/>
    <variable name="loggedIn">true()</variable>
  </if>-->
  <if test="$book._orderCount > 1">
    <s>vl:choose("internal-order-choose-document", 
                  "Welches Exemplar soll bestellt werden?", 
                  (1 to integer($book._orderCount))!$book("_orderTitle" || .),
                  ()) </s>
  </if>
  <else>
    <s>choose-result := 1</s>
    <call action="internal-order-choose-document"/>
  </else>
</action>

<action id="internal-order-choose-document">
  <if test="not( $choose-result instance of xs:decimal and $choose-result eq 0 )">
   <s>confirm := "", need-login := (), finish-order-now := false(),
      $order-now := $book(concat('_order', $choose-result)), 
      let $post := $book(concat('_orderPost', $choose-result))
      where $post
      return $order-now := {"url": $order-now, "post": $post, "method": "POST"}
     </s>
   <page url="{$order-now}"  templateFile="orderConfirmation"/>
   <if test="exists($need-login)">
     <page url="{$need-login}" />
     <s>need-login := ()</s>
     <page url="{$order-now}"  templateFile="orderConfirmation"/>
     <if test="exists($need-login)"><s>vl:raise-internal("Login fehlgeschlagen")</s></if>
   </if>
   <s>$choose-result := ""</s>
   <call test="$finish-order-now" action="internal-order"/>
  </if>
</action>

<action id="internal-order-confirmed">  
  <s>$choose-result := ""</s>
  <call test="$confirm-result" action="internal-order"/>  
</action>

<action id="internal-order">
  <if test="not( $choose-result instance of xs:decimal and $choose-result eq 0 )">
    <variable name="confirm">
    {
      "url": $confirm.url,
      "method": $confirm.method,
      "post": replace(replace(replace($confirm.post, 
                 "issuepoint=", concat("issuepoint=", $choose-result )) (: old sisis :),
                 "location=", concat("location=", $choose-result)) (: touchpoint :),
                 "(submit+ed)=false", "$1=true")  (: touchpoint, they actually spelled it "submited" :)
    }
    </variable>  
    <page url="{$confirm}">
      <template>
        <t:switch prioritized="true">
        <form t:condition="contains(@action, 'acknowledge.do') ">
         <!-- ok -->
  <!--    <template>          Das Medium wurde für Sie vorgemerkt
    und ist voraussichtlich bis |  Das Medium wurde für Sie an 2. Stelle vorgemerkt.  
    
     Ausgabeort: Zentralbibliothek    </template>-->
           {$book.statusId := "ordered"} 
        </form>   
        <div class="message-confirm">{$book.statusId := "ordered"}</div>
        </t:switch>   
      </template>
    </page>
  </if>
</action>

</actions> 
