RightMove blacklist properties

Allows user to mark properties on RightMove as 'never show again'

目前為 2014-10-18 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name           RightMove blacklist properties
// @description    Allows user to mark properties on RightMove as 'never show again'
// @include        http://www.rightmove.co.uk/*
// @version        1.0
// @namespace https://greasyfork.org/users/6137
// ==/UserScript==


//=====================================================================================
// HIDE PROPERTIES FROM LIST & GRID VIEW
//=====================================================================================

function HidePropertiesFromListView() {
	//
	// Check all the list items to remove blacklisted properties (hide them)
	//

	//Get all properties shown in list
	var properties = $('li.summary-list-item');
	//For each...
	var numremoved = 0;
	$.each(properties, function(i,v) {
		//Check ID
		var propertyId = /summary([0-9]{8})/.exec($(v).attr('id'))[1];
		if (GetBlacklistIds().indexOf(propertyId) != -1) {
			numremoved++;
			$(v).hide();
		}
	});
	//Message to user
	if (numremoved > 0) {
		if ($('#numberOfPropertiesRemoved').length == 0) {
			var b = $('<b></b>').attr('id', 'numberOfPropertiesRemoved').text(numremoved);
			var msg = $('<h4></h4>').attr('style', "color: red").append('Hiding ').append(b).append(' properties you never want to see again.');
			$('#numberOfProperties').after(msg);
		}
		$('#numberOfPropertiesRemoved').text(numremoved);
	}
    
    //UI to blacklist from list view (not on grid view)
    $.each(properties, function(i,v) {
        var propertyId = /summary([0-9]{8})/.exec($(v).attr('id'))[1];
        var propertyInfo = {
            link:  $('#prop'+propertyId).attr('href'),
            thumb: $('img', $('#prop'+propertyId)).attr('src'),
            title: $('strong', $('.displayaddress', v)).text()
        };
        var a = $('<a></a>').attr('id', 'link-blacklist-'+propertyId).attr('href', '#').text('Never show property again');
        a.addClass('priority2').attr('style', 'background-position: 0 -810px;');//add icon
        var li = $('<li></li>').append(a);
        a.click(function(e) {
            //Blacklist & immediately hide
            AddToBlacklist(propertyId, propertyInfo);
            $('#summary' + propertyId).hide();
        });
        $('ul', $('.moreinfo', v)).append(li);
    });
};

//=====================================================================================
// HIDE PROPERTIES FROM MAP VIEW
//=====================================================================================

function HidePropertiesFromMapView() {
    
	//
	// Override the markers function to remove blacklisted properties
	//
	var rmsr = RIGHTMOVE.namespace("RIGHTMOVE.MAPS.SEARCHRESULTS");
    if (rmsr.MapView) {
        rmsr.MapView.prototype.updateMarkers = overrideFunction(rmsr.MapView.prototype.updateMarkers, function(callback, a) {
            //Create a new list of properties removing all the ones that are blacklisted
            var trimmedlist = [];
            $.each(a.results.mappedProperties, function(i,v) {
                if (GetBlacklistIds().indexOf(v.id.toString()) == -1) {
                    trimmedlist.push(v);
                }
            });
            //Message to user
            var numremoved = -(trimmedlist.length - a.results.mappedProperties.length);
            if (numremoved > 0) {
                if ($('#numberOfPropertiesRemoved').length == 0) {
                    var b = $('<b></b>').attr('id', 'numberOfPropertiesRemoved').text(numremoved);
                    var msg = $('<h4></h4>').attr('style', "color: red").append('Hiding ').append(b).append(' properties you never want to see again.');
                    $('#numberOfProperties').after(msg);
                }
                $('#numberOfPropertiesRemoved').text(numremoved);
            }
            //And then call the original RightMove function
            a.results.mappedProperties = trimmedlist;
            return callback.call(this, a);
        });
        
        //
        // Override the addSummaries function to add UI control for blacklisting properties
        //
        rmsr.PropertyPopup.prototype.addSummaries = overrideFunction(rmsr.PropertyPopup.prototype.addSummaries, function(callback, a) {
            //Call real function first
            var ret = callback.call(this, a);
            //Then add additional buttons
            $.each( $('.propertysummary'), function(i, v) {
				var $v = $(v);
                var moreinfo = $('.moreinfo', $v);
                var propertyId = $(moreinfo).attr('id');
                var propertyInfo = {
                    link:  $('a.photo', $v).attr('href'),
                    thumb: $('img', $('a.photo', $v)).attr('src'),
                    title: $('h2.address', $v).text()
                };
                console.log(propertyId);
                var a = $('<a></a>').attr('id', 'link-blacklist-'+propertyId).attr('href', '#').text('Never show property again');
                var li = $('<li></li>').append(a);
                a.click(function(e) {
                    //Blacklist & immediately hide
                    AddToBlacklist(propertyId, propertyInfo);
                    $('#propertysummary-' + propertyId).hide();
                });
                $('ul', moreinfo).append(li);
            });
            return ret;
        });
    }
};


//=====================================================================================
// HIDE PROPERTY FROM DETAILS VIEW
//=====================================================================================

function HidePropertiesFromDetailsView() {
	var rhsPanel = $('#secondaryContent');
    if (rhsPanel.length > 0) {
        var propertyId = /property-([0-9]{8})[.]html/.exec($('meta[property="og:url"]').attr('content'))[1];
        var propertyInfo = {
            link:  $('meta[property="og:url"]').attr('content'),
            thumb: $('meta[property="og:image"]').attr('content'),
            title: $('address', $('.property-header-bedroom-and-price')).text()
        };
        console.log(propertyId);
        console.log(GetBlacklistIds());
        var saveProperty = $('.property-actions-save');
        var li = $('<li></li>').addClass('bdr-b');
        if (GetBlacklistIds().indexOf(propertyId) == -1) {
            var aBl = $('<a></a>').addClass('icon-before icon-house-pin-tiny button secondary').attr('href', '#').text('Never show property again');
            aBl.click(function(e) {
                //Blacklist & immediately hide
                AddToBlacklist(propertyId, propertyInfo);
                var p = $('<p></p>').attr('style', 'color: red').text('This property is hidden from results');
                aBl.after(p);
                aBl.hide();
            });
            li.append(aBl);
        } else {
            var p = $('<p></p>').attr('style', 'color: red').text('This property is hidden from results');
            li.append(p);
        }
        saveProperty.after(li);
    }
};

//=====================================================================================
// CONTROL BLACKLIST FROM MYRIGHTMOVE
//=====================================================================================

function AddBlacklistTabToMyRightmove() {
    
	var myrm = $('.myrightmovetopnav');
    if (myrm.length > 0) {
        var title = $('<a></a>').attr('href', '#').text('Blacklist');
        var tab = $('<li></li>').addClass('blacklist').append(title);
        $('.savedproperty').after(tab);
        title.click(function(e) {
            //Restore currently selected tab to a hyperlink
            var current = $('.selected', $('.myrightmovetopnav'));
            var currentLabel = $('strong', current);
            var link = '';
            if (current[0].className.indexOf('alerts') != -1)
                link = "/user/saved-searches/redirect.html";
            else if (current[0].className.indexOf('savedproperty') != -1)
                link = "/user/shortlist/redirect.html";
            else if (current[0].className.indexOf('drawnareas') != -1)
                link = "/user/drawn-areas.html";
            else if (current[0].className.indexOf('homeideas') != -1)
                link = "/user/home-ideas.html";
            else if (current[0].className.indexOf('mydetails') != -1)
                link = "/user/details.html";
            else
                link = "/user/investor.html";
            var newlink = $('<a></a>').attr('href', link).text(currentLabel.text());
			currentLabel.after(newlink);
            currentLabel.hide();
            current.removeClass('selected');
            //Make blacklist tab selected
            var blacklistTab = $('.blacklist');
            blacklistTab.addClass('selected');
            blacklistTab.append($('<strong></strong>').text($('a', blacklistTab).text()));
            $('a', blacklistTab).hide();
            //Clear or hide current page content
            $('#myrightmovesubtabs').hide();
           	var myrmc = $('#myrightmove');
            myrmc.empty();
            
            //
            // Add content
            //
            
            // Top bar (actions)
            var divTop = $('<div></div>').addClass('savedpropertycontainer clearfix').attr('id', 'savedpropertycontainer-top');
            var ulTop = $('<ul></ul>').attr('id', 'shortlistlinks');
            var aClearBl = $('<a></a>').addClass('priority2 deselect-all').attr('id', 'link-deselect-top').attr('href', '#').text('Clear Blacklist');
            var liClearBl = $('<li></li>');
            aClearBl.click(function(e) {
                //Handler to clear the blacklist
            	ClearBlacklist(); 
                $('.shortlist').empty();
            });
            divTop.append(ulTop.append(liClearBl.append(aClearBl)));
            myrmc.append(divTop);
            
            // Main body (properties)
            var list = $('<ol></ol>').addClass('shortlist').attr('id', 'summaries');
            $.each(GetBlacklistIds(), function(i,v) {
                var propertyInfo = GetBlacklistPropertyInfo(v);
                var item = $('<li></li>').addClass('summary-list-item');
                //Photo thumb
                var photoDiv1 = $('<div></div>').addClass('photoswrapper');
                var photoDiv2 = $('<div></div>').addClass('photos');
                var photoDiv3 = $('<div></div>').addClass('photoframe');
                var photoa = $('<a></a>').addClass('photo').attr('href', propertyInfo.link);
                var photoi = $('<img></img>').addClass('fixedPic').attr('src', propertyInfo.thumb);
        		photoDiv1.append(photoDiv2.append(photoDiv3.append(photoa.append(photoi))));
                //Actions
                var moreinfo = $('<div></div>').addClass('moreinfo');
                var aRestore = $('<a></a>').addClass('priority2').attr('style', 'background-position: 0 -731px;').attr('href', '#').text('Start showing this property again');
                aRestore.click(function(e) {
               		RemoveFromBlacklist(v);
                   	item.hide();
                });
                moreinfo.append($('<ul></ul>').append($('<li></li>').append(aRestore)));
                //All details
                var div1 = $('<div></div>').addClass('summarymaincontent');
                var div3 = $('<div></div>').addClass('details clearfix');
                var property = $('<a></a>').attr('href', propertyInfo.link).text(propertyInfo.title);
                item.append(div1.append(photoDiv1, div3.append(property).append(moreinfo)));
                list.append(item);
            });
            myrmc.append(list);
        });
    }
    
};


//=====================================================================================
// UTILS
//=====================================================================================

//
// Utility to override a function
//
function overrideFunction(originalfn, newfn) {
	var callback = originalfn
	return function(arg) {
		return newfn.call(this, callback, arg);
	};
};

//
// Utility to get blacklist property IDs only
//
function GetBlacklistIds() {
	return Object.keys(window.RMGM.BlacklistProperties);
};

//
// Utility to get the property info for a blacklisted property
function GetBlacklistPropertyInfo(propertyId) {
 	return window.RMGM.BlacklistProperties[propertyId];
};

//
//
// Utility to add a property to the blacklist & persist
//
function AddToBlacklist(propertyId, info) {
    console.log('about to blacklist ' + propertyId);
    console.log(info);

	//Add to blacklist    
    window.RMGM.BlacklistProperties[propertyId] = info;
    //Persist blacklist
    GM_setValue('RMGM_Blacklist', JSON.stringify(window.RMGM.BlacklistProperties));
};

//
// Clear the blacklist
//
function ClearBlacklist() {
	//Persist emtpy blacklist
    GM_setValue('RMGM_Blacklist', JSON.stringify({}));
};

//
// Remove 1 property from blacklist
//
function RemoveFromBlacklist(propertyId) {
	//Remove from blacklist    
    delete window.RMGM.BlacklistProperties[propertyId];
    //Persist blacklist
    GM_setValue('RMGM_Blacklist', JSON.stringify(window.RMGM.BlacklistProperties)); 
}
                
//=====================================================================================
// MAIN
//=====================================================================================

// Restore blacklist from storage
var blacklist = GM_getValue('RMGM_Blacklist');
if (blacklist == undefined) {
    blacklist = {};
} else {
	blacklist = JSON.parse(blacklist);
}
console.log('blacklist');
console.log(blacklist);

// Global settings/state for the RightMoveGreaseMonkey script
window.RMGM = {
	BlacklistProperties: blacklist			//stores the property blacklist
};

// Hide blacklisted properties
HidePropertiesFromListView();
HidePropertiesFromMapView();
HidePropertiesFromDetailsView();
// Add UI
AddBlacklistTabToMyRightmove();