- // ==UserScript==
- // @name Flatmates Plus
- // @namespace http://www.facebook.com/Tophness
- // @include https://flatmates.com.au/share-houses/*
- // @require https://gf.qytechs.cn/scripts/6217-gm-config/code/GM_config.js?version=23537
- // @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_log
- // @grant GM_registerMenuCommand
- // @version 1.1
- // @noframes
- // @run-at document-idle
- // @description Adds blacklist and whitelist filters to the FlatMates website, gets rid of early bird listings
- // ==/UserScript==
- GM_config.init('Flatmates Plus Options', {
- 'filters':
- {
- 'label': 'Location Filters',
- 'type': 'text',
- 'default': 'blacktown'
- },
- 'blacklist':
- {
- 'label': 'Descriptions Blacklist',
- 'type': 'text',
- 'default': 'Not included in rent'
- },
- 'whitelist':
- {
- 'label': 'Descriprions Whitelist',
- 'type': 'text',
- 'default': 'unlimited-internet'
- },
- 'homeaddress':
- {
- 'label': 'Work Address (For distance calculating)',
- 'type': 'text',
- 'default': 'Central Station, Sydney, NSW'
- }
- });
- function opengmcf() {
- GM_config.open();
- }
- GM_registerMenuCommand('Flatmates Plus Options', opengmcf);
- var stream = document.querySelector('div[data-react-class^="ListingResults"]');
- var whitelist = GM_config.get('whitelist');
- var blacklist = GM_config.get('blacklist');
- if (whitelist.length != 0) {
- whitelist = whitelist.split(',');
- }
- if (blacklist.length != 0) {
- blacklist = blacklist.split(',');
- }
- function searchProp(id, listingel) {
- if (stream) {
- var arr = JSON.parse(stream.getAttribute('data-react-props')).listings;
- var findid = arr.indexOf('"id":' + id);
- if (findid != - 1) {
- var listing = arr.substring(findid);
- listing = listing.substring(0, arr.indexOf('},{'));
- return findProp(listing, listingel);
- }
- else {
- ajaxsubmit('https://flatmates.com.au/P' + id, id, listingel);
- }
- }
- }
- function ajaxsubmit(url, id, listingel)
- {
- var mygetrequest = new ajaxRequest();
- mygetrequest.onreadystatechange = function () {
- if (mygetrequest.readyState == 4) {
- if (mygetrequest.status == 200) {
- findPropAjax(mygetrequest.responseText, id, listingel);
- }
- }
- }
- mygetrequest.open('GET', url, true);
- mygetrequest.send(null);
- }
- function findPropAjax(arr, id, listingel) {
- var findid = arr.indexOf('PropertyListing');
- if (findid != - 1) {
- //var listing = arr.substring(findid);
- //listing = listing.substring(0, arr.indexOf('modal-placeholder'));
- //findProp(listing, prop);
- findProp(unescapeHtml(arr.substring(findid)), listingel);
- }
- }
- function findProp(listing, listingel) {
- if (whitelist.length > 0) {
- for (var i6 = 0; i6 < whitelist.length; i6++) {
- if (listing.indexOf(whitelist[i6]) == -1) {
- listingel.parentNode.removeChild(listingel);
- }
- }
- }
- if (blacklist.length > 0) {
- for (var i7 = 0; i7 < blacklist.length; i7++) {
- if (listing.indexOf(blacklist[i7]) != -1) {
- listingel.parentNode.removeChild(listingel);
- }
- }
- }
- }
- function ajaxRequest() {
- var activexmodes = [
- 'Msxml2.XMLHTTP',
- 'Microsoft.XMLHTTP'
- ];
- if (window.ActiveXObject) {
- for (var i = 0; i < activexmodes.length; i++) {
- try {
- return new ActiveXObject(activexmodes[i]);
- }
- catch (e) {
- }
- }
- }
- else if (window.XMLHttpRequest)
- return new XMLHttpRequest();
- else
- return false;
- }
- function unescapeHtml(safe) {
- return safe.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, '\'');
- }
- //function unescapeHtml(safe) {
- // return $('<div />').html(safe).text();
- //}
- var i = 0;
- function filter(listingel) {
- i++;
- var id = listingel.getElementsByClassName('link');
- if (id.length != 0) {
- id = id[0].href.toString();
- id = id.substring(id.indexOf('/P') + 2);
- searchProp(id, listingel);
- }
- var earlybird = listingel.getElementsByClassName('home-listing-contact');
- if (earlybird.length != 0) {
- if (earlybird[0].innerText.indexOf('Free to Message') == -1) {
- listingel.parentNode.removeChild(listingel);
- }
- }
- var title = listingel.getElementsByClassName('listing-head');
- if (title.length != 0) {
- title = title[0].innerText.toString().toLowerCase();
- var filters = GM_config.get('filters');
- if (filters.length != 0) {
- filters = filters.split(',');
- for (var i2 = 0; i2 < filters.length; i2++) {
- if (title.indexOf(filters[i2].toLowerCase()) != -1) {
- listingel.parentNode.removeChild(listingel);
- }
- }
- }
- listingel.id = 'listing' + i;
- gdist(listingel.id, title);
- }
- }
- function gdist(listingel, title) {
- var etitle = document.createElement('div');
- etitle.innerHTML = title;
- etitle.id = 'etitle';
- etitle.style.visibility = 'hidden';
- var elistingel = document.createElement('div');
- elistingel.innerHTML = listingel;
- elistingel.id = 'elistingel';
- elistingel.style.visibility = 'hidden';
- var ehomeaddress = document.createElement('div');
- ehomeaddress.innerHTML = GM_config.get('homeaddress');
- ehomeaddress.id = 'ehomeaddress';
- ehomeaddress.style.visibility = 'hidden';
- document.body.appendChild(etitle);
- document.body.appendChild(elistingel);
- document.body.appendChild(ehomeaddress);
- exec(function () {
- var el = document.getElementById('elistingel').innerHTML.toString();
- var or = document.getElementById('ehomeaddress').innerHTML.toString();
- var des = document.getElementById('etitle').innerHTML.toString();
- var TransitOptions = {
- modes: [
- 'TRAIN',
- 'BUS'
- ]
- }
- var service = new google.maps.DistanceMatrixService;
- service.getDistanceMatrix({
- origins: [
- or
- ],
- destinations: [
- des
- ],
- travelMode: 'TRANSIT',
- transitOptions: TransitOptions,
- unitSystem: google.maps.UnitSystem.METRIC
- }, function (response, status) {
- if (status !== 'OK') {
- console.log('Error was: ' + status);
- } else {
- var originList = response.originAddresses;
- var destinationList = response.destinationAddresses;
- for (var i = 0; i < originList.length; i++) {
- var results = response.rows[i].elements;
- for (var j = 0; j < results.length; j++) {
- var newdiv = document.createElement('div');
- newdiv.innerHTML += results[j].duration.text + ' to ' + originList[i] + '<br>';
- document.getElementById(el).appendChild(newdiv);
- }
- }
- }
- });
- });
- document.body.removeChild(etitle);
- document.body.removeChild(elistingel);
- document.body.removeChild(ehomeaddress);
- }
- function exec(fn) {
- var script = document.createElement('script');
- script.setAttribute('type', 'application/javascript');
- script.textContent = '(' + fn + ')();';
- document.body.appendChild(script); // run the script
- document.body.removeChild(script); // clean up
- }
- function removeit(id) {
- if (document.getElementById(id)) {
- document.getElementById(id).parentNode.removeChild(document.getElementById(id));
- }
- }
- function timefilter(listingel) {
- setTimeout(function () {
- filter(listingel[0]);
- }, 200);
- }
- waitForKeyElements('div.content-column', timefilter);
- function waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
- var targetNodes,
- btargetsFound;
- if (typeof iframeSelector == 'undefined')
- targetNodes = $(selectorTxt);
- else
- targetNodes = $(iframeSelector).contents().find(selectorTxt);
- if (targetNodes && targetNodes.length > 0) {
- btargetsFound = true;
- /*--- Found target node(s). Go through each and act if they
- are new.
- */
- targetNodes.each(function () {
- var jThis = $(this);
- var alreadyFound = jThis.data('alreadyFound') || false;
- if (!alreadyFound) {
- //--- Call the payload function.
- var cancelFound = actionFunction(jThis);
- if (cancelFound)
- btargetsFound = false;
- else
- jThis.data('alreadyFound', true);
- }
- });
- }
- else {
- btargetsFound = false;
- } //--- Get the timer-control variable for this selector.
-
- var controlObj = waitForKeyElements.controlObj || {
- };
- var controlKey = selectorTxt.replace(/[^\w]/g, '_');
- var timeControl = controlObj[controlKey];
- //--- Now set or clear the timer as appropriate.
- if (btargetsFound && bWaitOnce && timeControl) {
- //--- The only condition where we need to clear the timer.
- clearInterval(timeControl);
- delete controlObj[controlKey]
- }
- else {
- //--- Set a timer, if needed.
- if (!timeControl) {
- timeControl = setInterval(function () {
- waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector
- );
- }, 300
- );
- controlObj[controlKey] = timeControl;
- }
- }
- waitForKeyElements.controlObj = controlObj;
- }