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