Created
January 19, 2017 01:13
-
-
Save TwoLeaves/b83b093d2e27eb437a4652008df6b5bc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name PTH: Sort/collapse albums | |
| // @namespace http://animorc.zapto.org/greasemonkey/scripts | |
| // @description Make the titles on artist and collage pages sortable and collapsible. | |
| // @updateURL http://userscripts.org/scripts/source/69448.meta.js | |
| // @include https://passtheheadphones.me/torrents.php?*id=* | |
| // @include https://passtheheadphones.me/artist.php?*id=* | |
| // @include https://passtheheadphones.me/collages.php?*id=* | |
| // @include https://passtheheadphones.me/user.php?*action=edit* | |
| // @include https://ssl.passtheheadphones.me/torrents.php?*id=* | |
| // @include https://ssl.passtheheadphones.me/artist.php?*id=* | |
| // @include https://ssl.passtheheadphones.me/collages.php?*id=* | |
| // @include https://ssl.passtheheadphones.me/user.php?*action=edit* | |
| // @version 2.7.7.47 | |
| // ==/UserScript== | |
| (function() { | |
| var scriptInfo = { | |
| scriptID: 69448, | |
| revision: 47, | |
| findUpdate: function() { | |
| if( getSetting('find_updates', 1) != 1 || !/(?:firefox|chrome)/.test(navigator.userAgent.toLowerCase()) ) | |
| return false; | |
| var date = new Date(); | |
| var latestRevision = getSetting('latest_revision', 0); | |
| if( this.revision >= latestRevision && getSetting('next_update_check', 0) < date.getTime() ) { | |
| setSetting('next_update_check', date.getTime() + 86400000); // Check for updates every day | |
| this.getLatestRevision(); | |
| } | |
| else if( this.revision < latestRevision ) | |
| this.createUpdateLink(); | |
| }, | |
| getLatestRevision: function() { | |
| var metaURL = 'https://userscripts.org/scripts/source/' + this.scriptID + '.meta.js'; | |
| if( typeof(GM_xmlhttpRequest) == 'function' ) { | |
| GM_xmlhttpRequest({ | |
| method: 'GET', | |
| url: metaURL, | |
| onload: this.parseXhrResponse | |
| }); | |
| } | |
| else { | |
| var xhr = new XMLHttpRequest(); | |
| xhr.open('GET', metaURL); | |
| xhr.onreadystatechange = function() { this.parseXhrResponse(xhr); }; | |
| xhr.send(); | |
| } | |
| }, | |
| parseXhrResponse: function(xhr) { | |
| if( xhr.readyState == 4 && xhr.status == 200 ) { | |
| var meta = xhr.responseText.split('\n'); | |
| var latestRevision = null; | |
| var metaVerLength = '// @version'.length; | |
| for( var i = meta.length - 1; i >= 0; i-- ) { | |
| if( meta[i].substr(0, metaVerLength) == '// @version' ) { | |
| var version = meta[i].match(/\/\/ @version\s*(\d+)\.(\d+)\.(\d+)\.(\d+)/) || [false]; | |
| latestRevision = version.pop(); | |
| if( latestRevision ) | |
| setSetting('latest_revision', latestRevision); | |
| break; | |
| } | |
| } | |
| if( scriptInfo.revision < latestRevision ) | |
| scriptInfo.createUpdateLink(); | |
| } | |
| }, | |
| createUpdateLink: function() { | |
| var settingsHeader = document.getElementById('animorc_sortcollapse_settings_label'); | |
| var updateDiv = document.createElement('div'); | |
| var updateLink = document.createElement('a'); | |
| updateLink.href = 'http://userscripts.org/scripts/show/' + scriptInfo.scriptID; | |
| updateLink.appendChild(document.createTextNode('Updates available!')); | |
| updateDiv.appendChild(updateLink); | |
| settingsHeader.appendChild(updateDiv); | |
| } | |
| } | |
| function getSize(string) { | |
| var size = string.split(' '); | |
| var unit = (size[1] == 'GB' | |
| ? 1073741824 | |
| : ( size[1] == 'MB' | |
| ? 1048576 | |
| : (size[1] == 'KB' | |
| ? 1024 | |
| : 1 ) ) ); | |
| return Math.ceil(size[0].replace(',', '') * unit); | |
| } | |
| function hasClass(obj, className) { | |
| var count = 0; | |
| var classes = obj.className.split(' '); | |
| for( var i = classes.length - 1; i >= 0; i-- ) { | |
| if(classes[i] === className) | |
| count++; | |
| } | |
| return count; | |
| } | |
| function getSetting(key, def) { | |
| if( typeof(localStorage) == 'object' ) | |
| return localStorage.getItem(key) || def; | |
| if( typeof(GM_getValue) == 'function' ) | |
| return GM_getValue(key, def); | |
| return false; | |
| } | |
| function setSetting(key, value) { | |
| if( typeof(localStorage) == 'object' ) | |
| localStorage.setItem(key, value); | |
| else if( typeof(GM_setValue) == 'function' ) | |
| GM_setValue(key, value); | |
| } | |
| var toggle = { | |
| start: 0, | |
| end: 0, | |
| last: 0, | |
| table: null, | |
| trigger: null, | |
| hide: null, | |
| forceHide: null, | |
| toggle: function(rowid, forceHide) { | |
| if( rowid ) | |
| this.start = rowid; | |
| this.forceHide = forceHide || null; | |
| this.trigger = this.table.rows[this.start].getAttribute('rowtype'); | |
| this.hide = ( this.forceHide || !hasClass(this.table.rows[this.start+1], 'hidden') ); | |
| if( this.end == -3 ) { // Batch hide editions on torrent page | |
| this.start = 1; | |
| this.end = this.table.rows.length - 1; | |
| } | |
| else if( this.end == -2 ) { // Batch hide editions | |
| this.end = this.start; | |
| while( this.table.rows[--this.start].getAttribute('rowtype') != 'group' ) | |
| ; | |
| while( ++this.end < this.table.rows.length && this.table.rows[this.end].getAttribute('rowtype') != 'group' ) | |
| ; | |
| this.end--; | |
| this.start++; | |
| } | |
| else if( this.end == -1 ) { // Batch hide releases | |
| this.start = 1; | |
| this.end = this.table.rows.length - 1; | |
| } | |
| else if( this.end > 0 ) { | |
| this.hide = ( !hasClass(this.table.rows[this.end+1], 'hidden') ); | |
| if( this.start > this.end ) { | |
| var tmp = this.start; | |
| this.start = this.end; | |
| this.end = tmp; | |
| } | |
| } | |
| else | |
| this.end = this.start; | |
| for( var i = this.start; i <= this.end; ) | |
| i += this.doToggle(this.table.rows[i]); | |
| this.end = 0; | |
| }, | |
| doToggle: function(row) { | |
| var count = 1, keepHidden = false, rowType = row.getAttribute('rowtype'); | |
| if( this.trigger == 'group' && rowType == 'group' ) | |
| row.cells[0].children[0].className = ( this.hide ? 'show_torrents' : 'hide_torrents' ); | |
| else if( this.trigger == 'edition' && rowType == 'edition' ) { | |
| row.cells[0].children[0].textContent = ( this.hide ? '+' : String.fromCharCode(8722) ) + row.cells[0].children[0].textContent.slice(1); | |
| keepHidden = ( hasClass(row, 'hidden') != 0 ); | |
| } | |
| while( (row = row.nextElementSibling) && (rowType = row.getAttribute('rowtype')) && rowType != this.trigger && rowType != 'group' && rowType != 'ungrouped' ) { | |
| count++; | |
| if( rowType == 'edition' ) | |
| keepHidden = ( row.cells[0].children[0].textContent.charAt(0) == '+' ); | |
| else if( rowType == 'torrentdetails' && row.getAttribute('hidedetails') == 'true' ) | |
| continue; | |
| else if( !this.hide && keepHidden ) | |
| continue; | |
| if( this.hide ) | |
| this.hideObj(row); | |
| else | |
| this.showObj(row); | |
| } | |
| return count; | |
| }, | |
| hideObj: function(obj) { | |
| if( (!this.forceHide && hasClass(obj, 'hidden')) || (this.forceHide && hasClass(obj, 'hidden') >= 2) ) | |
| return; | |
| var classes = obj.className.split(' '); | |
| classes.push('hidden'); | |
| obj.className = classes.join(' '); | |
| }, | |
| showObj: function(obj) { | |
| var classes = obj.className.split(' '); | |
| for( var i = classes.length - 1; i >= 0; i-- ) { | |
| if( classes[i] == 'hidden' ) { | |
| classes.splice(i, 1); | |
| obj.className = classes.join(' '); | |
| break; | |
| } | |
| } | |
| } | |
| }; | |
| var sortTable = { | |
| status: new Object(), | |
| sort: function(tableid, mode) { | |
| this.status.current = { | |
| index: mode.index, | |
| order: ( this.status[tableid] && this.status[tableid].index === mode.index ? -this.status[tableid].order : mode.deforder ), | |
| secondary: modes[mode.secondary] | |
| }; | |
| this.status[tableid] = { | |
| index: mode.index, | |
| order: this.status.current.order | |
| }; | |
| tables[tableid].titles.sort(this.init); | |
| this.build(tableid); | |
| }, | |
| init: function(a, b, secondary) { | |
| var index, order, ret; | |
| index = ( secondary ) ? sortTable.status.current.secondary.index : sortTable.status.current.index; | |
| order = sortTable.status.current.order; | |
| var asub = a[index]; | |
| var bsub = b[index]; | |
| if( typeof(asub) == 'number' && typeof(bsub) == 'number' ) | |
| ret = order * (asub - bsub); | |
| else | |
| ret = sortTable.func(asub, bsub, order); | |
| if( ret == 0 && !secondary ) | |
| return sortTable.init(a, b, 1); | |
| return ret; | |
| }, | |
| func: function(a, b, order) { // order: 1 = ascending, -1 = descending | |
| var posNumA, posNumB, posStrA, posStrB; | |
| while( true ) { | |
| // Both a and b start with numbers => Lowest number gives the lowest value | |
| if( a.charAt(0) <= '9' && a.charAt(0) >= '0' && b.charAt(0) <= '9' && b.charAt(0) >= '0' ) { | |
| ret = parseInt(a, 10) - parseInt(b, 10); | |
| if( ret ) | |
| return order * ret; | |
| // No more letters in a or b => Shortest string has lowest value | |
| if( (posStrA = a.search(/\D/)) == -1 || (posStrB = b.search(/\D/)) == -1 ) | |
| return ( posStrA ) ? -order : order; | |
| a = a.substr(posStrA); | |
| b = b.substr(posStrB); | |
| } | |
| else { | |
| // If none of a or b contain a digit, or one of them starts with a number, compare string values. | |
| if( (posNumA = a.search(/\d/)) == -1 || (posNumB = b.search(/\d/)) == -1 || !posNumA || !posNumB ) | |
| return ( a < b ) ? -order : ( a > b ) ? order : 0; | |
| var asub = a.substr(0, posNumA); | |
| var bsub = b.substr(0, posNumB); | |
| if( asub == bsub ) { | |
| a = a.substr(posNumA); | |
| b = b.substr(posNumB); | |
| } | |
| else | |
| return ( asub < bsub ) ? -order : order; | |
| } | |
| } | |
| }, | |
| build: function(tableid) { | |
| var table = tables[tableid]; | |
| var newTable = document.createElement('tbody'); | |
| newTable.appendChild(table.header); | |
| for( var i = 0; i < table.titles.length; i++ ) { | |
| var torrents = table.titles[i][0]; | |
| for( var j = 0; j < torrents.length; j++ ) | |
| newTable.appendChild(torrents[j]); | |
| } | |
| table.table.replaceChild(newTable, table.table.tBodies[0]); | |
| } | |
| }; | |
| var titleTypes = ['Album', 'Soundtrack', 'EP', 'Anthology', 'Compilation', 'DJ Mix', 'Single', 'Live album', 'Remix', 'Bootleg', 'Interview', 'Mixtape', 'Unknown', 'Guest appearance', 'Remixed by', 'Composition', 'Produced by', 'Collages']; | |
| if( window.location.pathname.indexOf('user.php') != -1 ) { // User settings | |
| var styleEl = document.createElement('style'); | |
| styleEl.appendChild(document.createTextNode( | |
| '#animorc_sortcollapse_settings section { margin: 5px 0px; }\n'+ | |
| '#animorc_sortcollapse_settings .subsection { margin-left: 20px; }\n'+ | |
| '#animorc_sortcollapse_settings .subsection .subsetting { margin-left: 20px; }\n'+ | |
| '#animorc_sortcollapse_settings .settings_header { font-size: 120%; }\n'+ | |
| '#animorc_sortcollapse_settings .settings_group { padding: 5px 0px; }\n'+ | |
| '#animorc_sortcollapse_settings .settings_list { list-style-type: none; column-width: 110px; -moz-column-width: 110px; -webkit-column-width: 110px; }\n'+ | |
| '#animorc_sortcollapse_settings .settings_list li { white-space: nowrap; padding: 1px; }\n'+ | |
| '#animorc_sortcollapse_settings .settings_textinput { padding: 0px; }')); | |
| // Add profile settings | |
| document.getElementsByTagName('head')[0].appendChild(styleEl); | |
| var formTable = document.getElementById('userform').getElementsByTagName('table')[0].tBodies[0]; | |
| var newRow = formTable.insertRow(8); | |
| var newCell = newRow.insertCell(-1); | |
| newCell.id = 'animorc_sortcollapse_settings_label'; | |
| newCell.className = 'label'; | |
| var el = document.createElement('strong'); | |
| el.appendChild(document.createTextNode('Sort/collapse albums')); | |
| newCell.appendChild(el); | |
| newCell = newRow.insertCell(-1); | |
| var settingsDiv = document.createElement('div'); | |
| settingsDiv.id = 'animorc_sortcollapse_settings'; | |
| // Release types | |
| var settingsSection = document.createElement('section'); | |
| var settingsSectionHeader = document.createElement('div'); | |
| settingsSectionHeader.className = 'settings_header'; | |
| settingsSectionHeader.appendChild(document.createTextNode('Collapse settings')); | |
| settingsSection.appendChild(settingsSectionHeader); | |
| var settingsSubDiv = document.createElement('div'); | |
| settingsSubDiv.className = 'subsection'; | |
| var settingsGroup = document.createElement('ul'); | |
| settingsGroup.className = 'settings_group settings_list'; | |
| var confItem, type; | |
| for( var i = 0; i < titleTypes.length; i++ ) { | |
| confItem = document.createElement('li'); | |
| type = titleTypes[i].toLowerCase().replace(' ', '_'); | |
| el = document.createElement('input'); | |
| el.type = 'checkbox'; | |
| el.id = 'animorc_collapse_'+type; | |
| el.setAttribute('titletype', type); | |
| el.addEventListener('click', | |
| function(e) { | |
| if( e.ctrlKey ) { | |
| for( var i = 0; i < titleTypes.length; i++ ) { | |
| var type = titleTypes[i].toLowerCase().replace(' ', '_'); | |
| setSetting('collapse_'+type, this.checked ? 1 : 0); | |
| document.getElementById('animorc_collapse_'+type).checked = this.checked; | |
| } | |
| } | |
| else | |
| setSetting('collapse_'+this.getAttribute('titletype'), ( this.checked ? 1 : 0 )); | |
| }, true); | |
| el.checked = ( getSetting('collapse_'+type, 0) == 1 ); | |
| confItem.appendChild(el); | |
| el = document.createElement('label'); | |
| el.htmlFor = 'animorc_collapse_'+type; | |
| el.appendChild(document.createTextNode(' '+titleTypes[i])); | |
| confItem.appendChild(el); | |
| settingsGroup.appendChild(confItem); | |
| } | |
| settingsSubDiv.appendChild(settingsGroup); | |
| settingsSection.appendChild(settingsSubDiv); | |
| // Threshold | |
| settingsSubDiv = document.createElement('div'); | |
| settingsSubDiv.className = 'subsection'; | |
| confItem = document.createElement('div'); | |
| confItem.className = 'settings_group'; | |
| confItem.appendChild(document.createTextNode('Only collapse groups with more than ')); | |
| el = document.createElement('input'); | |
| el.type = 'text'; | |
| el.className = 'settings_textinput'; | |
| el.style.width = '40px'; | |
| el.value = getSetting('threshold', 0); | |
| el.addEventListener('keyup', function() { setSetting('threshold', Math.abs(Number(this.value))); }, true); | |
| confItem.appendChild(el); | |
| confItem.appendChild(document.createTextNode(' items.')); | |
| settingsSubDiv.appendChild(confItem); | |
| // Editions | |
| confItem = document.createElement('div'); | |
| confItem.className = 'settings_group'; | |
| el = document.createElement('input'); | |
| el.type = 'checkbox'; | |
| el.id = 'animorc_collapse_editions'; | |
| el.addEventListener('click', function() { setSetting('collapse_editions', ( this.checked ? 1 : 0 )); }, true); | |
| el.checked = ( getSetting('collapse_editions', 0) == 1 ); | |
| confItem.appendChild(el); | |
| el = document.createElement('label'); | |
| el.htmlFor = 'animorc_collapse_editions'; | |
| el.appendChild(document.createTextNode(' Collapse editions in groups with more than ')); | |
| confItem.appendChild(el); | |
| el = document.createElement('input'); | |
| el.type = 'text'; | |
| el.className = 'settings_textinput'; | |
| el.style.width = '40px'; | |
| el.value = getSetting('edition_threshold', 0); | |
| el.addEventListener('keyup', function() { setSetting('edition_threshold', Math.abs(Number(this.value))); }, true); | |
| confItem.appendChild(el); | |
| confItem.appendChild(document.createTextNode(' editions.')); | |
| settingsSubDiv.appendChild(confItem); | |
| settingsSection.appendChild(settingsSubDiv); | |
| settingsDiv.appendChild(settingsSection); | |
| // Artist sort options | |
| settingsSection = document.createElement('section'); | |
| settingsSectionHeader = document.createElement('div'); | |
| settingsSectionHeader.className = 'settings_header'; | |
| settingsSectionHeader.appendChild(document.createTextNode('Sort settings')); | |
| settingsSection.appendChild(settingsSectionHeader); | |
| settingsSubDiv = document.createElement('div'); | |
| settingsSubDiv.className = 'subsection'; | |
| var artistSortColumn = getSetting('default_sort_index_artist', 'year'); | |
| var artistSortOrder = getSetting('default_sort_order_artist', -1); | |
| var settingsGroup = document.createElement('div'); | |
| settingsGroup.className = 'settings_group'; | |
| confItem = document.createElement('div'); | |
| confItem.appendChild(document.createTextNode('Sort torrents in artist sections by ')); | |
| var sortOptions = { | |
| year: 'Year', | |
| title: 'Title', | |
| snatches: 'Snatches', | |
| peers: 'Peers', | |
| seeders: 'Seeders', | |
| leechers: 'Leechers', | |
| size: 'Size' | |
| }; | |
| var elSelect = document.createElement('select'); | |
| elSelect.id = 'animorc_sortcollapse_index_artist'; | |
| elSelect.className = 'settings_select'; | |
| for( mode in sortOptions ) { | |
| var elOption = document.createElement('option'); | |
| elOption.value = mode; | |
| elOption.appendChild(document.createTextNode(sortOptions[mode])); | |
| elOption.selected = ( artistSortColumn == mode ); | |
| elSelect.appendChild(elOption); | |
| } | |
| elSelect.addEventListener('change', function() { setSetting('default_sort_index_artist', this.value); }, true); | |
| confItem.appendChild(elSelect); | |
| settingsGroup.appendChild(confItem); | |
| confItem = document.createElement('div'); | |
| confItem.className = 'subsetting'; | |
| confItem.appendChild(document.createTextNode(' in ')); | |
| el = document.createElement('a'); | |
| el.id = 'animorc_sortcollapse_order_artist_asc'; | |
| el.href = 'javascript:void(0);'; | |
| if( artistSortOrder == 1 ) | |
| el.style.fontWeight = 'bold'; | |
| el.appendChild(document.createTextNode('ascending')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_order_artist', 1); | |
| this.style.fontWeight = 'bold'; | |
| this.nextElementSibling.style.fontWeight = ''; | |
| }, true); | |
| confItem.appendChild(el); | |
| confItem.appendChild(document.createTextNode('/')); | |
| el = document.createElement('a'); | |
| el.id = 'animorc_sortcollapse_order_artist_desc'; | |
| el.href = 'javascript:void(0);'; | |
| if( artistSortOrder == -1 ) | |
| el.style.fontWeight = 'bold'; | |
| el.appendChild(document.createTextNode('descending')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_order_artist', -1); | |
| this.style.fontWeight = 'bold'; | |
| this.previousElementSibling.style.fontWeight = ''; | |
| }, true); | |
| confItem.appendChild(el); | |
| confItem.appendChild(document.createTextNode(' order. ')); | |
| el = document.createElement('a'); | |
| el.href = 'javascript:void(0);'; | |
| el.appendChild(document.createTextNode('Reset to default')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_index_artist', 'year'); | |
| setSetting('default_sort_order_artist', -1); | |
| document.getElementById('animorc_sortcollapse_order_artist_desc').style.fontWeight = 'bold'; | |
| document.getElementById('animorc_sortcollapse_order_artist_asc').style.fontWeight = ''; | |
| document.getElementById('animorc_sortcollapse_index_artist').value = 'year'; | |
| }, true); | |
| confItem.appendChild(el); | |
| settingsGroup.appendChild(confItem) | |
| settingsSubDiv.appendChild(settingsGroup); | |
| // Release sort options | |
| var releaseSortColumn = getSetting('default_sort_index_release', 'year'); | |
| var releaseSortOrder = getSetting('default_sort_order_release', 1); | |
| settingsGroup = document.createElement('div'); | |
| settingsGroup.className = 'settings_group'; | |
| confItem = document.createElement('div'); | |
| confItem.appendChild(document.createTextNode('Sort torrents in release sections by ')); | |
| sortOptions = { | |
| year: 'Year', | |
| title: 'Edition title', | |
| medium: 'Medium', | |
| snatches: 'Snatches', | |
| peers: 'Peers', | |
| seeders: 'Seeders', | |
| leechers: 'Leechers', | |
| size: 'Size' | |
| }; | |
| elSelect = document.createElement('select'); | |
| elSelect.id = 'animorc_sortcollapse_index_release'; | |
| elSelect.className = 'settings_select'; | |
| for( mode in sortOptions ) { | |
| var elOption = document.createElement('option'); | |
| elOption.value = mode; | |
| elOption.appendChild(document.createTextNode(sortOptions[mode])); | |
| elOption.selected = ( releaseSortColumn == mode ); | |
| elSelect.appendChild(elOption); | |
| } | |
| elSelect.addEventListener('change', function() { setSetting('default_sort_index_release', this.value); }, true); | |
| confItem.appendChild(elSelect); | |
| settingsGroup.appendChild(confItem); | |
| confItem = document.createElement('div'); | |
| confItem.className = 'subsetting'; | |
| confItem.appendChild(document.createTextNode(' in ')); | |
| el = document.createElement('a'); | |
| el.id = 'animorc_sortcollapse_order_release_asc'; | |
| el.href = 'javascript:void(0);'; | |
| if( releaseSortOrder == 1 ) | |
| el.style.fontWeight = 'bold'; | |
| el.appendChild(document.createTextNode('ascending')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_order_release', 1); | |
| this.style.fontWeight = 'bold'; | |
| this.nextElementSibling.style.fontWeight = ''; | |
| }, true); | |
| confItem.appendChild(el); | |
| confItem.appendChild(document.createTextNode('/')); | |
| el = document.createElement('a'); | |
| el.id = 'animorc_sortcollapse_order_release_desc'; | |
| el.href = 'javascript:void(0);'; | |
| if( releaseSortOrder == -1 ) | |
| el.style.fontWeight = 'bold'; | |
| el.appendChild(document.createTextNode('descending')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_order_release', -1); | |
| this.style.fontWeight = 'bold'; | |
| this.previousElementSibling.style.fontWeight = ''; | |
| }, true); | |
| confItem.appendChild(el); | |
| confItem.appendChild(document.createTextNode(' order. ')); | |
| el = document.createElement('a'); | |
| el.href = 'javascript:void(0);'; | |
| el.appendChild(document.createTextNode('Reset to default')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_index_release', 'year'); | |
| setSetting('default_sort_order_release', 1); | |
| document.getElementById('animorc_sortcollapse_order_release_desc').style.fontWeight = ''; | |
| document.getElementById('animorc_sortcollapse_order_release_asc').style.fontWeight = 'bold'; | |
| document.getElementById('animorc_sortcollapse_index_release').value = 'year'; | |
| }, true); | |
| confItem.appendChild(el); | |
| settingsGroup.appendChild(confItem) | |
| settingsSubDiv.appendChild(settingsGroup); | |
| // Collage sort options | |
| var collageSortColumn = getSetting('default_sort_index_collage', 'num'); | |
| var collageSortOrder = getSetting('default_sort_order_collage', 1); | |
| settingsGroup = document.createElement('div'); | |
| settingsGroup.className = 'settings_group'; | |
| confItem = document.createElement('div'); | |
| confItem.appendChild(document.createTextNode('Sort torrents in collages by ')); | |
| sortOptions = { | |
| num: 'Number', | |
| artist: 'Artist name', | |
| year: 'Year', | |
| title: 'Title', | |
| snatches: 'Snatches', | |
| peers: 'Peers', | |
| seeders: 'Seeders', | |
| leechers: 'Leechers', | |
| size: 'Size' | |
| }; | |
| elSelect = document.createElement('select'); | |
| elSelect.className = 'settings_select'; | |
| elSelect.id = 'animorc_sortcollapse_index_collage'; | |
| for( mode in sortOptions ) { | |
| var elOption = document.createElement('option'); | |
| elOption.value = mode; | |
| elOption.appendChild(document.createTextNode(sortOptions[mode])); | |
| elOption.selected = ( collageSortColumn == mode ); | |
| elSelect.appendChild(elOption); | |
| } | |
| elSelect.addEventListener('change', function() { setSetting('default_sort_index_collage', this.value); }, true); | |
| confItem.appendChild(elSelect); | |
| settingsGroup.appendChild(confItem); | |
| confItem = document.createElement('div'); | |
| confItem.className = 'subsetting'; | |
| confItem.appendChild(document.createTextNode(' in ')); | |
| el = document.createElement('a'); | |
| el.id = 'animorc_sortcollapse_order_collage_asc'; | |
| el.href = 'javascript:void(0);'; | |
| if( collageSortOrder == 1 ) | |
| el.style.fontWeight = 'bold'; | |
| el.appendChild(document.createTextNode('ascending')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_order_collage', 1); | |
| this.style.fontWeight = 'bold'; | |
| this.nextElementSibling.style.fontWeight = ''; | |
| }, true); | |
| confItem.appendChild(el); | |
| confItem.appendChild(document.createTextNode('/')); | |
| el = document.createElement('a'); | |
| el.id = 'animorc_sortcollapse_order_collage_desc'; | |
| el.href = 'javascript:void(0);'; | |
| if( collageSortOrder == -1 ) | |
| el.style.fontWeight = 'bold'; | |
| el.appendChild(document.createTextNode('descending')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_order_collage', -1); | |
| this.style.fontWeight = 'bold'; | |
| this.previousElementSibling.style.fontWeight = ''; | |
| }, true); | |
| confItem.appendChild(el); | |
| confItem.appendChild(document.createTextNode(' order. ')); | |
| el = document.createElement('a'); | |
| el.href = 'javascript:void(0);'; | |
| el.appendChild(document.createTextNode('Reset to default')); | |
| el.addEventListener('click', | |
| function() { | |
| setSetting('default_sort_index_collage', 'num'); | |
| setSetting('default_sort_order_collage', 1); | |
| document.getElementById('animorc_sortcollapse_order_collage_desc').style.fontWeight = ''; | |
| document.getElementById('animorc_sortcollapse_order_collage_asc').style.fontWeight = 'bold'; | |
| document.getElementById('animorc_sortcollapse_index_collage').value = 'num'; | |
| }, true); | |
| confItem.appendChild(el); | |
| settingsGroup.appendChild(confItem); | |
| settingsSubDiv.appendChild(settingsGroup); | |
| settingsSection.appendChild(settingsSubDiv); | |
| settingsDiv.appendChild(settingsSection); | |
| newCell.appendChild(settingsDiv); | |
| var updateAvailable = scriptInfo.findUpdate(); | |
| } | |
| else if( window.location.search.indexOf('action=') == -1 ) { | |
| var colors = new Object(); | |
| var tables = new Object(); | |
| var modes = { | |
| length: 0, | |
| create: function(deforder, secondary) { | |
| var obj = new Object(); | |
| obj.index = ++this.length; // Index in titles array | |
| obj.deforder = deforder || -1; // 1 = asc, -1 = desc | |
| obj.secondary = secondary || 'year'; // Secondary sort column | |
| return obj; | |
| } | |
| }; | |
| if( window.location.pathname.indexOf('artist.php') != -1 ) { // Artist | |
| modes.title = modes.create(1); | |
| modes.year = modes.create(-1, 'groupID'); | |
| modes.groupID = modes.create(); | |
| modes.peers = modes.create(); | |
| modes.stats = { | |
| size: modes.create(), | |
| snatches: modes.create(), | |
| seeders: modes.create(), | |
| leechers: modes.create() | |
| }; | |
| var sortColumn = getSetting('default_sort_index_artist', 'year'); | |
| var sortOrder = getSetting('default_sort_order_artist', -1); | |
| var mode = modes[sortColumn] || modes.stats[sortColumn] || modes.year; | |
| var sortMode = { | |
| index: mode.index, | |
| deforder: sortOrder == 1 ? 1 : -1, | |
| secondary: mode.secondary | |
| }; | |
| var discogTables = document.getElementsByClassName('torrent_table'); | |
| var hiddenDiscogs = hasClass(discogTables[0].rows[1], 'hidden'); // Is "Discography View" set to "Closed by default"? | |
| var threshold = Number(getSetting('threshold', 0)); | |
| var editionThreshold = Number(getSetting('edition_threshold', 0)); | |
| var infoIndex = toggleIndex = null; | |
| for( var i = 1, rows = discogTables[0].rows.length; i < rows && (infoIndex === null || toggleIndex === null); i++ ) { | |
| var row = discogTables[0].rows[1]; | |
| for( var j = 0, cells = row.cells.length; j < cells; j++ ) { | |
| var cell = row.cells[j]; | |
| if( infoIndex === null && (hasClass(cell, 'big_info') || cell.getElementsByClassName('tags').length > 0) ) { | |
| infoIndex = j; | |
| continue; | |
| } | |
| if( toggleIndex === null && cell.children[0].id.substr(0, 8) == 'showimg_' ) { | |
| toggleIndex = j; | |
| continue; | |
| } | |
| } | |
| } | |
| var hideEditions = ( getSetting('collapse_editions', 0) == 1 ); | |
| for( var i = 0; i < discogTables.length; i++ ) { | |
| var table = discogTables[i]; | |
| if( table.getAttribute('tableid') == i ) | |
| continue; | |
| table.setAttribute('tableid', i); | |
| toggle.table = table; | |
| var type = table.id.substr('torrents_'.length); | |
| var hideGroups = ( getSetting('collapse_'+type, 0) == 1 ); | |
| table.rows[0].cells[toggleIndex].style.width = '28px'; | |
| table.rows[0].cells[infoIndex].appendChild(document.createTextNode(' - Sort by: ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.setAttribute('tableid', i); | |
| newLink.appendChild(document.createTextNode('Title')); | |
| newLink.addEventListener('click', function() { sortTable.sort(this.getAttribute('tableid'), modes.title); }, false); | |
| table.rows[0].cells[infoIndex].appendChild(newLink); | |
| table.rows[0].cells[infoIndex].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.setAttribute('tableid', i); | |
| newLink.appendChild(document.createTextNode('Year')); | |
| newLink.addEventListener('click', function() { sortTable.sort(this.getAttribute('tableid'), modes.year); }, false); | |
| table.rows[0].cells[infoIndex].appendChild(newLink); | |
| table.rows[0].cells[infoIndex].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.setAttribute('tableid', i); | |
| newLink.appendChild(document.createTextNode('Peers')); | |
| newLink.addEventListener('click', function() { sortTable.sort(this.getAttribute('tableid'), modes.peers); }, false); | |
| table.rows[0].cells[infoIndex].appendChild(newLink); | |
| var cellIndex = infoIndex + 1; | |
| for( var j in modes.stats ) { | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.setAttribute('tableid', i); | |
| newLink.innerHTML = table.rows[0].cells[cellIndex].innerHTML; | |
| newLink.setAttribute('sort_index', j); | |
| newLink.addEventListener('click', function() { sortTable.sort(this.getAttribute('tableid'), modes.stats[this.getAttribute('sort_index')]); }, false); | |
| table.rows[0].deleteCell(cellIndex); | |
| var newCell = table.rows[0].insertCell(cellIndex); | |
| newCell.appendChild(newLink); | |
| cellIndex++; | |
| } | |
| var titles = new Array(); | |
| for( var j = 1; j < table.rows.length; j++ ) { | |
| var row = table.rows[j]; | |
| row.setAttribute('rowtype', 'group'); | |
| var toggleDiv = row.cells[toggleIndex].children[0]; | |
| var toggleRelease = document.createElement('a'); | |
| toggleRelease.href = 'javascript:void(0);'; | |
| toggleRelease.className = 'show_torrents_link'; | |
| toggleRelease.setAttribute('tableid', i); | |
| toggleRelease.addEventListener('click', | |
| function(e) { | |
| var rowid = this.parentNode.parentNode.parentNode.rowIndex; | |
| if( e.shiftKey && toggle.last && toggle.table.getAttribute('tableid') == this.getAttribute('tableid') ) { | |
| toggle.start = toggle.last; | |
| toggle.end = rowid; | |
| } | |
| else { | |
| toggle.start = rowid; | |
| if( e.ctrlKey ) | |
| toggle.end = -1; | |
| } | |
| toggle.table = this.parentNode.parentNode.offsetParent; | |
| toggle.toggle(); | |
| toggle.last = rowid; | |
| e.preventDefault(); | |
| }, false); | |
| toggleDiv.replaceChild(toggleRelease, toggleDiv.children[0]); | |
| if( row.className == row.nextSibling.className ) // Empty group | |
| continue; | |
| var groupInfoCont = row.cells[infoIndex].getElementsByClassName('group_info')[0] || row.cells[infoIndex]; | |
| var groupLink = groupInfoCont.children[0].children[0]; | |
| var year = Number(groupInfoCont.children[0].innerHTML.substr(0, 4)); | |
| var groupID = Number(groupLink.href.match(/\?id=(\d+)/)[1]); | |
| var name = groupLink.innerHTML.replace(/^\s+/, ''); | |
| if(isNaN(year)) | |
| year = 0; | |
| var snatches = 0, size = 0, seeders = 0, leechers = 0; | |
| var torrents = [row]; | |
| var torrentCount = 0, editionCount = 0; | |
| var hideGroup = hideGroups; | |
| var hideEdition = hideEditions; | |
| var snatchedGroup = hasClass(row, 'snatched_group'); | |
| for( var k = j + 1; k < table.rows.length && editionCount <= editionThreshold; k++ ) { | |
| var row = table.rows[k]; | |
| if( hasClass(row, 'group') ) | |
| break; | |
| if( hasClass(row, 'edition') ) | |
| editionCount++; | |
| } | |
| for( var k = j + 1; k < table.rows.length; k++ ) { | |
| row = table.rows[k]; | |
| if( hasClass(row, 'group') ) | |
| break; | |
| torrents.push(row); | |
| if( hasClass(row, 'edition') ) { // Edition | |
| // Only add multiple levels of hide if the entire discography tables are collapsed by default | |
| if( hideEdition && !hiddenDiscogs && hasClass(row, 'hidden') ) | |
| hideEdition = false; | |
| row.setAttribute('rowtype', 'edition'); | |
| var toggleEdition = document.createElement('a'); | |
| toggleEdition.href = 'javascript:void(0);'; | |
| toggleEdition.setAttribute('tableid', i); | |
| toggleEdition.addEventListener('click', | |
| function(e) { | |
| var rowid = this.parentNode.parentNode.rowIndex; | |
| if( e.shiftKey && toggle.last && toggle.table.getAttribute('tableid') == this.getAttribute('tableid') ) { | |
| toggle.start = toggle.last; | |
| toggle.end = rowid; | |
| } | |
| else { | |
| toggle.start = rowid; | |
| if( e.ctrlKey ) | |
| toggle.end = -2; | |
| } | |
| toggle.table = this.parentNode.offsetParent; | |
| toggle.toggle(); | |
| toggle.last = rowid; | |
| e.preventDefault(); | |
| }, false); | |
| // Mark editions as hidden by changing '-' to '+' instead of adding a second level of hide | |
| if( (hideGroups || hasClass(row, 'hidden')) && hideEditions && editionCount > editionThreshold ) | |
| row.cells[0].children[0].textContent = '+' + row.cells[0].children[0].textContent.slice(1); | |
| toggleEdition.appendChild(document.createTextNode(row.cells[0].textContent)); | |
| var colorType = snatchedGroup ? 'edlinkSnatched' : 'edlink'; | |
| if( colors[colorType] == null ) | |
| colors[colorType] = getComputedStyle(row.cells[0].firstChild, null).color; | |
| toggleEdition.style.color = colors[colorType]; | |
| toggleEdition.style.fontWeight = 'bold'; | |
| row.cells[0].replaceChild(toggleEdition, row.cells[0].firstChild); | |
| } | |
| else { // Torrent | |
| if( hideGroup && !hiddenDiscogs && hasClass(row, 'hidden') ) | |
| hideGroup = false; | |
| row.setAttribute('rowtype', 'torrent'); | |
| torrentCount++; | |
| size = Math.max(size, getSize(row.cells[1].firstChild.nodeValue)); | |
| snatches += !row.cells[2].firstChild ? 0 : Number(row.cells[2].firstChild.nodeValue.replace(/\D/g, '')); | |
| seeders += !row.cells[3].firstChild ? 0 : Number(row.cells[3].firstChild.nodeValue.replace(/\D/g, '')); | |
| leechers += !row.cells[4].firstChild ? 0 : Number(row.cells[4].firstChild.nodeValue.replace(/\D/g, '')); | |
| } | |
| } | |
| if( hideGroup && torrents.length > 1 && (!threshold || torrentCount > threshold) ) | |
| toggle.toggle(j, true); | |
| else if( hideEdition && torrentCount > 0 && editionCount > editionThreshold ) { | |
| // Simulate Ctrl-click on the first edition link | |
| toggle.start = j+1; | |
| toggle.end = -2; | |
| toggle.toggle(false, true); | |
| } | |
| titles.push([torrents, name.toLowerCase(), year, groupID, (seeders+leechers), size, snatches, seeders, leechers]); | |
| j = k - 1; | |
| } | |
| tables[i] = { | |
| header: table.rows[0], | |
| titles: titles, | |
| table: table, | |
| }; | |
| if( sortColumn != 'year' || sortOrder != -1 ) | |
| sortTable.sort(i, sortMode); | |
| else { | |
| sortTable.status[i] = { | |
| index: modes[sortColumn].index, | |
| order: sortOrder | |
| }; | |
| } | |
| } | |
| } | |
| else if( window.location.pathname.indexOf('torrents.php') != -1 ) { // Torrents | |
| modes.title = modes.create(1, 'medium'); | |
| modes.medium = modes.create(1); | |
| modes.year = modes.create(-1, 'medium'); | |
| modes.minID = modes.create(1); | |
| modes.maxID = modes.create(); | |
| modes.peers = modes.create(); | |
| modes.stats = { | |
| size: modes.create(), | |
| snatches: modes.create(), | |
| seeders: modes.create(), | |
| leechers: modes.create() | |
| }; | |
| var sortColumn = getSetting('default_sort_index_release', 'year'); | |
| var sortOrder = getSetting('default_sort_order_release', 1); | |
| var mode = modes[sortColumn] || modes.stats[sortColumn] || modes.year; | |
| var sortMode = { | |
| index: mode.index, | |
| deforder: sortOrder == 1 ? 1 : -1, | |
| secondary: mode.secondary | |
| }; | |
| var hideEditions = ( getSetting('collapse_editions', 0) == 1); | |
| var editionThreshold = Number(getSetting('edition_threshold', 0)); | |
| var table = document.getElementsByClassName('torrent_table')[0]; | |
| var editionLinks = table.getElementsByClassName('edition_info'); | |
| if( editionLinks.length ) { | |
| toggle.table = table; | |
| table.rows[0].cells[0].appendChild(document.createTextNode(' - Sort by: ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('Edition title')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.title); }, false); | |
| table.rows[0].cells[0].appendChild(newLink); | |
| table.rows[0].cells[0].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('Year')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.year); }, false); | |
| table.rows[0].cells[0].appendChild(newLink); | |
| table.rows[0].cells[0].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('Medium')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.medium); }, false); | |
| table.rows[0].cells[0].appendChild(newLink); | |
| table.rows[0].cells[0].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('Peers')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.peers); }, false); | |
| table.rows[0].cells[0].appendChild(newLink); | |
| var cellIndex = 1; | |
| for( var j in modes.stats ) { | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.innerHTML = table.rows[0].cells[cellIndex].innerHTML; | |
| newLink.setAttribute('sort_index', j); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.stats[this.getAttribute('sort_index')]); }, false); | |
| table.rows[0].deleteCell(cellIndex); | |
| var newCell = table.rows[0].insertCell(cellIndex); | |
| newCell.appendChild(newLink); | |
| cellIndex++; | |
| } | |
| var editionCount = editionLinks.length; | |
| var snatchedGroup = hasClass(table, 'snatched'); | |
| var editions = new Array(); | |
| for( var j = 1; j < table.rows.length; j++ ) { | |
| var row = table.rows[j]; | |
| var torrents = [row]; | |
| row.setAttribute('rowtype', 'edition'); | |
| var toggleEdition = document.createElement('a'); | |
| toggleEdition.href = 'javascript:void(0);'; | |
| toggleEdition.addEventListener('click', | |
| function(e) { | |
| var rowid = this.parentNode.parentNode.rowIndex; | |
| if( e.shiftKey && toggle.last ) { | |
| toggle.start = toggle.last; | |
| toggle.end = rowid; | |
| } | |
| else { | |
| toggle.start = rowid; | |
| if( e.ctrlKey ) | |
| toggle.end = -3; | |
| } | |
| toggle.toggle(); | |
| toggle.last = rowid; | |
| e.preventDefault(); | |
| }, false); | |
| toggleEdition.appendChild(document.createTextNode(row.cells[0].textContent)); | |
| var colorType = snatchedGroup ? 'edlinkSnatched' : 'edlink'; | |
| if( colors[colorType] == null ) | |
| colors[colorType] = getComputedStyle(row.cells[0].firstChild, null).color; | |
| toggleEdition.style.color = colors[colorType]; | |
| toggleEdition.style.fontWeight = 'bold'; | |
| row.cells[0].replaceChild(toggleEdition, row.cells[0].firstChild); | |
| if( row.className == row.nextSibling.className ) // Empty group | |
| continue; | |
| var editionInfo = toggleEdition.textContent.split(' / '); | |
| var year, title, medium; | |
| if( editionInfo.length == 1 ) // Edition info only has the release year (+ XXXX - medium) | |
| medium = editionInfo[0].substr(9); | |
| else | |
| medium = editionInfo.pop(); | |
| var yearMatch = editionInfo[0].match(/^. (\d{4}) - /); | |
| if( yearMatch ) { | |
| year = Number(yearMatch[1]); | |
| title = editionInfo.join(' ').substr(9); | |
| } | |
| else { | |
| year = 0; | |
| title = editionInfo.join(' ').substr(2); | |
| } | |
| var snatches = 0, size = 0, seeders = 0, leechers = 0, minTorrentID = Infinity, maxTorrentID = 0; | |
| var isExpanded = false; | |
| for( var k = j + 1; k < table.rows.length; k++ ) { | |
| row = table.rows[k]; | |
| if( hasClass(row, 'edition') ) // Edition | |
| break; | |
| torrents.push(row); | |
| if( hasClass(row, 'torrentdetails') ) { // Torrent details | |
| var thisIsExpanded = hasClass(row, 'hidden') == 0; | |
| if( thisIsExpanded ) | |
| isExpanded = true; | |
| row.setAttribute('rowtype', 'torrentdetails'); | |
| row.setAttribute('hidedetails', !thisIsExpanded); | |
| } | |
| else { // Torrent | |
| row.setAttribute('rowtype', 'torrent'); | |
| torrentID = row.id.substr('torrent'.length); | |
| size = Math.max(size, getSize(row.cells[1].firstChild.nodeValue)); | |
| minTorrentID = Math.min(minTorrentID, torrentID); | |
| maxTorrentID = Math.max(maxTorrentID, torrentID); | |
| snatches += !row.cells[2].firstChild ? 0 : Number(row.cells[2].firstChild.nodeValue.replace(/\D/g, '')); | |
| seeders += !row.cells[3].firstChild ? 0 : Number(row.cells[3].firstChild.nodeValue.replace(/\D/g, '')); | |
| leechers += !row.cells[4].firstChild ? 0 : Number(row.cells[4].firstChild.nodeValue.replace(/\D/g, '')); | |
| var toggleDetails = row.cells[0].children[1]; | |
| toggleDetails.addEventListener('click', | |
| function() { | |
| var row = this.parentNode.parentNode.nextElementSibling; | |
| row.setAttribute('hidedetails', row.getAttribute('hidedetails') == 'false'); | |
| }, false); | |
| } | |
| } | |
| if( hideEditions && !isExpanded && editionCount > editionThreshold ) | |
| toggle.toggle(j, true); | |
| j = k - 1; | |
| editions.push([torrents, title.toLowerCase(), medium.toLowerCase(), year, minTorrentID, maxTorrentID, (seeders+leechers), size, snatches, seeders, leechers]); | |
| } | |
| tables[0] = { | |
| header: table.rows[0], | |
| titles: editions, | |
| table: table | |
| }; | |
| if( sortColumn != 'year' || sortOrder != -1 ) | |
| sortTable.sort(0, sortMode); | |
| else { | |
| sortTable.status[0] = { | |
| index: modes[sortColumn].index, | |
| order: sortOrder | |
| }; | |
| } | |
| } | |
| } | |
| else if( window.location.pathname.indexOf('collages.php') != -1 ) { // Collages | |
| modes.num = modes.create(1), | |
| modes.artist = modes.create(1, 'title'), | |
| modes.title = modes.create(1, 'artist'), | |
| modes.year = modes.create(-1, 'groupID'); | |
| modes.groupID = modes.create(); | |
| modes.peers = modes.create(); | |
| modes.stats = { | |
| size: modes.create(), | |
| snatches: modes.create(), | |
| seeders: modes.create(), | |
| leechers: modes.create() | |
| }; | |
| var sortColumn = getSetting('default_sort_index_collage', 'num'); | |
| var sortOrder = getSetting('default_sort_order_collage', 1); | |
| var mode = modes[sortColumn] || modes.stats[sortColumn] || modes.num; | |
| var sortMode = { | |
| index: mode.index, | |
| deforder: sortOrder == 1 ? 1 : -1, | |
| secondary: mode.secondary | |
| }; | |
| var table = document.getElementById('discog_table'); | |
| toggle.table = table; | |
| var hideGroups = ( getSetting('collapse_collages', 0) == 1 ); | |
| var hideEditions = ( getSetting('collapse_editions', 0) == 1 ); | |
| var threshold = Number(getSetting('threshold', 0)); | |
| var editionThreshold = Number(getSetting('edition_threshold', 0)); | |
| table.rows[0].cells[2].appendChild(document.createTextNode(' - Sort by: ')); | |
| var newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('#')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.num); }, false); | |
| table.rows[0].cells[2].appendChild(newLink); | |
| table.rows[0].cells[2].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('Artist')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.artist); }, false); | |
| table.rows[0].cells[2].appendChild(newLink); | |
| table.rows[0].cells[2].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('Title')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.title); }, false); | |
| table.rows[0].cells[2].appendChild(newLink); | |
| table.rows[0].cells[2].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('Year')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.year); }, false); | |
| table.rows[0].cells[2].appendChild(newLink); | |
| table.rows[0].cells[2].appendChild(document.createTextNode(' | ')); | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.appendChild(document.createTextNode('Peers')); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.peers); }, false); | |
| table.rows[0].cells[2].appendChild(newLink); | |
| var cellIndex = 3; | |
| for( var j in modes.stats ) { | |
| newLink = document.createElement('a'); | |
| newLink.href = 'javascript:void(0);'; | |
| newLink.innerHTML = table.rows[0].cells[cellIndex].innerHTML; | |
| newLink.setAttribute('sort_index', j); | |
| newLink.addEventListener('click', function() { sortTable.sort(0, modes.stats[this.getAttribute('sort_index')]); }, false); | |
| table.rows[0].deleteCell(cellIndex); | |
| var newCell = table.rows[0].insertCell(cellIndex); | |
| newCell.appendChild(newLink); | |
| cellIndex++; | |
| } | |
| var titles = new Array(); | |
| for( var j = 1; j < table.rows.length; j++ ) { | |
| var row = table.rows[j]; | |
| if( hasClass(row, 'torrent') ) { // Ungrouped torrents require special attention | |
| row.setAttribute('rowtype', 'ungrouped'); | |
| var curCellIndex = 2; | |
| var curCell = row.cells[curCellIndex].children[1]; | |
| var num = titles.length+1; | |
| var artists = '', groupLink; | |
| var anchors = curCell.getElementsByTagName('a'); | |
| for( var k = 0, l = anchors.length - 1; k <= l; k++ ) { | |
| if( anchors[k].pathname == '/torrents.php' ) { | |
| groupLink = anchors[k]; | |
| break; | |
| } | |
| } | |
| var name = groupLink.innerHTML.replace(/^\s+/, ''); | |
| var groupID = Number(groupLink.href.match(/\?id=(\d+)/)[1]); | |
| var year = 0; | |
| var size = getSize(row.cells[curCellIndex+1].firstChild.nodeValue); | |
| var snatches = Number(row.cells[curCellIndex+2].firstChild.nodeValue); | |
| var seeders = Number(row.cells[curCellIndex+3].firstChild.nodeValue); | |
| var leechers = Number(row.cells[curCellIndex+4].firstChild.nodeValue); | |
| var torrents = [row]; | |
| } | |
| else { // Torrent group | |
| row.setAttribute('rowtype', 'group'); | |
| var torrentCount = 0, editionCount = 0; | |
| var origLink = table.rows[j].cells[0].getElementsByTagName('a')[0]; | |
| var toggleRelease = document.createElement('a'); | |
| toggleRelease.href = 'javascript:void(0);'; | |
| toggleRelease.className = 'show_torrents_link'; | |
| toggleRelease.addEventListener('click', | |
| function(e) { | |
| var rowid = this.parentNode.parentNode.parentNode.rowIndex; | |
| if( e.shiftKey && toggle.last ) { | |
| toggle.start = toggle.last; | |
| toggle.end = rowid; | |
| } | |
| else { | |
| toggle.start = rowid; | |
| if( e.ctrlKey ) | |
| toggle.end = -1; | |
| } | |
| toggle.toggle(); | |
| toggle.last = rowid; | |
| e.preventDefault(); | |
| }, false); | |
| origLink.parentNode.replaceChild(toggleRelease, origLink); | |
| var curCell = row.cells[2].children[0]; | |
| var num = Number(curCell.innerHTML.match(/^\d+/)[0]); | |
| var artists = new Array(), groupLink; | |
| if(curCell.children.length == 1) | |
| groupLink = curCell.children[0]; | |
| else { | |
| var anchors = curCell.getElementsByTagName('a'); | |
| for( var k = 0, l = anchors.length - 1; k <= l; k++ ) { | |
| if( anchors[k].pathname == '/artist.php' ) | |
| artists.push(anchors[k].innerHTML); | |
| else if( anchors[k].pathname == '/torrents.php' ) | |
| groupLink = anchors[k]; | |
| } | |
| } | |
| artists = artists.join(' '); | |
| var name = groupLink.innerHTML; | |
| var groupID = Number(groupLink.href.match(/\?id=(\d+)/)[1]); | |
| var year = Number(groupLink.nextSibling.nodeValue.substr(2, 4)); | |
| if(isNaN(year)) | |
| year = 0; | |
| var size = 0, snatches = 0, seeders = 0, leechers = 0; | |
| var torrents = [row]; | |
| var hideGroup = hideGroups; | |
| var hideEdition = hideEditions; | |
| var snatchedGroup = hasClass(row, 'snatched_group'); | |
| // Count editions | |
| for( var k = j + 1; k < table.rows.length && editionCount <= editionThreshold; k++ ) { | |
| var row = table.rows[k]; | |
| if( hasClass(row, 'group') ) | |
| break; | |
| if( hasClass(row, 'edition') ) | |
| editionCount++; | |
| } | |
| for( var k = j + 1; k < table.rows.length; k++ ) { | |
| row = table.rows[k]; | |
| if( hasClass(row, 'group') || hasClass(row, 'torrent') ) | |
| break; | |
| torrents.push(row); | |
| if( hasClass(row, 'edition') ) { // Edition | |
| if( hideEdition && hasClass(row, 'hidden') ) | |
| hideEdition = false; | |
| row.setAttribute('rowtype', 'edition'); | |
| var toggleEdition = document.createElement('a'); | |
| toggleEdition.href = 'javascript:void(0);'; | |
| toggleEdition.addEventListener('click', | |
| function(e) { | |
| var rowid = this.parentNode.parentNode.rowIndex; | |
| if( e.shiftKey && toggle.last ) { | |
| toggle.start = toggle.last; | |
| toggle.end = rowid; | |
| } | |
| else { | |
| toggle.start = rowid; | |
| if( e.ctrlKey ) | |
| toggle.end = -2; | |
| } | |
| toggle.toggle(); | |
| toggle.last = rowid; | |
| e.preventDefault(); | |
| }, false); | |
| // Mark editions as hidden by changing '-' to '+' instead of adding a second level of hide | |
| if( (hideGroups || hasClass(row, 'hidden')) && hideEditions && editionCount > editionThreshold) | |
| row.cells[0].children[0].textContent = '+' + row.cells[0].children[0].textContent.slice(1); | |
| toggleEdition.appendChild(document.createTextNode(row.cells[0].textContent)); | |
| var colorType = snatchedGroup ? 'edlinkSnatched' : 'edlink'; | |
| if( colors[colorType] == null ) | |
| colors[colorType] = getComputedStyle(row.cells[0].firstChild, null).color; | |
| toggleEdition.style.color = colors[colorType]; | |
| toggleEdition.style.fontWeight = 'bold'; | |
| row.cells[0].replaceChild(toggleEdition, row.cells[0].firstChild); | |
| } | |
| else { // Torrent | |
| if( hideGroup && hasClass(row, 'hidden') ) | |
| hideGroup = false; | |
| row.setAttribute('rowtype', 'torrent'); | |
| torrentCount++; | |
| size = Math.max(size, getSize(row.cells[1].firstChild.nodeValue)); | |
| snatches += !row.cells[2].firstChild ? 0 : Number(row.cells[2].firstChild.nodeValue.replace(/\D/g, '')); | |
| seeders += !row.cells[3].firstChild ? 0 : Number(row.cells[3].firstChild.nodeValue.replace(/\D/g, '')); | |
| leechers += !row.cells[4].firstChild ? 0 : Number(row.cells[4].firstChild.nodeValue.replace(/\D/g, '')); | |
| } | |
| } | |
| if( hideGroup && torrents.length > 1 && (!threshold || torrentCount > threshold) ) | |
| toggle.toggle(j); | |
| else if( hideEdition && torrentCount > 0 && editionCount > editionThreshold ) { | |
| // Simulate Ctrl-click on the first edition link | |
| toggle.start = j+1; | |
| toggle.end = -2; | |
| toggle.toggle(false, true); | |
| } | |
| j = k - 1; | |
| } | |
| titles.push([torrents, num, artists.toLowerCase(), name.toLowerCase(), year, groupID, (seeders+leechers), size, snatches, seeders, leechers]); | |
| } | |
| tables[0] = { | |
| header: table.rows[0], | |
| titles: titles, | |
| table: table | |
| }; | |
| if( sortColumn != 'num' || sortOrder != 1 ) | |
| sortTable.sort(0, sortMode); | |
| else { | |
| sortTable.status[0] = { | |
| index: modes[sortColumn].index, | |
| order: sortOrder | |
| }; | |
| } | |
| } | |
| } | |
| })(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment