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.
6 // @identifier http://6v8.gamboni.org/IMG/js/flickrnewcontactmorelinks.user.js
8 // @creator Pierre Andrews (mortimer.pa@free.fr)
9 // @include http://*flickr.com/messages_read.gne*
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
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.
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.
35 // The GNU General Public License is available by visiting
36 // http://www.gnu.org/copyleft/gpl.html
38 // Free Software Foundation, Inc.
39 // 51 Franklin Street, Fifth Floor
40 // Boston, MA 02110-1301
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
59 return document
.evaluate(
63 XPathResult
.FIRST_ORDERED_NODE_TYPE
, null
68 /***********************************************************************
70 **********************************************************************/
72 var FlickrLocaliser = function(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')]");
82 var matches
= /\/change_language.gne\?lang=([^&]+)&.*/.exec(langA
.href
);
83 if(matches
&& matches
[1]) {
84 this.selectedLang
= matches
[1];
85 return this.selectedLang
;
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
];
102 local
= this.localisations
[this.localisations
.defaultLang
][string
];
104 if(!local
) return string
;
106 var rep
= new RegExp('@'+arg
+'@','g');
107 local
= local
.replace(rep
,params
[arg
]);
109 local
=local
.replace(/@[^@]+@/g,'');
111 } else return undefined;
116 /*****************************Flickr Localisation**********************/
121 if(unsafeWindow
.console
)
122 unsafeWindow
.console
.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({
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'
145 'latest' : 'Foto recenti',
146 'about_group' : 'Su questo gruppo'
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'
156 'latest' : 'Fotos recientes'
159 'latest' : 'Neueste Fotos'
162 'latest' : 'Fotos recentes'
165 'latest' : '최근 사진'
168 'latest' : '最新的相片'
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"),
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]);
183 flickr_urls_lookupUser_onLoad: function(success
, responseXML
, responseText
, params
){
185 var rsp
= responseText
.replace(/jsonFlickrApi\(/,'');
187 if(rsp
.stat
== 'ok') {
188 self
.displayMoreContact(rsp
.user
.id
);
190 M8_log("Error5 "+responseText
);
192 M8_log("Error6 "+responseText
);
197 unsafeWindow
.F
.API
.callMethod('flickr.urls.lookupUser', {
198 url
: 'http://www.flickr.com/photos/'+matches
[2],
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");
208 flickr_urls_lookupGroup_onLoad: function(success
, responseXML
, responseText
, params
){
210 var rsp
= responseText
.replace(/jsonFlickrApi\(/,'');
212 if(rsp
.stat
== 'ok') {
214 flickr_groups_getInfo_onLoad: function(success
, responseXML
, responseText
, params
){
216 var rsp
= responseText
.replace(/jsonFlickrApi\(/,'');
219 self
.displayMoreGroup(rsp
);
221 M8_log("Error8 "+responseText
);
223 M8_log("Error7 "+responseText
);
229 unsafeWindow
.F
.API
.callMethod('flickr.groups.getInfo', {
230 group_id
: rsp
.group
.id
,
234 M8_log("Error5 "+responseText
);
236 M8_log("Error6 "+responseText
);
241 unsafeWindow
.F
.API
.callMethod('flickr.urls.lookupGroup', {
248 displayMoreContact: function(user_id
) {
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
;
261 flickr_photos_search_onLoad: function(success
, responseXML
, responseText
, params
){
263 var rsp
= responseText
.replace(/jsonFlickrApi\(/,'');
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
);
272 M8_log("Error3 "+responseText
);
274 M8_log("Error4 "+responseText
);
280 unsafeWindow
.F
.API
.callMethod('flickr.photos.search', {
283 sort
: 'interestingness-desc',
284 extras
: 'icon_server',
289 showPhotos: function(photos
,block
) {
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");
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]");
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>";
338 flickr_groups_pools_getPhotos_onLoad: function(success
, responseXML
, responseText
, params
){
340 var rsp
= responseText
.replace(/jsonFlickrApi\(/,'');
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
);
348 M8_log("Error3 "+responseText
);
350 M8_log("Error4 "+responseText
);
356 unsafeWindow
.F
.API
.callMethod('flickr.groups.pools.getPhotos', {
357 group_id
: info
.group
.id
,
364 //======================================================================
367 window
.addEventListener("load", function () {
370 // update automatically (http://userscripts.org/scripts/show/2296)
371 win
.UserScriptUpdates
.requestAutomaticUpdates(SCRIPT
);
374 var flickrgp
= new flickrnewcontactmorelinks();