// ==UserScript==
// @name RYM Custom Chart Filters
// @version 3.2
// @description adds new filters to the rym custom
// @match http://rateyourmusic.com/customchart*
// @match https://rateyourmusic.com/customchart*
// @copyright 2012+, quiapz + pandrei rublev
// @namespace https://greasyfork.org/users/2625
// @grant GM_getValue
// @grant GM_setValue
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
// @downloadURL none
// ==/UserScript==
// Place new elements in the custom charts to let the user filter results in various ways
var contentTable = document.getElementById("content");
var targetBar = contentTable.getElementsByTagName("div")[4];
var newTargetBar = targetBar.cloneNode(true);
var newClearBar = document.createElement('div');
var minRatings = document.createElement('input');
var maxRatings = document.createElement('input');
var startYear = document.createElement('input');
var genreCb = document.createElement('input');
var excludeCb = document.createElement('input');
newTargetBar.innerHTML = ' ';
newTargetBar.style.textAlign = 'left';
newClearBar.setAttribute('class', 'clear');
(targetBar.parentNode).insertBefore(newTargetBar, targetBar);
(targetBar.parentNode).insertBefore(newClearBar, targetBar);
// get albums that are ignored
var albumsRemove = GM_getValue('albumsRemoveCharts');
if (albumsRemove == undefined) {
albumsRemove = '';
}
notgenres = '
'
$('#include').before(notgenres)
if (document.URL.indexOf('notgenres=') > 0){
notgens = document.URL.split('notgenres=')[1].split('&')[0].replace(/\+/g,' ').replace(/\%2C/g,',');
$('#notgenres').val(notgens);
}
document.getElementById('notgenres').addEventListener('change', filterChart, false);
var label4 = document.createElement('span');
label4.innerHTML = '  ';
label4.style.float = 'none';
newTargetBar.appendChild(label4);
var label5 = document.createElement('span');
label5.id = 'toggle_exfilter_lbl';
label5.innerHTML = 'Show excluded releases: ';
label5.style.float = 'none';
newTargetBar.appendChild(label5);
excludeCb.type = 'checkbox';
excludeCb.id = 'excludeCbInput';
excludeCb.style.float = 'none';
excludeCb.style.verticalAlign = '-3px';
excludeCb.addEventListener('click', filterChart, false);
newTargetBar.appendChild(excludeCb);
var label3 = document.createElement('span');
label3.innerHTML = ' | ';
label3.style.float = 'none';
newTargetBar.appendChild(label3);
var label = document.createElement('span');
label.id = 'toggle_gfilter_lbl';
label.innerHTML = 'Display releases with ALL genres specified: ';
label.style.float = 'none';
newTargetBar.appendChild(label);
genreCb.type = 'checkbox';
genreCb.id = 'genreCbInput';
genreCb.style.float = 'none';
genreCb.style.verticalAlign = '-3px';
genreCb.addEventListener('click', filterChart, false);
newTargetBar.appendChild(genreCb);
var label1 = document.createElement('span');
label1.innerHTML = ' | ';
label1.style.float = 'none';
newTargetBar.appendChild(label1);
var label2 = document.createElement('span');
label2.id = 'minRatings';
label2.innerHTML = 'Min # of ratings: ';
label2.style.float = 'none';
newTargetBar.appendChild(label2);
minRatings.type = 'text';
minRatings.id = 'minRatingsInput';
minRatings.size = 7;
minRatings.maxLength = 7;
minRatings.style.float = 'none';
minRatings.style.height = '10px';
minRatings.style.fontSize = '10px';
minRatings.addEventListener('change', filterChart, false);
newTargetBar.appendChild(minRatings);
var label3 = document.createElement('span');
label3.innerHTML = ' | ';
label3.style.float = 'none';
newTargetBar.appendChild(label3);
var label4 = document.createElement('span');
label4.id = 'maxRatings';
label4.innerHTML = 'Max # of ratings: ';
label4.style.float = 'none';
newTargetBar.appendChild(label4);
maxRatings.type = 'text';
maxRatings.id = 'maxRatingsInput';
maxRatings.size = 7;
maxRatings.maxLength = 7;
maxRatings.style.float = 'none';
maxRatings.style.height = '10px';
maxRatings.style.fontSize = '10px';
maxRatings.addEventListener('change', filterChart, false);
newTargetBar.appendChild(maxRatings);
$(newTargetBar).append(' | ')
$(newTargetBar).append('From (year): ');
$(newTargetBar).append('');
document.getElementById('startYearInput').addEventListener('change', filterChart, false);
$(newTargetBar).append(' | ')
$(newTargetBar).append('To (year): ');
$(newTargetBar).append('');
document.getElementById('endYearInput').addEventListener('change', filterChart, false);
function filterChart() {
var minRatingsNum = parseInt($("#minRatingsInput").val());
var maxRatingsNum = parseInt($("#maxRatingsInput").val());
var genreCbVal = (document.getElementById("genreCbInput")).checked;
var excludeCbVal = (document.getElementById("excludeCbInput")).checked;
var startYearNum = parseInt((document.getElementById("startYearInput")).value);
var endYearNum = parseInt((document.getElementById("endYearInput")).value);
var genres = $("#genres").val().split(',');
var genresExcluded = $("#notgenres").val().split(',');
//new start
$.each($('.mbgen:eq(0)').find('tr'), function(){
var hideAlbum = false;
// year filter
if (!excludeCbVal && albumsRemove.length > 0){
if (albumsRemove.indexOf($(this).find('.album:eq(0)').attr('title')) > -1){hideAlbum = true}
}
if (!hideAlbum && (!(startYearNum == "") || !(endYearNum == ""))) {
if (isNaN(startYearNum)) {startYearNum = 0;}
if (isNaN(endYearNum)) {endYearNum = Number.MAX_VALUE;}
var albumYear = parseInt($(this).find('.mediumg').text().replace(/[()]/g, ''));
if ((albumYear < startYearNum) || (albumYear > endYearNum)) {hideAlbum = true;}
}
// ratings filter
if(!hideAlbum && (!(minRatingsNum == "") || !(maxRatingsNum == ""))){
if (isNaN(minRatingsNum)) {minRatingsNum = 0;}
if (isNaN(maxRatingsNum)) {maxRatingsNum = Number.MAX_VALUE;}
var albumRatings = parseInt($(this).find('b:eq(-2)').text());
if ((albumRatings < minRatingsNum) || (albumRatings > maxRatingsNum)) {hideAlbum = true;}
}
// genre include all matching filter
if(!hideAlbum && genreCbVal){
for (i = 0; i < genres.length; i++) {genres[i] = genres[i].trim();}
var matches = 0;
$.each($(this).find('.genre'),function(){
if (genres.indexOf($(this).text().toLowerCase()) > -1){matches++;}
})
if (matches != genres.length){hideAlbum = true;}
}
// exclude specified genres
if(!hideAlbum){
for (i = 0; i < genresExcluded.length; i++) {genresExcluded[i] = genresExcluded[i].trim();}
$.each($(this).find('.genre'),function(){
if (genresExcluded.indexOf($(this).text().toLowerCase()) > -1){hideAlbum = true;}
})
}
if(hideAlbum){$(this).hide();}
else{$(this).show();}
})
//end
}
function addAlbum(album) {
if (albumsRemove.indexOf(album.getAttribute('title')) >= 0) {
albumsRemove = albumsRemove.replace(album.getAttribute('title', ','), '');
album.nextSibling.nextSibling.innerHTML = 'x';
alert(album.innerHTML + ' has been removed from your ignore list.');
} else {
albumsRemove = album.getAttribute('title') + ',' + albumsRemove;
var excludeCbVal = (document.getElementById("excludeCbInput")).checked;
if (!excludeCbVal) {
album.parentNode.parentNode.parentNode.parentNode.style.display = "none";
}
album.nextSibling.nextSibling.innerHTML = '+';
}
GM_setValue('albumsRemoveCharts', albumsRemove);
}
var albumsRemove = GM_getValue('albumsRemoveCharts');
if (albumsRemove == undefined) {
albumsRemove = '';
}
var albums = document.getElementsByClassName('album');
if (albums != undefined) {
for (u = 0; u < albums.length; u++) {
y = document.createElement('a');
y.innerHTML = ' ';
removeButton = document.createElement('a');
removeButton.setAttribute('href', 'javascript:void(0);');
removeButton.setAttribute('class', 'smallgray');
albums[u].parentNode.insertBefore(removeButton, albums[u].nextSibling);
albums[u].parentNode.insertBefore(y, albums[u].nextSibling);
removeButton.addEventListener('click', (function (n) {
return function (e) {
e.preventDefault();
addAlbum(n);
};
})(albums[u]), false);
if (albumsRemove.indexOf(albums[u].getAttribute('title')) >= 0) {
albums[u].parentNode.parentNode.parentNode.parentNode.style.display = "none";
removeButton.innerHTML = '+';
} else {
removeButton.innerHTML = 'x';
}
}
}
filterChart()