fixed sets... added support for user tags
[FlickrHacks.git] / _greasemonkey_ / flickrnewcontatmorelinks.user.js
blob1d29c2fce58fafd6724d36e91ae50d0a3d00f8c0
1 // ==UserScript==
2 // @name Flickr New Contat More Links
3 // @namespace http://6v8.gamboni.org/
4 // @description When reading a Flickr Mail about someone adding you as contact, this script inserts more links and info about this user.
5 // @version 0.6
6 // @identifier http://6v8.gamboni.org/IMG/js/flickrnewcontactmorelinks.user.js
7 // @date 2007-06-26
8 // @creator Pierre Andrews (mortimer.pa@free.fr)
9 // @include http://*flickr.com/messages_read.gne*
10 //
11 // ==/UserScript==
13 // --------------------------------------------------------------------
15 // This is a Greasemonkey user script.
17 // To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
18 // Then restart Firefox and revisit this script.
19 // Under Tools, there will be a new menu item to "Install User Script".
20 // Accept the default configuration and install.
22 // --------------------------------------------------------------------
23 // Copyright (C) 2006 Pierre Andrews
24 //
25 // This program is free software; you can redistribute it and/or
26 // modify it under the terms of the GNU General Public License
27 // as published by the Free Software Foundation; either version 2
28 // of the License, or (at your option) any later version.
29 //
30 // This program is distributed in the hope that it will be useful,
31 // but WITHOUT ANY WARRANTY; without even the implied warranty of
32 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33 // GNU General Public License for more details.
34 //
35 // The GNU General Public License is available by visiting
36 // http://www.gnu.org/copyleft/gpl.html
37 // or by writing to
38 // Free Software Foundation, Inc.
39 // 51 Franklin Street, Fifth Floor
40 // Boston, MA 02110-1301
41 // USA
44 (function () {
46 //update information
47 var SCRIPT = {
48 name: "Flickr New Contat More Links",
49 namespace: "http://6v8.gamboni.org/",
50 description: "When reading a Flickr Mail about someone adding you as contact, this script inserts more links and info about this user.",
51 identifier: "http://6v8.gamboni.org/IMG/js/flickrnewcontactmorelinks.user.js",
52 version: "0.6", // version
53 date: (new Date("2007-05-26")) // update date
54 .valueOf()
58 function $x1(xpath) {
59 return document.evaluate(
60 xpath,
61 document,
62 null,
63 XPathResult.FIRST_ORDERED_NODE_TYPE, null
64 ).singleNodeValue;
68 /***********************************************************************
69 * Flickr Localisation
70 **********************************************************************/
72 var FlickrLocaliser = function(locals) {
73 this.init(locals);
75 FlickrLocaliser.prototype = {
76 selectedLang: undefined,
77 localisations: undefined,
78 getLanguage: function() {
79 if(!this.selectedLang) {
80 var langA = $x1("//p[@class='LanguageSelector']//a[contains(@class,'selected')]");
81 if(langA) {
82 var matches = /\/change_language.gne\?lang=([^&]+)&.*/.exec(langA.href);
83 if(matches && matches[1]) {
84 this.selectedLang = matches[1];
85 return this.selectedLang;
88 return false;
89 } else return this.selectedLang;
92 init: function(locals) {
93 this.localisations = locals;
96 localise: function(string, params) {
97 if(this.localisations && this.getLanguage()) {
98 var currentLang = this.localisations[this.selectedLang];
99 if(!currentLang) currentLang = this.localisations[this.localisations.defaultLang];
100 var local = currentLang[string];
101 if(!local) {
102 local = this.localisations[this.localisations.defaultLang][string];
104 if(!local) return string;
105 for(arg in params) {
106 var rep = new RegExp('@'+arg+'@','g');
107 local = local.replace(rep,params[arg]);
109 local =local.replace(/@[^@]+@/g,'');
110 return local;
111 } else return undefined;
116 /*****************************Flickr Localisation**********************/
120 function M8_log() {
121 if(unsafeWindow.console)
122 unsafeWindow.console.log(arguments);
123 else
124 GM_log(arguments);
127 function getObjectMethodClosure(object, method) {
128 return function(arg) {
129 return object[method](arg);
133 var flickrnewcontactmorelinks = function() {this.init();}
135 flickrnewcontactmorelinks.prototype = {
136 localiser: new FlickrLocaliser({
137 'en-us' : {
138 'scout' : "And Flickr's Explore photos here",
139 'inspector' : 'And Flickr DNA here',
140 'interesting' : 'Here are the most interestings',
141 'latest' : 'Recent Photos',
142 'about_group' : 'About this group'
144 'it-it' : {
145 'latest' : 'Foto recenti',
146 'about_group' : 'Su questo gruppo'
148 'fr-fr' : {
149 'scout' : "Et ses photos sur l'Explorer",
150 'inspector' : 'Et sa page Flickr DNA',
151 'interesting' : 'Voici ses photos les plus "intèressante"',
152 'latest' : 'Dernières photos',
153 'about_group' : 'A propos de ce groupe'
155 'es-us' : {
156 'latest' : 'Fotos recientes'
158 'de-de' : {
159 'latest' : 'Neueste Fotos'
161 'pt-br' : {
162 'latest' : 'Fotos recentes'
164 'ko-kr' : {
165 'latest' : '최근 사진'
167 'zh-hk' : {
168 'latest' : '最新的相片'
170 defaultLang: 'en-us'
172 message: $x1("/html/body/div[@id='Main']/div/table/tbody/tr[3]/td[2]/p"),
173 title: $x1("/html/body/div[@id='Main']/div/table/tbody/tr[2]/td/h3"),
174 init: function() {
175 var matches = /http:\/\/(www.)?flickr.com\/people\/([^\/]+)\//.exec(this.message.textContent);
177 if(this.title && this.message && matches) {
178 if(matches[1].indexOf('@') > 0) {
179 self.displayMoreContact(matches[1]);
180 } else {
181 var self = this;
182 var listener = {
183 flickr_urls_lookupUser_onLoad: function(success, responseXML, responseText, params){
184 try{
185 var rsp = responseText.replace(/jsonFlickrApi\(/,'');
186 rsp = eval('('+rsp);
187 if(rsp.stat == 'ok') {
188 self.displayMoreContact(rsp.user.id);
189 } else
190 M8_log("Error5 "+responseText);
191 } catch (e) {
192 M8_log("Error6 "+responseText);
193 M8_log(e);
197 unsafeWindow.F.API.callMethod('flickr.urls.lookupUser', {
198 url: 'http://www.flickr.com/photos/'+matches[2],
199 format: 'json'
200 }, listener);
203 } else if(this.title && this.message && (matches = /href="(http:\/\/(www.)?flickr.com\/groups\/[^\/]+\/)"/.exec(this.message.innerHTML))) {
204 var link = $x1("/html/body/div[@id='Main']/div/table/tbody/tr[3]/td[2]/p[1]/a");
205 if(link) {
206 var self = this;
207 var listener = {
208 flickr_urls_lookupGroup_onLoad: function(success, responseXML, responseText, params){
209 try{
210 var rsp = responseText.replace(/jsonFlickrApi\(/,'');
211 rsp = eval('('+rsp);
212 if(rsp.stat == 'ok') {
213 var listener2 = {
214 flickr_groups_getInfo_onLoad: function(success, responseXML, responseText, params){
215 try{
216 var rsp = responseText.replace(/jsonFlickrApi\(/,'');
217 rsp = eval('('+rsp);
218 if(rsp.stat == 'ok')
219 self.displayMoreGroup(rsp);
220 else
221 M8_log("Error8 "+responseText);
222 } catch (e) {
223 M8_log("Error7 "+responseText);
224 M8_log(e);
229 unsafeWindow.F.API.callMethod('flickr.groups.getInfo', {
230 group_id: rsp.group.id,
231 format: 'json'
232 }, listener2);
233 } else
234 M8_log("Error5 "+responseText);
235 } catch (e) {
236 M8_log("Error6 "+responseText);
237 M8_log(e);
241 unsafeWindow.F.API.callMethod('flickr.urls.lookupGroup', {
242 url: matches[1],
243 format: 'json'
244 }, listener);
248 displayMoreContact: function(user_id) {
249 if(this.message) {
250 this.user_id=user_id;
251 var newNode = this.message.insertBefore(document.createElement('span'),this.message.lastChild);
252 var scout = "http://bighugelabs.com/flickr/scout.php?username="+encodeURIComponent(user_id);
253 var inspect = "http://bighugelabs.com/flickr/dna.php?username="+encodeURIComponent(user_id);
254 html = this.localiser.localise('scout')+":<br/>"+
255 scout.link(scout)+'<br/>'+
256 this.localiser.localise('inspector')+":<br/>"+
257 inspect.link(inspect)+'<br/>'+'<br/>';
258 newNode.innerHTML = html;
259 var self = this;
260 var listener = {
261 flickr_photos_search_onLoad: function(success, responseXML, responseText, params){
262 try{
263 var rsp = responseText.replace(/jsonFlickrApi\(/,'');
264 rsp = eval('('+rsp);
265 if(rsp.stat == 'ok') {
266 var div = self.message.parentNode.insertBefore(document.createElement('div'),self.message.nextSibling);
267 div.setAttribute("style","margin-top:1em;");
268 div.innerHTML = "<h3>"+self.localiser.localise('interesting')+"</h3>"
269 self.showPhotos(rsp,div);
271 else
272 M8_log("Error3 "+responseText);
273 } catch (e) {
274 M8_log("Error4 "+responseText);
275 M8_log(e);
280 unsafeWindow.F.API.callMethod('flickr.photos.search', {
281 user_id: user_id,
282 per_page: 20,
283 sort: 'interestingness-desc',
284 extras: 'icon_server',
285 format: 'json'
286 }, listener);
289 showPhotos: function(photos,block) {
290 var i;
291 var div = block.appendChild(document.createElement('div'));
292 div.setAttribute('style','width:400px;');
293 for(i=0;i<photos.photos.photo.length;i++) {
294 var photo = photos.photos.photo[i];
295 var img = '<a href="http://www.flickr.com/photos/'+photo.owner+'/'+photo.id+'/"><img src="http://static.flickr.com/'+photo.server+'/'+photo.id+'_'+photo.secret+'_s.jpg" alt="'+photo.title+'"/></a>';
296 div.innerHTML += img;
298 if(i == 0 && photo.iconserver) {
299 this.createUserIcon(photo.iconserver);
304 createUserIcon: function(server) {
305 var a = this.title.appendChild(document.createElement('a'));
306 a.href= '/photos/'+this.user_id+'/';
307 var img = a.appendChild(document.createElement('img'));
308 img.width = img.height = 48;
309 img.setAttribute('style','margin-left:1em;');
310 img.src= ((server>0)?'http://static.flickr.com/'+server+'/buddyicons/'+this.user_id+'.jpg':'http://www.flickr.com/images/buddyicon.jpg');
311 img.className="FriendBuddyIcon";
312 img.id = "FriendBuddyIcon"+this.user_id;
313 img.nsid = this.user_id;
314 img.addEventListener('mouseover',getObjectMethodClosure(unsafeWindow.document.getElementById('person_hover'),'icon_mouseover'),true);
315 img.addEventListener('mouseout',getObjectMethodClosure(unsafeWindow.document.getElementById("person_hover"),'icon_mouseout'),true);
316 var img2 = unsafeWindow.document.getElementById('FriendBuddyIcon'+this.user_id);
317 img2.nsid = this.user_id;
318 var id = "hover_img" + this.user_id;
319 if (!document.getElementById(id)) {
320 var new_img = document.createElement("IMG");
321 new_img.id = id;
322 new_img.nsid = this.user_id;
323 new_img.src = img.src;
324 new_img.className = "person_hover_img";
325 unsafeWindow.document.getElementById("person_hover_link").appendChild(new_img);
326 var new_img2 = unsafeWindow.document.getElementById(id);
327 new_img2.nsid = this.user_id;
330 displayMoreGroup: function(info) {
331 var tr1 = $x1("/html/body/div[@id='Main']/div/table/tbody/tr[3]");
332 if(tr1) {
333 var tr2 = tr1.parentNode.insertBefore(document.createElement('tr'),tr1.nextSibling);
334 tr2.setAttribute("style","border-top: 1px solid black;");
335 tr2.innerHTML = '<td><h3>'+this.localiser.localise('about_group')+':</h3></td><td><p style="overflow: auto; max-height: 500px; width: 600px; border-top:1px solid #FF0084;padding-top:10px; border-bottom:1px solid #FF0084;padding-bottom:10px">'+info.group.description._content.replace(/\n/g,"<br/>")+"</p></td>";
336 var self = this;
337 var listener = {
338 flickr_groups_pools_getPhotos_onLoad: function(success, responseXML, responseText, params){
339 try{
340 var rsp = responseText.replace(/jsonFlickrApi\(/,'');
341 rsp = eval('('+rsp);
342 if(rsp.stat == 'ok') {
343 var tr3 = tr2.parentNode.insertBefore(document.createElement('tr'),tr2.nextSibling);
344 tr3.innerHTML = "<td><h3>"+self.localiser.localise('latest')+"</h3></td>";
345 var td = tr3.appendChild(document.createElement('td'));
346 self.showPhotos(rsp,td);
347 } else
348 M8_log("Error3 "+responseText);
349 } catch (e) {
350 M8_log("Error4 "+responseText);
351 M8_log(e);
356 unsafeWindow.F.API.callMethod('flickr.groups.pools.getPhotos', {
357 group_id: info.group.id,
358 per_page: 20,
359 format: 'json'
360 }, listener);
364 //======================================================================
365 // launch
366 try {
367 window.addEventListener("load", function () {
368 try {
370 // update automatically (http://userscripts.org/scripts/show/2296)
371 win.UserScriptUpdates.requestAutomaticUpdates(SCRIPT);
372 } catch (ex) {}
374 var flickrgp = new flickrnewcontactmorelinks();
375 }, false);
376 } catch (ex) {}
377 })();