| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| function toArray(iter) { |
| if (iter === null) { |
| return null; |
| } |
| return Array.prototype.slice.call(iter); |
| } |
| |
| function find(selector, elem) { |
| if (!elem) { |
| elem = document; |
| } |
| return elem.querySelector(selector); |
| } |
| |
| function find_all(selector, elem) { |
| if (!elem) { |
| elem = document; |
| } |
| return toArray(elem.querySelectorAll(selector)); |
| } |
| |
| addEventListener("DOMContentLoaded", function() { |
| reset_sort_headers(); |
| |
| split_debug_onto_two_rows(); |
| |
| find_all('.col-links a.screenshot').forEach(function(elem) { |
| elem.addEventListener("click", |
| function(event) { |
| var node = elem; |
| while (node && !node.classList.contains('results-table-row')) { |
| node = node.parentNode; |
| } |
| if (node != null) { |
| if (node.nextSibling && |
| node.nextSibling.classList.contains("debug")) { |
| var href = find('.screenshot img', node.nextSibling).src; |
| window.open(href); |
| } |
| } |
| event.preventDefault(); |
| }, false) |
| }); |
| |
| find_all('.screenshot a').forEach(function(elem) { |
| elem.addEventListener("click", |
| function(event) { |
| window.open(find('img', elem).getAttribute('src')); |
| event.preventDefault(); |
| }, false) |
| }); |
| |
| find_all('.sortable').forEach(function(elem) { |
| elem.addEventListener("click", |
| function(event) { |
| toggle_sort_states(elem); |
| var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem); |
| var key = elem.classList.contains('numeric') ? key_num : key_alpha; |
| sort_table(elem, key(colIndex)); |
| }, false) |
| }); |
| |
| }); |
| |
| function sort_table(clicked, key_func) { |
| one_row_for_data(); |
| var rows = find_all('.results-table-row'); |
| var reversed = !clicked.classList.contains('asc'); |
| |
| var sorted_rows = sort(rows, key_func, reversed); |
| |
| var parent = document.getElementById('results-table-body'); |
| sorted_rows.forEach(function(elem) { |
| parent.appendChild(elem); |
| }); |
| |
| split_debug_onto_two_rows(); |
| } |
| |
| function sort(items, key_func, reversed) { |
| var sort_array = items.map(function(item, i) { |
| return [key_func(item), i]; |
| }); |
| var multiplier = reversed ? -1 : 1; |
| |
| sort_array.sort(function(a, b) { |
| var key_a = a[0]; |
| var key_b = b[0]; |
| return multiplier * (key_a >= key_b ? 1 : -1); |
| }); |
| |
| return sort_array.map(function(item) { |
| var index = item[1]; |
| return items[index]; |
| }); |
| } |
| |
| function key_alpha(col_index) { |
| return function(elem) { |
| return elem.childNodes[col_index].firstChild.data.toLowerCase(); |
| }; |
| } |
| |
| function key_num(col_index) { |
| return function(elem) { |
| return parseFloat(elem.childNodes[col_index].firstChild.data); |
| }; |
| } |
| |
| function reset_sort_headers() { |
| find_all('.sort-icon').forEach(function(elem) { |
| elem.parentNode.removeChild(elem); |
| }); |
| find_all('.sortable').forEach(function(elem) { |
| var icon = document.createElement("div"); |
| icon.className = "sort-icon"; |
| icon.textContent = "vvv"; |
| elem.insertBefore(icon, elem.firstChild); |
| elem.classList.remove("desc", "active"); |
| elem.classList.add("asc", "inactive"); |
| }); |
| } |
| |
| function toggle_sort_states(elem) { |
| //if active, toggle between asc and desc |
| if (elem.classList.contains('active')) { |
| elem.classList.toggle('asc'); |
| elem.classList.toggle('desc'); |
| } |
| |
| //if inactive, reset all other functions and add ascending active |
| if (elem.classList.contains('inactive')) { |
| reset_sort_headers(); |
| elem.classList.remove('inactive'); |
| elem.classList.add('active'); |
| } |
| } |
| |
| function split_debug_onto_two_rows() { |
| find_all('tr.results-table-row').forEach(function(elem) { |
| var new_row = document.createElement("tr") |
| new_row.className = "debug"; |
| elem.parentNode.insertBefore(new_row, elem.nextSibling); |
| find_all(".debug", elem).forEach(function (td_elem) { |
| if (find(".log", td_elem)) { |
| new_row.appendChild(td_elem); |
| td_elem.colSpan=5; |
| } else { |
| td_elem.parentNode.removeChild(td_elem); |
| } |
| }); |
| }); |
| } |
| |
| function one_row_for_data() { |
| find_all('tr.results-table-row').forEach(function(elem) { |
| if (elem.nextSibling.classList.contains('debug')) { |
| toArray(elem.nextSibling.childNodes).forEach( |
| function (td_elem) { |
| elem.appendChild(td_elem); |
| }) |
| } else { |
| var new_td = document.createElement("td"); |
| new_td.className = "debug"; |
| elem.appendChild(new_td); |
| } |
| }); |
| } |