- Fixed a bunch of bugs for existing paginations
[FlickrHacks.git] / _greasemonkey_ / flickrquickcomment.user.js
blobe082084b60e168e022b5e8f952cb9d14918f4f72
1 // ==UserScript==\r
2 // @name            Flickr Quick Comment\r
3 // @description     Adds a select box with pre written comments. Derived from Steeev Group Promotion Tool\r
4 // @author          Pierre Andrews. (code base Steeev http://steeev.f2o.org/, pt translation by Perla* <http://www.flickr.com/photos/bobnperla/>)\r
5 // @namespace       http://6v8.gamboni.org/\r
6 // @include         http://*flickr.com/photos/*\r
7 // @include         http://*flickr.com/groups/*/discuss*\r
8 // @include         http://*flickr.com/groups*\r
9 // @include         http://*flickr.com/photos/*/editcomment*\r
10 // @exclude         http://*flickr.com/groups/*/pool*\r
11 // @exclude         http://*flickr.com/groups/*/admin*\r
12 // @exclude         http://*flickr.com/groups/*/map*\r
13 // @exclude         http://*flickr.com/groups_members*\r
14 // @exclude         http://*flickr.com/groups_invite*\r
15 // @version         0.9\r
16 // ==/UserScript==\r
18 // ======================================================================\r
19 // To add a new quickcomment, go in the menu tools->User Scripts commands->Add new quick comment and fill the fields.\r
20 // The name is what will apear in the select box.\r
21 // The comment is what will be added at the cursor position of the current comment field. This field will autofill with what you have selected on the page.\r
22 // ======================================================================\r
24 // --------------------------------------------------------------------\r
25 //\r
26 // This is a Greasemonkey user script.\r
27 //\r
28 // To install, you need FireFox  http://www.mozilla.org/firefox and the firefox extension called Greasemonkey: http://greasemonkey.mozdev.org/\r
29 // Install the Greasemonkey extension then restart Firefox and revisit this script.\r
30 // Under Tools, there will be a new menu item to "Install User Script".\r
31 // Accept the default configuration and install.\r
32 //\r
33 // To uninstall, go to Tools/Manage User Scripts,\r
34 // select "Flickr Group Promotion Tool", and click Uninstall.\r
35 //\r
36 // --------------------------------------------------------------------\r
38 (function() {\r
40         var quicktags = new Array();\r
42                 /***********************************************************************\r
43          * Flickr Localisation\r
44          **********************************************************************/\r
46         function $x1(xpath) {\r
47                 return document.evaluate(\r
48                                                                  xpath,\r
49                                                                  document,\r
50                                                                  null,\r
51                                                                  XPathResult.FIRST_ORDERED_NODE_TYPE, null\r
52                                                                  ).singleNodeValue;\r
53         }\r
55         var FlickrLocaliser = function(locals) {\r
56                 this.init(locals);\r
57         }\r
58         FlickrLocaliser.prototype = {\r
59                 selectedLang: undefined,\r
60                 localisations: undefined,\r
61                 getLanguage: function() {\r
62                         if(!this.selectedLang) {\r
63                                 var langA = $x1("//p[@class='LanguageSelector']//a[contains(@class,'selected')]");\r
64                                 if(langA) {\r
65                                         var matches = /\/change_language.gne\?lang=([^&]+)&.*/.exec(langA.href);\r
66                                         if(matches && matches[1]) {\r
67                                                 this.selectedLang = matches[1];\r
68                                                 return this.selectedLang;\r
69                                         }\r
70                                 }\r
71                                 return false;\r
72                         } else return this.selectedLang;\r
73                 },\r
75                 init: function(locals) {\r
76                         this.localisations = locals;\r
77                 },\r
79                 localise: function(string, params) {\r
80                         if(this.localisations && this.getLanguage()) {\r
81                                 var currentLang = this.localisations[this.selectedLang];\r
82                                 if(!currentLang) currentLang = this.localisations[this.localisations.defaultLang];\r
83                                 var local = currentLang[string];\r
84                                 if(!local) {\r
85                                         local = this.localisations[this.localisations.defaultLang][string];\r
86                                 } \r
87                                 if(!local) return string;\r
88                                 for(arg in params) {\r
89                                         var rep = new RegExp('@'+arg+'@','g');\r
90                                         local = local.replace(rep,params[arg]);\r
91                                 }\r
92                                 local =local.replace(/@[^@]+@/g,'');\r
93                                 return local;\r
94                         } else return undefined;\r
95                 }\r
97         }\r
99         /*****************************Flickr Localisation**********************/\r
102         var localiser = new FlickrLocaliser({\r
103                         'en-us' :{\r
104                                 'Name':'Name',\r
105                                 'choose_name': 'Choose a name',\r
106                                 'Comment': 'Comment',\r
107                                 'Add':'Add',\r
108                                 'Cancel':'Cancel',\r
109                                 'prompt_comment': "Add a new quick comment",\r
110                                 'Save':'Save',\r
111                                 'edit_comments': "Edit quick comments",\r
112                                 'quick_comments' : 'Quick Comment',\r
113                                 'add_title' : 'Add A New Quick Comment',\r
114                                 'edit_title' : 'Edit saved quick comments (uncheck to remove)'\r
115                         },\r
116                         'fr-fr': {\r
117                                 // A\r
118                                 'Add' : 'Ajouter',\r
119                                 // C\r
120                                 'Cancel' : 'Annuler',\r
121                                 'Comment' : 'Commentaire',\r
122                                 // N\r
123                                 'Name' : 'Nom',\r
124                                 // S\r
125                                 'Save' : 'Sauver',\r
126                                 // C\r
127                                 'choose_name' : 'Choisir un nom',\r
128                                 // E\r
129                                 'edit_comments' : 'Editer la liste de commentaires',\r
130                                 // P\r
131                                 'prompt_comment' : 'Ajouter un nouveau commentaire',\r
132                                 'quick_comments' : 'Commentaires Faciles',\r
133                                 'add_title' : 'Ajouter Un Nouveau Commentaire Facile',\r
134                                 'edit_title' : 'Editer les commentaires faciles existants (d&eacute;cocher pour enlever)'\r
135                         },\r
136                         'pt-br': {\r
137                                 // A\r
138                                 'Add' : 'Adicionar',\r
139                                 // C\r
140                                 'Cancel' : 'Cancelar',\r
141                                 'Comment' : 'Coment&aacute;rio',\r
142                                 // N\r
143                                 'Name' : 'Nome',\r
144                                 // S\r
145                                 'Save' : 'Salvar',\r
146                                 // A\r
147                                 'add_title' : 'Adicionar coment&aacute;rio r&aacute;pido',\r
148                                 // C\r
149                                 'choose_name' : 'Escolher um nome',\r
150                                 // E\r
151                                 'edit_comments' : 'Editar coment&aacute;rio r&aacute;pido',\r
152                                 'edit_title' : 'Editar coment&aacute;rio r&aacute;pido salvo (desmarcar para remover)',\r
153                                 // P\r
154                                 'prompt_comment' : 'Adicionar um novo coment&aacute;rio r&aacute;pido',\r
155                                 // Q\r
156                                 'quick_comments' : 'Coment&aacute;rio r&aacute;pido'\r
157                         },\r
158                         defaultLang:'en-us'\r
159                 });\r
161         //from http://www.nabble.com/-greasemonkey-users--GM_setValue-loses-unicode-characters-t2840046.html#a7943662\r
162         function encode_utf8( s )\r
163                 {\r
164                         return unescape( encodeURIComponent( s ) );\r
165                 }\r
166         \r
167         function decode_utf8( s )\r
168                 {\r
169                         return decodeURIComponent( escape( s ) );\r
170                 } \r
172         function save() {\r
173                 var value = '';\r
174                 for each(q in quicktags) {\r
175                         value += '@#@'+q[0]+'{#}'+q[1];\r
176                 }\r
177                 value = value.substr(3);\r
178                 GM_setValue('quicktag',encode_utf8(value));\r
179         }\r
180         \r
181         function load() {\r
182                 var value = decode_utf8(GM_getValue('quicktag'));\r
183                 if(value) {\r
184                         var split = value.split('@#@');\r
185                         for each(q in split) {\r
186                                 var s = q.split('{#}');\r
187                                 quicktags.push(new Array(s[0],s[1]));\r
188                         }\r
189                         quicktags.sort();\r
190                 }\r
191         }\r
193         function createAutoCommenter() {\r
194                 \r
195                 var autocommenter="&nbsp;<form name='sfcommentform'>";\r
197                 if(quicktags.length >0) {\r
198                         autocommenter+="<select name='sfquicktag' onchange='sf_gpt_addcomment(document.forms.sfcommentform);'><option value='0'>-- "+localiser.localise('quick_comments')+" --</option>";\r
199                         for (i=0;i<quicktags.length;i++) {\r
200                                 var label = quicktags[i][0];\r
201                                 var value = quicktags[i][1];\r
202                                 autocommenter += '<option value="'+i+'">' +label +'</option>';\r
203                         }\r
204                         autocommenter += "</select>";\r
205                 }\r
206                 \r
207                 autocommenter += "</form>";\r
208                 return autocommenter;\r
209         }\r
211         load();\r
212         arse=document.createElement('span');\r
214         var prompt_autocomment = function() {\r
215                 var select = unsafeWindow.getSelection();\r
217                 var back = document.body.appendChild(document.createElement('div'));\r
218                 back.id="poolCleaningBack";\r
219                 back.setAttribute('style',"position:absolute;background-color: black;opacity: 0.35; display: block; left: 0pt;");\r
220                 back.style.width = document.body.clientWidth+'px';\r
221                 back.style.height = document.body.clientHeight+'px';\r
222                 back.style.top = document.body.scrollTop+'px';\r
223                 var modal = document.body.appendChild(document.createElement('div'));\r
224                 modal.id="poolCleaning";\r
225                 modal.setAttribute('style',"position:absolute;background:white;border: 3px solid black;display: block;");\r
226                 modal.style.width = (document.body.clientWidth*2/3) +'px';\r
227                 modal.style.left = (document.body.clientWidth*1/6) +'px';\r
228                 modal.innerHTML = '<div style="padding:12px;background-color: #EEEEEE;clear:both;font-size: 14px;">'+localiser.localise('add_title')+'</div>';\r
229                 modal.style.top = document.body.scrollTop+(document.body.clientHeight/2)+'px';\r
230                 \r
231                 var dialog = modal.appendChild(document.createElement('div'));\r
232                 dialog.setAttribute('style',"padding: 18px 16px;clear:both; width:100%;");\r
233                 var content = dialog.appendChild(document.createElement('div'));\r
234                 var l1 = content.appendChild(document.createElement('label'))\r
235                 l1.innerHTML = localiser.localise('Name')+':';\r
236                 l1.style.clear="both";\r
237                 var vname = content.appendChild(document.createElement('input'));\r
238                 vname.type="text";\r
239                 vname.value = localiser.localise("choose_name");\r
240                 \r
241                 content.appendChild(document.createElement('br'));\r
242                 var l2 = content.appendChild(document.createElement('label'));\r
243                 l2.innerHTML = localiser.localise('Comment')+':';\r
244                 content.appendChild(document.createElement('br'));\r
245                 var text = content.appendChild(document.createElement('textarea'));\r
246                 text.rows= 10;\r
247                 text.innerHTML = select;\r
248                 text.setAttribute('style','width: 90%');\r
249                 \r
250                 var buttons = dialog.appendChild(document.createElement('div'));\r
251                 var ok = buttons.appendChild(document.createElement('button'));\r
252                 ok.type ='button';\r
253                 ok.className='Butt';\r
254                 ok.innerHTML = localiser.localise('Add');\r
255                 var cancel = buttons.appendChild(document.createElement('button'));\r
256                 cancel.type ='button';\r
257                 cancel.className = 'Butt';\r
258                 cancel.innerHTML = localiser.localise('Cancel');\r
259                 \r
260                 cancel.addEventListener('click',function() {\r
261                                                                         document.body.removeChild(back);\r
262                                                                         document.body.removeChild(modal);\r
263                                                                 },true);\r
264                 \r
265                 \r
266                 ok.addEventListener('click',function() {\r
267                                                                 quicktags.push(new Array(vname.value,text.value));\r
268                                                                 save();\r
269                                                                 arse.innerHTML = createAutoCommenter();\r
270                                                                 document.body.removeChild(back);\r
271                                                                 document.body.removeChild(modal);\r
272                                                         },true);\r
273                 \r
274                 modal.style.top = document.body.scrollTop+((document.body.clientHeight-modal.scrollHeight)/2)+'px';\r
275         };\r
276         GM_registerMenuCommand(localiser.localise("prompt_comment"), prompt_autocomment);\r
278         \r
279         var prompt_editautocomment = function() {\r
280                 var select = unsafeWindow.getSelection();\r
282                 var back = document.body.appendChild(document.createElement('div'));\r
283                 back.id="poolCleaningBack";\r
284                 back.setAttribute('style',"position:absolute;background-color: black;opacity: 0.35; display: block; left: 0pt;");\r
285                 back.style.width = document.body.clientWidth+'px';\r
286                 back.style.height = document.body.clientHeight+'px';\r
287                 back.style.top = document.body.scrollTop+'px';\r
288                 var modal = document.body.appendChild(document.createElement('div'));\r
289                 modal.id="poolCleaning";\r
290                 modal.setAttribute('style',"position:absolute;background:white;border: 3px solid black;display: block;");\r
291                 modal.style.width = (document.body.clientWidth*2/3) +'px';\r
292                 modal.style.left = (document.body.clientWidth*1/6) +'px';\r
293                 modal.innerHTML = '<div style="padding:12px;background-color: #EEEEEE;clear:both;font-size: 14px;">'+localiser.localise('edit_title')+'.</div>';\r
294                 modal.style.top = document.body.scrollTop+(document.body.clientHeight/2)+'px';\r
295                 \r
296                 var dialog = modal.appendChild(document.createElement('div'));\r
297                 dialog.setAttribute('style',"padding: 18px 16px;clear:both; width:100%;overflow:auto;");\r
298                 var content = dialog.appendChild(document.createElement('div'));\r
299                 var ul = document.createElement('ul');\r
300                 var inputs = new Array();\r
301                 for (i=0;i<quicktags.length;i++) {\r
302                         var label = quicktags[i][0];\r
303                         var value = quicktags[i][1];\r
304                         var li = document.createElement('li');\r
305                         var l1 = li.appendChild(document.createElement('label'));\r
306                         l1.innerHTML = label;\r
307                         var vname = document.createElement('input');\r
308                         vname.type="checkbox";\r
309                         vname.value = i;\r
310                         vname.checked = true;\r
311                         li.appendChild(vname);\r
312                         ul.appendChild(li);\r
313                         inputs.push(vname);\r
314                 }\r
315                 content.appendChild(ul);\r
316                 \r
317                 var buttons = dialog.appendChild(document.createElement('div'));\r
318                 var ok = buttons.appendChild(document.createElement('button'));\r
319                 ok.type ='button';\r
320                 ok.className='Butt';\r
321                 ok.innerHTML = localiser.localise('Save');\r
322                 var cancel = buttons.appendChild(document.createElement('button'));\r
323                 cancel.type ='button';\r
324                 cancel.className = 'Butt';\r
325                 cancel.innerHTML = localiser.localise('Cancel');\r
326                 \r
327                 cancel.addEventListener('click',function() {\r
328                                                                         document.body.removeChild(back);\r
329                                                                         document.body.removeChild(modal);\r
330                                                                 },true);\r
331                 \r
332                 \r
333                 ok.addEventListener('click',function() {\r
334                                 new_q = new Array();\r
335                                 for each(inp in inputs) {\r
336                                                 if(inp.checked)\r
337                                                         new_q.push(quicktags[inp.value]);\r
338                                         }\r
339                                 quicktags = new_q;\r
340                                 save();\r
341                                 arse.innerHTML = createAutoCommenter();\r
342                                 document.body.removeChild(back);\r
343                                 document.body.removeChild(modal);\r
344                         },true);\r
345                 \r
346                 modal.style.top = document.body.scrollTop+((document.body.clientHeight-modal.scrollHeight)/2)+'px';\r
347         };\r
348         GM_registerMenuCommand(localiser.localise('edit_comments'), prompt_editautocomment);\r
349         \r
350         var w;\r
351         if (unsafeWindow) \r
352                 w=unsafeWindow;\r
353         else\r
354                 w=window;\r
355         \r
356         w.sf_gpt_addcomment=function(theform) {\r
357                 \r
358                 thisTextArea = document.evaluate(\r
359                                                                                  "//textarea[@name='message']",\r
360                                                                                  document,\r
361                                                                                  null,\r
362                                                                                  XPathResult.FIRST_ORDERED_NODE_TYPE, null\r
363                                                                                  ).singleNodeValue;\r
364                 \r
365                 if(thisTextArea) {\r
366                         mesg = '';\r
367                         if(theform.sfquicktag.selectedIndex != 0)\r
368                                 mesg += quicktags[theform.sfquicktag.options[theform.sfquicktag.selectedIndex].value][1];\r
369                         \r
370                         try {\r
371                                 thisTextArea.value = thisTextArea.value.substr(0,thisTextArea.selectionStart) \r
372                                         + mesg\r
373                                         + thisTextArea.value.substr(thisTextArea.selectionStart);\r
374                         } catch(e) {\r
375                                 thisTextArea.value += mesg;\r
376                         }\r
377                 }\r
378         }\r
379         \r
380         arse.innerHTML= createAutoCommenter();\r
381         var thisLink;\r
382         if(document.location.pathname.indexOf('photos/') >= 0) {                \r
383                 if(document.location.pathname.indexOf('editcomment') >= 0) {\r
384                         thisLink = document.evaluate('//td[@id=\'GoodStuff\']/h3',\r
385                                                                                  document,\r
386                                                                                  null,\r
387                                                                                  XPathResult.FIRST_ORDERED_NODE_TYPE,\r
388                                                                                  null\r
389                                                                                  ).singleNodeValue;     \r
391                         if(thisLink)\r
392                                 thisLink.parentNode.insertBefore(arse, thisLink.nextSibling);                   \r
393                 } else {\r
394                         var allLinks, thisLink;\r
395                         allLinks = document.evaluate('//div[@id="DiscussPhoto"]/h3',\r
396                                                                                  document,\r
397                                                                                  null,\r
398                                                                                  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,\r
399                                                                                  null);\r
400                         for (var i = 0; i < allLinks.snapshotLength; i++) {\r
401                                 thisLink = allLinks.snapshotItem(i);\r
402                                 thisLink.parentNode.insertBefore(arse, thisLink.nextSibling);\r
403                         }\r
404                 }\r
405         } else if(document.location.pathname.indexOf('discuss/') >= 0) {                \r
406                 if(document.location.pathname.indexOf('edit') >= 0) {\r
407                         thisLink = document.evaluate('//td[@id=\'GoodStuff\']/form/p[1]/textarea',\r
408                                                                                  document,\r
409                                                                                  null,\r
410                                                                                  XPathResult.FIRST_ORDERED_NODE_TYPE,\r
411                                                                                  null\r
412                                                                                  ).singleNodeValue;     \r
413                         if(thisLink)\r
414                                 thisLink.parentNode.insertBefore(arse, thisLink);\r
415                 } else {\r
416                         thisLink = document.evaluate(\r
417                                                                                  '//div[@id=\'DiscussTopic\']//td/h3',\r
418                                                                                  document,\r
419                                                                                  null,\r
420                                                                                  XPathResult.FIRST_ORDERED_NODE_TYPE,\r
421                                                                                  null\r
422                                                                                  ).singleNodeValue;     \r
423                         if(thisLink)\r
424                                 thisLink.parentNode.insertBefore(arse, thisLink.nextSibling);\r
425                 } \r
426         } else if(document.location.pathname == "/groups_newtopic.gne") {\r
427                 thisLink = document.evaluate('//td[@id=\'GoodStuff\']/form/table/tbody/tr[2]/td[2]/textarea',\r
428                                                                          document,\r
429                                                                          null,\r
430                                                                          XPathResult.FIRST_ORDERED_NODE_TYPE,\r
431                                                                          null\r
432                                                                          ).singleNodeValue;     \r
433                 if(thisLink)\r
434                         thisLink.parentNode.insertBefore(arse, thisLink);\r
436         }\r
437 })();\r