/* TradeMe PhotoView //Shows thumbnails for all listings in TradeMe Version 0.35 (16 October 2014) Author: tbird81 / JimBob Baggins Licence: Will be free to edit as you choose, but i'd like to sort it out a bit first Gui: {333eb056-63c4-4e4b-9589-85a0d46d22b0} // Future improvements For me to think about: - DieNicelies for GM functions. - Convert to normal xmlhttprequest - More resilience Fix the pop ups since TradeMe's changes. // Risks Risks of using this software: - Your incoming traffic may slightly increase because more pictures are loaded. - This software may slow down the loading of TradeMe listings pages. - You might forget that other people don't have this script, so may under-promote your auction. - TradeMe may change its site without notice, rendering this script useless. Changes: - v0.35 Pop-ups in gallery view of clothing/home & living fixed. - v0.31 New asynchronous clothing not showing pop-ups. Had to finally use jquery... - v0.30 Obvious speed fix made. Property slowness should be eliminated. - v0.29 Big changes people! - v0.28.3 Chrome strikes again... - v0.28.2 Double D'oh! - v0.28.1 D'oh! - v0.28 Property and Flatmates were causing issues. Should be good now. - v0.27 Fixed my shennanigans. - v0.26 Fixed TradeMe shennanigans. - v0.25 Fixed clothing issue. - v0.23 Open homes bug fixed. - v0.22 Big Zooms! - v0.21 TM Server change... - v0.20 Chrome's GM_xmlhttpRequest issue bypassed (will probably be resolved by them in due course)... - v0.15 Stuffed up the href link on the image brought forward. - v0.08 Sorry about the vary slow update!!! Should work with new trademe. I'm not sure what I was doing wrong. - v0.07 Fixed snippets. - v0.06 Updated image folder. Prior versions will not work. - v0.05 Displays an enlarged image when the mouse hovers over a thumbnail - v0.04 Now adds snippets of information about items. - v0.04 Uses maxHeight and maxWidth styles to confine picture to 85x64px - v0.03 Remove an unneeded loop! - v0.02 Made the User-agent the same as the browser. - v0.02 Exits search for images once first thumbnail has been found . - v0.02 Exits search for images once matching icon is found. - v0.02 Changed some variable names to make more sense. */ // ==UserScript== // @name TradeMe PhotoView // @namespace http://www.girlza.com/ // @include http://www.trademe.co.nz/* // @description Show thumbnails for all listings in TradeMe // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js // @grant GM_addStyle // @grant metadata // @version 0.35 // @downloadURL none // ==/UserScript== //This allows you to turn off unnecessary features var showThumbs = true; var showSnippets = true; var showZoom = true; function addCustomSearchResult (jNode) { //Open Homes were bugging out var z = document.getElementsByClassName('openhomes') for (var i = 0; i < z.length; i++) { if (z[i].tagName == "LI") { z[i].style.width = '170px'; z[i].style.textAlign = 'center'; z[i].childNodes[1].style.width = '170px'; z[i].childNodes[1].style.textAlign = 'center'; } } //The prototype for the callback function that allows me to remember what link I was loading! Function.prototype.bind = function(thisObject) { var method = this; var oldargs = [].slice.call(arguments, 1); return function() { var newargs = [].slice.call(arguments); return method.apply(thisObject, oldargs.concat(newargs)); }; } var allImgs, thisImg; var globalTimer; //First we load all the images of that little camera allImgs = document.evaluate( "//img | //div[@class='image']", //the name of the little camera icon document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); //Then we go through them one-by-one for (var i = 0; i < allImgs.snapshotLength; i++) { var n = allImgs.snapshotItem(i).src; var bgIm = false if(typeof n === 'undefined'){ n = allImgs.snapshotItem(i).style.backgroundImage; n = n.substring(4,n.length-1).replace(/["']/g, ""); bgIm = true; } if (n.indexOf('hasPhoto_160x120.png') > -1) { thisImg = allImgs.snapshotItem(i); //the photos exist but no thumbnail thisImg.setAttribute('thumbnailnumber', i); //We need to request the page that the icon links to, to get it's thumbnail if (thisImg.parentNode.href) { var oReq = new XMLHttpRequest(); oReq.open("GET", thisImg.parentNode.href); oReq.addEventListener("load", cbReplaceWithPhoto.bind({ specificIcon: thisImg.parentNode }), false); oReq.send(); } } else if (n.indexOf('/lv2/') > -1 || n.indexOf('/gv/') > -1 || n.indexOf('/med/') > -1 || bgIm){ thisImg = allImgs.snapshotItem(i); thisImg.setAttribute('thumbnailnumber', i); addHover(thisImg, bgIm) } } //Set the style up in the
tag var head = document.getElementsByTagName('head')[0]; style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = '.enlargement {visibility:hidden;position:absolute;z-index:100;top:20px;}\r\n.enlargement img {}'; head.appendChild(style); var dimsz = document.getElementById("container").offsetLeft + document.getElementById("mainContent").offsetLeft style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = ".imgBig {top:50px;position:absolute;max-width:100%;min-height:100%;margin-left:20px;left:0px;border:1px solid #000;box-shadow:0 0 17px #000;-moz-box-shadow:0 0 17px #000;-webkit-box-shadow:0 0 17px #000;}"; head.appendChild(style); String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); } function hasClass(element, cls) { return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1; } function addHover(imgUse, bgIm){ //This handles the tooltip-like zoom function var zoomDiv = document.createElement('div'); zoomDiv.setAttribute('id', "enlargement" + imgUse.getAttribute('thumbnailnumber')); zoomDiv.setAttribute('class', 'enlargement'); document.body.appendChild(zoomDiv); //When mouse goes over it starts a timer. imgUse.addEventListener( 'mouseover', function(event) { var x = event.pageX; var y = event.pageY var divId = 'enlargement' + this.getAttribute('thumbnailnumber'); obj = document.getElementById(divId); var n = this.src; if (bgIm){ n = this.style.backgroundImage; n = n.substring(4,n.length-1).replace(/["']/g, "") n = n.replace('/sgss/', '/full/') n = n.replace('/sgsl/', '/full/') } obj.innerHTML = "