svghmi/gen_index_xhtml.xslt
branchsvghmi
changeset 2954 b5dccd0d99ac
parent 2949 e50908ddec60
child 2955 64e603b84aa3
equal deleted inserted replaced
2953:15bebe9a2806 2954:b5dccd0d99ac
   782 </xsl:text>
   782 </xsl:text>
   783   </xsl:template>
   783   </xsl:template>
   784   <xsl:template mode="hmi_elements" match="svg:*">
   784   <xsl:template mode="hmi_elements" match="svg:*">
   785     <xsl:variable name="widget" select="func:widget(@id)"/>
   785     <xsl:variable name="widget" select="func:widget(@id)"/>
   786     <xsl:variable name="eltid" select="@id"/>
   786     <xsl:variable name="eltid" select="@id"/>
       
   787     <xsl:variable name="args">
       
   788       <xsl:for-each select="$widget/arg">
       
   789         <xsl:text>"</xsl:text>
       
   790         <xsl:value-of select="@value"/>
       
   791         <xsl:text>"</xsl:text>
       
   792         <xsl:if test="position()!=last()">
       
   793           <xsl:text>,</xsl:text>
       
   794         </xsl:if>
       
   795       </xsl:for-each>
       
   796     </xsl:variable>
       
   797     <xsl:variable name="indexes">
       
   798       <xsl:for-each select="$widget/path">
       
   799         <xsl:choose>
       
   800           <xsl:when test="not(@index)">
       
   801             <xsl:message terminate="no">
       
   802               <xsl:text>Widget </xsl:text>
       
   803               <xsl:value-of select="$widget/@type"/>
       
   804               <xsl:text> id="</xsl:text>
       
   805               <xsl:value-of select="$eltid"/>
       
   806               <xsl:text>" : No match for path "</xsl:text>
       
   807               <xsl:value-of select="@value"/>
       
   808               <xsl:text>" in HMI tree</xsl:text>
       
   809             </xsl:message>
       
   810           </xsl:when>
       
   811           <xsl:otherwise>
       
   812             <xsl:value-of select="@index"/>
       
   813             <xsl:if test="position()!=last()">
       
   814               <xsl:text>,</xsl:text>
       
   815             </xsl:if>
       
   816           </xsl:otherwise>
       
   817         </xsl:choose>
       
   818       </xsl:for-each>
       
   819     </xsl:variable>
   787     <xsl:text>  "</xsl:text>
   820     <xsl:text>  "</xsl:text>
   788     <xsl:value-of select="@id"/>
   821     <xsl:value-of select="@id"/>
   789     <xsl:text>": new </xsl:text>
   822     <xsl:text>": new </xsl:text>
   790     <xsl:value-of select="$widget/@type"/>
   823     <xsl:value-of select="$widget/@type"/>
   791     <xsl:text>Widget ({
   824     <xsl:text>Widget ("</xsl:text>
   792 </xsl:text>
       
   793     <xsl:text>    args: [
       
   794 </xsl:text>
       
   795     <xsl:for-each select="$widget/arg">
       
   796       <xsl:text>        "</xsl:text>
       
   797       <xsl:value-of select="@value"/>
       
   798       <xsl:text>"</xsl:text>
       
   799       <xsl:if test="position()!=last()">
       
   800         <xsl:text>,</xsl:text>
       
   801       </xsl:if>
       
   802       <xsl:text>
       
   803 </xsl:text>
       
   804     </xsl:for-each>
       
   805     <xsl:text>    ],
       
   806 </xsl:text>
       
   807     <xsl:text>    offset: 0,
       
   808 </xsl:text>
       
   809     <xsl:text>    indexes: [
       
   810 </xsl:text>
       
   811     <xsl:for-each select="$widget/path">
       
   812       <xsl:choose>
       
   813         <xsl:when test="not(@index)">
       
   814           <xsl:message terminate="no">
       
   815             <xsl:text>Widget </xsl:text>
       
   816             <xsl:value-of select="$widget/@type"/>
       
   817             <xsl:text> id="</xsl:text>
       
   818             <xsl:value-of select="$eltid"/>
       
   819             <xsl:text>" : No match for path "</xsl:text>
       
   820             <xsl:value-of select="@value"/>
       
   821             <xsl:text>" in HMI tree</xsl:text>
       
   822           </xsl:message>
       
   823         </xsl:when>
       
   824         <xsl:otherwise>
       
   825           <xsl:text>        </xsl:text>
       
   826           <xsl:value-of select="@index"/>
       
   827           <xsl:text> /* </xsl:text>
       
   828           <xsl:value-of select="@value"/>
       
   829           <xsl:text> */ </xsl:text>
       
   830           <xsl:if test="position()!=last()">
       
   831             <xsl:text>,</xsl:text>
       
   832           </xsl:if>
       
   833           <xsl:text>
       
   834 </xsl:text>
       
   835         </xsl:otherwise>
       
   836       </xsl:choose>
       
   837     </xsl:for-each>
       
   838     <xsl:text>    ],
       
   839 </xsl:text>
       
   840     <xsl:text>    element: id("</xsl:text>
       
   841     <xsl:value-of select="@id"/>
   825     <xsl:value-of select="@id"/>
   842     <xsl:text>"),
   826     <xsl:text>",[</xsl:text>
       
   827     <xsl:value-of select="$args"/>
       
   828     <xsl:text>],[</xsl:text>
       
   829     <xsl:value-of select="$indexes"/>
       
   830     <xsl:text>],{
   843 </xsl:text>
   831 </xsl:text>
   844     <xsl:apply-templates mode="widget_defs" select="$widget">
   832     <xsl:apply-templates mode="widget_defs" select="$widget">
   845       <xsl:with-param name="hmi_element" select="."/>
       
   846     </xsl:apply-templates>
       
   847     <xsl:apply-templates mode="widget_subscribe" select="$widget">
       
   848       <xsl:with-param name="hmi_element" select="."/>
   833       <xsl:with-param name="hmi_element" select="."/>
   849     </xsl:apply-templates>
   834     </xsl:apply-templates>
   850     <xsl:text>  })</xsl:text>
   835     <xsl:text>  })</xsl:text>
   851     <xsl:if test="position()!=last()">
   836     <xsl:if test="position()!=last()">
   852       <xsl:text>,</xsl:text>
   837       <xsl:text>,</xsl:text>
   883 </xsl:text>
   868 </xsl:text>
   884     <xsl:text>
   869     <xsl:text>
   885 </xsl:text>
   870 </xsl:text>
   886     <xsl:text>class Widget {
   871     <xsl:text>class Widget {
   887 </xsl:text>
   872 </xsl:text>
   888     <xsl:text>    constructor(members){
   873     <xsl:text>    constructor(elt_id,args,indexes,members){
       
   874 </xsl:text>
       
   875     <xsl:text>        this.element = id(elt_id);
       
   876 </xsl:text>
       
   877     <xsl:text>        this.args = args;
       
   878 </xsl:text>
       
   879     <xsl:text>        this.indexes = indexes;
       
   880 </xsl:text>
       
   881     <xsl:text>        this.offset = 0;
   889 </xsl:text>
   882 </xsl:text>
   890     <xsl:text>        Object.keys(members).forEach(prop =&gt; this[prop]=members[prop]);
   883     <xsl:text>        Object.keys(members).forEach(prop =&gt; this[prop]=members[prop]);
   891 </xsl:text>
   884 </xsl:text>
   892     <xsl:text>    }
   885     <xsl:text>    }
       
   886 </xsl:text>
       
   887     <xsl:text>    unsub(){
       
   888 </xsl:text>
       
   889     <xsl:text>        /* remove subsribers */
       
   890 </xsl:text>
       
   891     <xsl:text>        for(let index of this.indexes){
       
   892 </xsl:text>
       
   893     <xsl:text>            let idx = index + this.offset;
       
   894 </xsl:text>
       
   895     <xsl:text>            subscribers[idx].delete(this);
       
   896 </xsl:text>
       
   897     <xsl:text>        }
       
   898 </xsl:text>
       
   899     <xsl:text>        this.offset = 0;
       
   900 </xsl:text>
       
   901     <xsl:text>    }
       
   902 </xsl:text>
       
   903     <xsl:text>
       
   904 </xsl:text>
       
   905     <xsl:text>    sub(new_offset=0){
       
   906 </xsl:text>
       
   907     <xsl:text>        /* set the offset because relative */
       
   908 </xsl:text>
       
   909     <xsl:text>        this.offset = new_offset;
       
   910 </xsl:text>
       
   911     <xsl:text>        /* add this's subsribers */
       
   912 </xsl:text>
       
   913     <xsl:text>        for(let index of this.indexes){
       
   914 </xsl:text>
       
   915     <xsl:text>            subscribers[index + new_offset].add(this);
       
   916 </xsl:text>
       
   917     <xsl:text>        }
       
   918 </xsl:text>
       
   919     <xsl:text>        need_cache_apply.push(this); 
       
   920 </xsl:text>
       
   921     <xsl:text>    }
       
   922 </xsl:text>
       
   923     <xsl:text>
       
   924 </xsl:text>
       
   925     <xsl:text>    apply_cache() {
       
   926 </xsl:text>
       
   927     <xsl:text>        for(let index of this.indexes){
       
   928 </xsl:text>
       
   929     <xsl:text>            /* dispatch current cache in newly opened page widgets */
       
   930 </xsl:text>
       
   931     <xsl:text>            let realindex = index+this.offset;
       
   932 </xsl:text>
       
   933     <xsl:text>            let cached_val = cache[realindex];
       
   934 </xsl:text>
       
   935     <xsl:text>            if(cached_val != undefined)
       
   936 </xsl:text>
       
   937     <xsl:text>                dispatch_value_to_widget(this, realindex, cached_val, cached_val);
       
   938 </xsl:text>
       
   939     <xsl:text>        }
       
   940 </xsl:text>
       
   941     <xsl:text>    }
       
   942 </xsl:text>
       
   943     <xsl:text>
   893 </xsl:text>
   944 </xsl:text>
   894     <xsl:text>}
   945     <xsl:text>}
   895 </xsl:text>
   946 </xsl:text>
   896     <xsl:text>
   947     <xsl:text>
   897 </xsl:text>
   948 </xsl:text>
   939     <xsl:text>}
   990     <xsl:text>}
   940 </xsl:text>
   991 </xsl:text>
   941     <xsl:text>
   992     <xsl:text>
   942 </xsl:text>
   993 </xsl:text>
   943   </xsl:template>
   994   </xsl:template>
   944   <xsl:template mode="widget_subscribe" match="widget">
       
   945     <xsl:text>    sub: subscribe,
       
   946 </xsl:text>
       
   947     <xsl:text>    unsub: unsubscribe,
       
   948 </xsl:text>
       
   949     <xsl:text>    apply_cache: widget_apply_cache,
       
   950 </xsl:text>
       
   951   </xsl:template>
       
   952   <xsl:template mode="widget_subscribe" match="widget[@type='Page']"/>
       
   953   <xsl:template name="defs_by_labels">
   995   <xsl:template name="defs_by_labels">
   954     <xsl:param name="labels" select="''"/>
   996     <xsl:param name="labels" select="''"/>
   955     <xsl:param name="mandatory" select="'yes'"/>
   997     <xsl:param name="mandatory" select="'yes'"/>
   956     <xsl:param name="subelements" select="/.."/>
   998     <xsl:param name="subelements" select="/.."/>
   957     <xsl:param name="hmi_element"/>
   999     <xsl:param name="hmi_element"/>
  1823 </xsl:text>
  1865 </xsl:text>
  1824     <xsl:text>    },
  1866     <xsl:text>    },
  1825 </xsl:text>
  1867 </xsl:text>
  1826     <xsl:text>    item_offset: 0,
  1868     <xsl:text>    item_offset: 0,
  1827 </xsl:text>
  1869 </xsl:text>
  1828     <xsl:text>    on_click: foreach_onclick,
  1870   </xsl:template>
  1829 </xsl:text>
  1871   <xsl:template mode="widget_class" match="widget[@type='ForEach']">
  1830   </xsl:template>
  1872     <xsl:text>class ForEachWidget extends Widget{
  1831   <xsl:template mode="widget_subscribe" match="widget[@type='ForEach']">
  1873 </xsl:text>
  1832     <xsl:text>    sub: foreach_subscribe,
  1874     <xsl:text>    unsub(){
  1833 </xsl:text>
  1875 </xsl:text>
  1834     <xsl:text>    unsub: foreach_unsubscribe,
  1876     <xsl:text>        for(let item of this.items){
  1835 </xsl:text>
  1877 </xsl:text>
  1836     <xsl:text>    apply_cache: foreach_apply_cache,
  1878     <xsl:text>            for(let widget of item) {
  1837 </xsl:text>
  1879 </xsl:text>
  1838   </xsl:template>
  1880     <xsl:text>                widget.unsub();
  1839   <definitions:foreach/>
  1881 </xsl:text>
  1840   <xsl:template match="definitions:foreach">
  1882     <xsl:text>            }
  1841     <xsl:text>
       
  1842 </xsl:text>
       
  1843     <xsl:text>/* </xsl:text>
       
  1844     <xsl:value-of select="local-name()"/>
       
  1845     <xsl:text> */
       
  1846 </xsl:text>
       
  1847     <xsl:text>
       
  1848 </xsl:text>
       
  1849     <xsl:text>function foreach_unsubscribe(){
       
  1850 </xsl:text>
       
  1851     <xsl:text>    for(let item of this.items){
       
  1852 </xsl:text>
       
  1853     <xsl:text>        for(let widget of item) {
       
  1854 </xsl:text>
       
  1855     <xsl:text>            unsubscribe.call(widget);
       
  1856 </xsl:text>
  1883 </xsl:text>
  1857     <xsl:text>        }
  1884     <xsl:text>        }
  1858 </xsl:text>
  1885 </xsl:text>
       
  1886     <xsl:text>        this.offset = 0;
       
  1887 </xsl:text>
  1859     <xsl:text>    }
  1888     <xsl:text>    }
  1860 </xsl:text>
  1889 </xsl:text>
  1861     <xsl:text>    this.offset = 0;
  1890     <xsl:text>
       
  1891 </xsl:text>
       
  1892     <xsl:text>    foreach_widgets_do(new_offset, todo){
       
  1893 </xsl:text>
       
  1894     <xsl:text>        this.offset = new_offset;
       
  1895 </xsl:text>
       
  1896     <xsl:text>        for(let i = 0; i &lt; this.items.length; i++) {
       
  1897 </xsl:text>
       
  1898     <xsl:text>            let item = this.items[i];
       
  1899 </xsl:text>
       
  1900     <xsl:text>            let orig_item_index = this.index_pool[i];
       
  1901 </xsl:text>
       
  1902     <xsl:text>            let item_index = this.index_pool[i+this.item_offset];
       
  1903 </xsl:text>
       
  1904     <xsl:text>            let item_index_offset = item_index - orig_item_index;
       
  1905 </xsl:text>
       
  1906     <xsl:text>            for(let widget of item) {
       
  1907 </xsl:text>
       
  1908     <xsl:text>                todo(widget).call(widget, new_offset + item_index_offset);
       
  1909 </xsl:text>
       
  1910     <xsl:text>            }
       
  1911 </xsl:text>
       
  1912     <xsl:text>        }
       
  1913 </xsl:text>
       
  1914     <xsl:text>    }
       
  1915 </xsl:text>
       
  1916     <xsl:text>
       
  1917 </xsl:text>
       
  1918     <xsl:text>    sub(new_offset=0){
       
  1919 </xsl:text>
       
  1920     <xsl:text>        this.foreach_widgets_do(new_offset, w=&gt;w.sub);
       
  1921 </xsl:text>
       
  1922     <xsl:text>    }
       
  1923 </xsl:text>
       
  1924     <xsl:text>
       
  1925 </xsl:text>
       
  1926     <xsl:text>    apply_cache() {
       
  1927 </xsl:text>
       
  1928     <xsl:text>        this.foreach_widgets_do(this.offset, w=&gt;w.apply_cache);
       
  1929 </xsl:text>
       
  1930     <xsl:text>    }
       
  1931 </xsl:text>
       
  1932     <xsl:text>
       
  1933 </xsl:text>
       
  1934     <xsl:text>    on_click(opstr, evt) {
       
  1935 </xsl:text>
       
  1936     <xsl:text>        let new_item_offset = eval(String(this.item_offset)+opstr);
       
  1937 </xsl:text>
       
  1938     <xsl:text>        if(new_item_offset + this.items.length &gt; this.index_pool.length) {
       
  1939 </xsl:text>
       
  1940     <xsl:text>            if(this.item_offset + this.items.length == this.index_pool.length)
       
  1941 </xsl:text>
       
  1942     <xsl:text>                new_item_offset = 0;
       
  1943 </xsl:text>
       
  1944     <xsl:text>            else
       
  1945 </xsl:text>
       
  1946     <xsl:text>                new_item_offset = this.index_pool.length - this.items.length;
       
  1947 </xsl:text>
       
  1948     <xsl:text>        } else if(new_item_offset &lt; 0) {
       
  1949 </xsl:text>
       
  1950     <xsl:text>            if(this.item_offset == 0)
       
  1951 </xsl:text>
       
  1952     <xsl:text>                new_item_offset = this.index_pool.length - this.items.length;
       
  1953 </xsl:text>
       
  1954     <xsl:text>            else
       
  1955 </xsl:text>
       
  1956     <xsl:text>                new_item_offset = 0;
       
  1957 </xsl:text>
       
  1958     <xsl:text>        }
       
  1959 </xsl:text>
       
  1960     <xsl:text>        this.item_offset = new_item_offset;
       
  1961 </xsl:text>
       
  1962     <xsl:text>        this.unsub();
       
  1963 </xsl:text>
       
  1964     <xsl:text>        this.sub(this.offset);
       
  1965 </xsl:text>
       
  1966     <xsl:text>        update_subscriptions();
       
  1967 </xsl:text>
       
  1968     <xsl:text>        need_cache_apply.push(this);
       
  1969 </xsl:text>
       
  1970     <xsl:text>        jumps_need_update = true;
       
  1971 </xsl:text>
       
  1972     <xsl:text>        requestHMIAnimation();
       
  1973 </xsl:text>
       
  1974     <xsl:text>    }
  1862 </xsl:text>
  1975 </xsl:text>
  1863     <xsl:text>}
  1976     <xsl:text>}
  1864 </xsl:text>
       
  1865     <xsl:text>
       
  1866 </xsl:text>
       
  1867     <xsl:text>function foreach_widgets_do(new_offset, todo){
       
  1868 </xsl:text>
       
  1869     <xsl:text>    this.offset = new_offset;
       
  1870 </xsl:text>
       
  1871     <xsl:text>    for(let i = 0; i &lt; this.items.length; i++) {
       
  1872 </xsl:text>
       
  1873     <xsl:text>        let item = this.items[i];
       
  1874 </xsl:text>
       
  1875     <xsl:text>        let orig_item_index = this.index_pool[i];
       
  1876 </xsl:text>
       
  1877     <xsl:text>        let item_index = this.index_pool[i+this.item_offset];
       
  1878 </xsl:text>
       
  1879     <xsl:text>        let item_index_offset = item_index - orig_item_index;
       
  1880 </xsl:text>
       
  1881     <xsl:text>        for(let widget of item) {
       
  1882 </xsl:text>
       
  1883     <xsl:text>            todo.call(widget, new_offset + item_index_offset);
       
  1884 </xsl:text>
       
  1885     <xsl:text>        }
       
  1886 </xsl:text>
       
  1887     <xsl:text>    }
       
  1888 </xsl:text>
       
  1889     <xsl:text>}
       
  1890 </xsl:text>
       
  1891     <xsl:text>
       
  1892 </xsl:text>
       
  1893     <xsl:text>function foreach_subscribe(new_offset=0){
       
  1894 </xsl:text>
       
  1895     <xsl:text>    foreach_widgets_do.call(this, new_offset, subscribe);
       
  1896 </xsl:text>
       
  1897     <xsl:text>}
       
  1898 </xsl:text>
       
  1899     <xsl:text>
       
  1900 </xsl:text>
       
  1901     <xsl:text>function foreach_apply_cache() {
       
  1902 </xsl:text>
       
  1903     <xsl:text>    foreach_widgets_do.call(this, this.offset, widget_apply_cache);
       
  1904 </xsl:text>
       
  1905     <xsl:text>}
       
  1906 </xsl:text>
       
  1907     <xsl:text>
       
  1908 </xsl:text>
       
  1909     <xsl:text>function foreach_onclick(opstr, evt) {
       
  1910 </xsl:text>
       
  1911     <xsl:text>    new_item_offset = eval(String(this.item_offset)+opstr)
       
  1912 </xsl:text>
       
  1913     <xsl:text>    if(new_item_offset + this.items.length &gt; this.index_pool.length) {
       
  1914 </xsl:text>
       
  1915     <xsl:text>        if(this.item_offset + this.items.length == this.index_pool.length)
       
  1916 </xsl:text>
       
  1917     <xsl:text>            new_item_offset = 0;
       
  1918 </xsl:text>
       
  1919     <xsl:text>        else
       
  1920 </xsl:text>
       
  1921     <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  1922 </xsl:text>
       
  1923     <xsl:text>    } else if(new_item_offset &lt; 0) {
       
  1924 </xsl:text>
       
  1925     <xsl:text>        if(this.item_offset == 0)
       
  1926 </xsl:text>
       
  1927     <xsl:text>            new_item_offset = this.index_pool.length - this.items.length;
       
  1928 </xsl:text>
       
  1929     <xsl:text>        else
       
  1930 </xsl:text>
       
  1931     <xsl:text>            new_item_offset = 0;
       
  1932 </xsl:text>
       
  1933     <xsl:text>    }
       
  1934 </xsl:text>
       
  1935     <xsl:text>    this.item_offset = new_item_offset;
       
  1936 </xsl:text>
       
  1937     <xsl:text>    off = this.offset;
       
  1938 </xsl:text>
       
  1939     <xsl:text>    foreach_unsubscribe.call(this);
       
  1940 </xsl:text>
       
  1941     <xsl:text>    foreach_subscribe.call(this,off);
       
  1942 </xsl:text>
       
  1943     <xsl:text>    update_subscriptions();
       
  1944 </xsl:text>
       
  1945     <xsl:text>    need_cache_apply.push(this);
       
  1946 </xsl:text>
       
  1947     <xsl:text>    jumps_need_update = true;
       
  1948 </xsl:text>
       
  1949     <xsl:text>    requestHMIAnimation();
       
  1950 </xsl:text>
       
  1951     <xsl:text>}
       
  1952 </xsl:text>
       
  1953     <xsl:text>
       
  1954 </xsl:text>
       
  1955     <xsl:text>
       
  1956 </xsl:text>
  1977 </xsl:text>
  1957   </xsl:template>
  1978   </xsl:template>
  1958   <xsl:template mode="widget_defs" match="widget[@type='Input']">
  1979   <xsl:template mode="widget_defs" match="widget[@type='Input']">
  1959     <xsl:param name="hmi_element"/>
  1980     <xsl:param name="hmi_element"/>
  1960     <xsl:variable name="value_elt">
  1981     <xsl:variable name="value_elt">
  2178       <xsl:text>        this.active_elt_style = this.active_elt.getAttribute("style");
  2199       <xsl:text>        this.active_elt_style = this.active_elt.getAttribute("style");
  2179 </xsl:text>
  2200 </xsl:text>
  2180       <xsl:text>        this.inactive_elt_style = this.inactive_elt.getAttribute("style");
  2201       <xsl:text>        this.inactive_elt_style = this.inactive_elt.getAttribute("style");
  2181 </xsl:text>
  2202 </xsl:text>
  2182     </xsl:if>
  2203     </xsl:if>
  2183     <xsl:if test="$have_disability">
       
  2184       <xsl:text>        this.disabled_elt_style = this.disabled_elt.getAttribute("style");
       
  2185 </xsl:text>
       
  2186     </xsl:if>
       
  2187     <xsl:text>    },
       
  2188 </xsl:text>
       
  2189   </xsl:template>
       
  2190   <xsl:template mode="widget_subscribe" match="widget[@type='Jump']">
       
  2191     <xsl:param name="hmi_element"/>
       
  2192     <xsl:variable name="activity">
       
  2193       <xsl:call-template name="jump_widget_activity">
       
  2194         <xsl:with-param name="hmi_element" select="$hmi_element"/>
       
  2195       </xsl:call-template>
       
  2196     </xsl:variable>
       
  2197     <xsl:variable name="have_activity" select="string-length($activity)&gt;0"/>
       
  2198     <xsl:variable name="disability">
       
  2199       <xsl:call-template name="jump_widget_disability">
       
  2200         <xsl:with-param name="hmi_element" select="$hmi_element"/>
       
  2201       </xsl:call-template>
       
  2202     </xsl:variable>
       
  2203     <xsl:variable name="have_disability" select="$have_activity and string-length($disability)&gt;0"/>
       
  2204     <xsl:choose>
  2204     <xsl:choose>
  2205       <xsl:when test="$have_disability">
  2205       <xsl:when test="$have_disability">
  2206         <xsl:text>    sub: subscribe,
  2206         <xsl:text>        this.disabled_elt_style = this.disabled_elt.getAttribute("style");
  2207 </xsl:text>
       
  2208         <xsl:text>    unsub: unsubscribe,
       
  2209 </xsl:text>
       
  2210         <xsl:text>    apply_cache: widget_apply_cache,
       
  2211 </xsl:text>
  2207 </xsl:text>
  2212       </xsl:when>
  2208       </xsl:when>
  2213       <xsl:otherwise>
  2209       <xsl:otherwise>
  2214         <xsl:text>    sub: function(){},
  2210         <xsl:text>        this.sub = function(){};
  2215 </xsl:text>
  2211 </xsl:text>
  2216         <xsl:text>    unsub: function(){},
  2212         <xsl:text>        this.unsub = function(){};
  2217 </xsl:text>
  2213 </xsl:text>
  2218         <xsl:text>    apply_cache: function(){},
  2214         <xsl:text>        this.apply_cache = function(){};
  2219 </xsl:text>
  2215 </xsl:text>
  2220       </xsl:otherwise>
  2216       </xsl:otherwise>
  2221     </xsl:choose>
  2217     </xsl:choose>
       
  2218     <xsl:text>    },
       
  2219 </xsl:text>
  2222   </xsl:template>
  2220   </xsl:template>
  2223   <xsl:template mode="per_page_widget_template" match="widget[@type='Jump']">
  2221   <xsl:template mode="per_page_widget_template" match="widget[@type='Jump']">
  2224     <xsl:param name="page_desc"/>
  2222     <xsl:param name="page_desc"/>
  2225     <xsl:if test="path">
  2223     <xsl:if test="path">
  2226       <xsl:variable name="target_page_name">
  2224       <xsl:variable name="target_page_name">
  3342 </xsl:text>
  3340 </xsl:text>
  3343           <xsl:text>};
  3341           <xsl:text>};
  3344 </xsl:text>
  3342 </xsl:text>
  3345           <xsl:text>
  3343           <xsl:text>
  3346 </xsl:text>
  3344 </xsl:text>
  3347           <xsl:text>function* chain(a,b){
       
  3348 </xsl:text>
       
  3349           <xsl:text>    yield* a;
       
  3350 </xsl:text>
       
  3351           <xsl:text>    yield* b;
       
  3352 </xsl:text>
       
  3353           <xsl:text>};
       
  3354 </xsl:text>
       
  3355           <xsl:text>
       
  3356 </xsl:text>
       
  3357           <xsl:text>function unsubscribe(){
       
  3358 </xsl:text>
       
  3359           <xsl:text>    /* remove subsribers */
       
  3360 </xsl:text>
       
  3361           <xsl:text>    for(let index of this.indexes){
       
  3362 </xsl:text>
       
  3363           <xsl:text>        let idx = index + this.offset;
       
  3364 </xsl:text>
       
  3365           <xsl:text>        subscribers[idx].delete(this);
       
  3366 </xsl:text>
       
  3367           <xsl:text>    }
       
  3368 </xsl:text>
       
  3369           <xsl:text>    this.offset = 0;
       
  3370 </xsl:text>
       
  3371           <xsl:text>}
       
  3372 </xsl:text>
       
  3373           <xsl:text>
       
  3374 </xsl:text>
       
  3375           <xsl:text>function subscribe(new_offset=0){
       
  3376 </xsl:text>
       
  3377           <xsl:text>    /* set the offset because relative */
       
  3378 </xsl:text>
       
  3379           <xsl:text>    this.offset = new_offset;
       
  3380 </xsl:text>
       
  3381           <xsl:text>    /* add this's subsribers */
       
  3382 </xsl:text>
       
  3383           <xsl:text>    for(let index of this.indexes){
       
  3384 </xsl:text>
       
  3385           <xsl:text>        subscribers[index + new_offset].add(this);
       
  3386 </xsl:text>
       
  3387           <xsl:text>    }
       
  3388 </xsl:text>
       
  3389           <xsl:text>    need_cache_apply.push(this); 
       
  3390 </xsl:text>
       
  3391           <xsl:text>}
       
  3392 </xsl:text>
       
  3393           <xsl:text>
       
  3394 </xsl:text>
       
  3395           <xsl:text>function widget_apply_cache() {
       
  3396 </xsl:text>
       
  3397           <xsl:text>    for(let index of this.indexes){
       
  3398 </xsl:text>
       
  3399           <xsl:text>        /* dispatch current cache in newly opened page widgets */
       
  3400 </xsl:text>
       
  3401           <xsl:text>        let realindex = index+this.offset;
       
  3402 </xsl:text>
       
  3403           <xsl:text>        let cached_val = cache[realindex];
       
  3404 </xsl:text>
       
  3405           <xsl:text>        if(cached_val != undefined)
       
  3406 </xsl:text>
       
  3407           <xsl:text>            dispatch_value_to_widget(this, realindex, cached_val, cached_val);
       
  3408 </xsl:text>
       
  3409           <xsl:text>    }
       
  3410 </xsl:text>
       
  3411           <xsl:text>}
       
  3412 </xsl:text>
       
  3413           <xsl:text>
       
  3414 </xsl:text>
       
  3415           <xsl:text>function switch_visible_page(page_name) {
  3345           <xsl:text>function switch_visible_page(page_name) {
  3416 </xsl:text>
  3346 </xsl:text>
  3417           <xsl:text>
  3347           <xsl:text>
  3418 </xsl:text>
  3348 </xsl:text>
  3419           <xsl:text>    let old_desc = page_desc[current_visible_page];
  3349           <xsl:text>    let old_desc = page_desc[current_visible_page];