NeoGAF - Hide Forum Threads Mobile

Hides threads in Vbulletin boards.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name NeoGAF - Hide Forum Threads Mobile
// @namespace ThreadFilter
// @description Hides threads in Vbulletin boards.
// @require http://code.jquery.com/jquery-latest.min.js
// @require http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js
// @include http://m.neogaf.com/*
// @version 0.2
// ==/UserScript==

var sThreadTitle;
nShownCount = 0;
nOriginalPageCount = GetNextPage();
nPageCount = nOriginalPageCount;
nAdditionalThreadCount = 0;

$(document).ready(function() {
    IgnoreList = GetListFromLocalStorage('IgnoreList');
    
    if (IsMobile())
        {
         //$('#jumpToLogIn').after("<div style='display:none;'><select id='ThreadFilter' onchange='UpdateThreads();'><option value='Unignored' selected='true'>Show Unignored Only</option><option value='Ignored'>Show Ignored Only</option><option value='All'>Show All</option></select></div>");
    	 $('#jumpToLogIn').after("<a class='jumpTo' id='ShowUnignored'><span>Show Unignored Only</span></a><a class='jumpTo'  id='ShowIgnored'><span>Show Ignored Only</span></a><a  class='jumpTo'  id='ShowAll'><span>Show All</span></a>");
    	 $('#ShowUnignored').click(function() { localStorage.setItem('ThreadFilter','Unignored'); UpdateThreads();});
    	 $('#ShowIgnored').click(function() { localStorage.setItem('ThreadFilter','Ignored'); UpdateThreads();});
    	 $('#ShowAll').click(function() { localStorage.setItem('ThreadFilter','All'); UpdateThreads();});
            
    	   $(".listItemAnchor").each(function( index ) {
        nThreadID = $(this).attr('href').replace('showthread.php?t=','');
    
	    $(this).attr('id',nThreadID);
      	$(this).parent().on("swiperight",{param1: nThreadID, param2: 'IgnoreList', param3: UpdateThreads},IgnoreItem);
    	$(this).parent().on("swipeleft",{param1: nThreadID, param2: 'IgnoreList', param3: UpdateThreads},IgnoreItem);
        //$(this).parent().on("swiperight",SwipeHandler);
        //$(this).parent().on("swipeleft",SwipeHandler);
        
        //return;
        //$(this).append("<br /><a id='RemoveThread" + nThreadID + "' href=javascript:IgnoreThread('" + nThreadID + "');>" + sIgnoreText + "</a>");
		});
    
    
    	//$('div.listItem').on("swiperight",function (event) { IgnoreThread($(this).find('.listItemAnchor').attr('href').replace('showthread.php?t=',''));});
    	//$('div.listItem').on("swipeleft",function (event) { IgnoreThread($(this).find('.listItemAnchor').attr('href').replace('showthread.php?t=',''));});
    
    	//$('div.listItem').on("swiperight",{param1: $(this).find('.listItemAnchor').attr('href').replace('showthread.php?t=',''), param2: 'IgnoreList', param3: UpdateThreads},IgnoreItem);
    	}
    else
    {
    var sHideThreadStyle = 'margin-left: -11px;  margin-top: -38px;';
    var sHideThreadStyle2 = 'padding-left:10px; margin-left:-45px;  margin-top:-2px;';
    
    var sRemoveStyle = '<style>';
    sRemoveStyle += '.threadbit > td > a[id^="RemoveThread"]:before {  content: "x";  font-size: 15pt;}';
    sRemoveStyle += '.threadbit > td > a[id^="RemoveThread"] {  position: absolute !important;  ' + (navigator.userAgent.search("Chrome") >= 0 ? sHideThreadStyle : sHideThreadStyle2) + '  font-size: 0pt;  visibility: hidden !important;}';
    sRemoveStyle += '.threadbit > td:hover > a[id^="RemoveThread"] {  visibility: visible !important; } ';
    
    sRemoveStyle += '.threadbit > td > a[id^="RemoveUser"]:before {  content: "x";  font-size: 15pt;} ';
    sRemoveStyle += '.threadbit > td > a[id^="RemoveUser"] {  position: absolute !important;   padding-left:10px; margin-left:-25px;  margin-top:-2px;   font-size: 0pt;  visibility: hidden !important;} ';
    sRemoveStyle += '.threadbit > td:hover > a[id^="RemoveUser"] {  visibility: visible !important; } ';
    sRemoveStyle += '</style>';
    
    $("body").append("<link rel='stylesheet' href='//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css'>");
    $("body").append(sRemoveStyle);        
    
  	var sControlPanel = "<div id='tabs' style='display:none;'>";
  	sControlPanel += "<ul>";
  	sControlPanel += "<li><a href='#tabs-1'>Word Filter</a></li>";
    sControlPanel += "<li><a href='#tabs-2'>Ignored Threads</a></li>"; 
    sControlPanel += "<li><a href='#tabs-3'>Ignored Users</a></li>"; 
    sControlPanel += "<li><a href='#tabs-4'>Settings</a></li>";
    sControlPanel += "</ul>";
  	sControlPanel += "<div id='tabs-1'>";
    sControlPanel += CreateWordFilter();
    sControlPanel += "</div>";
    sControlPanel += "<div id='tabs-2'>";
    sControlPanel += "<div id='RecentlyIgnoredListing'></div>";
    sControlPanel += "</div>";
    sControlPanel += "<div id='tabs-3'>";
    sControlPanel += CreateIgnoredUserTab();
    sControlPanel += "</div>";
  	sControlPanel += "<div id='tabs-4'>";
    sControlPanel += CreateSettingsOptions();
    sControlPanel += "</div>";
	sControlPanel += "</div>";

    $('.large-button:first').parent().append("<select id='ThreadFilter'><option value='Unignored' selected='true'>Show Unignored Only</option><option value='Ignored'>Show Ignored Only</option><option value='All'>Show All</option></select>&nbsp;");
	$('.large-button:first').parent().append(sControlPanel);
    $('.large-button:first').parent().append($('<a id="OpenFilterCP" class="large-button submit">Filter CP</a>'));

	    $('#ThreadFilter').change(UpdateThreads); 
    $('#OpenFilterCP').click(OpenFilterCP);
	$('#AddWordButton').click(AddToWordFilter);
    $('#AddIgnoredUserButton').click(AddToIgnoredUserList);
    $('#SearchAdditional').change(function() { localStorage.setItem('SearchAdditional', this.checked); }); 
	
	$("td[id*='td_threadstatusicon_']").each(function( index,value ) { AddHideLink(this);});

    document.getElementById("ThreadFilter").value = CheckThreadFilterValue(localStorage.getItem("ThreadFilter"));
    
    if (localStorage.getItem("SearchAdditional"))
        $("#SearchAdditional").attr("checked", localStorage.getItem("SearchAdditional") == "true" ? true : false);
    else
        localStorage.setItem("SearchAdditional", "true");

    }

	UpdateThreads();

});

function UpdateThreads()
    {
      nShownCount = 0;
        
      if (IsMobile())
        {
            $(".listItemAnchor").each(function(index) 
        	{
    		 nThreadID = $(this).attr('href').replace('showthread.php?t=','');
    		 //sThreadTitle = $(this).find('.listItemTitle')[0].text();
             console.log(sThreadTitle);
                
             if (CheckThreadHidden(nThreadID,sThreadTitle))
                 $(this).hide();
             else
             {
                 nShownCount++;
                 $(this).show();
             }
    		});
        }
        else
        {
            $('#ThreadFilter').blur();
          	localStorage.setItem('ThreadFilter',document.getElementById("ThreadFilter").value);
      
            $("td[id*=td_threadstatusicon_]").each(function(index) 
        	{
    		 nThreadID = $(this).attr('id').replace('td_threadstatusicon_','');
    		 sThreadTitle = $('#thread_title_' + nThreadID).text();
             sUserID = $(this).siblings().find('a[href*="member.php?u="]')[0].href.replace("http://www.neogaf.com/forum/member.php?u=","");
             
             if (CheckThreadHidden(nThreadID,sThreadTitle,sUserID))
                 $(this).parent().hide();
             else
             {
                 nShownCount++;
                 $(this).parent().show();
             }
	    	});
            
            if (localStorage.getItem("SearchAdditional") == "true")
        	{
            	GetAdditionalThreads();
        	}
        }
        
} 



function GetAdditionalThreads()
{
    if (nShownCount < 40 && nPageCount <= nOriginalPageCount + 5)
    {
        var jqxhr = $.get(window.location.href + "&order=desc&page=" + nPageCount, ProcessAdditionalThread)
    	.done(function() {
        nPageCount ++;
        
        GetAdditionalThreads();
  		});
    }
}

function ProcessAdditionalThread(data)
{
	    var lastThread = $("td[id*='td_threadstatusicon_']").last();
    
        $(data).find("td[id*='td_threadstatusicon_']").each(function(index, value) 
       	{
            nThreadID = $(this).attr('id').replace('td_threadstatusicon_','');
        	sThreadTitle = $(data).find('#thread_title_' + nThreadID).text();
        	sUserID = $(this).siblings().find('a[href*="member.php?u="]')[0].href.replace("http://www.neogaf.com/forum/member.php?u=","");
            
        	nAdditionalThreadCount = nAdditionalThreadCount + 1;
        	
        	if (!CheckThreadHidden(nThreadID, sThreadTitle, sUserID) && nShownCount < 40)
            	{
    	            $(lastThread).parent().after($(this).parent().clone().wrap('<p>').parent().html());
    	    		AddHideLink($("td[id*=td_threadstatusicon_" + nThreadID + "]"));    	
            		nShownCount++;
            	}
           
    	});
}

function CheckThreadFilterValue(sFilterValue)
{
    if (sFilterValue != "Unignored" && sFilterValue != "Ignored" && sFilterValue != "All")
        sFilterValue = "Unignored";
    
    return sFilterValue;
}

function IgnoreItem(event) { 
    var nCurrentID = event.data.param1;
    var sList = event.data.param2;
    var addItem = {};
    addItem.ID = nCurrentID;
    
    if (sList == "IgnoreList")
        addItem.Title = $('#thread_title_' + nCurrentID).text();
    else if (sList == "IgnoredUserList")
        addItem.Username = $('a[href="member.php?u=' + nCurrentID + '"]').attr("title");
    
    CurrentList = GetListFromLocalStorage(sList);
    nFoundIndex = containsObject(nCurrentID,CurrentList);
    
    if (nFoundIndex == -1) 
    	CurrentList.push(addItem); 
    else 
    	CurrentList.splice(nFoundIndex,1); 
        
    
	localStorage.setItem(sList, JSON.stringify(CurrentList));
    
    if (event.data.param3)
    	event.data.param3();
    
    return 0;
}

function AddHideLink(currentThread)
{
    	nThreadID = $(currentThread).attr('id').replace('td_threadstatusicon_','');
        MemberLink = $(currentThread).siblings().find('a[href*="member.php?u="]')[0];
    	nUserID = MemberLink.href.replace("http://www.neogaf.com/forum/member.php?u=","");
    
    	var RemoveUserLinks = $('a[id*=RemoveUser' + nUserID + ']').toArray();
    
    	sUserIDReference = (RemoveUserLinks.length > 0) ? nUserID + RemoveUserLinks.length : nUserID;
    
    	//if (RemoveUserLinks.length > 0)
          //  console.log('multiple references to ' + nUserID);
    
        $(MemberLink).before("<a id='RemoveUser" + sUserIDReference + "'>Remove User</a>");
    	$('#RemoveUser' + sUserIDReference).click({param1: nUserID, param2: 'IgnoredUserList', param3: UpdateThreads}, IgnoreItem); 
	
    	if ($(currentThread).has("a[id*='RemoveThread" + nThreadID + "']").length == 0)
	    {
    	    $('<a></a>', {
	  	    id: "RemoveThread" + nThreadID
			}).appendTo(currentThread);
        
    	    $('#RemoveThread' + nThreadID).click({param1: nThreadID, param2: 'IgnoreList', param3: UpdateThreads}, IgnoreItem); 
    	}
}


function CheckThreadHidden(nThreadID, sThreadTitle,sUserID)
{
    		var sThreadFilterVal = CheckThreadFilterValue(localStorage.getItem("ThreadFilter"));
    		var bWordFilterApplies = false;
    		var bUserFilterApplies = false;
    
    		IgnoreList = GetListFromLocalStorage('IgnoreList');
    		nThreadIndex = containsObject(nThreadID,IgnoreList);
    		
    		var bThreadIgnored = (nThreadIndex == -1) ? false : true;
    
             if (bThreadIgnored && sThreadFilterVal == 'Unignored' )
             {
                 return true;
             }
             else
             {
                 bWordFilterApplies = WordFilterApplies(sThreadTitle);
                 
                 if (bWordFilterApplies && sThreadFilterVal == 'Unignored')
             		{
                 		return true;
             		}
                else 
                 	{
                        bUserFilterApplies = containsObject(sUserID,GetListFromLocalStorage('IgnoredUserList')) != -1 ? true : false;   
                      
                      if (bUserFilterApplies && sThreadFilterVal == 'Unignored')
             			{
                            return true;
             			}
                     else if (!bThreadIgnored && !bWordFilterApplies && !bUserFilterApplies && sThreadFilterVal == 'Ignored')
             			{
                 			return true;
             			}
                 	}
             	
             }
    
    return false;
}

function WordFilterApplies(sThreadTitle)
{
    var bFilterApplies = false;
	WordList = GetListFromLocalStorage('WordList');
            
    jQuery.each(WordList,function (index)
	{
        if (this.Type == 'plaintext')
		{
			sFragments = this.Word.split('*');
		
			bMatchesPattern = true;
			jQuery.each(sFragments, function(index)
			{
				if (sThreadTitle.toLowerCase().indexOf(this.toLowerCase()) == -1)
				{
					bMatchesPattern = false;
				}
			});
		
			if (bMatchesPattern === true)
            	{
                    bFilterApplies = true;
					return 0;
            	}
		}
		else if (this.Type == 'regularexpression')
		{
			sRegExMatches = sThreadTitle.match(this.Word);
			
			if (sRegExMatches)
            {
                bFilterApplies = true;
                return 0;
            }
		}
    });
	
    return bFilterApplies;
 }   
 

function AddToWordFilter(event) {
    newWord = $('#AddWordText').val();

    var addWord = {};
    addWord.Word = newWord;
    addWord.Type = $('input[name*=AddWordType]:checked').val();

    WordList = GetListFromLocalStorage('WordList');
    nWordIndex = containsObject(addWord.Word, WordList);

    if (nWordIndex == -1) {

        WordList.push(addWord);
    }

    localStorage.setItem('WordList', JSON.stringify(WordList));
    $('#AddWordText').val('');
    
    UpdateListing('WordListing', 'WordList');
}

function AddToIgnoredUserList(event) {
    newIgnoredUserText = $('#AddIgnoredUserText').val();

    var addIgnoredUser = {};
    addIgnoredUser.Username = newIgnoredUser;

    IgnoredUserList = GetListFromLocalStorage('IgnoredUserList');
    nIgnoredUserIndex = containsObject(addIgnoredUser.Username, IgnoredUserList);

    if (nIgnoredUserIndex == -1) {
        IgnoredUserList.push(addIgnoredUser);
    }

    localStorage.setItem('IgnoredUserList', JSON.stringify(IgnoredUserList));
    $('#AddIgnoredUserText').val('');
    
    UpdateListing('IgnoredUserListing', 'IgnoredUserList');
}

function CreateWordFilter()
{
    sWordFilter = "<div id='WordFilter'>";
    sWordFilter += "<strong>Add New Word:</strong>&nbsp;<input id='AddWordText'><input type='button' id='AddWordButton' value='Add'><br /><input type='radio' name='AddWordType' value='plaintext' checked>Plain Text (* supported)<input type='radio' name='AddWordType' value='regularexpression'>Regular Expression<br /><br /><hr width='100%' color='black'><div id='WordListing'></div>";
    sWordFilter += "</div>";
    
    return sWordFilter;
}

function CreateIgnoredUserTab()
{
    sIgnoredUserTab = "<hr width='100%' color='black'><div id='IgnoredUserListing'></div>";
    
    return sIgnoredUserTab;
}

function CreateSettingsOptions()
{
    sCreateSettings = "<input type='checkbox' id='SearchAdditional' checked='true'>Search additional pages for threads</input>";
    
    return sCreateSettings;
}

function OpenFilterCP()
    {
    	UpdateListing('WordListing', 'WordList');
        UpdateListing('RecentlyIgnoredListing', 'IgnoreList');
        UpdateListing('IgnoredUserListing', 'IgnoredUserList');
        
        $('#tabs').tabs();
        $('#tabs').dialog();
        $('#tabs').bind('dialogclose', function(event) { UpdateThreads();});
    	$('#tabs').dialog({ title: "Filter Control Panel"});
        $("#tabs").dialog("option", "width", $("#tabs").dialog( "option", "width" ) + 200);
    }

function UpdateListing(sListingDiv, sListName)
{
	$('#' + sListingDiv).empty();
    CurrentList = GetListFromLocalStorage(sListName);
 
    if (sListName == 'IgnoreList' || sListName == 'IgnoredUserList')
        CurrentList.reverse();
    
    var sListingText;

	if (sListName == 'IgnoredUserList')    
    	sColumnHeadings = '<td align="center" width="300px"><strong>Username</strong></td>';
    else if (sListName == 'IgnoreList')
        sColumnHeadings = '<td align="center" width="300px"><strong>Title</strong></td>';
    else if (sListName == 'WordList')
        sColumnHeadings = '<td align="center" width="200px"><strong>Word</strong></td><td align="center" width="200px"><strong>Type</strong></td>';
    
    sListingText = '<table width="100%"><tr>' + sColumnHeadings + '<td>&nbsp;</td></tr>';
	
    
  	jQuery.each(CurrentList,function (index) 
	{	
        if (sListName == 'IgnoredUserList')    
        	sListingText += '<tr><td align="center"><div style="word-wrap:break-word;width:300px"><a href="http://www.neogaf.com/forum/member.php?u=' + this.ID + '" target="_blank">' + this.Username + '</a></div></td><td><input type=button id="RemoveIgnoredUser' + this.ID + '" value=Unignore /></td></tr>';
    	else if (sListName == 'IgnoreList')
        	sListingText += '<tr><td align="center"><div style="word-wrap:break-word;width:300px"><a href="http://www.neogaf.com/forum/showthread.php?t=' + this.ID + '" target="_blank">' + this.Title + '</a></div></td><td><input type=button id="RemoveRecentlyIgnored' + this.ID + '" value=Unignore /></td></tr>';
    	else if (sListName == 'WordList')
        	sListingText += '<tr><td align="center"><div style="word-wrap:break-word;width:200px">' + this.Word + '</div></td><td align="center">' + this.Type + '</td><td><input type=button id="RemoveWord' + index + '" value=Remove /></td></tr>';
    
	});
    
    sListingText += '</table>';
    
    $('#' + sListingDiv).append(sListingText);
        
    jQuery.each(CurrentList,function (index) 
                {
                    if (sListName == 'IgnoredUserList')    
                        $('#RemoveIgnoredUser' + this.ID).click({sCurrentID: this.ID, sListName: 'IgnoredUserList', sListDiv: 'IgnoredUserListing'}, RemoveIgnored);
			    	else if (sListName == 'IgnoreList')
        	            $('#RemoveRecentlyIgnored' + this.ID).click({sCurrentID: this.ID, sListName: 'IgnoreList', sListDiv: 'RecentlyIgnoredListing'}, RemoveIgnored);
    				else if (sListName == 'WordList')
                        $('#RemoveWord' + index).click({sCurrentID: this.Word, sListName: 'WordList', sListDiv: 'WordListing'}, RemoveIgnored);
                    
                });
}


function RemoveIgnored(event) { 
    IgnoreList = GetListFromLocalStorage(event.data.sListName);
    nCurrentIndex = containsObject(event.data.sCurrentID,IgnoreList);
    IgnoreList.splice(nCurrentIndex,1); 
    localStorage.setItem(event.data.sListName, JSON.stringify(IgnoreList));
    
    UpdateListing(event.data.sListDiv,event.data.sListName);
}

function containsObject(id, list) {
	    var i;
	    for (i = 0; i < list.length; i++) {
		    if (list[i].ID == id || list[i].Word == id) {
    			return i;
    			}
    		}

    	return -1;
	}

function GetNextPage()
{
    var str = window.location.href; 
	var res = str.match("page=[0-9]+");
    
    if (res)
        	return parseInt(res[0].replace("page=","")) + 1;
    else
            return 2;
                        
}

function GetListFromLocalStorage(sListName)
{
     return localStorage.getItem(sListName) ? JSON.parse(localStorage.getItem(sListName)) : [];
}

function IsMobile()
{
    return window.location.href.indexOf('m.neogaf') != -1 ? true : false;
}