text: /*******************************************************************************
   * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
   * This program and the accompanying materials are made available under
   * the terms of the Eclipse Public License 2.0 which is available at
   * http://www.eclipse.org/legal/epl-2.0
   *
   * SPDX-License-Identifier: EPL-2.0
   *
   * Contributors:
   *    Marc R. Hoffmann - initial API and implementation
   *
   *******************************************************************************/
  
  (function () {
  
      /**
       * Sets the initial sorting derived from the hash.
       *
       * @param linkelementids
       *          list of element ids to search for links to add sort inidcator
       *          hash links
       */
      function initialSort(linkelementids) {
          window.linkelementids = linkelementids;
          var hash = window.location.hash;
          if (hash) {
              var m = hash.match(/up-./);
              if (m) {
                  var header = window.document.getElementById(m[0].charAt(3));
                  if (header) {
                      sortColumn(header, true);
                  }
                  return;
              }
              var m = hash.match(/dn-./);
              if (m) {
                  var header = window.document.getElementById(m[0].charAt(3));
                  if (header) {
                      sortColumn(header, false);
                  }
                  return
              }
          }
      }
  
      /**
       * Sorts the columns with the given header dependening on the current sort state.
       */
      function toggleSort(header) {
          var sortup = header.className.indexOf('down ') == 0;
          sortColumn(header, sortup);
      }
  
      /**
       * Sorts the columns with the given header in the given direction.
       */
      function sortColumn(header, sortup) {
          var table = header.parentNode.parentNode.parentNode;
          var body = table.tBodies[0];
          var colidx = getNodePosition(header);
  
          resetSortedStyle(table);
  
          var rows = body.rows;
          var sortedrows = [];
          for (var i = 0; i < rows.length; i++) {
              r = rows[i];
              sortedrows[parseInt(r.childNodes[colidx].id.slice(1))] = r;
          }
  
          var hash;
  
          if (sortup) {
              for (var i = sortedrows.length - 1; i >= 0; i--) {
                  body.appendChild(sortedrows[i]);
              }
              header.className = 'up ' + header.className;
              hash = 'up-' + header.id;
          } else {
              for (var i = 0; i < sortedrows.length; i++) {
                  body.appendChild(sortedrows[i]);
              }
              header.className = 'down ' + header.className;
              hash = 'dn-' + header.id;
          }
  
          setHash(hash);
      }
  
      /**
       * Adds the sort indicator as a hash to the document URL and all links.
       */
      function setHash(hash) {
          window.document.location.hash = hash;
          ids = window.linkelementids;
          for (var i = 0; i < ids.length; i++) {
              setHashOnAllLinks(document.getElementById(ids[i]), hash);
          }
      }
  
      /**
       * Extend all links within the given tag with the given hash.
       */
      function setHashOnAllLinks(tag, hash) {
          links = tag.getElementsByTagName("a");
          for (var i = 0; i < links.length; i++) {
              var a = links[i];
              var href = a.href;
              var hashpos = href.indexOf("#");
              if (hashpos != -1) {
                  href = href.substring(0, hashpos);
              }
              a.href = href + "#" + hash;
          }
      }
  
      /**
       * Calculates the position of a element within its parent.
       */
      function getNodePosition(element) {
          var pos = -1;
          while (element) {
              element = element.previousSibling;
              pos++;
          }
          return pos;
      }
  
      /**
       * Remove the sorting indicator style from all headers.
       */
      function resetSortedStyle(table) {
          for (var c = table.tHead.firstChild.firstChild; c; c = c.nextSibling) {
              if (c.className) {
                  if (c.className.indexOf('down ') == 0) {
                      c.className = c.className.slice(5);
                  }
                  if (c.className.indexOf('up ') == 0) {
                      c.className = c.className.slice(3);
                  }
              }
          }
      }
  
      window['initialSort'] = initialSort;
      window['toggleSort'] = toggleSort;
  
  })();
  