- Fixed a bunch of bugs for existing paginations
[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()
55         };
57         
58         function $x1(xpath) {
59                 return document.evaluate(
60                                                                  xpath,
61                                                                  document,
62                                                                  null,
63                                                                  XPathResult.FIRST_ORDERED_NODE_TYPE, null
64                                                                  ).singleNodeValue;
65         }
68         /***********************************************************************
69          * Flickr Localisation
70          **********************************************************************/
72         var FlickrLocaliser = function(locals) {
73                 this.init(locals);
74         }
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;
86                                         }
87                                 }
88                                 return false;
89                         } else return this.selectedLang;
90                 },
92                 init: function(locals) {
93                         this.localisations = locals;
94                 },
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];
103                                 } 
104                                 if(!local) return string;
105                                 for(arg in params) {
106                                         var rep = new RegExp('@'+arg+'@','g');
107                                         local = local.replace(rep,params[arg]);
108                                 }
109                                 local =local.replace(/@[^@]+@/g,'');
110                                 return local;
111                         } else return undefined;
112                 }
114         }
116         /*****************************Flickr Localisation**********************/
118         
119         
120         function M8_log() {
121                 if(unsafeWindow.console)
122                         unsafeWindow.console.log(arguments);
123                 else
124                         GM_log(arguments);
125         }
127         function getObjectMethodClosure(object, method) {
128                 return function(arg) {
129                         return object[method](arg); 
130                 }
131         }
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'
143                                 },
144                                 'it-it' : {
145                                         'latest' : 'Foto recenti',
146                                         'about_group' : 'Su questo gruppo'
147                                 },
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'
154                                 },
155                                 'es-us' : {
156                                         'latest' : 'Fotos recientes'
157                                 },
158                                 'de-de' : {
159                                         'latest' : 'Neueste Fotos'
160                                 },
161                                 'pt-br' : {
162                                         'latest' : 'Fotos recentes'
163                                 },
164                                 'ko-kr' : {
165                                         'latest' : '최근 사진'
166                                 },
167                                 'zh-hk' : {
168                                         'latest' : '最新的相片'
169                                 },
170                                 defaultLang: 'en-us'
171                         }),
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);
194                                                         }
195                                                 }
196                                         };
197                                         unsafeWindow.F.API.callMethod('flickr.urls.lookupUser', {
198                                                         url: 'http://www.flickr.com/photos/'+matches[2],
199                                                                 format: 'json'
200                                                                 }, listener);
201                                 }
202                                 
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);
225                                                                                         }
226                                                                                 }
227                                                                         };
228                                 
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);
238                                                         }
239                                                 }
240                                         };
241                                         unsafeWindow.F.API.callMethod('flickr.urls.lookupGroup', {
242                                                 url: matches[1],
243                                                                           format: 'json'
244                                                                           }, listener);
245                                 }
246                         } 
247                 },
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);
270                                                         }
271                                                         else
272                                                         M8_log("Error3 "+responseText);                                                 
273                                                 } catch (e) {
274                                                         M8_log("Error4 "+responseText);
275                                                         M8_log(e);
276                                                 }
277                                         }
278                                 };
279                                 
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);
287                         }
288                 },
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);
300                                 }
302                         }
303                 },
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;
328                         }
329                 },
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);
352                                                 }
353                                         }
354                                 };
355                                 
356                                 unsafeWindow.F.API.callMethod('flickr.groups.pools.getPhotos', {
357                                         group_id: info.group.id,
358                                                                  per_page: 20,
359                                                                   format: 'json'
360                                                                   }, listener);
361                         }
362                 }
363         }
364         //======================================================================
365         // launch
366         try {
367                 window.addEventListener("load", function () {
368                                                                         try {
369                                                                                 
370                                                                                 // update automatically (http://userscripts.org/scripts/show/2296)
371                                                                                 win.UserScriptUpdates.requestAutomaticUpdates(SCRIPT);
372                                                                         } catch (ex) {} 
373                                                                         
374                                                                         var flickrgp = new flickrnewcontactmorelinks();
375                 }, false);
376         } catch (ex) {}
377 })();