Startpage.com Autopager

Autopager for startpage.com

  1. // ==UserScript==
  2. // @name Startpage.com Autopager
  3. // @namespace https://greasyfork.org/users/5174-jesuis-parapluie
  4. // @author jesuis-parapluie
  5. //
  6. // @description Autopager for startpage.com
  7. //
  8. // @include /^https?:\/\/(.+\.)?startpage\.com\/do\/.*$/
  9. //
  10. // @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
  11. //
  12. // @grant GM_xmlhttpRequest
  13. // @grant GM_getValue
  14. // @grant GM_setValue
  15. //
  16. // @version 0.1.5
  17. // ==/UserScript==
  18.  
  19. (function ($) {
  20. 'use strict';
  21. /*jslint browser: true, regexp: true, newcap: true */
  22. /*global $, jQuery, GM_xmlhttpRequest, GM_getValue, GM_setValue */
  23. var autoPager = function () {
  24. var pos = $(document).height() - $('body').scrollTop() - $('html').scrollTop() - $(window).height(),
  25. form = $('#nextnavbar form'),
  26. resultsQuery = '#results, #video_results',
  27. data = "",
  28. breaker,
  29. nr;
  30. if (!$('#results_content').hasClass('trigger-block') && pos < 50) {
  31. $('#results_content').addClass('trigger-block');
  32. breaker = $('<div>', {
  33. 'class': 'breaker',
  34. 'style': 'clear: both; line-height: 21px; text-align: center; margin: 10px; border: 1px solid; opacity: 0.7; font-style: italic;',
  35. 'html': 'loading page <span class="nr"></span> ..'
  36. });
  37. breaker.css('width', $('div#first-result').width());
  38. if ($("div[id*='pagenav'] .active").length !== 0) { // new design
  39. resultsQuery = '#bottom-result-container';
  40. nr = parseInt($("div[id*='pagenav'] .active").last().text(), 10) + 1;
  41. $('#pagenavigation').before(breaker);
  42. } else {
  43. nr = parseInt($('#pagenavigation #pnform').html().match(/.*&nbsp;(\d+)&nbsp;.*/).pop(), 10) + 1;
  44. $(resultsQuery).last().append(breaker);
  45. }
  46. if (isNaN(nr) || $('#pagenavigation').find('a[id=' + nr + ']').length === 0) {
  47. breaker.remove();
  48. return true;
  49. }
  50. breaker.find('.nr').text(nr);
  51. breaker.data('ipage', nr);
  52. form.find("input[type=\"hidden\"]").each(function () {
  53. data += "&" + $(this).attr('name') + "=" + $(this).attr('value');
  54. });
  55. data = data.substring(1);
  56. GM_xmlhttpRequest({
  57. method: "POST",
  58. url: form.attr('action'),
  59. data: data,
  60. headers: {
  61. "Content-Type": "application/x-www-form-urlencoded"
  62. },
  63. onload: function (response) {
  64. var startat,
  65. clickWrapper = function () {
  66. var obj = $('#pagenav' + $(this).attr('id'));
  67. if (obj.size() > 0) {
  68. $(document).scrollTop(obj.offset().top);
  69. } else {
  70. startat = $(this).attr('onclick').match(/\((\d+)\)/).pop();
  71. obj = $('form[name=pnform]').last();
  72. obj.find('#startat').attr('value', startat);
  73. obj.submit();
  74. }
  75. return false;
  76. },
  77. newPage = $(response.responseText),
  78. isEmpty = (newPage.find(resultsQuery).length === 0),
  79. isLastPage = (newPage.find("form[name='nextform']").length === 0);
  80. if (isEmpty) {
  81. return;
  82. }
  83. breaker.after(newPage.find(resultsQuery).html());
  84. breaker.css('font-style', 'normal');
  85. breaker.attr('id', 'pagenav' + breaker.find('span').text());
  86. $('.classified').hide();
  87. $('.classified').last().show();
  88. if (!isLastPage) {
  89. if ($('#search_footer').size()) {
  90. $('#pagenavigation').html(newPage.find('#pagenavigation').html());
  91. breaker.html($('#pagenavigation').clone(true).html());
  92. } else { // new design
  93. breaker.html($('#pagenavigation').html());
  94. $('#pagenavigation').remove();
  95. $('#pagenavigation').html(newPage.find('#pagenavigation').html());
  96. }
  97.  
  98. $('#pagenavigation #nextnavbar a').attr('id', breaker.data('ipage') + 1);
  99. breaker.find('#nextnavbar a').attr('id', breaker.data('ipage') + 1);
  100. startat = $('#pagenavigation #nextnavbar input[name="startat"]').attr('value');
  101. $('#pagenavigation #nextnavbar a').attr('onclick', 'mysubmit(' + startat + '); return false;');
  102. breaker.find('#nextnavbar a').attr('onclick', 'mysubmit(' + startat + '); return false;');
  103. $('#pagenavigation #prevnavbar a').attr('id', breaker.data('ipage') - 1);
  104. breaker.find('#prevnavbar a').attr('id', breaker.data('ipage') - 1);
  105. startat = $('#pagenavigation #prevnavbar input[name="startat"]').attr('value');
  106. $('#pagenavigation #prevnavbar a').attr('onclick', 'mysubmit(' + startat + '); return false;');
  107. breaker.find('#prevnavbar a').attr('onclick', 'mysubmit(' + startat + '); return false;');
  108. $('#pagenavigation a').click(clickWrapper);
  109. breaker.find('a').click(clickWrapper);
  110.  
  111. breaker.find('div').css('display', 'inline');
  112. $('#pagenavigation div').css('display', 'inline');
  113. breaker.find('span.active').css('padding', breaker.find('#nextnavbar a, #prevnavbar a').first().css('padding'));
  114. if ($('#pagenavigation').width() > $('div#first-result').width()) { breaker.css('width', $('#pagenavigation').width()); }
  115. $('#results_content').removeClass('trigger-block');
  116. } else {
  117. breaker.remove();
  118. $('#pagenavigation #jumpsbar a').each(function () {
  119. if (parseInt($(this).attr('id'), 10) >= nr) {
  120. $(this).remove();
  121. }
  122. });
  123. $('#pagenavigation #nextnavbar').remove();
  124. }
  125. },
  126. onerror: function () {
  127. $('.breaker').last().html('loading failed');
  128. }
  129. });
  130. }
  131. };
  132. $(function () {
  133. var link = $('<a>', {
  134. 'class': 'autopager',
  135. 'style': 'cursor:pointer;font-weight:normal;text-align:left;',
  136. 'html': 'Autopager <span style="color:#D5402C;">off</span>'
  137. }).click(function () {
  138. if ($(this).find('span').text() === 'on') {
  139. $(this).find('span').text('off');
  140. GM_setValue('SP-Autopager', false);
  141. $(document).off('scroll', autoPager);
  142. } else {
  143. $(this).find('span').text('on');
  144. GM_setValue('SP-Autopager', true);
  145. $(document).on('scroll', autoPager);
  146. }
  147. });
  148. if ($('#pagenavigation').length) {
  149. if ($('.navbar-header').length) { // new design
  150. $('#head_left').before(link);
  151. link.css('position', 'relative');
  152. link.css('left', '640px');
  153. link.css('top', '63px');
  154. } else {
  155. $('#head_left').parent().append(link);
  156. }
  157. $('body').prepend($('<span>', {'id': 'pagenav1'}));
  158. if (GM_getValue('SP-Autopager', false)) {
  159. link.click();
  160. }
  161. }
  162. });
  163. }(jQuery));