/******************************************************************************* * 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; })();