summaryrefslogtreecommitdiffabout
path: root/content/fireflix.js
Unidiff
Diffstat (limited to 'content/fireflix.js') (more/less context) (ignore whitespace changes)
-rw-r--r--content/fireflix.js878
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 @@
1function 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
12var 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};