// ==UserScript==
// @name GoG Search
// @namespace https://gist.github.com/adaliabooks/
// @version 1.0
// @description Adds Basic user search / filter bar to GoG.com forums
// @author adaliabooks
// @updateURL https://gist.github.com/adaliabooks/51d25e123f36f4308bb2/raw/
// @downloadURL https://gist.github.com/adaliabooks/51d25e123f36f4308bb2/raw/
// @require https://raw.githubusercontent.com/bartaz/sandbox.js/master/jquery.highlight.js
// @grant none
// @include http://www.gog.com/forum/*
// @include https://www.gog.com/forum/*
// ==/UserScript==
var versionNumber = "1.0";
var months = { Jan : 0, Feb : 1, Mar : 2, Apr : 3, May : 4, Jun : 5, Jul : 6, Aug : 7, Sep : 8, Oct : 9, Nov : 10, Dec : 11 };
var debugLogger = {
debuggingActive : false,
debugLog : function (message)
{
if(debugLogger.debuggingActive)
{
console.log(message);
}
}
};
jQuery.expr[':'].Contains = function(a, i, m) {
return jQuery(a).text().toUpperCase()
.indexOf(m[3].toUpperCase()) >= 0;
};
function FolderDepthFunction(the_url)
{
var the_arr = the_url.split('/');
return the_arr.length;
}
function RemoveLastDirectoryPartOf(the_url)
{
var the_arr = the_url.split('/');
the_arr.pop();
return( the_arr.join('/') );
}
function RemoveLastDirIfLonger(the_url, length)
{
if (FolderDepthFunction(the_url) > length)
{
return RemoveLastDirectoryPartOf(the_url);
}
else
{
return the_url;
}
}
function GetFirstPartOfDirectory(the_url)
{
var the_arr = the_url.split('/');
return the_arr[0];
}
function GetLastPartOfDirectory(the_url)
{
var the_arr = the_url.split('/');
return the_arr[the_arr.length - 1];
}
function FindLastPageNumber()
{
return parseInt(jQuery('.n_b_b_nr_last').first().text());
}
function MergeArraysRemoveDuplicates(array1, array2)
{
var result = array1;
array2.forEach(function(value){
if (result.indexOf(value)==-1) result.push(value);
});
return result;
}
function StripNonNumbers(aString)
{
return aString.replace(/\D/g,'');
}
function StripNonNumbersParse(aString)
{
return parseInt(aString.replace(/\D/g,''));
}
function naturalCompare(a, b) {
// thanks to stackoverflow user georg for this function here: http://stackoverflow.com/a/15479354
var ax = [], bx = [];
a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });
while(ax.length && bx.length) {
var an = ax.shift();
var bn = bx.shift();
var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
if(nn) return nn;
}
return ax.length - bx.length;
}
function checkIsForumPage()
{
/*
if(window.location.hash)
{
return true;
}
else
{
return false;
}
*/
if(!$('.n_b_t_main_2').length)
{
debugLogger.debugLog('Forum');
return true;
}
else
{
debugLogger.debugLog('Thread');
return false;
}
}
function getNoResultForum()
{
debugLogger.debugLog('Forum Search: No Results');
return $('
now
GOG.com Sorry, data for given user is currently unavailable. Please, try again later. View wishlist Start conversation Invite to friendsAccept invitation Pending invitation... User since Friends since ');
}
function getNoResultThread()
{
debugLogger.debugLog('Thread Search: No Results');
return $(' Editor
Sorry, data for given user is currently unavailable. Please, try again later. View wishlist Start conversation Invite to friendsAccept invitation Pending invitation... User since Friends since Sorry, no results have been found to match your search query.
');
}
function getNumberOfResultsForum(number, time)
{
return $('now
GOG.com Sorry, data for given user is currently unavailable. Please, try again later. View wishlist Start conversation Invite to friendsAccept invitation Pending invitation... User since Friends since ');
}
function getNumberOfResultsThread(number, time)
{
return $('');
}
var ajaxQueue = {
maxRequests : 100,
currentRequests : 0,
requests : [],
add : function (URL, callback) {
if (this.currentRequests < this.maxRequests)
{
$.get(URL, callback);
}
else
{
this.requests.push({ pageURL : URL, callbackFunction : callback});
}
}
};
$(document).off('ajaxSend');
$(document).off('ajaxComplete');
$(document).ajaxSend(function() {
ajaxQueue.currentRequests++;
});
$(document).ajaxComplete(function() {
ajaxQueue.currentRequests--;
if (ajaxQueue.currentRequests < ajaxQueue.maxRequests && ajaxQueue.requests.length > 0)
{
request = ajaxQueue.requests.shift();
$.get(request.pageURL, request.callbackFunction);
debugLogger.debugLog('AJAX Removed From Queue');
}
debugLogger.debugLog('AJAX Complete');
});
function splitSearchTerms()
{
var searchText = $("#search_text_box").val();
var orTermsArray = searchText.split(';');
var termsArray = [];
for (var i = 0; i < orTermsArray.length; i++)
{
termsArray.push(orTermsArray[i].split('&'));
}
debugLogger.debugLog("Search Term Array: " + termsArray);
return termsArray;
}
function threadSearchBase()
{
if ($("#resultsSearch_checkbox").prop('checked'))
{
debugLogger.debugLog('Thread Search: Within Results');
threadSearchWithinResults();
}
else
{
debugLogger.debugLog('Thread Search: Normal Search');
threadSearch();
}
}
function forumSearchBase()
{
if ($("#resultsSearch_checkbox").prop('checked'))
{
debugLogger.debugLog('Forum Search: Within Results');
forumSearchWithinResults();
}
else
{
debugLogger.debugLog('Forum Search: Normal Search');
forumSearch();
}
}
function threadFilter(array, post, andSearchTerms)
{
var result = true;
for (var i = 0; i < andSearchTerms.length; i++)
{
result &= threadFilterInner(array, post, andSearchTerms[i]);
}
if (result)
{
array[post.id] = post;
}
}
function threadFilterInner(array, post, searchValueUntrimmed)
{
var searchValue = searchValueUntrimmed.trim();
debugLogger.debugLog('Thread Search: Post Number ' + post.id);
if ($(post).find('.b_u_name:Contains(' + searchValue + ')').length && $("#usernames_checkbox").prop('checked'))
{
if ($("#highlight_checkbox").prop('checked'))
{
$(post).find('.b_u_name').highlight(searchValue);
}
return true;
}
else if ($(post).find('.post_text_c:Contains(' + searchValue + ')').length && $("#posts_checkbox").prop('checked'))
{
if ($("#highlight_checkbox").prop('checked'))
{
$(post).find('.post_text_c').highlight(searchValue);
}
return true;
}
else if ($(post).find('.post_text_c:has(span.bold:Contains(' + searchValue + '))').length && $("#bold_checkbox").prop('checked'))
{
if ($("#highlight_checkbox").prop('checked'))
{
$(post).find('span.bold').highlight(searchValue);
}
return true;
}
}
function forumFilter(array, thread, andSearchTerms)
{
var result = true;
for (var i = 0; i < andSearchTerms.length; i++)
{
result &= forumFilterInner(array, thread, andSearchTerms[i]);
}
if (result)
{
var key = $(thread).find('.topic_s a').attr('href');
array[key] = thread;
}
}
function forumFilterInner(array, thread, searchValueUntrimmed)
{
var searchValue = searchValueUntrimmed.trim();
debugLogger.debugLog('Forum Search: Thread Name ' + $(thread).find('.topic_s').text());
if ($(thread).find('.user__name:Contains(' + searchValue + ')').length && $("#usernames_checkbox").prop('checked'))
{
if ($("#highlight_checkbox").prop('checked'))
{
$(thread).find('.user__name').highlight(searchValue);
}
return true;
}
else if ($(thread).find('.topic_s:Contains(' + searchValue + ')').length && $("#posts_checkbox").prop('checked'))
{
if ($("#highlight_checkbox").prop('checked'))
{
$(thread).find('.topic_s').highlight(searchValue);
}
return true;
}
}
function threadSearch()
{
var start = performance.now();
$('.spot_h').remove();
var endpage;
if ($("#endpage_box").val())
{
endpage = parseInt($("#endpage_box").val());
}
else
{
endpage = FindLastPageNumber();
}
var startpage;
if ($("#startpage_box").val())
{
startpage = parseInt($("#startpage_box").val());
}
else
{
startpage = 1;
}
if (endpage > startpage + 500)
{
endpage = startpage + 500;
}
var postsPerPage = 20;
var currentPostsOnPage = 0;
var currentPage = 1;
var selectedPage = 1;
var postsArray = {};
var searchTerms = splitSearchTerms();
$(document).off('ajaxStop');
$( document ).ajaxStop(function() {
if (!jQuery.isEmptyObject(postsArray))
{
var postsKeys = Object.keys(postsArray);
postsKeys.sort(naturalCompare);
for (var i = 0; i < postsKeys.length; i++)
{
var k = postsKeys[i];
var post = postsArray[k];
if (!$(".page" + currentPage + "posts").length)
{
var $newdiv = $( "" );
$( ".list_h" ).append($newdiv);
}
$(post).appendTo(".page" + currentPage + "posts");
currentPostsOnPage++;
if (currentPostsOnPage > postsPerPage)
{
currentPostsOnPage = 0;
currentPage++;
}
}
var end = performance.now();
var timeTaken = Math.round((end - start) / 1000);
var resultPost = getNumberOfResultsThread(postsKeys.length, timeTaken);
$(resultPost).prependTo( ".list_h" );
}
else
{
var noResultPost = getNoResultThread();
$(noResultPost).appendTo( ".list_h" );
}
if ($(".quick_post").length)
{
$(".list_h").append($(".quick_post"));
}
});
for (var i = startpage; i < endpage + 1; i++)
{
debugLogger.debugLog('PageNumber: ' + i);
var fullURL = window.location.pathname;
var threadURL = RemoveLastDirIfLonger(fullURL, 4) + "/page" + i;
ajaxQueue.add( threadURL, function( data ) {
var $page = $(data);
$page.find('.big_post_h').parents('.spot_h').each(function( index ) {
for (var i = 0; i < searchTerms.length; i++)
{
debugLogger.debugLog('Or Search Term: ' + searchTerms[i]);
threadFilter(postsArray, this, searchTerms[i]);
}
});
});
}
}
function forumSearch()
{
var start = performance.now();
$('.list_row_odd').remove();
var endpage;
if ($("#endpage_box").val())
{
endpage = parseInt($("#endpage_box").val());
}
else
{
endpage = FindLastPageNumber();
}
var startpage;
if ($("#startpage_box").val())
{
startpage = parseInt($("#startpage_box").val());
}
else
{
startpage = 1;
}
if (endpage > startpage + 500)
{
endpage = startpage + 500;
}
var postsPerPage = 20;
var currentPostsOnPage = 0;
var currentPage = 1;
var selectedPage = 1;
var postsArray = {};
var searchTerms = splitSearchTerms();
$(document).off('ajaxStop');
$( document ).ajaxStop(function() {
if (!jQuery.isEmptyObject(postsArray))
{
var postsKeys = Object.keys(postsArray);
postsKeys.sort(function (a, b)
{
var dateA = parseDate($(postsArray[a]).find(".last_update").text());
var dateB = parseDate($(postsArray[b]).find(".last_update").text());
return dateB - dateA;
});
for (var i = 0; i < postsKeys.length; i++)
{
var k = postsKeys[i];
var post = postsArray[k];
if (!$(".page" + currentPage + "posts").length)
{
var $newdiv = $( "" );
$( "#t_norm > .list_row_h" ).append($newdiv);
}
$(post).appendTo(".page" + currentPage + "posts");
currentPostsOnPage++;
if (currentPostsOnPage > postsPerPage)
{
currentPostsOnPage = 0;
currentPage++;
}
}
var end = performance.now();
var timeTaken = Math.round((end - start) / 1000);
var resultPost = getNumberOfResultsForum(postsKeys.length, timeTaken);
$(resultPost).prependTo( "#t_norm > .list_row_h" );
}
else
{
var noResultPost = getNoResultForum();
$(noResultPost).appendTo( "#t_norm > .list_row_h" );
}
});
for (var i = startpage; i < endpage + 1; i++)
{
debugLogger.debugLog('Page Number: ' + i);
var fullURL = window.location.pathname;
var threadURL = RemoveLastDirIfLonger(fullURL, 3) + "/page" + i;
ajaxQueue.add( threadURL, function( data ) {
var $page = $(data);
$page.find('.list_row_odd').each(function( index ) {
for (var i = 0; i < searchTerms.length; i++)
{
debugLogger.debugLog('Search Term: ' + searchTerms[i]);
forumFilter(postsArray, this, searchTerms[i]);
}
});
});
}
}
function threadSearchWithinResults()
{
var start = performance.now();
var postsPerPage = 20;
var currentPostsOnPage = 0;
var currentPage = 1;
var selectedPage = 1;
var postsArray = {};
var searchTerms = splitSearchTerms();
$(document).off('ajaxStop');
$('.big_post_h').parents('.spot_h').each(function( index ) {
for (var i = 0; i < searchTerms.length; i++)
{
threadFilter(postsArray, this, searchTerms[i]);
}
});
$('.spot_h').remove();
if (!jQuery.isEmptyObject(postsArray))
{
var postsKeys = Object.keys(postsArray);
postsKeys.sort(naturalCompare);
for (var i = 0; i < postsKeys.length; i++)
{
var k = postsKeys[i];
var post = postsArray[k];
if (!$(".page" + currentPage + "posts").length)
{
var $newdiv = $( "" )
$( ".list_h" ).append($newdiv)
}
$(post).appendTo(".page" + currentPage + "posts");
currentPostsOnPage++;
if (currentPostsOnPage > postsPerPage)
{
currentPostsOnPage = 0;
currentPage++;
}
}
var end = performance.now();
var timeTaken = Math.round((end - start) / 1000);
var post = getNumberOfResultsThread(postsKeys.length, timeTaken);
$(post).prependTo( ".list_h" );
}
else
{
var post = getNoResultThread();
$(post).appendTo( ".list_h" );
}
if ($(".quick_post").length)
{
$(".list_h").append($(".quick_post"));
}
}
function forumSearchWithinResults()
{
var start = performance.now();
var postsPerPage = 20;
var currentPostsOnPage = 0;
var currentPage = 1;
var selectedPage = 1;
var postsArray = {};
var searchTerms = splitSearchTerms();
$(document).off('ajaxStop');
$('.list_row_odd').each(function( index ) {
for (var i = 0; i < searchTerms.length; i++)
{
forumFilter(postsArray, this, searchTerms[i]);
}
});
$('.list_row_odd').remove();
if (!jQuery.isEmptyObject(postsArray))
{
var postsKeys = Object.keys(postsArray);
postsKeys.sort(function (a, b)
{
var dateA = parseDate($(postsArray[a]).find(".last_update").text());
var dateB = parseDate($(postsArray[b]).find(".last_update").text());
return dateB - dateA;
});
for (var i = 0; i < postsKeys.length; i++)
{
var k = postsKeys[i];
var post = postsArray[k];
if (!$(".page" + currentPage + "posts").length)
{
var $newdiv = $( "" );
$( "#t_norm > .list_row_h" ).append($newdiv);
}
$(post).appendTo(".page" + currentPage + "posts");
currentPostsOnPage++;
if (currentPostsOnPage > postsPerPage)
{
currentPostsOnPage = 0;
currentPage++;
}
}
var end = performance.now();
var timeTaken = Math.round((end - start) / 1000);
var resultPost = getNumberOfResultsForum(postsKeys.length, timeTaken);
$(resultPost).prependTo( "#t_norm > .list_row_h" );
}
else
{
var noResultPost = getNoResultForum();
$(noResultPost).appendTo( "#t_norm > .list_row_h" );
}
}
function threadReplies()
{
$('.spot_h').remove();
var endpage;
if ($("#endpage_box").val())
{
endpage = parseInt($("#endpage_box").val());
}
else
{
endpage = FindLastPageNumber();
}
var startpage;
if ($("#startpage_box").val())
{
startpage = parseInt($("#startpage_box").val());
}
else
{
startpage = 1;
}
if (endpage > startpage + 500)
{
endpage = startpage + 500;
}
var postsPerPage = 20;
var currentPostsOnPage = 0;
var currentPage = 1;
var selectedPage = 1;
var postsArray = {};
$(document).off('ajaxStop');
$( document ).ajaxStop(function() {
if (!jQuery.isEmptyObject(postsArray))
{
var postsKeys = Object.keys(postsArray);
postsKeys.sort(naturalCompare);
for (var i = 0; i < postsKeys.length; i++)
{
var k = postsKeys[i];
var post = postsArray[k];
if (!$(".page" + currentPage + "posts").length)
{
var $newdiv = $( "" )
$( ".list_h" ).append($newdiv)
}
$(post).appendTo(".page" + currentPage + "posts");
currentPostsOnPage++;
if (currentPostsOnPage > postsPerPage)
{
currentPostsOnPage = 0;
currentPage++;
}
}
}
else
{
var post = getNoResultThread();
$(post).appendTo( ".list_h" );
}
if ($(".quick_post").length)
{
$(".list_h").append($(".quick_post"));
}
});
for (var i = startpage; i < endpage + 1; i++)
{
var fullURL = window.location.pathname;
var threadURL = RemoveLastDirIfLonger(fullURL, 4) + "/page" + i;
ajaxQueue.add( threadURL, function( data ) {
var $page = $(data);
$page.find('.big_post_h').parents('.spot_h').each(function( index ) {
if ($(this).find('.r_t_y').length)
{
postsArray[this.id] = this;
}
});
});
}
}
function forumReplies()
{
window.location.href = "http://www.gog.com/forum/myrecentposts";
}
function parseDate(dateString)
{
if (dateString.indexOf("now") >= 0)
{
return Date.now();
}
else if (dateString.indexOf("min") >= 0)
{
var mins = StripNonNumbersParse(dateString) * 60000;
return new Date(Date.now() - mins);
}
else if (dateString.indexOf("hrs") >= 0)
{
var hrs = StripNonNumbersParse(dateString) * 3600000;
return new Date(Date.now() - hrs);
}
else if (dateString.indexOf("Yesterday") >= 0)
{
var today = new Date();
var yesterday = new Date(today);
yesterday.setDate(today.getDate() - 1);
return yesterday;
}
else if (dateString.indexOf("days") >= 0)
{
var days = StripNonNumbersParse(dateString)
var today = new Date();
var date = new Date(today);
date.setDate(today.getDate() - days);
return date;
}
else
{
var aString = dateString.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g,"");
var strArray = aString.split(" ");
var month = months[strArray[0]];
var day = strArray[1];
var year = strArray[2];
return new Date(year, month, day);
}
}
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
addGlobalStyle('#gogSearchBox { background-color: #474747; padding: 15px 17px 0 10px; height: 45px; color: #a1a1a1; font-size: 12px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; -khtml-border-radius: 10px; border-bottom: #aaa 1px solid; border-top: #aaa 1px solid; margin-bottom: 10px;}');
addGlobalStyle('div.nav_bar_top_h { width: 950px; height: 141px; margin: 0 23px 0 23px; padding: 28px 0 0 0; position: relative;}');
addGlobalStyle('#filter_go { display: inline; float: right; background: #aaa; color: #ececec; padding: 4px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 5px; -khtml-border-radius: 10px; }');
addGlobalStyle('#find_replies_button { display: inline; position: absolute; right: 60px; margin: 2px; }');
addGlobalStyle('.highlight { background-color: #FFFF88; color: #000; }');
var $filterbar = $( '' );
$( ".nav_bar_top_h" ).prepend($filterbar);
if (checkIsForumPage())
{
$( "#filter_go" ).on("click", forumSearchBase);
$('#search_text_box, #endpage_box, #startpage_box').bind("enterKey", forumSearchBase);
$('#search_text_box, #endpage_box, #startpage_box').keyup(function(e){
if(e.keyCode == 13)
{
$(this).trigger("enterKey");
}
});
$( "#find_replies_button" ).on("click", forumReplies);
}
else
{
$( "#filter_go" ).on("click", threadSearchBase);
$('#search_text_box, #endpage_box, #startpage_box').bind("enterKey", threadSearchBase);
$('#search_text_box, #endpage_box, #startpage_box').keyup(function(e){
if(e.keyCode == 13)
{
$(this).trigger("enterKey");
}
});
$( "#find_replies_button" ).on("click", threadReplies);
}