4 // Copyright (c) 2007, Pierre Andrews.
5 // Released under the GPL license
6 // http://www.gnu.org/copyleft/gpl.html
9 // @name Flickr Auto Tag
10 // @namespace http://6v8.gamboni.org/Flickr-Auto-Tag.html
11 // @description Save and reuse quickly the tags you often use.
14 // @creator Pierre Andrews (mortimer.pa@free.fr)
15 // @include http://*flickr.com/photos/*
16 // @exclude http://*flickr.com/photos/organize*
21 var win = (unsafeWindow || window.wrappedJSObject || window);
25 name: "Flickr Auto Tag",
26 namespace: "http://6v8.gamboni.org/Flickr-Auto-Tag.html",
27 description: "Save and reuse quickly the tags you often use.",
28 source: "http://6v8.gamboni.org/Flickr-Auto-Tag.html", // script homepage/description URL
29 identifier: "http://6v8.gamboni.org/IMG/js/flickrautotag.user.js",
30 version: "0.3", // version
31 date: (new Date(2007, 6, 26)) // update date
35 //======================================================================
36 //to do the closure and get the right this.
37 //adapted from http://persistent.info/greasemonkey/gmail.user.js
39 function getObjectMethodClosure0(object, method,args) {
41 return object[method](args);
45 /***********************************************************************
47 **********************************************************************/
50 return document.evaluate(
54 XPathResult.FIRST_ORDERED_NODE_TYPE, null
58 var FlickrLocaliser = function(locals) {
61 FlickrLocaliser.prototype = {
62 selectedLang: undefined,
63 localisations: undefined,
64 getLanguage: function() {
65 if(!this.selectedLang) {
66 var langA = $x1("//p[@class='LanguageSelector']//a[contains(@class,'selected')]");
68 var matches = /\/change_language.gne\?lang=([^&]+)&.*/.exec(langA.href);
69 if(matches && matches[1]) {
70 this.selectedLang = matches[1];
71 return this.selectedLang;
75 } else return this.selectedLang;
78 init: function(locals) {
79 this.localisations = locals;
82 localise: function(string, params) {
83 if(this.localisations && this.getLanguage()) {
84 var currentLang = this.localisations[this.selectedLang];
85 if(!currentLang) currentLang = this.localisations[this.localisations.defaultLang];
86 var local = currentLang[string];
88 local = this.localisations[this.localisations.defaultLang][string];
90 if(!local) return string;
92 var rep = new RegExp('@'+arg+'@','g');
93 local = local.replace(rep,params[arg]);
95 local =local.replace(/@[^@]+@/g,'');
97 } else return undefined;
102 /*****************************Flickr Localisation**********************/
105 /*function M8_log() {
106 if(unsafeWindow.console)
107 unsafeWindow.console.log(arguments);
112 var localiser = new FlickrLocaliser({
116 'clear' : "FlickrAutoTag: Clear"
121 'clear' : "FlickrAutoTag: Vider les tags"
126 'clear' : "FlickrAutoTag: Borrar las etiquetas"
131 'clear' : "FlickrAutoTag: Cancella i tag"
136 'clear' : "FlickrAutoTag: Limpar suas tags"
140 'add' : '增加',
142 'save' : '儲存'
146 'add' : 'hinzfügen',
152 'add' : '추가',
154 'save' : '저장'
159 win.FlickrAutoTag = function() {
163 win.FlickrAutoTag.prototype = {
167 var matches = /\/photos\/[^\/]+\/([0-9]+)/.exec(document.location.pathname);
169 //use the tags flickr already retrieved for use, thanks
170 existing_tags = unsafeWindow.global_photos[matches[1]].tags_rawA;
172 var tags = GM_getValue('tags');
174 var tagit = document.getElementById('tagadderlink');
176 stags = tags.split('#@#');
178 for each(tag in stags) {
181 //This will not resist to "
182 var split = tag.split(' ');
184 for each(t in split) {
185 if(existing_tags.indexOf(t) > 0) cnt++;
187 if(cnt == split.length) show = false;
190 tag = tag.replace(/\"/g,'"');
191 html += '<option>'+tag+'</option>';
195 var span = tagit.appendChild(document.createElement('span'));
196 span.style.display = 'block';
197 span.style.fontSize = '80%';
198 var select = span.appendChild(document.createElement('select'));
199 select.innerHTML = html;
200 var button = span.appendChild(document.createElement('button'));
201 button.innerHTML = localiser.localise('add');
202 button.className = 'SmallButt';
203 button.addEventListener('click',getObjectMethodClosure0(this,'addTags',select),true);
209 var adder = document.getElementById('tagadderform');
211 var label = adder.parentNode.insertBefore(document.createElement('label'),adder.nextSibling);
212 label.innerHTML = localiser.localise('save');
213 label.style.fontSize = 'small';
214 label.style.color = 'grey';
215 label.htmlFor = 'savetag';
216 var save = adder.parentNode.insertBefore(document.createElement('input'),adder.nextSibling);
217 save.type = 'checkbox';
219 adder.elements[2].addEventListener('click',function() {
221 if(!tags || (tags.split('#@#').indexOf(adder.elements[1].value) < 0)) {
222 if(tags) tags += '#@#'; //this will not resist tags containing #@#
224 tags += adder.elements[1].value;
225 GM_setValue('tags',tags);
232 addTags: function(select) {
234 var adder = document.getElementById('tagadderform');
236 var matches = /\/photos\/[^\/]+\/([0-9]+)/.exec(document.location.pathname);
238 //use flickr function to do the work
239 unsafeWindow.tagrs_addTag(matches[1],select.value);
245 //======================================================================
247 //======================================================================
250 window.addEventListener("load", function () {
253 // update automatically (http://userscripts.org/scripts/show/2296)
254 win.UserScriptUpdates.requestAutomaticUpdates(SCRIPT);
257 var flickrgp = new win.FlickrAutoTag();
259 //a menu item to clear the saved tags.
260 GM_registerMenuCommand( localiser.localise('clear'), function() {GM_setValue('tags','');} );