RightMove blacklist properties

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

当前为 2014-10-18 提交的版本,查看 最新版本

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

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

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

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

您需要先安装一款用户脚本管理器扩展,例如 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();