-rw-r--r-- | content/fireflix.js | 878 |
1 files changed, 878 insertions, 0 deletions
diff --git a/content/fireflix.js b/content/fireflix.js new file mode 100644 index 0000000..9518480 --- a/dev/null +++ b/content/fireflix.js | |||
@@ -0,0 +1,878 @@ | |||
1 | function splitascii(s) { | ||
2 | var rv=''; | ||
3 | for(var i=0;i<s.length;++i) { | ||
4 | var w = s.charCodeAt(i); | ||
5 | rv += String.fromCharCode( | ||
6 | w&0xff, (w>>8)&0xff ); | ||
7 | } | ||
8 | return rv; | ||
9 | } | ||
10 | |||
11 | |||
12 | var fireflix = { | ||
13 | flickr: new Flickr(), | ||
14 | init: function() { | ||
15 | this.loc_strings = document.getElementById('loc_strings'); | ||
16 | this.build_menus(); | ||
17 | this.cmd_set_props = document.getElementById('cmd_set_props'); | ||
18 | this.foundphotos.init(this); | ||
19 | this.photosets.init(this); | ||
20 | this.photoset.init(this); | ||
21 | this.uploads.init(this); | ||
22 | this.uploadObserver.init(this); | ||
23 | this.flickr.api_key = '9c43cd66947a57e6f29db1a9da3f72e3'; | ||
24 | this.flickr.api_shs = '9c33c9e2f0f0cfd5'; | ||
25 | this.flickr.prefs_root = 'net.klever.kin.fireflix'; | ||
26 | this.flickr.load_token(); | ||
27 | document.getElementById('setslist').view = this.photosets; | ||
28 | document.getElementById('setphotos').view = this.photoset; | ||
29 | document.getElementById('uploadlist').view = this.uploads; | ||
30 | this.flickr.no_auth_info_label = document.getElementById('auth_info').value; | ||
31 | if(this.flickr.token) { | ||
32 | this.refresh_stuff(); | ||
33 | document.getElementById('auth_info').value = | ||
34 | this.flickr.user.fullname+' ['+this.flickr.user.username+']'; | ||
35 | document.getElementById('auth_info').disabled = false; | ||
36 | document.getElementById('b_auth').hidden = true; | ||
37 | } | ||
38 | }, | ||
39 | on_auth: function() { | ||
40 | var _this = this; | ||
41 | this.flickr.authorize_0( | ||
42 | function() { | ||
43 | document.getElementById('b_auth').hidden = true; | ||
44 | document.getElementById('b_auth_done').hidden = false; | ||
45 | }, function(x,s,c,m) { | ||
46 | _this.flickr_failure(x,s,c,m); | ||
47 | } | ||
48 | ); | ||
49 | }, | ||
50 | on_auth_done: function() { | ||
51 | document.getElementById('b_auth_done').hidden = true; | ||
52 | var _this = this; | ||
53 | this.flickr.authorize_1( | ||
54 | function() { | ||
55 | _this.flickr.save_token(); | ||
56 | _this.refresh_stuff(); | ||
57 | document.getElementById('auth_info').value = | ||
58 | _this.flickr.user.fullname+' ['+_this.flickr.user.username+']'; | ||
59 | document.getElementById('auth_info').disabled = false; | ||
60 | }, function(x,s,c,m) { | ||
61 | document.getElementById('b_auth').hidden = false; | ||
62 | _this.flickr_failure(x,s,c,m); | ||
63 | } | ||
64 | ); | ||
65 | }, | ||
66 | |||
67 | refresh_sets: function() { this.photosets.refresh_sets(); }, | ||
68 | refresh_stuff: function() { | ||
69 | this.refresh_sets(); | ||
70 | this.refresh_user_tags(); | ||
71 | }, | ||
72 | |||
73 | /* photoset treeview */ | ||
74 | photoset: { | ||
75 | photos: new Array(), | ||
76 | fireflix: null, | ||
77 | init: function(f) { | ||
78 | this.fireflix = f; | ||
79 | }, | ||
80 | rowCount: 0, | ||
81 | getCellText: function(r,c) { | ||
82 | var p = this.photos[r]; | ||
83 | if(c.id=='sp_title') return p.title; | ||
84 | if(c.id=='sp_taken') return p.datetaken; | ||
85 | if(c.id=='sp_upload') return p.dateupload; /* TODO: unixtime conversion */ | ||
86 | return c.id; | ||
87 | }, | ||
88 | setTree: function(t) { this.tree = t }, | ||
89 | isContainer: function(r) { return false; }, | ||
90 | isSeparator: function(r) { return false; }, | ||
91 | isSorted: function(r) { return false; }, | ||
92 | getLevel: function(r) { return 0; }, | ||
93 | getImageSrc: function(r,c) { return null }, | ||
94 | getRowProperties: function(r,p) {}, | ||
95 | getCellProperties: function(cid,cel,p) {}, | ||
96 | getColumnProperties: function(cid,cel,p) { }, | ||
97 | cycleHeader: function(cid,e) { }, | ||
98 | getParentIndex: function(r) { return -1; }, | ||
99 | drop: function(r,o) { }, | ||
100 | canDropBeforeAfter: function(r,b) { return false }, | ||
101 | |||
102 | importXPR: function(xp) { | ||
103 | this.tree.beginUpdateBatch(); | ||
104 | this.photos = new Array(); | ||
105 | var n; while(n=xp.iterateNext()) { | ||
106 | this.photos.push(new Photo(n)); | ||
107 | } | ||
108 | this.rowCount = this.photos.length; | ||
109 | this.tree.endUpdateBatch(); | ||
110 | }, | ||
111 | load_photos: function(psid) { | ||
112 | var _this = this; | ||
113 | this.fireflix.flickr.api_call( | ||
114 | { | ||
115 | method: 'flickr.photosets.getPhotos', | ||
116 | auth_token: 'default', | ||
117 | photoset_id: psid, | ||
118 | extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update' | ||
119 | }, function(xr) { | ||
120 | var x = xr.responseXML; | ||
121 | var xp = x.evaluate( | ||
122 | '/rsp/photoset/photo', x, null, | ||
123 | XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); | ||
124 | _this.importXPR(xp); | ||
125 | }, function(x,s,c,m) { | ||
126 | _this.fireflix.flickr_failure(x,s,c,m); | ||
127 | } | ||
128 | ); | ||
129 | }, | ||
130 | on_select: function() { | ||
131 | if(this.selection.count==1) { | ||
132 | var p = this.photos[this.selection.currentIndex]; | ||
133 | document.getElementById('set_photo').src = | ||
134 | this.fireflix.flickr.get_photo_url(p.server,p.id,p.secret,'t'); | ||
135 | document.getElementById('set_photo').hidden = false; | ||
136 | }else{ | ||
137 | document.getElementById('set_photo').hidden = true; | ||
138 | } | ||
139 | } | ||
140 | }, | ||
141 | |||
142 | /* photosets treeview */ | ||
143 | photosets: { | ||
144 | sets: new Array(), | ||
145 | fireflix: null, | ||
146 | init: function(f) { | ||
147 | this.fireflix = f; | ||
148 | }, | ||
149 | rowCount: 0, | ||
150 | getCellText: function(r,c) { | ||
151 | var s = this.sets[r]; | ||
152 | if(c.id=='sl_name') return s.title; | ||
153 | if(c.id=='sl_photos') return s.photos; | ||
154 | return c.id; | ||
155 | }, | ||
156 | setTree: function(t) { this.tree = t }, | ||
157 | isContainer: function(r) { return false; }, | ||
158 | isSeparator: function(r) { return false; }, | ||
159 | isSorted: function() { return false; }, | ||
160 | getLevel: function(r) { return 0; }, | ||
161 | getImageSrc: function(r,c) { return null }, | ||
162 | getRowProperties: function(r,p) {}, | ||
163 | getCellProperties: function(cid,cel,p) { }, | ||
164 | getColumnProperties: function(cid,cel,p) { }, | ||
165 | cycleHeader: function(cid,e) { }, | ||
166 | getParentIndex: function(r) { return -1; }, | ||
167 | drop: function(r,o) { }, | ||
168 | canDropBeforeAfter: function(r,b) { return false }, | ||
169 | |||
170 | importXPR: function(xp) { | ||
171 | this.tree.beginUpdateBatch(); | ||
172 | this.sets = new Array(); | ||
173 | var n; while(n=xp.iterateNext()) { | ||
174 | this.sets.push(new Photoset(n)); | ||
175 | } | ||
176 | this.rowCount = this.sets.length; | ||
177 | this.tree.endUpdateBatch(); | ||
178 | }, | ||
179 | refresh_sets: function() { | ||
180 | var _this = this; | ||
181 | this.fireflix.flickr.api_call( | ||
182 | { | ||
183 | method: 'flickr.photosets.getList', | ||
184 | auth_token: 'default' | ||
185 | }, function(xr) { | ||
186 | var x = xr.responseXML; | ||
187 | var xp = x.evaluate( | ||
188 | '/rsp/photosets/photoset', x, null, | ||
189 | XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); | ||
190 | _this.importXPR(xp); | ||
191 | }, function(x,s,c,m) { | ||
192 | _this.fireflix.flickr_failure(x,s,c,m); | ||
193 | } | ||
194 | ); | ||
195 | }, | ||
196 | on_select: function() { | ||
197 | if(this.selection.count==1) { | ||
198 | this.fireflix.cmd_set_props.setAttribute('disabled','false'); | ||
199 | var s = this.sets[this.selection.currentIndex]; | ||
200 | this.fireflix.photoset.load_photos(s.id); | ||
201 | }else{ | ||
202 | this.fireflix.cmd_set_props.setAttribute('disabled','true'); | ||
203 | } | ||
204 | } | ||
205 | }, | ||
206 | |||
207 | refresh_user_tags: function() { | ||
208 | var lb = document.getElementById('tagslist'); | ||
209 | var _this = this; | ||
210 | this.flickr.api_call( | ||
211 | { | ||
212 | method: 'flickr.tags.getListUser', | ||
213 | auth_token: 'default', | ||
214 | }, function(xr) { | ||
215 | var x = xr.responseXML; | ||
216 | var xp = x.evaluate( | ||
217 | '/rsp/who/tags/tag', x, null, | ||
218 | XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); | ||
219 | // TODO: clear list | ||
220 | var n; while(n=xp.iterateNext()) { | ||
221 | lb.appendItem(n.firstChild.nodeValue); | ||
222 | } | ||
223 | }, function(x,s,c,m) { | ||
224 | _this.flickr_failure(x,s,c,m); | ||
225 | } | ||
226 | ); | ||
227 | }, | ||
228 | |||
229 | uploadObserver: { | ||
230 | fireflix: null, | ||
231 | init: function(f) { | ||
232 | this.fireflix = f; | ||
233 | }, | ||
234 | getSupportedFlavours: function() { | ||
235 | var rv = new FlavourSet(); | ||
236 | rv.appendFlavour('application/x-moz-file','nsIFile'); | ||
237 | rv.appendFlavour('application/x-moz-url'); | ||
238 | rv.appendFlavour('text/uri-list'); | ||
239 | rv.appendFlavour('text/unicode'); | ||
240 | return rv; | ||
241 | }, | ||
242 | canHandleMultipleItems: true, | ||
243 | onDragOver: function(ev,fl,sess) { | ||
244 | return true; | ||
245 | }, | ||
246 | onDrop: function(ev,dd,s) { | ||
247 | var ldf = null; | ||
248 | for(var i in dd.dataList) { | ||
249 | var di = dd.dataList[i]; | ||
250 | var dif = di.first; | ||
251 | if( | ||
252 | ldf==null | ||
253 | || ldf.flavour.contentType!=dif.flavour.contentType | ||
254 | || ldf.contentLength!=dif.contentLength | ||
255 | || ldf.data!=dif.data ) | ||
256 | this.drop_item(ev,di,s); | ||
257 | ldf = dif; | ||
258 | } | ||
259 | }, | ||
260 | drop_item: function(ev,di,s) { | ||
261 | var d = di.first; | ||
262 | switch(d.flavour.contentType) { | ||
263 | case 'text/unicode': | ||
264 | this.drop_urilist(ev,d.data,s); | ||
265 | break; | ||
266 | case 'application/x-moz-file': | ||
267 | this.fireflix.uploads.add(d.data.path); | ||
268 | document.getElementById('fireflix_tabs').selectedTab | ||
269 | = document.getElementById('tab_upload'); | ||
270 | break; | ||
271 | case 'text/uri-list': | ||
272 | // is it ascii or could it be utf8? | ||
273 | this.drop_urilist(ev,splitascii(d.data),s); | ||
274 | break; | ||
275 | default: alert(d.flavour.contentType+':'+d.data); break; | ||
276 | }; | ||
277 | }, | ||
278 | drop_urilist: function(ev,ul,s) { | ||
279 | // TODO: check for being a file? | ||
280 | var us = decodeURIComponent(ul).split(/[\r\n]/); | ||
281 | for(var ui in us) | ||
282 | if(/\S/.test(us[ui])) | ||
283 | this.fireflix.uploads.add(us[ui]); | ||
284 | document.getElementById('fireflix_tabs').selectedTab | ||
285 | = document.getElementById('tab_upload'); | ||
286 | } | ||
287 | }, | ||
288 | |||
289 | uploads: { | ||
290 | fireflix: null, | ||
291 | init: function(f) { | ||
292 | this.fireflix=f; | ||
293 | this.upload_filename = document.getElementById('upload_filename'); | ||
294 | this.upload_title = document.getElementById('upload_title'); | ||
295 | this.upload_file_preview = document.getElementById('upload_file_preview'); | ||
296 | this.upload_file_props = document.getElementById('upload_file_props'); | ||
297 | this.upload_progress = document.getElementById('upload_progress'); | ||
298 | this.upload_tags = document.getElementById('upload_tags'); | ||
299 | }, | ||
300 | files: new Array(), | ||
301 | rowCount: 0, | ||
302 | getCellText: function(r,c) { | ||
303 | var f = this.files[r]; | ||
304 | if(c.id=='up_file') return f.file; | ||
305 | if(c.id=='up_title') return f.title; | ||
306 | if(c.id=='up_status') return f.state; | ||
307 | return c.id; | ||
308 | }, | ||
309 | setTree: function(t) { this.tree = t }, | ||
310 | isContainer: function(r) { return false; }, | ||
311 | isSeparator: function(r) { return false; }, | ||
312 | isSorted: function(r) { return false; }, | ||
313 | getLevel: function(r) { return 0; }, | ||
314 | getImageSrc: function(r,c) { return null }, | ||
315 | getRowProperties: function(r,p) { | ||
316 | try { | ||
317 | if(!Components) return; | ||
318 | }catch(e) { return } | ||
319 | var f = this.files[r]; | ||
320 | var as = Components.classes['@mozilla.org/atom-service;1']. | ||
321 | getService(Components.interfaces.nsIAtomService); | ||
322 | p.AppendElement(as.getAtom(f.state)); | ||
323 | }, | ||
324 | getCellProperties: function(r,c,p) { this.getRowProperties(r,p); }, | ||
325 | getColumnProperties: function(c,p) { }, | ||
326 | cycleHeader: function(cid,e) { }, | ||
327 | getParentIndex: function(r) { return -1; }, | ||
328 | drop: function(r,o) { }, | ||
329 | canDropBeforeAfter: function(r,b) { return false }, | ||
330 | |||
331 | add: function(f) { | ||
332 | if(f.indexOf('file:/')==0) { | ||
333 | f = f.substr(5); | ||
334 | while(f.substr(0,2)=='//') { // XXX: not very performant, is it? ;-) | ||
335 | f = f.substr(1); | ||
336 | } | ||
337 | } | ||
338 | var t = f; | ||
339 | var ls = t.lastIndexOf('/'); | ||
340 | if(ls>0) t = t.substr(ls+1); | ||
341 | ls = t.lastIndexOf('\\'); | ||
342 | if(ls>0) t = t.substr(ls+1); | ||
343 | var ld = t.lastIndexOf('.'); | ||
344 | if(ld>0) t = t.substr(0,ld); | ||
345 | this.files.push( { | ||
346 | file: f, | ||
347 | title: t, | ||
348 | tags: '', | ||
349 | state: 'pending' | ||
350 | } ); | ||
351 | this.rowCount = this.files.length; | ||
352 | this.tree.rowCountChanged(this.rowCount-1,1); | ||
353 | }, | ||
354 | |||
355 | upload_worker: function() { | ||
356 | for(var f in this.files) { | ||
357 | if(this.files[f].state=='pending') { | ||
358 | var ff = this.files[f]; | ||
359 | dump('upload '+ff.file+'\n'); | ||
360 | this.on_file_upload(ff); | ||
361 | ff.state='uploading'; | ||
362 | this.tree.invalidate(); | ||
363 | var _this = this; | ||
364 | this.fireflix.flickr.upload_file( | ||
365 | ff.file, { title: ff.title, tags: ff.tags }, | ||
366 | function(x,p) { | ||
367 | ff.photoid = p; | ||
368 | _this.batch_ids.push(p); | ||
369 | ff.state='completed'; | ||
370 | _this.tree.invalidate(); | ||
371 | window.setTimeout(_this.upload_to,0,_this); | ||
372 | }, function(x,s,c,m) { | ||
373 | ff.state='failed'; | ||
374 | ff.flickr_errcode = c; | ||
375 | ff.flickr_errmsg = m; | ||
376 | _this.tree.invalidate(); | ||
377 | window.setTimeout(_this.upload_to,0,_this); | ||
378 | } | ||
379 | ); | ||
380 | return; | ||
381 | } | ||
382 | } | ||
383 | dump('uploading done\n'); | ||
384 | this.on_finish_upload(); | ||
385 | }, | ||
386 | upload_to: function(_this) { _this.upload_worker(); }, | ||
387 | on_file_upload: function(f) { | ||
388 | document.getElementById('cmd_uploads_upload').setAttribute('disabled','true'); | ||
389 | for(var fi in this.files) { | ||
390 | if(this.files[fi].file==f.file) { | ||
391 | this.tree.ensureRowIsVisible(fi); | ||
392 | this.selection.rangedSelect(fi,fi,false); | ||
393 | this.selection.currentIndex = fi; | ||
394 | this.selToProps(); | ||
395 | break; | ||
396 | } | ||
397 | } | ||
398 | }, | ||
399 | on_finish_upload: function() { | ||
400 | if(this.batch_ids.length) { | ||
401 | var psn = prompt(this.fireflix.loc_strings.getString('postUploadPhotoset')); | ||
402 | if(psn!=null) { | ||
403 | var pids = this.batch_ids.join(','); | ||
404 | var ppid = this.batch_ids[0]; | ||
405 | var _this = this; | ||
406 | this.fireflix.flickr.api_call( | ||
407 | { | ||
408 | method: 'flickr.photosets.create', | ||
409 | auth_token: 'default', | ||
410 | title: psn, | ||
411 | primary_photo_id: ppid | ||
412 | }, function(x) { | ||
413 | var npid = | ||
414 | x.responseXML.getElementsByTagName('photoset').item(0).getAttribute('id'); | ||
415 | _this.fireflix.flickr.api_call( | ||
416 | { | ||
417 | method: 'flickr.photosets.editPhotos', | ||
418 | auth_token: 'default', | ||
419 | photoset_id: npid, | ||
420 | primary_photo_id: ppid, | ||
421 | photo_ids: pids | ||
422 | }, function(x) { | ||
423 | _this.fireflix.refresh_sets(); | ||
424 | }, function(x,s,c,m) { | ||
425 | _this.fireflix.flickr_failure(x,s,c,m); | ||
426 | } | ||
427 | ); | ||
428 | }, function(x,s,c,m) { | ||
429 | _this.fireflix.flickr_failure(x,s,c,m); | ||
430 | } | ||
431 | ); | ||
432 | } | ||
433 | } | ||
434 | this.selection.clearSelection(); | ||
435 | document.getElementById('cmd_uploads_upload').setAttribute('disabled','false'); | ||
436 | this.upload_progress.setAttribute('hidden','true'); | ||
437 | }, | ||
438 | |||
439 | clear_list: function() { | ||
440 | this.tree.beginUpdateBatch(); | ||
441 | this.rowCount = 0; | ||
442 | this.files = new Array(); | ||
443 | this.tree.endUpdateBatch(); | ||
444 | this.selToProps(); | ||
445 | }, | ||
446 | selectionChanged: function() { | ||
447 | this.selToProps(); | ||
448 | }, | ||
449 | disableProps: function() { | ||
450 | this.upload_filename.value=''; | ||
451 | this.upload_filename.disabled = true; | ||
452 | this.upload_title.value=''; | ||
453 | this.upload_title.disabled = true; | ||
454 | this.upload_file_preview.src = null; | ||
455 | this.upload_file_props.hidden = true; | ||
456 | this.upload_tags.value=''; | ||
457 | this.upload_tags.disabled = true; | ||
458 | }, | ||
459 | selToProps: function() { | ||
460 | if(!this.selection.count) { | ||
461 | this.disableProps(); | ||
462 | }else if(this.selection.count==1) { | ||
463 | var f=this.files[this.selection.currentIndex]; | ||
464 | if(f==null || f.state!='pending') { | ||
465 | this.disableProps(); | ||
466 | }else{ | ||
467 | this.upload_filename.value = f.file; | ||
468 | this.upload_filename.disabled = false; | ||
469 | this.upload_title.value = f.title; | ||
470 | this.upload_title.disabled = false; | ||
471 | this.upload_file_preview.src = 'file:///'+f.file; | ||
472 | this.upload_file_props.hidden = false; | ||
473 | this.upload_tags.value = f.tags; | ||
474 | this.upload_tags.disabled = false; | ||
475 | } | ||
476 | }else{ | ||
477 | var ftitle = null; var onetitle = true; | ||
478 | var ftags = null; var onetag = true; | ||
479 | var fs = 0; | ||
480 | for(var ff in this.files) { | ||
481 | if(this.selection.isSelected(ff) && this.files[ff].state=='pending' ) { | ||
482 | ++fs; | ||
483 | if(ftitle==null) { | ||
484 | ftitle = this.files[ff].title; | ||
485 | }else if(ftitle!=this.files[ff].title) { | ||
486 | onetitle = false; | ||
487 | } | ||
488 | if(ftags==null) { | ||
489 | ftags = this.files[ff].tags; | ||
490 | }else if(ftags!=this.files[ff].tags) { | ||
491 | onetag = false; | ||
492 | } | ||
493 | } | ||
494 | } | ||
495 | if(fs) { | ||
496 | this.upload_filename.value=''; | ||
497 | this.upload_filename.disabled = true; | ||
498 | if(onetitle) | ||
499 | this.upload_title.value = ftitle; | ||
500 | this.upload_title.disabled = false; | ||
501 | if(onetag) | ||
502 | this.upload_tags.value = ftags; | ||
503 | this.upload_tags.disabled = false; | ||
504 | this.upload_file_preview.src = null; | ||
505 | this.upload_file_props.hidden = false; | ||
506 | }else | ||
507 | this.disableProps(); | ||
508 | } | ||
509 | }, | ||
510 | propsToSel: function(prop) { | ||
511 | if(this.selection.count<=0) return; | ||
512 | for(var ff in this.files) { | ||
513 | if(this.selection.isSelected(ff) && this.files[ff].state=='pending') { | ||
514 | if(prop=='filename') | ||
515 | this.files[ff].file = this.upload_filename.value; | ||
516 | if(prop=='title') | ||
517 | this.files[ff].title = this.upload_title.value; | ||
518 | if(prop=='tags') | ||
519 | this.files[ff].tags = this.upload_tags.value; | ||
520 | this.tree.invalidateRow(ff); | ||
521 | } | ||
522 | } | ||
523 | }, | ||
524 | |||
525 | on_upload: function() { | ||
526 | this.selToProps(); | ||
527 | this.batch_ids = new Array(); | ||
528 | this.upload_progress.value=0; | ||
529 | this.upload_progress.setAttribute('hidden','false'); | ||
530 | this.upload_worker(); | ||
531 | }, | ||
532 | on_clear: function() { | ||
533 | this.clear_list(); | ||
534 | }, | ||
535 | on_remove: function() { | ||
536 | if(this.selection.count) { | ||
537 | this.tree.beginUpdateBatch(); | ||
538 | for(var i=this.files.length-1;i>=0;--i) { | ||
539 | if(this.selection.isSelected(i)) { | ||
540 | this.files.splice(i,1); | ||
541 | this.rowCount--; | ||
542 | } | ||
543 | } | ||
544 | this.tree.endUpdateBatch(); | ||
545 | this.selection.clearSelection(); | ||
546 | } | ||
547 | }, | ||
548 | on_add: function() { | ||
549 | var ifp = Components.interfaces.nsIFilePicker; | ||
550 | var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(ifp); | ||
551 | fp.init(window, "Select a File", ifp.modeOpenMultiple); | ||
552 | fp.appendFilters(ifp.filterImages); | ||
553 | var rv = fp.show(); | ||
554 | if(rv==ifp.returnOK) { | ||
555 | var ff = fp.files; | ||
556 | while(ff.hasMoreElements()) { | ||
557 | var f = ff.getNext(); | ||
558 | f.QueryInterface(Components.interfaces.nsIFile); | ||
559 | this.add(f.path); | ||
560 | } | ||
561 | } | ||
562 | } | ||
563 | }, | ||
564 | |||
565 | on_set_props: function() { | ||
566 | var pset = this.photosets.sets[this.photosets.selection.currentIndex]; | ||
567 | window.openDialog( | ||
568 | "chrome://fireflix/content/photoset-props.xul", | ||
569 | null, "dependent,modal,dialog,chrome", this, | ||
570 | pset ); | ||
571 | if(pset.dirty) { | ||
572 | var _this = this; | ||
573 | this.flickr.api_call( | ||
574 | { | ||
575 | method: 'flickr.photosets.editMeta', | ||
576 | auth_token: 'default', | ||
577 | photoset_id: pset.id, | ||
578 | title: pset.title, | ||
579 | description: pset.description | ||
580 | }, function(xr) { | ||
581 | pset.dirty = false; | ||
582 | _this.flickr.api_call( | ||
583 | { | ||
584 | method: 'flickr.photosets.getPhotos', | ||
585 | auth_token: 'default', | ||
586 | photoset_id: pset.id | ||
587 | }, function(xr) { | ||
588 | var x = xr.responseXML; | ||
589 | var xp = x.evaluate( | ||
590 | '/rsp/photoset/photo', x, null, | ||
591 | XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); | ||
592 | var phids = new Array(); | ||
593 | var priph = null; | ||
594 | var n; while(n=xp.iterateNext()) { | ||
595 | var pid = n.getAttribute('id'); | ||
596 | phids.push( pid ); | ||
597 | if(pid==pset.primary && n.getAttribute('isprimary')!='1') | ||
598 | priph = pid; | ||
599 | } | ||
600 | if(priph) { | ||
601 | _this.flickr.api_call( | ||
602 | { | ||
603 | method: 'flickr.photosets.editPhotos', | ||
604 | auth_token: 'default', | ||
605 | photoset_id: pset.id, | ||
606 | primary_photo_id: priph, | ||
607 | photo_ids: phids.join(',') | ||
608 | }, function() { }, function(x,s,c,m) { /* flickr.photosets.editPhotos */ | ||
609 | _this.flickr_failure(x,s,c,m); | ||
610 | } | ||
611 | ); | ||
612 | } | ||
613 | }, function(x,s,c,m) { /* flickr.photosets.getPhotos */ | ||
614 | _this.flickr_failure(x,s,c,m); | ||
615 | } | ||
616 | ); | ||
617 | }, function(x,s,c,m) { /* flickr.photosets.editMeta */ | ||
618 | _this.flickr_failure(x,s,c,m); | ||
619 | } | ||
620 | ); | ||
621 | } | ||
622 | }, | ||
623 | on_refresh_sets: function() { | ||
624 | this.refresh_sets(); | ||
625 | }, | ||
626 | on_cmd_sets_html: function(csfx,ev) { | ||
627 | var uti = csfx.charAt(0); var utl = csfx.charAt(1); | ||
628 | var rv = this.build_html(this.photoset.photos,uti,utl); | ||
629 | this.popup_content(rv); | ||
630 | }, | ||
631 | |||
632 | on_cmd_uploads_html: function(csfx,ev) { | ||
633 | var uti = csfx.charAt(0); var utl = csfx.charAt(1); | ||
634 | var pids = new Array(); | ||
635 | for(var f in this.uploads.files) { | ||
636 | if(this.uploads.selection.isSelected(f)) | ||
637 | if(this.uploads.files[f].photoid) | ||
638 | pids.push(this.uploads.files[f].photoid); | ||
639 | } | ||
640 | var pp = this.uploads.rowCount*2; if(pp>500) pp = 500; | ||
641 | var _this = this; | ||
642 | this.flickr.api_call( | ||
643 | { | ||
644 | method: 'flickr.photos.search', | ||
645 | auth_token: 'default', | ||
646 | extras: 'original_format', | ||
647 | user_id: 'me', | ||
648 | per_page: pp | ||
649 | }, | ||
650 | function(xr) { | ||
651 | var x = xr.responseXML; | ||
652 | var rv = ''; | ||
653 | for(var pn in pids) { | ||
654 | var p = pids[pn]; | ||
655 | var pp = new Photo(xp_node('/rsp/photos/photo[@id='+p+']',x)); | ||
656 | rv += _this.photo_html(pp,uti,utl)+'\n'; | ||
657 | } | ||
658 | _this.popup_content(rv); | ||
659 | }, function(x,s,c,m) { | ||
660 | _this.flickr_failure(x,s,c,m); | ||
661 | } | ||
662 | ); | ||
663 | }, | ||
664 | |||
665 | /* | ||
666 | * | ||
667 | */ | ||
668 | foundphotos: { | ||
669 | fireflix: null, | ||
670 | init: function(f) { | ||
671 | this.fireflix = f; | ||
672 | this.search_for = document.getElementById('search_for'); | ||
673 | this.search_tags= document.getElementById('search_tags'); | ||
674 | this.search_mine = document.getElementById('search_mine'); | ||
675 | document.getElementById('searchresults').view = this; | ||
676 | this.searchresult_props = document.getElementById('searchresult_props'); | ||
677 | this.search_photo = document.getElementById('search_photo'); | ||
678 | this.searchresult_title = document.getElementById('searchresult_title'); | ||
679 | this.searchresult_description = document.getElementById('searchresult_description'); | ||
680 | }, | ||
681 | photos: new Array(), | ||
682 | rowCount: 0, | ||
683 | getCellText: function(r,c) { | ||
684 | var p = this.photos[r]; | ||
685 | if(c.id=='sr_title') return p.title; | ||
686 | return c.id; | ||
687 | }, | ||
688 | setTree: function(t) { this.tree = t }, | ||
689 | isContainer: function(r) { return false }, | ||
690 | isSeparator: function(r) { return false }, | ||
691 | isSorted: function(r) { return false }, | ||
692 | getLevel: function(r) { return 0 }, | ||
693 | getImageSrc: function(r,c) { return null }, | ||
694 | getRowProperties: function(r,p) { }, | ||
695 | getCellProperties: function(cid,cel,p) { }, | ||
696 | getColumnProperties: function(cid,cel,p) { }, | ||
697 | cycleHeader: function(cid,e) { }, | ||
698 | getParentIndex: function(r) { return -1 }, | ||
699 | drop: function(r,o) { }, | ||
700 | canDropBeforeAfter: function(r,b) { return false }, | ||
701 | |||
702 | importXPR: function(xp) { | ||
703 | this.selection.clearSelection(); | ||
704 | this.selection.currentIndex = -1; | ||
705 | this.searchresult_props.hidden = true; | ||
706 | this.tree.beginUpdateBatch(); | ||
707 | this.photos = new Array(); | ||
708 | var n; while(n=xp.iterateNext()) { | ||
709 | this.photos.push(new Photo(n)); | ||
710 | } | ||
711 | this.rowCount = this.photos.length; | ||
712 | this.tree.endUpdateBatch(); | ||
713 | }, | ||
714 | search_photos: function() { | ||
715 | var pars = { | ||
716 | method: 'flickr.photos.search', | ||
717 | auth_token: 'default', | ||
718 | extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update,geo' | ||
719 | }; | ||
720 | if(this.search_mine.checked) | ||
721 | pars.user_id='me'; | ||
722 | if(this.search_tags.checked) { | ||
723 | pars.tags=this.search_for.value.split(/ +/).join(','); | ||
724 | }else{ | ||
725 | pars.text=this.search_for.value; | ||
726 | } | ||
727 | var _this = this; | ||
728 | this.fireflix.flickr.api_call( pars, | ||
729 | function(xr) { | ||
730 | var x = xr.responseXML; | ||
731 | var xp = x.evaluate( | ||
732 | '/rsp/photos/photo', x, null, | ||
733 | XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); | ||
734 | _this.importXPR(xp); | ||
735 | _this.on_select(); | ||
736 | }, function(x,s,c,m) { | ||
737 | _this.fireflix.flickr_failure(x,s,c,m); | ||
738 | } | ||
739 | ); | ||
740 | }, | ||
741 | on_select: function() { | ||
742 | if(this.selection.currentIndex<0) { | ||
743 | this.searchresult_props.hidden = true; | ||
744 | }else{ | ||
745 | var p = this.photos[this.selection.currentIndex]; | ||
746 | if(!p) { | ||
747 | this.searchresult_props.hidden = true; | ||
748 | }else{ | ||
749 | this.search_photo.src = this.fireflix.flickr.make_photo_url(p,'t'); | ||
750 | this.searchresult_title.value = p.title; | ||
751 | this.searchresult_description.value = null; | ||
752 | if(p.description==null && p.description==undefined) { | ||
753 | var pid = p.id; | ||
754 | var ci = this.selection.currentIndex; | ||
755 | var _this = this; | ||
756 | this.fireflix.flickr.api_call( | ||
757 | { | ||
758 | method: 'flickr.photos.getInfo', | ||
759 | auth_token: 'default', | ||
760 | photo_id: p.id, | ||
761 | secret: p.secret | ||
762 | }, function(xr) { | ||
763 | var pp = _this.photos[ci]; | ||
764 | if(ci==_this.selection.currentIndex && pp.id==pid) { | ||
765 | var n = xp_node('/rsp/photo',xr.responseXML); | ||
766 | pp.fromNode_(n); | ||
767 | _this.searchresult_description.value=pp.description?pp.description:null; | ||
768 | } | ||
769 | }, function(x,s,c,m) { | ||
770 | _this.fireflix.flickr_failure(x,s,c,m); | ||
771 | } | ||
772 | ); | ||
773 | this.searchresult_props.hidden = false; | ||
774 | }else{ | ||
775 | this.searchresult_description.value=p.description?p.description:null; | ||
776 | } | ||
777 | } | ||
778 | } | ||
779 | }, | ||
780 | on_cmd_open: function(ev) { | ||
781 | if(this.selection.currentIndex<0) | ||
782 | return; | ||
783 | var p = this.photos[this.selection.currentIndex]; | ||
784 | if(!p.id) | ||
785 | return; | ||
786 | this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p')); | ||
787 | } | ||
788 | }, | ||
789 | |||
790 | photo_html: function(p,i,l) { | ||
791 | // TODO: add alt/title when possible | ||
792 | var rv = | ||
793 | '<a href="'+this.flickr.make_photo_url(p,l)+'">' + | ||
794 | '<img src="'+this.flickr.make_photo_url(p,i)+'" />'+ | ||
795 | '</a>'; | ||
796 | return rv; | ||
797 | }, | ||
798 | build_html: function(photos,uti,utl) { | ||
799 | var rv = ''; | ||
800 | for(var i in photos) { | ||
801 | var p = photos[i]; | ||
802 | rv += this.photo_html(p,utl,uti)+'\n'; | ||
803 | } | ||
804 | return rv; | ||
805 | }, | ||
806 | |||
807 | popup_content: function(s) { | ||
808 | window.openDialog( | ||
809 | "chrome://fireflix/content/generated-content.xul", | ||
810 | null, "dialog,chrome", this, s ); | ||
811 | }, | ||
812 | copy_to_clipboard: function(s) { | ||
813 | var ch = Components.classes["@mozilla.org/widget/clipboardhelper;1"] | ||
814 | .getService(Components.interfaces.nsIClipboardHelper); | ||
815 | ch.copyString(s); | ||
816 | }, | ||
817 | openTab: function(l) { | ||
818 | var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService( | ||
819 | Components.interfaces.nsIWindowMediator ); | ||
820 | var bw = wm.getMostRecentWindow('navigator:browser'); | ||
821 | var b = bw.getBrowser(); | ||
822 | var t = b.addTab(l); | ||
823 | b.selectedTab = t; | ||
824 | }, | ||
825 | |||
826 | build_menus: function() { | ||
827 | this.append_html_menu( | ||
828 | document.getElementById('sets_html_menu'), | ||
829 | 'stm_','m_bop','cmdset_sets','cmd_sets_html' | ||
830 | ); | ||
831 | this.append_html_menu( | ||
832 | document.getElementById('uploads_html_menu'), | ||
833 | 'stm_','m_bop','cmdset_uploads','cmd_uploads_html' | ||
834 | ); | ||
835 | return; | ||
836 | }, | ||
837 | append_html_menu: function(m,imgt,lnkt,csid,cpfx) { | ||
838 | var mp = m.appendChild(document.createElement('menupopup')); | ||
839 | var t; | ||
840 | t=mp.appendChild(document.createElement('menuitem')); | ||
841 | t.setAttribute('label',this.loc_strings.getString('menutitle_Images')); | ||
842 | t.setAttribute('class','menuhead');t.setAttribute('disabled','true'); | ||
843 | mp.appendChild(document.createElement('menuseparator')); | ||
844 | var cs = document.getElementById(csid); | ||
845 | for(var iti=0;iti<imgt.length;++iti) { | ||
846 | t = mp.appendChild(document.createElement('menu')); | ||
847 | t.setAttribute('label',this.loc_strings.getString('urltype_'+imgt.charAt(iti))); | ||
848 | var smp = t.appendChild(document.createElement('menupopup')); | ||
849 | t=smp.appendChild(document.createElement('menuitem')); | ||
850 | t.setAttribute('label',this.loc_strings.getString('menutitle_Links')); | ||
851 | t.setAttribute('class','menuhead');t.setAttribute('disabled','true'); | ||
852 | smp.appendChild(document.createElement('menuseparator')); | ||
853 | for(var lti=0;lti<lnkt.length;++lti) { | ||
854 | var csfx = imgt.charAt(iti)+lnkt.charAt(lti); | ||
855 | t=smp.appendChild(document.createElement('menuitem')); | ||
856 | t.setAttribute('label',this.loc_strings.getString('urltype_'+lnkt.charAt(lti))); | ||
857 | t.setAttribute('command',cpfx+'_'+csfx); | ||
858 | t=cs.appendChild(document.createElement('command')); | ||
859 | t.setAttribute('id',cpfx+'_'+csfx); | ||
860 | t.setAttribute('oncommand','fireflix.on_'+cpfx+"('"+csfx+"',event)"); | ||
861 | } | ||
862 | } | ||
863 | return mp; | ||
864 | }, | ||
865 | |||
866 | flickr_failure: function(x,s,c,m) { | ||
867 | if(c==98) { // Invalid auth token | ||
868 | this.flickr.reset_token(); | ||
869 | document.getElementById('auth_info').value = this.no_auth_info_label; | ||
870 | document.getElementById('auth_info').disabled = true; | ||
871 | document.getElementById('b_auth').hidden = false; | ||
872 | return; | ||
873 | } | ||
874 | // TODO: is that beauty | ||
875 | alert('flickr api call failed\n'+c+' '+m); | ||
876 | } | ||
877 | |||
878 | }; | ||