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
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
26 // This is a Greasemonkey user script.
\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
33 // To uninstall, go to Tools/Manage User Scripts,
\r
34 // select "Flickr Group Promotion Tool", and click Uninstall.
\r
36 // --------------------------------------------------------------------
\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
51 XPathResult.FIRST_ORDERED_NODE_TYPE, null
\r
55 var FlickrLocaliser = function(locals) {
\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
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
72 } else return this.selectedLang;
\r
75 init: function(locals) {
\r
76 this.localisations = locals;
\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
85 local = this.localisations[this.localisations.defaultLang][string];
\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
92 local =local.replace(/@[^@]+@/g,'');
\r
94 } else return undefined;
\r
99 /*****************************Flickr Localisation**********************/
\r
102 var localiser = new FlickrLocaliser({
\r
105 'choose_name': 'Choose a name',
\r
106 'Comment': 'Comment',
\r
109 'prompt_comment': "Add a new quick comment",
\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
120 'Cancel' : 'Annuler',
\r
121 'Comment' : 'Commentaire',
\r
127 'choose_name' : 'Choisir un nom',
\r
129 'edit_comments' : 'Editer la liste de commentaires',
\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écocher pour enlever)'
\r
138 'Add' : 'Adicionar',
\r
140 'Cancel' : 'Cancelar',
\r
141 'Comment' : 'Comentário',
\r
147 'add_title' : 'Adicionar comentário rápido',
\r
149 'choose_name' : 'Escolher um nome',
\r
151 'edit_comments' : 'Editar comentário rápido',
\r
152 'edit_title' : 'Editar comentário rápido salvo (desmarcar para remover)',
\r
154 'prompt_comment' : 'Adicionar um novo comentário rápido',
\r
156 'quick_comments' : 'Comentário rápido'
\r
158 defaultLang:'en-us'
\r
161 //from http://www.nabble.com/-greasemonkey-users--GM_setValue-loses-unicode-characters-t2840046.html#a7943662
\r
162 function encode_utf8( s )
\r
164 return unescape( encodeURIComponent( s ) );
\r
167 function decode_utf8( s )
\r
169 return decodeURIComponent( escape( s ) );
\r
174 for each(q in quicktags) {
\r
175 value += '@#@'+q[0]+'{#}'+q[1];
\r
177 value = value.substr(3);
\r
178 GM_setValue('quicktag',encode_utf8(value));
\r
182 var value = decode_utf8(GM_getValue('quicktag'));
\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
193 function createAutoCommenter() {
\r
195 var autocommenter=" <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
204 autocommenter += "</select>";
\r
207 autocommenter += "</form>";
\r
208 return autocommenter;
\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
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
239 vname.value = localiser.localise("choose_name");
\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
247 text.innerHTML = select;
\r
248 text.setAttribute('style','width: 90%');
\r
250 var buttons = dialog.appendChild(document.createElement('div'));
\r
251 var ok = buttons.appendChild(document.createElement('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
260 cancel.addEventListener('click',function() {
\r
261 document.body.removeChild(back);
\r
262 document.body.removeChild(modal);
\r
266 ok.addEventListener('click',function() {
\r
267 quicktags.push(new Array(vname.value,text.value));
\r
269 arse.innerHTML = createAutoCommenter();
\r
270 document.body.removeChild(back);
\r
271 document.body.removeChild(modal);
\r
274 modal.style.top = document.body.scrollTop+((document.body.clientHeight-modal.scrollHeight)/2)+'px';
\r
276 GM_registerMenuCommand(localiser.localise("prompt_comment"), prompt_autocomment);
\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
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
310 vname.checked = true;
\r
311 li.appendChild(vname);
\r
312 ul.appendChild(li);
\r
313 inputs.push(vname);
\r
315 content.appendChild(ul);
\r
317 var buttons = dialog.appendChild(document.createElement('div'));
\r
318 var ok = buttons.appendChild(document.createElement('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
327 cancel.addEventListener('click',function() {
\r
328 document.body.removeChild(back);
\r
329 document.body.removeChild(modal);
\r
333 ok.addEventListener('click',function() {
\r
334 new_q = new Array();
\r
335 for each(inp in inputs) {
\r
337 new_q.push(quicktags[inp.value]);
\r
341 arse.innerHTML = createAutoCommenter();
\r
342 document.body.removeChild(back);
\r
343 document.body.removeChild(modal);
\r
346 modal.style.top = document.body.scrollTop+((document.body.clientHeight-modal.scrollHeight)/2)+'px';
\r
348 GM_registerMenuCommand(localiser.localise('edit_comments'), prompt_editautocomment);
\r
356 w.sf_gpt_addcomment=function(theform) {
\r
358 thisTextArea = document.evaluate(
\r
359 "//textarea[@name='message']",
\r
362 XPathResult.FIRST_ORDERED_NODE_TYPE, null
\r
367 if(theform.sfquicktag.selectedIndex != 0)
\r
368 mesg += quicktags[theform.sfquicktag.options[theform.sfquicktag.selectedIndex].value][1];
\r
371 thisTextArea.value = thisTextArea.value.substr(0,thisTextArea.selectionStart)
\r
373 + thisTextArea.value.substr(thisTextArea.selectionStart);
\r
375 thisTextArea.value += mesg;
\r
380 arse.innerHTML= createAutoCommenter();
\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
387 XPathResult.FIRST_ORDERED_NODE_TYPE,
\r
389 ).singleNodeValue;
\r
392 thisLink.parentNode.insertBefore(arse, thisLink.nextSibling);
\r
394 var allLinks, thisLink;
\r
395 allLinks = document.evaluate('//div[@id="DiscussPhoto"]/h3',
\r
398 XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
\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
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
410 XPathResult.FIRST_ORDERED_NODE_TYPE,
\r
412 ).singleNodeValue;
\r
414 thisLink.parentNode.insertBefore(arse, thisLink);
\r
416 thisLink = document.evaluate(
\r
417 '//div[@id=\'DiscussTopic\']//td/h3',
\r
420 XPathResult.FIRST_ORDERED_NODE_TYPE,
\r
422 ).singleNodeValue;
\r
424 thisLink.parentNode.insertBefore(arse, thisLink.nextSibling);
\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
430 XPathResult.FIRST_ORDERED_NODE_TYPE,
\r
432 ).singleNodeValue;
\r
434 thisLink.parentNode.insertBefore(arse, thisLink);
\r