summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--content/fireflix.js96
-rw-r--r--content/flickr.js65
2 files changed, 69 insertions, 92 deletions
diff --git a/content/fireflix.js b/content/fireflix.js
index 225e21c..283e930 100644
--- a/content/fireflix.js
+++ b/content/fireflix.js
@@ -63,227 +63,215 @@ var fireflix = {
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 import_json: function(jp) {
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 for(var i in jp) this.photos.push(new Photo(jp[i]));
131 this.photos.push(new Photo(n)); 131 this.rowCount =this.photos.length;
132 }
133 this.rowCount = this.photos.length;
134 this.tree.endUpdateBatch(); 132 this.tree.endUpdateBatch();
135 this.selection.clearSelection(); 133 this.selection.clearSelection();
136 }, 134 },
137 load_photos: function(psid) { 135 load_photos: function(psid) {
138 var _this = this; 136 var that = this;
139 this.fireflix.flickr.api_call( 137 this.fireflix.flickr.api_call_json(
140 { 138 {
141 method: 'flickr.photosets.getPhotos', 139 method: 'flickr.photosets.getPhotos',
142 auth_token: 'default', 140 auth_token: 'default',
143 photoset_id: psid, 141 photoset_id: psid,
144 extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update' 142 extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update'
145 }, function(xr) { 143 }, function(x,j) {
146 var x = xr.responseXML; 144 that.import_json(j.photoset.photo);
147 var xp = x.evaluate(
148 '/rsp/photoset/photo', x, null,
149 XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
150 _this.importXPR(xp);
151 }, function(x,s,c,m) { 145 }, function(x,s,c,m) {
152 _this.fireflix.flickr_failure(x,s,c,m); 146 that.fireflix.flickr_failure(x,s,c,m);
153 } 147 }
154 ); 148 );
155 }, 149 },
156 on_select: function() { 150 on_select: function() {
157 if(this.selection.count==1) { 151 if(this.selection.count==1) {
158 var p = this.photos[this.selection.currentIndex]; 152 var p = this.photos[this.selection.currentIndex];
159 this.set_photo.src = 153 this.set_photo.src =
160 this.fireflix.flickr.get_photo_url(p.server,p.id,p.secret,'t'); 154 this.fireflix.flickr.get_photo_url(p.server,p.id,p.secret,'t');
161 this.set_photo_props.hidden = false; 155 this.set_photo_props.hidden = false;
162 }else{ 156 }else{
163 this.set_photo_props.hidden = true; 157 this.set_photo_props.hidden = true;
164 } 158 }
165 }, 159 },
166 on_cmd_open: function(ev) { 160 on_cmd_open: function(ev) {
167 if(this.selection.currentIndex<0) return; 161 if(this.selection.currentIndex<0) return;
168 var p = this.photos[this.selection.currentIndex]; 162 var p = this.photos[this.selection.currentIndex];
169 if(!p.id) return; 163 if(!p.id) return;
170 this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p')); 164 this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p'));
171 } 165 }
172 }, 166 },
173 167
174 /* photosets treeview */ 168 /* photosets treeview */
175 photosets: { 169 photosets: {
176 sets: new Array(), 170 sets: new Array(),
177 fireflix: null, 171 fireflix: null,
178 init: function(f) { 172 init: function(f) {
179 this.fireflix = f; 173 this.fireflix = f;
180 document.getElementById('setslist').view = this; 174 document.getElementById('setslist').view = this;
181 }, 175 },
182 rowCount: 0, 176 rowCount: 0,
183 getCellText: function(r,c) { 177 getCellText: function(r,c) {
184 var s = this.sets[r]; 178 var s = this.sets[r];
185 if(c.id=='sl_name') return s.title; 179 if(c.id=='sl_name') return s.title;
186 if(c.id=='sl_photos') return s.photos; 180 if(c.id=='sl_photos') return s.photos;
187 return c.id; 181 return c.id;
188 }, 182 },
189 setTree: function(t) { this.tree = t }, 183 setTree: function(t) { this.tree = t },
190 isContainer: function(r) { return false; }, 184 isContainer: function(r) { return false; },
191 isSeparator: function(r) { return false; }, 185 isSeparator: function(r) { return false; },
192 isSorted: function() { return false; }, 186 isSorted: function() { return false; },
193 getLevel: function(r) { return 0; }, 187 getLevel: function(r) { return 0; },
194 getImageSrc: function(r,c) { return null }, 188 getImageSrc: function(r,c) { return null },
195 getRowProperties: function(r,p) {}, 189 getRowProperties: function(r,p) {},
196 getCellProperties: function(cid,cel,p) { }, 190 getCellProperties: function(cid,cel,p) { },
197 getColumnProperties: function(cid,cel,p) { }, 191 getColumnProperties: function(cid,cel,p) { },
198 cycleHeader: function(cid,e) { }, 192 cycleHeader: function(cid,e) { },
199 getParentIndex: function(r) { return -1; }, 193 getParentIndex: function(r) { return -1; },
200 drop: function(r,o) { }, 194 drop: function(r,o) { },
201 canDropBeforeAfter: function(r,b) { return false }, 195 canDropBeforeAfter: function(r,b) { return false },
202 196
203 importXPR: function(xp) { 197 import_json: function(j) {
204 this.tree.beginUpdateBatch(); 198 this.tree.beginUpdateBatch();
205 this.sets = new Array(); 199 this.sets = new Array();
206 var n; while(n=xp.iterateNext()) { 200 for(var i in j) this.sets.push(new Photoset(j[i]));
207 this.sets.push(new Photoset(n));
208 }
209 this.rowCount = this.sets.length; 201 this.rowCount = this.sets.length;
210 this.tree.endUpdateBatch(); 202 this.tree.endUpdateBatch();
211 }, 203 },
212 refresh_sets: function() { 204 refresh_sets: function() {
213 var _this = this; 205 var that = this;
214 this.fireflix.flickr.api_call( 206 this.fireflix.flickr.api_call_json(
215 { 207 {
216 method: 'flickr.photosets.getList', 208 method: 'flickr.photosets.getList',
217 auth_token: 'default' 209 auth_token: 'default'
218 }, function(xr) { 210 }, function(x,j) {
219 var x = xr.responseXML; 211 that.import_json(j.photosets.photoset);
220 var xp = x.evaluate(
221 '/rsp/photosets/photoset', x, null,
222 XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
223 _this.importXPR(xp);
224 }, function(x,s,c,m) { 212 }, function(x,s,c,m) {
225 _this.fireflix.flickr_failure(x,s,c,m); 213 that.fireflix.flickr_failure(x,s,c,m);
226 } 214 }
227 ); 215 );
228 }, 216 },
229 on_select: function() { 217 on_select: function() {
230 if(this.selection.count==1) { 218 if(this.selection.count==1) {
231 this.fireflix.cmd_set_props.setAttribute('disabled','false'); 219 this.fireflix.cmd_set_props.setAttribute('disabled','false');
232 var s = this.sets[this.selection.currentIndex]; 220 var s = this.sets[this.selection.currentIndex];
233 this.fireflix.photoset.load_photos(s.id); 221 this.fireflix.photoset.load_photos(s.id);
234 }else{ 222 }else{
235 this.fireflix.cmd_set_props.setAttribute('disabled','true'); 223 this.fireflix.cmd_set_props.setAttribute('disabled','true');
236 } 224 }
237 }, 225 },
238 on_cmd_open_in_flickr: function(ev) { 226 on_cmd_open_in_flickr: function(ev) {
239 if(this.selection.currentIndex<0) return; 227 if(this.selection.currentIndex<0) return;
240 var p = this.sets[this.selection.currentIndex]; 228 var p = this.sets[this.selection.currentIndex];
241 if(!p.id) return; 229 if(!p.id) return;
242 this.fireflix.openTab(this.fireflix.flickr.make_photoset_url(p)); 230 this.fireflix.openTab(this.fireflix.flickr.make_photoset_url(p));
243 } 231 }
244 }, 232 },
245 233
246 refresh_user_tags: function() { 234 refresh_user_tags: function() {
247 var lb = document.getElementById('tagslist'); 235 var lb = document.getElementById('tagslist');
248 var _this = this; 236 var _this = this;
249 this.flickr.api_call( 237 this.flickr.api_call(
250 { 238 {
251 method: 'flickr.tags.getListUser', 239 method: 'flickr.tags.getListUser',
252 auth_token: 'default', 240 auth_token: 'default',
253 }, function(xr) { 241 }, function(xr) {
254 var x = xr.responseXML; 242 var x = xr.responseXML;
255 var xp = x.evaluate( 243 var xp = x.evaluate(
256 '/rsp/who/tags/tag', x, null, 244 '/rsp/who/tags/tag', x, null,
257 XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); 245 XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
258 // TODO: clear list 246 // TODO: clear list
259 var n; while(n=xp.iterateNext()) { 247 var n; while(n=xp.iterateNext()) {
260 lb.appendItem(n.firstChild.nodeValue); 248 lb.appendItem(n.firstChild.nodeValue);
261 } 249 }
262 }, function(x,s,c,m) { 250 }, function(x,s,c,m) {
263 _this.flickr_failure(x,s,c,m); 251 _this.flickr_failure(x,s,c,m);
264 } 252 }
265 ); 253 );
266 }, 254 },
267 255
268 uploadObserver: { 256 uploadObserver: {
269 fireflix: null, 257 fireflix: null,
270 init: function(f) { 258 init: function(f) {
271 this.fireflix = f; 259 this.fireflix = f;
272 }, 260 },
273 getSupportedFlavours: function() { 261 getSupportedFlavours: function() {
274 var rv = new FlavourSet(); 262 var rv = new FlavourSet();
275 rv.appendFlavour('application/x-moz-file','nsIFile'); 263 rv.appendFlavour('application/x-moz-file','nsIFile');
276 rv.appendFlavour('application/x-moz-url'); 264 rv.appendFlavour('application/x-moz-url');
277 rv.appendFlavour('text/uri-list'); 265 rv.appendFlavour('text/uri-list');
278 rv.appendFlavour('text/unicode'); 266 rv.appendFlavour('text/unicode');
279 return rv; 267 return rv;
280 }, 268 },
281 canHandleMultipleItems: true, 269 canHandleMultipleItems: true,
282 onDragOver: function(ev,fl,sess) { 270 onDragOver: function(ev,fl,sess) {
283 return true; 271 return true;
284 }, 272 },
285 onDrop: function(ev,dd,s) { 273 onDrop: function(ev,dd,s) {
286 var ldf = null; 274 var ldf = null;
287 for(var i in dd.dataList) { 275 for(var i in dd.dataList) {
288 var di = dd.dataList[i]; 276 var di = dd.dataList[i];
289 var dif = di.first; 277 var dif = di.first;
@@ -726,255 +714,251 @@ var fireflix = {
726 if(this.uploads.files[f].photoid) 714 if(this.uploads.files[f].photoid)
727 pids.push(this.uploads.files[f].photoid); 715 pids.push(this.uploads.files[f].photoid);
728 } 716 }
729 var pp = this.uploads.rowCount*2; if(pp>500) pp = 500; 717 var pp = this.uploads.rowCount*2; if(pp>500) pp = 500;
730 var _this = this; 718 var _this = this;
731 this.flickr.api_call( 719 this.flickr.api_call(
732 { 720 {
733 method: 'flickr.photos.search', 721 method: 'flickr.photos.search',
734 auth_token: 'default', 722 auth_token: 'default',
735 extras: 'original_format', 723 extras: 'original_format',
736 user_id: 'me', 724 user_id: 'me',
737 per_page: pp 725 per_page: pp
738 }, 726 },
739 function(xr) { 727 function(xr) {
740 var x = xr.responseXML; 728 var x = xr.responseXML;
741 var rv = ''; 729 var rv = '';
742 for(var pn in pids) { 730 for(var pn in pids) {
743 var p = pids[pn]; 731 var p = pids[pn];
744 var pp = new Photo(xp_node('/rsp/photos/photo[@id='+p+']',x)); 732 var pp = new Photo(xp_node('/rsp/photos/photo[@id='+p+']',x));
745 rv += _this.photo_html(pp,uti,utl)+'\n'; 733 rv += _this.photo_html(pp,uti,utl)+'\n';
746 } 734 }
747 _this.popup_content(rv); 735 _this.popup_content(rv);
748 }, function(x,s,c,m) { 736 }, function(x,s,c,m) {
749 _this.flickr_failure(x,s,c,m); 737 _this.flickr_failure(x,s,c,m);
750 } 738 }
751 ); 739 );
752 }, 740 },
753 741
754 /* 742 /*
755 * 743 *
756 */ 744 */
757 foundphotos: { 745 foundphotos: {
758 fireflix: null, 746 fireflix: null,
759 init: function(f) { 747 init: function(f) {
760 this.fireflix = f; 748 this.fireflix = f;
761 pull_elements(this,document,[ 749 pull_elements(this,document,[
762 'search_for','search_tags','search_mine', 750 'search_for','search_tags','search_mine',
763 'searchresult_props','search_photo', 751 'searchresult_props','search_photo',
764 'searchresult_title','searchresult_description', 752 'searchresult_title','searchresult_description',
765 'search_page','cmd_search_prev_page','cmd_search_next_page' 753 'search_page','cmd_search_prev_page','cmd_search_next_page'
766 ]); 754 ]);
767 document.getElementById('searchresults').view = this; 755 document.getElementById('searchresults').view = this;
768 }, 756 },
769 photos: new Array(), 757 photos: new Array(),
770 rowCount: 0, 758 rowCount: 0,
771 getCellText: function(r,c) { 759 getCellText: function(r,c) {
772 var p = this.photos[r]; 760 var p = this.photos[r];
773 if(c.id=='sr_title') return p.title; 761 if(c.id=='sr_title') return p.title;
774 return c.id; 762 return c.id;
775 }, 763 },
776 setTree: function(t) { this.tree = t }, 764 setTree: function(t) { this.tree = t },
777 isContainer: function(r) { return false }, 765 isContainer: function(r) { return false },
778 isSeparator: function(r) { return false }, 766 isSeparator: function(r) { return false },
779 isSorted: function(r) { return false }, 767 isSorted: function(r) { return false },
780 getLevel: function(r) { return 0 }, 768 getLevel: function(r) { return 0 },
781 getImageSrc: function(r,c) { return null }, 769 getImageSrc: function(r,c) { return null },
782 getRowProperties: function(r,p) { }, 770 getRowProperties: function(r,p) { },
783 getCellProperties: function(cid,cel,p) { }, 771 getCellProperties: function(cid,cel,p) { },
784 getColumnProperties: function(cid,cel,p) { }, 772 getColumnProperties: function(cid,cel,p) { },
785 cycleHeader: function(cid,e) { }, 773 cycleHeader: function(cid,e) { },
786 getParentIndex: function(r) { return -1 }, 774 getParentIndex: function(r) { return -1 },
787 drop: function(r,o) { }, 775 drop: function(r,o) { },
788 canDropBeforeAfter: function(r,b) { return false }, 776 canDropBeforeAfter: function(r,b) { return false },
789 777
790 importXPR: function(xp) { 778 import_json: function(jp) {
791 this.selection.clearSelection(); 779 this.selection.clearSelection();
792 this.selection.currentIndex = -1; 780 this.selection.currentIndex=-1;
793 this.searchresult_props.hidden = true; 781 this.searchresult_props.hidden=true;
794 this.tree.beginUpdateBatch(); 782 this.tree.beginUpdateBatch();
795 this.photos = new Array(); 783 this.photos = new Array();
796 var n; while(n=xp.iterateNext()) { 784 for(var i in jp) {
797 this.photos.push(new Photo(n)); 785 this.photos.push(new Photo(jp[i]));
798 } 786 }
799 this.rowCount = this.photos.length; 787 this.rowCount = this.photos.length;
800 this.tree.endUpdateBatch(); 788 this.tree.endUpdateBatch();
801 }, 789 },
802 paging: { 790 paging: {
803 pars: null, 791 pars: null,
804 page: null, pages: null, perpage: null, total: null 792 page: null, pages: null, perpage: null, total: null
805 }, 793 },
806 search_photos: function() { 794 search_photos: function() {
807 var pars = { 795 var pars = {
808 method: 'flickr.photos.search', 796 method: 'flickr.photos.search',
809 auth_token: 'default', 797 auth_token: 'default',
810 extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update,geo' 798 extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update,geo'
811 }; 799 };
812 if(this.search_mine.checked) 800 if(this.search_mine.checked)
813 pars.user_id='me'; 801 pars.user_id='me';
814 if(this.search_tags.checked) { 802 if(this.search_tags.checked) {
815 pars.tags=this.search_for.value.split(/ +/).join(','); 803 pars.tags=this.search_for.value.split(/ +/).join(',');
816 }else{ 804 }else{
817 pars.text=this.search_for.value; 805 pars.text=this.search_for.value;
818 } 806 }
819 this.paging.pars = new Object(); 807 this.paging.pars = new Object();
820 this.paging.page = null; this.paging.pages = null; 808 this.paging.page = null; this.paging.pages = null;
821 this.paging.perpage = null; this.paging.total = null; 809 this.paging.perpage = null; this.paging.total = null;
822 for(var p in pars) this.paging.pars[p] = pars[p]; 810 for(var p in pars) this.paging.pars[p] = pars[p];
823 this.perform_search(pars); 811 this.perform_search(pars);
824 }, 812 },
825 perform_search: function(p) { 813 perform_search: function(p) {
826 var _this = this; 814 var that = this;
827 this.fireflix.flickr.api_call( p, 815 this.fireflix.flickr.api_call_json( p,
828 function(xr) { 816 function(x,j) {
829 var x = xr.responseXML; 817 that.import_json(j.photos.photo);
830 var xp = xp_nodes('/rsp/photos/photo',x); 818 that.tree.ensureRowIsVisible(0);
831 _this.importXPR(xp); 819 var pp=j.photos;
832 _this.tree.ensureRowIsVisible(0); 820 that.paging.page = pp.page; that.paging.pages = pp.pages;
833 xp = xp_node('/rsp/photos',x); 821 that.paging.perpage = pp.perpage;
834 _this.paging.page = parseInt(xp.getAttribute('page')); 822 that.paging.total = pp.total;
835 _this.paging.pages = parseInt(xp.getAttribute('pages')); 823 that.update_paging();
836 _this.paging.perpage = parseInt(xp.getAttribute('perpage')); 824 that.on_select();
837 _this.paging.total = parseInt(xp.getAttribute('total'));
838 _this.update_paging();
839 _this.on_select();
840 }, function(x,s,c,m) { 825 }, function(x,s,c,m) {
841 _this.fireflix.flickr_failure(x,s,c,m); 826 that.fireflix.flickr_failure(x,s,c,m);
842 } 827 }
843 ); 828 );
844 }, 829 },
845 on_cmd_prev: function(ev) { 830 on_cmd_prev: function(ev) {
846 var pars = new Object(); 831 var pars = new Object();
847 for(var p in this.paging.pars) pars[p] = this.paging.pars[p]; 832 for(var p in this.paging.pars) pars[p] = this.paging.pars[p];
848 pars.page=this.paging.page-1; pars.per_page=this.paging.perpage; 833 pars.page=this.paging.page-1; pars.per_page=this.paging.perpage;
849 this.perform_search(pars); 834 this.perform_search(pars);
850 }, 835 },
851 on_cmd_next: function(ev) { 836 on_cmd_next: function(ev) {
852 var pars = new Object(); 837 var pars = new Object();
853 for(var p in this.paging.pars) pars[p] = this.paging.pars[p]; 838 for(var p in this.paging.pars) pars[p] = this.paging.pars[p];
854 pars.page=this.paging.page+1; pars.per_page=this.paging.perpage; 839 pars.page=this.paging.page+1; pars.per_page=this.paging.perpage;
855 this.perform_search(pars); 840 this.perform_search(pars);
856 }, 841 },
857 update_paging: function() { 842 update_paging: function() {
858 if(! (this.paging.pars && this.paging.page && this.paging.pages) ) { 843 if(! (this.paging.pars && this.paging.page && this.paging.pages) ) {
859 this.search_page.value=''; this.search_page.hidden = true; 844 this.search_page.value=''; this.search_page.hidden = true;
860 this.cmd_search_prev_page.setAttribute('disabled','true'); 845 this.cmd_search_prev_page.setAttribute('disabled','true');
861 this.cmd_search_next_page.setAttribute('disabled','true'); 846 this.cmd_search_next_page.setAttribute('disabled','true');
862 }else{ 847 }else{
863 this.search_page.value=this.fireflix.loc_strings.getFormattedString('search_page',[this.paging.page,this.paging.pages]); 848 this.search_page.value=this.fireflix.loc_strings.getFormattedString('search_page',[this.paging.page,this.paging.pages]);
864 this.search_page.hidden=false; 849 this.search_page.hidden=false;
865 this.cmd_search_prev_page.setAttribute('disabled',(this.paging.page>1)?'false':'true'); 850 this.cmd_search_prev_page.setAttribute('disabled',(this.paging.page>1)?'false':'true');
866 this.cmd_search_next_page.setAttribute('disabled',(this.paging.page<this.paging.pages)?'false':'true'); 851 this.cmd_search_next_page.setAttribute('disabled',(this.paging.page<this.paging.pages)?'false':'true');
867 } 852 }
868 }, 853 },
869 render_description_frame: function(content) { 854 render_description_frame: function(content) {
870 this.searchresult_description.innerHTML = ''; 855 this.searchresult_description.innerHTML = '';
871 if(content) { 856 if(content) {
872 var dp = new DOMParser(); 857 var dp = new DOMParser();
873 var pd = dp.parseFromString( 858 var pd = dp.parseFromString(
874 '<div xmlns="http://www.w3.org/1999/xhtml">'+content+'</div>', 'text/xml' ); 859 '<div xmlns="http://www.w3.org/1999/xhtml">'+content+'</div>', 'text/xml' );
875 var de = pd.documentElement; 860 var de = pd.documentElement;
876 if(de.tagName=='parsererror') 861 if(de.tagName=='parsererror')
877 this.searchresult_description.innerHTML=this.fireflix.loc_strings.getString('broken_description'); 862 this.searchresult_description.innerHTML=this.fireflix.loc_strings.getString('broken_description');
878 else 863 else
879 this.searchresult_description.appendChild(de); 864 this.searchresult_description.appendChild(de);
880 /* of all linking elements flickr only allows a */ 865 /* of all linking elements flickr only allows a */
881 var as = this.searchresult_description.getElementsByTagName('a'); 866 var as = this.searchresult_description.getElementsByTagName('a');
882 for(var a=0;a<as.length;++a) 867 for(var a=0;a<as.length;++a)
883 as.item(a).setAttribute('target','_blank'); 868 as.item(a).setAttribute('target','_blank');
884 } 869 }
885 }, 870 },
886 on_select: function() { 871 on_select: function() {
887 if(this.selection.currentIndex<0) { 872 if(this.selection.currentIndex<0) {
888 this.searchresult_props.hidden = true; 873 this.searchresult_props.hidden = true;
889 }else{ 874 }else{
890 var p = this.photos[this.selection.currentIndex]; 875 var p = this.photos[this.selection.currentIndex];
891 if(!p) { 876 if(!p) {
892 this.searchresult_props.hidden = true; 877 this.searchresult_props.hidden = true;
893 }else{ 878 }else{
894 this.search_photo.src = this.fireflix.flickr.make_photo_url(p,'t'); 879 this.search_photo.src = this.fireflix.flickr.make_photo_url(p,'t');
895 this.searchresult_title.value = p.title; 880 this.searchresult_title.value = p.title;
896 this.searchresult_title.tooltipText = p.title; 881 this.searchresult_title.tooltipText = p.title;
897 this.render_description_frame(null); 882 this.render_description_frame(null);
898 if(p.description==null && p.description==undefined) { 883 if(p.description==null && p.description==undefined) {
899 var pid = p.id; 884 var pid = p.id;
900 var ci = this.selection.currentIndex; 885 var ci = this.selection.currentIndex;
901 var _this = this; 886 var that = this;
902 this.fireflix.flickr.api_call( 887 this.fireflix.flickr.api_call_json(
903 { 888 {
904 method: 'flickr.photos.getInfo', 889 method: 'flickr.photos.getInfo',
905 auth_token: 'default', 890 auth_token: 'default',
906 photo_id: p.id, 891 photo_id: p.id,
907 secret: p.secret 892 secret: p.secret
908 }, function(xr) { 893 }, function(x,j) {
909 var pp = _this.photos[ci]; 894 var pp = that.photos[ci];
910 if(ci==_this.selection.currentIndex && pp.id==pid) { 895 if(ci==that.selection.currentIndex && pp.id==pid) {
911 var n = xp_node('/rsp/photo',xr.responseXML); 896 pp.fromJSON_(j.photo);
912 pp.fromNode_(n); 897 that.render_description_frame(pp.description);
913 _this.render_description_frame(pp.description);
914 } 898 }
915 }, function(x,s,c,m) { 899 }, function(x,s,c,m) {
916 _this.fireflix.flickr_failure(x,s,c,m); 900 that.fireflix.flickr_failure(x,s,c,m);
917 } 901 }
918 ); 902 );
919 this.searchresult_props.hidden = false; 903 this.searchresult_props.hidden = false;
920 }else{ 904 }else{
921 this.render_description_frame(p.description); 905 this.render_description_frame(p.description);
922 } 906 }
923 } 907 }
924 } 908 }
925 }, 909 },
926 on_cmd_open: function(ev) { 910 on_cmd_open: function(ev) {
927 if(this.selection.currentIndex<0) return; 911 if(this.selection.currentIndex<0) return;
928 var p = this.photos[this.selection.currentIndex]; 912 var p = this.photos[this.selection.currentIndex];
929 if(!p.id) return; 913 if(!p.id) return;
930 this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p')); 914 this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p'));
931 } 915 }
932 }, 916 },
933 917
934 photo_html: function(p,i,l) { 918 photo_html: function(p,i,l) {
935 // TODO: add alt/title when possible 919 // TODO: add alt/title when possible
936 var rv = 920 var rv =
937 '<a href="'+this.flickr.make_photo_url(p,l)+'">' + 921 '<a href="'+this.flickr.make_photo_url(p,l)+'">' +
938 '<img src="'+this.flickr.make_photo_url(p,i)+'" />'+ 922 '<img src="'+this.flickr.make_photo_url(p,i)+'" />'+
939 '</a>'; 923 '</a>';
940 return rv; 924 return rv;
941 }, 925 },
942 build_html: function(photos,uti,utl) { 926 build_html: function(photos,uti,utl) {
943 var rv = ''; 927 var rv = '';
944 for(var i in photos) { 928 for(var i in photos) {
945 var p = photos[i]; 929 var p = photos[i];
946 rv += this.photo_html(p,uti,utl)+'\n'; 930 rv += this.photo_html(p,uti,utl)+'\n';
947 } 931 }
948 return rv; 932 return rv;
949 }, 933 },
950 934
951 popup_content: function(s) { 935 popup_content: function(s) {
952 window.openDialog( 936 window.openDialog(
953 "chrome://fireflix/content/generated-content.xul", 937 "chrome://fireflix/content/generated-content.xul",
954 null, "dialog,chrome", this, s ); 938 null, "dialog,chrome", this, s );
955 }, 939 },
956 copy_to_clipboard: function(s) { 940 copy_to_clipboard: function(s) {
957 var ch = Components.classes["@mozilla.org/widget/clipboardhelper;1"] 941 var ch = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
958 .getService(Components.interfaces.nsIClipboardHelper); 942 .getService(Components.interfaces.nsIClipboardHelper);
959 ch.copyString(s); 943 ch.copyString(s);
960 }, 944 },
961 openTab: function(l) { 945 openTab: function(l) {
962 var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService( 946 var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(
963 Components.interfaces.nsIWindowMediator ); 947 Components.interfaces.nsIWindowMediator );
964 var bw = wm.getMostRecentWindow('navigator:browser'); 948 var bw = wm.getMostRecentWindow('navigator:browser');
965 var b = bw.getBrowser(); 949 var b = bw.getBrowser();
966 var t = b.addTab(l); 950 var t = b.addTab(l);
967 b.selectedTab = t; 951 b.selectedTab = t;
968 }, 952 },
969 953
970 build_menus: function() { 954 build_menus: function() {
971 this.append_html_menu( 955 this.append_html_menu(
972 document.getElementById('sets_html_menu'), 956 document.getElementById('sets_html_menu'),
973 'stm_','m_bop','cmdset_sets','cmd_sets_html' 957 'stm_','m_bop','cmdset_sets','cmd_sets_html'
974 ); 958 );
975 this.append_html_menu( 959 this.append_html_menu(
976 document.getElementById('setphotos_html_menu'), 960 document.getElementById('setphotos_html_menu'),
977 'stm_','m_bop','cmdset_setphotos','cmd_setphotos_html' 961 'stm_','m_bop','cmdset_setphotos','cmd_setphotos_html'
978 ); 962 );
979 this.append_html_menu( 963 this.append_html_menu(
980 document.getElementById('uploads_html_menu'), 964 document.getElementById('uploads_html_menu'),
diff --git a/content/flickr.js b/content/flickr.js
index 545144c..716874b 100644
--- a/content/flickr.js
+++ b/content/flickr.js
@@ -1,142 +1,135 @@
1/* 1/*
2 * Photoset 2 * Photoset
3 */ 3 */
4 4
5function Photoset(s) { 5function Photoset(s) {
6 if(s instanceof Photoset) { 6 if(s instanceof Photoset) {
7 for(var p in s) this[p]=s[p]; 7 for(var p in s) this[p]=s[p];
8 }else 8 }else
9 this.fromNode(s); 9 this.fromJSON(s);
10} 10}
11Photoset.prototype = { 11Photoset.prototype = {
12 id: null, 12 id: null,
13 primary: null, 13 primary: null,
14 secret: null, 14 secret: null,
15 server: null, 15 server: null,
16 photos: null, 16 photos: null,
17 title: null, 17 title: null,
18 description: null, 18 description: null,
19 fromNode: function(n) { 19 fromJSON: function(j) {
20 this.id = n.getAttribute('id'); 20 this.id=j.id;
21 this.primary = n.getAttribute('primary'); 21 this.primary = j.primary;
22 this.secret = n.getAttribute('secret'); 22 this.secret = j.secret; this.server = j.server;
23 this.server = n.getAttribute('server'); 23 this.photos = j.photos;
24 this.photos = n.getAttribute('photos'); 24 this.title = j.title._content;
25 this.title = n.getElementsByTagName('title').item(0).firstChild.nodeValue; 25 this.description = j.description._content;
26 this.description = n.getElementsByTagName('description').item(0).firstChild;
27 if(this.description) this.description = this.description.nodeValue;
28 } 26 }
29}; 27};
30 28
31/* 29/*
32 * Photo 30 * Photo
33 */ 31 */
34function Photo(s) { 32function Photo(s) {
35 if(s instanceof Photo) { 33 if(s instanceof Photo) {
36 for(var p in s) this[p]=s[p]; 34 for(var p in s) this[p]=s[p];
37 }else 35 }else
38 this.fromNode(s); 36 this.fromJSON(s);
39} 37}
40Photo.prototype = { 38Photo.prototype = {
41 id: null, secret: null, 39 id: null, secret: null,
42 server: null, 40 server: null,
43 title: null, 41 title: null,
44 isprimary: null, 42 isprimary: null,
45 license: null, 43 license: null,
46 dateupload: null, datetaken: null, datetakengranularity: null, 44 dateupload: null, datetaken: null, datetakengranularity: null,
47 ownername: null, 45 ownername: null,
48 iconserver: null, 46 iconserver: null,
49 originalformat: null, 47 originalformat: null,
50 lastupdate: null, 48 lastupdate: null,
51 fromNode: function(n) { 49 fromJSON: function(j) {
52 this.id = n.getAttribute('id'); this.secret = n.getAttribute('secret'); 50 this.id = j.id; this.secret = j.secret;
53 this.server = n.getAttribute('server'); 51 this.server = j.server;
54 this.title = n.getAttribute('title'); 52 this.title=j.title;
55 this.isprimary = n.getAttribute('isprimary'); 53 this.isprimary = j.isprimary;
56 this.license = n.getAttribute('license'); 54 this.license = j.license;
57 this.dateupload = n.getAttribute('dateupload'); 55 this.dateupload = j.dateupload;
58 this.datetaken = n.getAttribute('datetaken'); this.datetakengranularity = n.getAttribute('datetakengranularity'); 56 this.datetaken=j.datetaken; j.datetakengranularity=j.datetakengranularity;
59 this.ownername = n.getAttribute('ownername'); 57 this.ownername=j.ownername;
60 this.iconserver = n.getAttribute('iconserver'); 58 this.iconserver=j.iconserver;
61 this.originalformat = n.getAttribute('originalformat'); 59 this.originalformat=j.originalformat;
62 this.lastupdate = n.getAttribute('lastupdate'); 60 this.lastupdate=j.lastupdate;
63 }, 61 },
64 fromNode_: function(n) { 62 fromJSON_: function(j) {
65 var t;
66 // TODO: @rotation @isfavorite
67 this.owner = {}; 63 this.owner = {};
68 t = n.getElementsByTagName('owner').item(0); 64 var t;
69 if(t) { 65 if((t=j.owner)) {
70 this.owner.nsid=t.getAttribute('nsid'); 66 this.owner.nsid=t.nsid;
71 this.owner.username=t.getAttribute('username'); 67 this.owner.username=t.username; this.owner.realname=t.realname;
72 this.owner.realname=t.getAttribute('realname'); 68 this.owner.location=t.location;
73 this.owner.location=t.getAttribute.location;
74 }
75 t = n.getElementsByTagName('description').item(0);
76 if(t && t.firstChild) {
77 this.description = t.firstChild.nodeValue;
78 } 69 }
70 if((t=j.description)) this.description=t._content;
71 // TODO: @rotation @isfavorite
79 // TODO: visibility/@ispublic visibility/@isfriend visibility/@isfamily 72 // TODO: visibility/@ispublic visibility/@isfriend visibility/@isfamily
80 // TODO: dates/@posted dates/@taken dates/@takengranularity dates/@lastupdate 73 // TODO: dates/@posted dates/@taken dates/@takengranularity dates/@lastupdate
81 // TODO: permissions/@permcomment permsiions/@permaddmeta 74 // TODO: permissions/@permcomment permsiions/@permaddmeta
82 // TODO: editability/@canaddcomment editability/@canaddmeta 75 // TODO: editability/@canaddcomment editability/@canaddmeta
83 // TODO: comments 76 // TODO: comments
84 // TODO: notes/note/@id notes/note/@author notes/note/@authorname 77 // TODO: notes/note/@id notes/note/@author notes/note/@authorname
85 // TODO: notes/note/@x notes/note/@y notes/note/@w notes/note/@h 78 // TODO: notes/note/@x notes/note/@y notes/note/@w notes/note/@h
86 // TODO: notes/note 79 // TODO: notes/note
87 // TODO: tags/tag/@id tags/tag/@author tags/tag/@raw tags/tag 80 // TODO: tags/tag/@id tags/tag/@author tags/tag/@raw tags/tag
88 // TODO: urls/url/@type urls/url 81 // TODO: urls/url/@type urls/url
89 } 82 }
90}; 83};
91 84
92function Flickr() { } 85function Flickr() { }
93Flickr.prototype = { 86Flickr.prototype = {
94 87
95 rest_url: 'http://www.flickr.com/services/rest/', 88 rest_url: 'http://www.flickr.com/services/rest/',
96 auth_url: 'http://flickr.com/services/auth/', 89 auth_url: 'http://flickr.com/services/auth/',
97 photo_url: 'http://static.flickr.com/', 90 photo_url: 'http://static.flickr.com/',
98 photos_url: 'http://www.flickr.com/photos/', 91 photos_url: 'http://www.flickr.com/photos/',
99 upload_url: 'http://www.flickr.com/services/upload/', 92 upload_url: 'http://www.flickr.com/services/upload/',
100 uploader_edit_url: 'http://www.flickr.com/tools/uploader_edit.gne', 93 uploader_edit_url: 'http://www.flickr.com/tools/uploader_edit.gne',
101 94
102 api_sig: function(paramstr) { 95 api_sig: function(paramstr) {
103 return MD5(toutf8(this.api_shs+paramstr)); 96 return MD5(toutf8(this.api_shs+paramstr));
104 }, 97 },
105 api_call_url: function(params,url) { 98 api_call_url: function(params,url) {
106 params.api_key = this.api_key; 99 params.api_key = this.api_key;
107 var pp = new Array(); 100 var pp = new Array();
108 for(var p in params) { 101 for(var p in params) {
109 pp.push(p); 102 pp.push(p);
110 } 103 }
111 var pstr = ''; 104 var pstr = '';
112 var rv = (url?url:this.rest_url)+'?'; 105 var rv = (url?url:this.rest_url)+'?';
113 for(var p in pp.sort()) { 106 for(var p in pp.sort()) {
114 var pn = pp[p]; 107 var pn = pp[p];
115 pstr += pn+params[pn]; 108 pstr += pn+params[pn];
116 rv += pn+'='+params[pn]+'&'; 109 rv += pn+'='+params[pn]+'&';
117 } 110 }
118 rv += 'api_sig='+this.api_sig(pstr); 111 rv += 'api_sig='+this.api_sig(pstr);
119 return rv; 112 return rv;
120 }, 113 },
121 api_call_json: function(params,on_success,on_failure) { 114 api_call_json: function(params,on_success,on_failure) {
122 if(params.auth_token=='default') params.auth_token=this.token; 115 if(params.auth_token=='default') params.auth_token=this.token;
123 params.format = 'json'; params.nojsoncallback=1; 116 params.format = 'json'; params.nojsoncallback=1;
124 var x = new XMLHttpRequest(); 117 var x = new XMLHttpRequest();
125 x.open("GET",this.api_call_url(params)); 118 x.open("GET",this.api_call_url(params));
126 x.onreadystatechange=function() { 119 x.onreadystatechange=function() {
127 if(x.readyState!=4) return false; 120 if(x.readyState!=4) return false;
128 if(x.status==200) { 121 if(x.status==200) {
129 var rsp=JSON.parse(x.responseText); 122 var rsp=JSON.parse(x.responseText);
130 if(rsp.stat=='ok') 123 if(rsp.stat=='ok')
131 on_success && on_success(x,rsp); 124 on_success && on_success(x,rsp);
132 else 125 else
133 on_failure && on_failure(rsp,rsp.stat,rsp.code,rsp.message); 126 on_failure && on_failure(rsp,rsp.stat,rsp.code,rsp.message);
134 }else 127 }else
135 on_failure && on_failure(x); 128 on_failure && on_failure(x);
136 return true; 129 return true;
137 }; 130 };
138 x.send(null); 131 x.send(null);
139 return true; 132 return true;
140 }, 133 },
141 api_call: function(params, on_success, on_failure) { 134 api_call: function(params, on_success, on_failure) {
142 if(params.auth_token == 'default') 135 if(params.auth_token == 'default')