NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name EBird Daily Summary // @namespace http://tampermonkey.net/ // @version 0.4.17 // @description Inserts a table at the top of the eBirds alert page with the results sorted by location // @author Al Caughey (https://ebird.org/profile/Nzc4NDIy) // @match https://ebird.org/alert/summary* // @require http://code.jquery.com/jquery-3.3.1.min.js // @grant none // @license MIT // ==/UserScript== // v0.3.x - fixed sorting in Chrome // v0.4.x - added filtering by location (function () { 'use strict'; var $ = window.jQuery; window.jQuery.extend( window.jQuery.expr[':'].containsCI = function (a, i, m) { var sText = (a.textContent || a.innerText || "") var zRegExp = new RegExp(m[3], 'i') return zRegExp.test(sText) } ) function debounce(fn, duration) { var timer return function () { clearTimeout(timer) timer = setTimeout(fn, duration) } } $(document).ready(function () { $('#al-summary').remove() $('.screenhead').after("<div id='al-summary'><h1>Al's Revised Summary<span style='font-size:small'> (<a href='#sightingsTable'>Original</a>)</span> </h1><table style='width:100%'><thead><tr><th><input type='text' id='filter-loc' placeholder='Filter by location...'></input></th><th><input type='text' id='filter-sp' placeholder='Filter by species...'></input> <span id='clear-filter' style='display:none'>X</span></th></thead id='al-summary-list'><tbody id='al-summary-list'></tbody></table></div>") $("<style type='text/css'> .hl{color:#f00;font-weight:bold;} .hlb{background:#0FF;font-weight:bold;width:max-content;} .hlb:before {content:'*';}#clear-filter{opacity:0.66;}#clear-filter:hover{cursor:pointer;opacity:1;}</style>").appendTo("head"); var needslist = {} $('.has-details').each(function (index, value) { var species = $(value).find('.species-name a').text(), species_link = $(value).find('.species-name a').attr('href'), species_code = $(value).find('.species-name a').data('species-code'), date = $(value).find('.date').text().replace(' Checklist', ''), time = date.split(' ')[3], checklist = $(value).find('.date a').attr('href').split('/')[3], location = $(value).find('.location').text().replace(/Map/, '').replace(/Ottawa--/, '').replace(/Ottawa - /, ''), location_short = location.split(', ')[0].trim(), latlong_href = $(value).find('.location a').attr('href'), latlong = latlong_href.match(/ll=.*/)[0].replace(/ll=/, '') var ll = latlong.replace(/[-,\.]/g, '') if (!needslist[latlong]) { needslist[latlong] = { 'name': location_short } $('#al-summary-list').append("<tr class='location-row showing' style='' id='" + ll + "' data-species-count='0'><td class='location-name' style='width:50%;vertical-align:top;border-top: 1px solid grey'><a href='" + latlong_href + "' target='_blank'>" + location_short + "</a><br/>Species Count: <span class='species-count' title='# species identified at this location'>##</span><br/>Lat/Long: " + latlong + "<br/><span class='checklists' title='Links to reporting checklist; sorted by time' style='display:flex;flex-wrap:wrap'>Checklists: </td><td class='location-species' style='width:50%;vertical-align:top;border-top: 1px solid grey;display:flex;flex-flow:column'></td></tr") } if (!needslist[latlong][species]) { needslist[latlong][species] = [] $('#' + ll + ' .location-species').append("<a href='" + species_link + "' target='_blank' class='" + checklist + "' data-species-code='" + species_code + "'>" + species + "</a>") $('#' + ll).attr('data-species-count', $('#' + ll).attr('data-species-count') * 1 + 1) } else { $('#' + ll + ' .location-species').find('[data-species-code="' + species_code + '"]').addClass(checklist) } needslist[latlong][species].push({ 'checklist': checklist, 'time': time }) if (!$('#' + ll + " [data-checklist='" + checklist + "']").length) { // console.log(checklist, $('#' + ll + " [data-checklist='"+checklist+"']").length) $('#' + ll + ' .checklists').append("<a href='/view/checklist/" + checklist + "' target='_blank' data-checklist='" + checklist + "' style='padding-right:4px' title='" + date + "'>" + time + "</span>") } }); var rows = $('.location-row') rows.sort(function (a, b) { var r1 = $(a).attr('data-species-count') * 1 var r2 = $(b).attr('data-species-count') * 1 return (r1 > r2 ? -1 : (r1 < r2 ? 1 : 0)) }); $.each(rows, function (index, row) { $('#al-summary-list').append(row) var checklists = $(row).find('.checklists a') $(row).find('.species-count').text($(row).attr('data-species-count')) checklists.sort(function (t1, t2) { var e1 = $(t1).text() var e2 = $(t2).text() return (e1 > e2 ? 1 : (e1 < e2 ? -1 : 0)) }) $.each(checklists, function (i, checklist) { $(row).find('.checklists').append(checklist) }) var species = $(row).find('.location-species a') species.sort(function (t1, t2) { var e1 = $(t1).text() var e2 = $(t2).text() return (e1 > e2 ? 1 : (e1 < e2 ? -1 : 0)) }) $.each(species, function (i, bird) { $(row).find('.location-species').append(species) }) }); $('.checklists a').mouseenter(function () { var cc = $(this).data('checklist') $(this).parents('.location-row').find('.' + cc).addClass('hl') }).mouseleave(function () { var cc = $(this).data('checklist') $('.hl').removeClass('hl') }) $('#filter-sp').keyup(debounce(function () { var st = $('#filter-sp').val() var all_r = $('.location-row') $('#filter-loc').fadeOut('slow') $('#clear-filter').fadeIn('slow') $('.hlb').removeClass('hlb') if (st == '') { all_r.show().slideDown('fast').addClass('showing') $('#filter-sp').fadeIn('slow') $('#clear-filter').fadeOut('slow') } else if (st.length < 2) { return false } else { all_r.not($('.location-species a:containsCI("' + st + '")').parents('tr')).hide().removeClass('showing'); all_r.find($('.location-species a:containsCI("' + st + '")')).parents('tr').slideDown('fast').addClass('showing'); $('.location-species a:containsCI("' + st + '")').addClass('hlb') } }, 333)) $('#filter-loc').keyup(debounce(function () { var st = $('#filter-loc').val() var all_r = $('.location-row') $('#filter-sp').fadeOut('slow') $('#clear-filter').fadeIn('slow') if (st == '') { all_r.show().slideDown('fast').addClass('showing') $('#filter-sp').fadeIn('slow') $('#clear-filter').fadeOut('slow') } else if (st.length < 2) { return false } else { all_r.not($('.location-name a:containsCI("' + st + '")').parents('tr')).hide().removeClass('showing'); all_r.find($('.location-name a:containsCI("' + st + '")')).parents('tr').slideDown('fast').addClass('showing'); } }, 333)) $('#clear-filter').click(function () { $('#clear-filter').fadeOut('slow') $('#filter-sp, #filter-loc').val('').fadeIn('slow') $('.location-row').slideDown('fast').addClass('showing') }) }) })();