summaryrefslogtreecommitdiffabout
authorMichael Krelin <hacker@klever.net>2006-11-16 23:04:06 (UTC)
committer Michael Krelin <hacker@klever.net>2006-11-16 23:04:06 (UTC)
commita5df65b1ec3c86cba0e2f12d5f51e3cb29c99353 (patch) (unidiff)
treecd0f7c5f5506fc599c083d6632a7e74506baf6da
parent77bede81381ed1adbda91a119128712a3688b4bd (diff)
downloadfireflix-a5df65b1ec3c86cba0e2f12d5f51e3cb29c99353.zip
fireflix-a5df65b1ec3c86cba0e2f12d5f51e3cb29c99353.tar.gz
fireflix-a5df65b1ec3c86cba0e2f12d5f51e3cb29c99353.tar.bz2
Building HTML for photos selection in sets browser
git-svn-id: http://svn.klever.net/kin/fireflix/trunk@231 fe716a7a-6dde-0310-88d9-d003556173a8
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--content/fireflix-panel.xul11
-rw-r--r--content/fireflix.js13
-rw-r--r--locale/en-US/fireflix.dtd2
3 files changed, 25 insertions, 1 deletions
diff --git a/content/fireflix-panel.xul b/content/fireflix-panel.xul
index 62862a9..0e511c5 100644
--- a/content/fireflix-panel.xul
+++ b/content/fireflix-panel.xul
@@ -1,296 +1,305 @@
1<?xml version="1.0"?> 1<?xml version="1.0"?>
2<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> 2<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
3<?xml-stylesheet href="fireflix.css" type="text/css"?> 3<?xml-stylesheet href="fireflix.css" type="text/css"?>
4<!DOCTYPE page SYSTEM "chrome://fireflix/locale/fireflix.dtd"> 4<!DOCTYPE page SYSTEM "chrome://fireflix/locale/fireflix.dtd">
5<page 5<page
6 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 6 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
7 id="fireflixwindow" title="Fireflix" 7 id="fireflixwindow" title="Fireflix"
8 onload="fireflix.init()" 8 onload="fireflix.init()"
9 orient="vertical" 9 orient="vertical"
10 ondragover="nsDragAndDrop.dragOver(event,fireflix.uploadObserver)" 10 ondragover="nsDragAndDrop.dragOver(event,fireflix.uploadObserver)"
11 ondragdrop="nsDragAndDrop.drop(event,fireflix.uploadObserver)" 11 ondragdrop="nsDragAndDrop.drop(event,fireflix.uploadObserver)"
12 > 12 >
13 13
14 <script src="chrome://global/content/nsDragAndDrop.js"/> 14 <script src="chrome://global/content/nsDragAndDrop.js"/>
15 <script src="chrome://global/content/nsTransferable.js"/> 15 <script src="chrome://global/content/nsTransferable.js"/>
16 <script type="application/x-javascript" src="md5.js" /> 16 <script type="application/x-javascript" src="md5.js" />
17 <script type="application/x-javascript" src="util.js" /> 17 <script type="application/x-javascript" src="util.js" />
18 <script type="application/x-javascript" src="flickr.js" /> 18 <script type="application/x-javascript" src="flickr.js" />
19 <script type="application/x-javascript" src="fireflix.js" /> 19 <script type="application/x-javascript" src="fireflix.js" />
20 20
21 <stringbundleset> 21 <stringbundleset>
22 <stringbundle id="loc_strings" src="chrome://fireflix/locale/fireflix.properties" /> 22 <stringbundle id="loc_strings" src="chrome://fireflix/locale/fireflix.properties" />
23 </stringbundleset> 23 </stringbundleset>
24 24
25 <commandset> 25 <commandset>
26 <command id="cmd_auth_auth" label="&panel.auth.auth.label;" 26 <command id="cmd_auth_auth" label="&panel.auth.auth.label;"
27 oncommand="fireflix.on_cmd_auth()"/> 27 oncommand="fireflix.on_cmd_auth()"/>
28 <command id="cmd_auth_done" label="&panel.auth.done.label;" 28 <command id="cmd_auth_done" label="&panel.auth.done.label;"
29 oncommand="fireflix.on_cmd_auth_done()" disabled="true"/> 29 oncommand="fireflix.on_cmd_auth_done()" disabled="true"/>
30 <command id="cmd_auth_open_flickr" label="&panel.auth.flickr.label;" 30 <command id="cmd_auth_open_flickr" label="&panel.auth.flickr.label;"
31 oncommand="fireflix.openTab('http://www.flickr.com/')" /> 31 oncommand="fireflix.openTab('http://www.flickr.com/')" />
32 <command id="cmd_auth_unauth" label="&panel.auth.unauth.label;" 32 <command id="cmd_auth_unauth" label="&panel.auth.unauth.label;"
33 oncommand="fireflix.on_cmd_auth_unauth()" /> 33 oncommand="fireflix.on_cmd_auth_unauth()" />
34 <command id="cmd_help" label="?" 34 <command id="cmd_help" label="?"
35 oncommand="fireflix.openTab('chrome://fireflix/content/help.xml')" /> 35 oncommand="fireflix.openTab('chrome://fireflix/content/help.xml')" />
36 </commandset> 36 </commandset>
37 37
38 <popupset> 38 <popupset>
39 <popup id="auth_menu"> 39 <popup id="auth_menu">
40 <menuitem command="cmd_auth_auth"/> 40 <menuitem command="cmd_auth_auth"/>
41 <menuitem command="cmd_auth_done" hidden="true" id="menu_auth_done"/> 41 <menuitem command="cmd_auth_done" hidden="true" id="menu_auth_done"/>
42 <menuitem command="cmd_auth_unauth" /> 42 <menuitem command="cmd_auth_unauth" />
43 <menuseparator/> 43 <menuseparator/>
44 <menuitem command="cmd_auth_open_flickr"/> 44 <menuitem command="cmd_auth_open_flickr"/>
45 </popup> 45 </popup>
46 </popupset> 46 </popupset>
47 47
48 <commandset id="cmdset_search"> 48 <commandset id="cmdset_search">
49 <command id="cmd_search" label="&panel.search.cmd_search.label;" 49 <command id="cmd_search" label="&panel.search.cmd_search.label;"
50 oncommand="fireflix.foundphotos.search_photos()"/> 50 oncommand="fireflix.foundphotos.search_photos()"/>
51 <command id="cmd_search_open" label="&panel.search.cmd_search_open.label;" 51 <command id="cmd_search_open" label="&panel.search.cmd_search_open.label;"
52 oncommand="fireflix.foundphotos.on_cmd_open(event)" /> 52 oncommand="fireflix.foundphotos.on_cmd_open(event)" />
53 <command id="cmd_search_prev_page" 53 <command id="cmd_search_prev_page"
54 label="&panel.search.cmd_search_prev_page.label;" 54 label="&panel.search.cmd_search_prev_page.label;"
55 oncommand="fireflix.foundphotos.on_cmd_prev(event)" disabled="true"/> 55 oncommand="fireflix.foundphotos.on_cmd_prev(event)" disabled="true"/>
56 <command id="cmd_search_next_page" 56 <command id="cmd_search_next_page"
57 label="&panel.search.cmd_search_next_page.label;" 57 label="&panel.search.cmd_search_next_page.label;"
58 oncommand="fireflix.foundphotos.on_cmd_next(event)" disabled="true"/> 58 oncommand="fireflix.foundphotos.on_cmd_next(event)" disabled="true"/>
59 </commandset> 59 </commandset>
60 60
61 <commandset id="cmdset_sets"> 61 <commandset id="cmdset_sets">
62 <command id="cmd_refresh_sets" label="&panel.sets.cmd_refresh_sets;" 62 <command id="cmd_refresh_sets" label="&panel.sets.cmd_refresh_sets;"
63 oncommand="fireflix.on_refresh_sets()" /> 63 oncommand="fireflix.on_refresh_sets()" />
64 <command id="cmd_set_props" label="&panel.sets.cmd_properties;" 64 <command id="cmd_set_props" label="&panel.sets.cmd_properties;"
65 oncommand="fireflix.on_set_props()" disabled="true" /> 65 oncommand="fireflix.on_set_props()" disabled="true" />
66 </commandset> 66 </commandset>
67 67
68 <popupset> 68 <popupset>
69 <popup id="sets_menu"> 69 <popup id="sets_menu">
70 <menuitem command="cmd_set_props"/> 70 <menuitem command="cmd_set_props"/>
71 <menuitem command="cmd_refresh_sets"/> 71 <menuitem command="cmd_refresh_sets"/>
72 <menuseparator/> 72 <menuseparator/>
73 <menu label="&panel.sets.generate_html;" id="sets_html_menu"/> 73 <menu label="&panel.sets.generate_html;" id="sets_html_menu"/>
74 </popup> 74 </popup>
75 </popupset> 75 </popupset>
76 76
77 <commandset id="cmdset_setphotos">
78 </commandset>
79
80 <popupset>
81 <popup id="setphotos_menu">
82 <menu label="&panel.setphotos.generate_html;" id="setphotos_html_menu"/>
83 </popup>
84 </popupset>
85
77 <commandset id="cmdset_uploads"> 86 <commandset id="cmdset_uploads">
78 <command id="cmd_uploads_clear" label="&panel.uploads.clear.label;" 87 <command id="cmd_uploads_clear" label="&panel.uploads.clear.label;"
79 oncommand="fireflix.uploads.on_clear()" /> 88 oncommand="fireflix.uploads.on_clear()" />
80 <command id="cmd_uploads_upload" label="&panel.uploads.upload.label;" 89 <command id="cmd_uploads_upload" label="&panel.uploads.upload.label;"
81 oncommand="fireflix.uploads.on_upload()" /> 90 oncommand="fireflix.uploads.on_upload()" />
82 <command id="cmd_uploads_remove" label="&panel.uploads.remove.label;" 91 <command id="cmd_uploads_remove" label="&panel.uploads.remove.label;"
83 oncommand="fireflix.uploads.on_remove()" /> 92 oncommand="fireflix.uploads.on_remove()" />
84 <command id="cmd_uploads_add" label="&panel.uploads.add.label;" 93 <command id="cmd_uploads_add" label="&panel.uploads.add.label;"
85 oncommand="fireflix.uploads.on_add()" /> 94 oncommand="fireflix.uploads.on_add()" />
86 </commandset> 95 </commandset>
87 96
88 <popupset> 97 <popupset>
89 <popup id="uploads_menu"> 98 <popup id="uploads_menu">
90 <menuitem command="cmd_uploads_add"/> 99 <menuitem command="cmd_uploads_add"/>
91 <menuitem command="cmd_uploads_clear"/> 100 <menuitem command="cmd_uploads_clear"/>
92 <menuitem command="cmd_uploads_remove"/> 101 <menuitem command="cmd_uploads_remove"/>
93 <menuseparator/> 102 <menuseparator/>
94 <menuitem command="cmd_uploads_upload"/> 103 <menuitem command="cmd_uploads_upload"/>
95 <menuseparator/> 104 <menuseparator/>
96 <menu label="&panel.uploads.generate_html;" id="uploads_html_menu"/> 105 <menu label="&panel.uploads.generate_html;" id="uploads_html_menu"/>
97 </popup> 106 </popup>
98 </popupset> 107 </popupset>
99 108
100 <vbox class="wholething" flex="1"> 109 <vbox class="wholething" flex="1">
101 110
102 <groupbox context="auth_menu"> 111 <groupbox context="auth_menu">
103 <caption label="&panel.auth_info;"/> 112 <caption label="&panel.auth_info;"/>
104 <hbox> 113 <hbox>
105 <vbox pack="center" flex="1"> 114 <vbox pack="center" flex="1">
106 <label id="auth_info" value="&panel.no_auth_info;" disabled="true" crop="end"/> 115 <label id="auth_info" value="&panel.no_auth_info;" disabled="true" crop="end"/>
107 </vbox> 116 </vbox>
108 <button class="lean" id="b_auth" command="cmd_auth_auth"/> 117 <button class="lean" id="b_auth" command="cmd_auth_auth"/>
109 <button class="lean" id="b_auth_done" command="cmd_auth_done" hidden="true"/> 118 <button class="lean" id="b_auth_done" command="cmd_auth_done" hidden="true"/>
110 <button class="lean" command="cmd_auth_open_flickr" 119 <button class="lean" command="cmd_auth_open_flickr"
111 tooltiptext="&panel.auth.flickr.tip;"/> 120 tooltiptext="&panel.auth.flickr.tip;"/>
112 <button class="lean" command="cmd_help"/> 121 <button class="lean" command="cmd_help"/>
113 </hbox> 122 </hbox>
114 </groupbox> 123 </groupbox>
115 124
116 <tabbox flex="1" id="fireflix_tabs"> 125 <tabbox flex="1" id="fireflix_tabs">
117 126
118 <tabs> 127 <tabs>
119 <tab label="&panel.tabs.search;"/> 128 <tab label="&panel.tabs.search;"/>
120 <tab label="&panel.tabs.sets;"/> 129 <tab label="&panel.tabs.sets;"/>
121 <tab label="&panel.tabs.tags;" hidden="true"/> <!-- TODO: --> 130 <tab label="&panel.tabs.tags;" hidden="true"/> <!-- TODO: -->
122 <tab id="tab_upload" label="&panel.tabs.upload;"/> 131 <tab id="tab_upload" label="&panel.tabs.upload;"/>
123 </tabs> 132 </tabs>
124 133
125 <tabpanels flex="1"> 134 <tabpanels flex="1">
126 135
127 <tabpanel id="tabpanel_search" flex="1"> 136 <tabpanel id="tabpanel_search" flex="1">
128 <vbox flex="1"> 137 <vbox flex="1">
129 <groupbox class="search_params" orient="vertical" onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.foundphotos.search_photos()"> 138 <groupbox class="search_params" orient="vertical" onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.foundphotos.search_photos()">
130 <hbox> 139 <hbox>
131 <vbox pack="center"> 140 <vbox pack="center">
132 <label control="search_for" value="&panel.search.search_for.label;" accesskey="s"/> 141 <label control="search_for" value="&panel.search.search_for.label;" accesskey="s"/>
133 </vbox> 142 </vbox>
134 <textbox id="search_for" flex="1"/> 143 <textbox id="search_for" flex="1"/>
135 </hbox> 144 </hbox>
136 <hbox> 145 <hbox>
137 <checkbox id="search_tags" label="&panel.search.mode.tagsonly.label;" 146 <checkbox id="search_tags" label="&panel.search.mode.tagsonly.label;"
138 tooltiptext="&panel.search.mode.tagsonly.tip;" checked="false" 147 tooltiptext="&panel.search.mode.tagsonly.tip;" checked="false"
139 accesskey="t" /> 148 accesskey="t" />
140 <checkbox id="search_mine" label="&panel.search.mode.mine.label;" checked="true" accesskey="m"/> 149 <checkbox id="search_mine" label="&panel.search.mode.mine.label;" checked="true" accesskey="m"/>
141 <spacer flex="1"/> 150 <spacer flex="1"/>
142 <button class="lean" command="cmd_search"/> 151 <button class="lean" command="cmd_search"/>
143 </hbox> 152 </hbox>
144 </groupbox> 153 </groupbox>
145 <hbox> 154 <hbox>
146 <button class="lean" command="cmd_search_prev_page"/> 155 <button class="lean" command="cmd_search_prev_page"/>
147 <spacer flex="1"/> 156 <spacer flex="1"/>
148 <label id="search_page" hidden="true"/> 157 <label id="search_page" hidden="true"/>
149 <spacer flex="1"/> 158 <spacer flex="1"/>
150 <button class="lean" command="cmd_search_next_page"/> 159 <button class="lean" command="cmd_search_next_page"/>
151 </hbox> 160 </hbox>
152 <tree id="searchresults" rows="2" flex="1" 161 <tree id="searchresults" rows="2" flex="1"
153 onselect="fireflix.foundphotos.on_select()" 162 onselect="fireflix.foundphotos.on_select()"
154 ondblclick="fireflix.foundphotos.on_cmd_open(event)" 163 ondblclick="fireflix.foundphotos.on_cmd_open(event)"
155 onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.foundphotos.on_cmd_open(event)"> 164 onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.foundphotos.on_cmd_open(event)">
156 <treecols> 165 <treecols>
157 <treecol id="sr_title" label="&panel.search.col.title.label;" flex="2" crop="end" align="start" /> 166 <treecol id="sr_title" label="&panel.search.col.title.label;" flex="2" crop="end" align="start" />
158 </treecols> 167 </treecols>
159 <treechildren/> 168 <treechildren/>
160 </tree> 169 </tree>
161 <groupbox id="searchresult_props" orient="horizontal" hidden="true"> 170 <groupbox id="searchresult_props" orient="horizontal" hidden="true">
162 <vbox width="100" pack="center"> 171 <vbox width="100" pack="center">
163 <hbox pack="center"> 172 <hbox pack="center">
164 <image id="search_photo" 173 <image id="search_photo"
165 ondblclick="fireflix.foundphotos.on_cmd_open(event)"/> 174 ondblclick="fireflix.foundphotos.on_cmd_open(event)"/>
166 </hbox> 175 </hbox>
167 </vbox> 176 </vbox>
168 <vbox flex="1"> 177 <vbox flex="1">
169 <label id="searchresult_title" crop="end"/> 178 <label id="searchresult_title" crop="end"/>
170 <hbox flex="1" pack="center"> 179 <hbox flex="1" pack="center">
171 <div flex="1" id="searchresult_description" xmlns="http://www.w3.org/1999/xhtml"/> 180 <div flex="1" id="searchresult_description" xmlns="http://www.w3.org/1999/xhtml"/>
172 </hbox> 181 </hbox>
173 <hbox pack="end"> 182 <hbox pack="end">
174 <button command="cmd_search_open"/> 183 <button command="cmd_search_open"/>
175 </hbox> 184 </hbox>
176 </vbox> 185 </vbox>
177 </groupbox> 186 </groupbox>
178 </vbox> 187 </vbox>
179 </tabpanel> 188 </tabpanel>
180 189
181 <tabpanel id="tabpanel_sets" flex="1" 190 <tabpanel id="tabpanel_sets" flex="1"
182 onkeypress="if(event.keyCode==event.DOM_VK_RETURN) 191 onkeypress="if(event.keyCode==event.DOM_VK_RETURN)
183 document.getElementById('setphotos').focus()"> 192 document.getElementById('setphotos').focus()">
184 <vbox flex="1"> 193 <vbox flex="1">
185 <tree id="setslist" rows="2" onselect="fireflix.photosets.on_select()" 194 <tree id="setslist" rows="2" onselect="fireflix.photosets.on_select()"
186 flex="1" context="sets_menu" 195 flex="1" context="sets_menu"
187 ondblclick="fireflix.photosets.on_cmd_open_in_flickr(event)" 196 ondblclick="fireflix.photosets.on_cmd_open_in_flickr(event)"
188 > 197 >
189 <treecols> 198 <treecols>
190 <treecol id="sl_name" label="&panel.sets.name.label;" flex="4" crop="end" align="start" tooltiptext="&panel.sets.name.tip;"/> 199 <treecol id="sl_name" label="&panel.sets.name.label;" flex="4" crop="end" align="start" tooltiptext="&panel.sets.name.tip;"/>
191 <splitter class="tree-splitter" /> 200 <splitter class="tree-splitter" />
192 <treecol id="sl_photos" label="&panel.sets.photos.label;" flex="1" align="end" tooltiptext="&panel.sets.photos.tip;" /> 201 <treecol id="sl_photos" label="&panel.sets.photos.label;" flex="1" align="end" tooltiptext="&panel.sets.photos.tip;" />
193 </treecols> 202 </treecols>
194 <treechildren/> 203 <treechildren/>
195 </tree> 204 </tree>
196 <hbox> 205 <hbox>
197 <button command="cmd_refresh_sets" /> 206 <button command="cmd_refresh_sets" />
198 <button command="cmd_set_props" /> 207 <button command="cmd_set_props" />
199 </hbox> 208 </hbox>
200 <tree id="setphotos" rows="2" onselect="fireflix.photoset.on_select()" 209 <tree id="setphotos" rows="2" onselect="fireflix.photoset.on_select()"
201 flex="1" ondblclick="fireflix.photoset.on_cmd_open(event)" 210 flex="1" ondblclick="fireflix.photoset.on_cmd_open(event)"
202 onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.photoset.on_cmd_open(event)"> 211 onkeypress="if(event.keyCode==event.DOM_VK_RETURN) fireflix.photoset.on_cmd_open(event)" context="setphotos_menu">
203 <treecols> 212 <treecols>
204 <treecol id="sp_title" label="&panel.setphotos.title.label;" flex="1" crop="end" align="start" tooltiptext="&panel.setphotos.title.tip;" /> 213 <treecol id="sp_title" label="&panel.setphotos.title.label;" flex="1" crop="end" align="start" tooltiptext="&panel.setphotos.title.tip;" />
205 <splitter class="tree-splitter" /> 214 <splitter class="tree-splitter" />
206 <treecol id="sp_taken" label="&panel.setphotos.taken.label;" crop="end" align="start" tooltiptext="&panel.setphotos.taken.tip;" hidden="true" /> 215 <treecol id="sp_taken" label="&panel.setphotos.taken.label;" crop="end" align="start" tooltiptext="&panel.setphotos.taken.tip;" hidden="true" />
207 <treecol id="sp_upload" label="&panel.setphotos.upload.label;" crop="end" align="start" tooltiptext="&panel.setphotos.upload.tip;" hidden="true" /> 216 <treecol id="sp_upload" label="&panel.setphotos.upload.label;" crop="end" align="start" tooltiptext="&panel.setphotos.upload.tip;" hidden="true" />
208 </treecols> 217 </treecols>
209 <treechildren/> 218 <treechildren/>
210 </tree> 219 </tree>
211 <groupbox id="set_photo_props" orient="horizontal" hidden="true"> 220 <groupbox id="set_photo_props" orient="horizontal" hidden="true">
212 <vbox width="100" pack="center"> 221 <vbox width="100" pack="center">
213 <hbox pack="center"> 222 <hbox pack="center">
214 <image id="set_photo" 223 <image id="set_photo"
215 ondblclick="fireflix.photoset.on_cmd_open(event)" /> 224 ondblclick="fireflix.photoset.on_cmd_open(event)" />
216 </hbox> 225 </hbox>
217 </vbox> 226 </vbox>
218 <spacer flex="1"/> 227 <spacer flex="1"/>
219 </groupbox> 228 </groupbox>
220 </vbox> 229 </vbox>
221 </tabpanel> 230 </tabpanel>
222 231
223 <tabpanel id="tabpanel_tags"> 232 <tabpanel id="tabpanel_tags">
224 <listbox id="tagslist" rows="8" flex="1"> 233 <listbox id="tagslist" rows="8" flex="1">
225 <listhead> 234 <listhead>
226 <listheader label="&panel.tagslist.tag.label;"/> 235 <listheader label="&panel.tagslist.tag.label;"/>
227 </listhead> 236 </listhead>
228 <listcols> 237 <listcols>
229 <listcol flex="1"/> 238 <listcol flex="1"/>
230 </listcols> 239 </listcols>
231 </listbox> 240 </listbox>
232 </tabpanel> 241 </tabpanel>
233 242
234 <tabpanel id="tabpanel_upload"> 243 <tabpanel id="tabpanel_upload">
235 <vbox flex="1"> 244 <vbox flex="1">
236 <tree id="uploadlist" rows="2" flex="1" 245 <tree id="uploadlist" rows="2" flex="1"
237 onselect="fireflix.uploads.selectionChanged()" 246 onselect="fireflix.uploads.selectionChanged()"
238 context="uploads_menu"> 247 context="uploads_menu">
239 <treecols> 248 <treecols>
240 <treecol id="up_file" label="&panel.uploadlist.file.label;" flex="4" crop="start" align="start"/> 249 <treecol id="up_file" label="&panel.uploadlist.file.label;" flex="4" crop="start" align="start"/>
241 <splitter class="tree-splitter" /> 250 <splitter class="tree-splitter" />
242 <treecol id="up_title" label="&panel.uploadlist.title.label;" flex="5" crop="end" align="start" /> 251 <treecol id="up_title" label="&panel.uploadlist.title.label;" flex="5" crop="end" align="start" />
243 <splitter class="tree-splitter" /> 252 <splitter class="tree-splitter" />
244 <treecol id="up_status" label="&panel.uploadlist.status.label;" flex="1" crop="end" align="start" /> 253 <treecol id="up_status" label="&panel.uploadlist.status.label;" flex="1" crop="end" align="start" />
245 </treecols> 254 </treecols>
246 <treechildren/> 255 <treechildren/>
247 </tree> 256 </tree>
248 <progressmeter id="upload_progress" mode="undetermined" hidden="true" /> 257 <progressmeter id="upload_progress" mode="undetermined" hidden="true" />
249 <groupbox id="upload_file_props" orient="horizontal" hidden="true"> 258 <groupbox id="upload_file_props" orient="horizontal" hidden="true">
250 <image id="upload_file_preview" width="100" height="100" /> 259 <image id="upload_file_preview" width="100" height="100" />
251 <grid flex="1"> 260 <grid flex="1">
252 <columns> 261 <columns>
253 <column/> 262 <column/>
254 <column flex="1"/> 263 <column flex="1"/>
255 </columns> 264 </columns>
256 <rows> 265 <rows>
257 <row> 266 <row>
258 <label control="upload_filename" 267 <label control="upload_filename"
259 value="&panel.upload_props.filename.label;" /> 268 value="&panel.upload_props.filename.label;" />
260 <textbox id="upload_filename" 269 <textbox id="upload_filename"
261 oninput="fireflix.uploads.propsToSel('filename')"/> 270 oninput="fireflix.uploads.propsToSel('filename')"/>
262 </row> 271 </row>
263 <row> 272 <row>
264 <label control="upload_title" value="&panel.upload_props.title.label;" /> 273 <label control="upload_title" value="&panel.upload_props.title.label;" />
265 <textbox id="upload_title" 274 <textbox id="upload_title"
266 oninput="fireflix.uploads.propsToSel('title')"/> 275 oninput="fireflix.uploads.propsToSel('title')"/>
267 </row> 276 </row>
268 <row> 277 <row>
269 <label control="uplod_tags" value="&panel.upload_props.tags.label;" /> 278 <label control="uplod_tags" value="&panel.upload_props.tags.label;" />
270 <textbox id="upload_tags" 279 <textbox id="upload_tags"
271 oninput="fireflix.uploads.propsToSel('tags')"/> 280 oninput="fireflix.uploads.propsToSel('tags')"/>
272 </row> 281 </row>
273 <!-- TODO: description, public, friend, family --> 282 <!-- TODO: description, public, friend, family -->
274 </rows> 283 </rows>
275 </grid> 284 </grid>
276 </groupbox> 285 </groupbox>
277 <hbox> 286 <hbox>
278 <button class="lean" command="cmd_uploads_add" /> 287 <button class="lean" command="cmd_uploads_add" />
279 <spacer flex="1"/> 288 <spacer flex="1"/>
280 <button class="lean" command="cmd_uploads_remove" /> 289 <button class="lean" command="cmd_uploads_remove" />
281 <spacer flex="1"/> 290 <spacer flex="1"/>
282 <button class="lean" command="cmd_uploads_clear" /> 291 <button class="lean" command="cmd_uploads_clear" />
283 </hbox> 292 </hbox>
284 <hbox pack="center"> 293 <hbox pack="center">
285 <button command="cmd_uploads_upload" flex="1"/> 294 <button command="cmd_uploads_upload" flex="1"/>
286 </hbox> 295 </hbox>
287 </vbox> 296 </vbox>
288 </tabpanel> 297 </tabpanel>
289 298
290 </tabpanels> 299 </tabpanels>
291 300
292 </tabbox> 301 </tabbox>
293 302
294 </vbox> 303 </vbox>
295 304
296</page> 305</page>
diff --git a/content/fireflix.js b/content/fireflix.js
index 328e9e2..995ec5c 100644
--- a/content/fireflix.js
+++ b/content/fireflix.js
@@ -1,970 +1,983 @@
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'
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; 492 this.upload_file_props.hidden = true;
493 this.upload_tags.value=''; 493 this.upload_tags.value='';
494 this.upload_tags.disabled = true; 494 this.upload_tags.disabled = 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 }else if(this.selection.count==1) { 499 }else if(this.selection.count==1) {
500 var f=this.files[this.selection.currentIndex]; 500 var f=this.files[this.selection.currentIndex];
501 if(f==null || f.state!='pending') { 501 if(f==null || f.state!='pending') {
502 this.disableProps(); 502 this.disableProps();
503 }else{ 503 }else{
504 this.upload_filename.value = f.file; 504 this.upload_filename.value = f.file;
505 this.upload_filename.disabled = false; 505 this.upload_filename.disabled = false;
506 this.upload_title.value = f.title; 506 this.upload_title.value = f.title;
507 this.upload_title.disabled = false; 507 this.upload_title.disabled = false;
508 this.upload_file_preview.src = 'file:///'+f.file; 508 this.upload_file_preview.src = 'file:///'+f.file;
509 this.upload_file_props.hidden = false; 509 this.upload_file_props.hidden = false;
510 this.upload_tags.value = f.tags; 510 this.upload_tags.value = f.tags;
511 this.upload_tags.disabled = false; 511 this.upload_tags.disabled = false;
512 } 512 }
513 }else{ 513 }else{
514 var ftitle = null; var onetitle = true; 514 var ftitle = null; var onetitle = true;
515 var ftags = null; var onetag = true; 515 var ftags = null; var onetag = true;
516 var fs = 0; 516 var fs = 0;
517 for(var ff in this.files) { 517 for(var ff in this.files) {
518 if(this.selection.isSelected(ff) && this.files[ff].state=='pending' ) { 518 if(this.selection.isSelected(ff) && this.files[ff].state=='pending' ) {
519 ++fs; 519 ++fs;
520 if(ftitle==null) { 520 if(ftitle==null) {
521 ftitle = this.files[ff].title; 521 ftitle = this.files[ff].title;
522 }else if(ftitle!=this.files[ff].title) { 522 }else if(ftitle!=this.files[ff].title) {
523 onetitle = false; 523 onetitle = false;
524 } 524 }
525 if(ftags==null) { 525 if(ftags==null) {
526 ftags = this.files[ff].tags; 526 ftags = this.files[ff].tags;
527 }else if(ftags!=this.files[ff].tags) { 527 }else if(ftags!=this.files[ff].tags) {
528 onetag = false; 528 onetag = false;
529 } 529 }
530 } 530 }
531 } 531 }
532 if(fs) { 532 if(fs) {
533 this.upload_filename.value=''; 533 this.upload_filename.value='';
534 this.upload_filename.disabled = true; 534 this.upload_filename.disabled = true;
535 if(onetitle) 535 if(onetitle)
536 this.upload_title.value = ftitle; 536 this.upload_title.value = ftitle;
537 this.upload_title.disabled = false; 537 this.upload_title.disabled = false;
538 if(onetag) 538 if(onetag)
539 this.upload_tags.value = ftags; 539 this.upload_tags.value = ftags;
540 this.upload_tags.disabled = false; 540 this.upload_tags.disabled = false;
541 this.upload_file_preview.src = null; 541 this.upload_file_preview.src = null;
542 this.upload_file_props.hidden = false; 542 this.upload_file_props.hidden = false;
543 }else 543 }else
544 this.disableProps(); 544 this.disableProps();
545 } 545 }
546 }, 546 },
547 propsToSel: function(prop) { 547 propsToSel: function(prop) {
548 if(this.selection.count<=0) return; 548 if(this.selection.count<=0) return;
549 for(var ff in this.files) { 549 for(var ff in this.files) {
550 if(this.selection.isSelected(ff) && this.files[ff].state=='pending') { 550 if(this.selection.isSelected(ff) && this.files[ff].state=='pending') {
551 if(prop=='filename') 551 if(prop=='filename')
552 this.files[ff].file = this.upload_filename.value; 552 this.files[ff].file = this.upload_filename.value;
553 if(prop=='title') 553 if(prop=='title')
554 this.files[ff].title = this.upload_title.value; 554 this.files[ff].title = this.upload_title.value;
555 if(prop=='tags') 555 if(prop=='tags')
556 this.files[ff].tags = this.upload_tags.value; 556 this.files[ff].tags = this.upload_tags.value;
557 this.tree.invalidateRow(ff); 557 this.tree.invalidateRow(ff);
558 } 558 }
559 } 559 }
560 }, 560 },
561 561
562 on_upload: function() { 562 on_upload: function() {
563 this.selToProps(); 563 this.selToProps();
564 this.batch_ids = new Array(); 564 this.batch_ids = new Array();
565 this.upload_progress.value=0; 565 this.upload_progress.value=0;
566 this.upload_progress.setAttribute('hidden','false'); 566 this.upload_progress.setAttribute('hidden','false');
567 this.upload_worker(); 567 this.upload_worker();
568 }, 568 },
569 on_clear: function() { 569 on_clear: function() {
570 this.clear_list(); 570 this.clear_list();
571 }, 571 },
572 on_remove: function() { 572 on_remove: function() {
573 if(this.selection.count) { 573 if(this.selection.count) {
574 this.tree.beginUpdateBatch(); 574 this.tree.beginUpdateBatch();
575 for(var i=this.files.length-1;i>=0;--i) { 575 for(var i=this.files.length-1;i>=0;--i) {
576 if(this.selection.isSelected(i)) { 576 if(this.selection.isSelected(i)) {
577 this.files.splice(i,1); 577 this.files.splice(i,1);
578 this.rowCount--; 578 this.rowCount--;
579 } 579 }
580 } 580 }
581 this.tree.endUpdateBatch(); 581 this.tree.endUpdateBatch();
582 this.selection.clearSelection(); 582 this.selection.clearSelection();
583 } 583 }
584 }, 584 },
585 on_add: function() { 585 on_add: function() {
586 var ifp = Components.interfaces.nsIFilePicker; 586 var ifp = Components.interfaces.nsIFilePicker;
587 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(ifp); 587 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(ifp);
588 fp.init(window, "Select a File", ifp.modeOpenMultiple); 588 fp.init(window, "Select a File", ifp.modeOpenMultiple);
589 fp.appendFilters(ifp.filterImages); 589 fp.appendFilters(ifp.filterImages);
590 var rv = fp.show(); 590 var rv = fp.show();
591 if(rv==ifp.returnOK) { 591 if(rv==ifp.returnOK) {
592 var ff = fp.files; 592 var ff = fp.files;
593 while(ff.hasMoreElements()) { 593 while(ff.hasMoreElements()) {
594 var f = ff.getNext(); 594 var f = ff.getNext();
595 f.QueryInterface(Components.interfaces.nsIFile); 595 f.QueryInterface(Components.interfaces.nsIFile);
596 this.add(f.path); 596 this.add(f.path);
597 } 597 }
598 } 598 }
599 } 599 }
600 }, 600 },
601 601
602 on_set_props: function() { 602 on_set_props: function() {
603 var pset = this.photosets.sets[this.photosets.selection.currentIndex]; 603 var pset = this.photosets.sets[this.photosets.selection.currentIndex];
604 window.openDialog( 604 window.openDialog(
605 "chrome://fireflix/content/photoset-props.xul", 605 "chrome://fireflix/content/photoset-props.xul",
606 null, "dependent,modal,dialog,chrome", this, 606 null, "dependent,modal,dialog,chrome", this,
607 pset ); 607 pset );
608 if(pset.dirty) { 608 if(pset.dirty) {
609 var _this = this; 609 var _this = this;
610 this.flickr.api_call( 610 this.flickr.api_call(
611 { 611 {
612 method: 'flickr.photosets.editMeta', 612 method: 'flickr.photosets.editMeta',
613 auth_token: 'default', 613 auth_token: 'default',
614 photoset_id: pset.id, 614 photoset_id: pset.id,
615 title: pset.title, 615 title: pset.title,
616 description: pset.description 616 description: pset.description
617 }, function(xr) { 617 }, function(xr) {
618 pset.dirty = false; 618 pset.dirty = false;
619 _this.flickr.api_call( 619 _this.flickr.api_call(
620 { 620 {
621 method: 'flickr.photosets.getPhotos', 621 method: 'flickr.photosets.getPhotos',
622 auth_token: 'default', 622 auth_token: 'default',
623 photoset_id: pset.id 623 photoset_id: pset.id
624 }, function(xr) { 624 }, function(xr) {
625 var x = xr.responseXML; 625 var x = xr.responseXML;
626 var xp = x.evaluate( 626 var xp = x.evaluate(
627 '/rsp/photoset/photo', x, null, 627 '/rsp/photoset/photo', x, null,
628 XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); 628 XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
629 var phids = new Array(); 629 var phids = new Array();
630 var priph = null; 630 var priph = null;
631 var n; while(n=xp.iterateNext()) { 631 var n; while(n=xp.iterateNext()) {
632 var pid = n.getAttribute('id'); 632 var pid = n.getAttribute('id');
633 phids.push( pid ); 633 phids.push( pid );
634 if(pid==pset.primary && n.getAttribute('isprimary')!='1') 634 if(pid==pset.primary && n.getAttribute('isprimary')!='1')
635 priph = pid; 635 priph = pid;
636 } 636 }
637 if(priph) { 637 if(priph) {
638 _this.flickr.api_call( 638 _this.flickr.api_call(
639 { 639 {
640 method: 'flickr.photosets.editPhotos', 640 method: 'flickr.photosets.editPhotos',
641 auth_token: 'default', 641 auth_token: 'default',
642 photoset_id: pset.id, 642 photoset_id: pset.id,
643 primary_photo_id: priph, 643 primary_photo_id: priph,
644 photo_ids: phids.join(',') 644 photo_ids: phids.join(',')
645 }, function() { }, function(x,s,c,m) { /* flickr.photosets.editPhotos */ 645 }, function() { }, function(x,s,c,m) { /* flickr.photosets.editPhotos */
646 _this.flickr_failure(x,s,c,m); 646 _this.flickr_failure(x,s,c,m);
647 } 647 }
648 ); 648 );
649 } 649 }
650 }, function(x,s,c,m) { /* flickr.photosets.getPhotos */ 650 }, function(x,s,c,m) { /* flickr.photosets.getPhotos */
651 _this.flickr_failure(x,s,c,m); 651 _this.flickr_failure(x,s,c,m);
652 } 652 }
653 ); 653 );
654 }, function(x,s,c,m) { /* flickr.photosets.editMeta */ 654 }, function(x,s,c,m) { /* flickr.photosets.editMeta */
655 _this.flickr_failure(x,s,c,m); 655 _this.flickr_failure(x,s,c,m);
656 } 656 }
657 ); 657 );
658 } 658 }
659 }, 659 },
660 on_refresh_sets: function() { 660 on_refresh_sets: function() {
661 this.refresh_sets(); 661 this.refresh_sets();
662 }, 662 },
663 on_cmd_sets_html: function(csfx,ev) { 663 on_cmd_sets_html: function(csfx,ev) {
664 var uti = csfx.charAt(0); var utl = csfx.charAt(1); 664 var uti = csfx.charAt(0); var utl = csfx.charAt(1);
665 var rv = this.build_html(this.photoset.photos,uti,utl); 665 var rv = this.build_html(this.photoset.photos,uti,utl);
666 this.popup_content(rv); 666 this.popup_content(rv);
667 }, 667 },
668 on_cmd_setphotos_html: function(csfx,ev) {
669 var uti = csfx.charAt(0); var utl = csfx.charAt(1);
670 var rv = '';
671 for(var p in this.photoset.photos) {
672 if(this.photoset.selection.isSelected(p))
673 rv += this.photo_html(this.photoset.photos[p],uti,utl)+'\n';
674 }
675 this.popup_content(rv);
676 },
668 677
669 on_cmd_uploads_html: function(csfx,ev) { 678 on_cmd_uploads_html: function(csfx,ev) {
670 var uti = csfx.charAt(0); var utl = csfx.charAt(1); 679 var uti = csfx.charAt(0); var utl = csfx.charAt(1);
671 var pids = new Array(); 680 var pids = new Array();
672 for(var f in this.uploads.files) { 681 for(var f in this.uploads.files) {
673 if(this.uploads.selection.isSelected(f)) 682 if(this.uploads.selection.isSelected(f))
674 if(this.uploads.files[f].photoid) 683 if(this.uploads.files[f].photoid)
675 pids.push(this.uploads.files[f].photoid); 684 pids.push(this.uploads.files[f].photoid);
676 } 685 }
677 var pp = this.uploads.rowCount*2; if(pp>500) pp = 500; 686 var pp = this.uploads.rowCount*2; if(pp>500) pp = 500;
678 var _this = this; 687 var _this = this;
679 this.flickr.api_call( 688 this.flickr.api_call(
680 { 689 {
681 method: 'flickr.photos.search', 690 method: 'flickr.photos.search',
682 auth_token: 'default', 691 auth_token: 'default',
683 extras: 'original_format', 692 extras: 'original_format',
684 user_id: 'me', 693 user_id: 'me',
685 per_page: pp 694 per_page: pp
686 }, 695 },
687 function(xr) { 696 function(xr) {
688 var x = xr.responseXML; 697 var x = xr.responseXML;
689 var rv = ''; 698 var rv = '';
690 for(var pn in pids) { 699 for(var pn in pids) {
691 var p = pids[pn]; 700 var p = pids[pn];
692 var pp = new Photo(xp_node('/rsp/photos/photo[@id='+p+']',x)); 701 var pp = new Photo(xp_node('/rsp/photos/photo[@id='+p+']',x));
693 rv += _this.photo_html(pp,uti,utl)+'\n'; 702 rv += _this.photo_html(pp,uti,utl)+'\n';
694 } 703 }
695 _this.popup_content(rv); 704 _this.popup_content(rv);
696 }, function(x,s,c,m) { 705 }, function(x,s,c,m) {
697 _this.flickr_failure(x,s,c,m); 706 _this.flickr_failure(x,s,c,m);
698 } 707 }
699 ); 708 );
700 }, 709 },
701 710
702 /* 711 /*
703 * 712 *
704 */ 713 */
705 foundphotos: { 714 foundphotos: {
706 fireflix: null, 715 fireflix: null,
707 init: function(f) { 716 init: function(f) {
708 this.fireflix = f; 717 this.fireflix = f;
709 pull_elements(this,document,[ 718 pull_elements(this,document,[
710 'search_for','search_tags','search_mine', 719 'search_for','search_tags','search_mine',
711 'searchresult_props','search_photo', 720 'searchresult_props','search_photo',
712 'searchresult_title','searchresult_description', 721 'searchresult_title','searchresult_description',
713 'search_page','cmd_search_prev_page','cmd_search_next_page' 722 'search_page','cmd_search_prev_page','cmd_search_next_page'
714 ]); 723 ]);
715 document.getElementById('searchresults').view = this; 724 document.getElementById('searchresults').view = this;
716 }, 725 },
717 photos: new Array(), 726 photos: new Array(),
718 rowCount: 0, 727 rowCount: 0,
719 getCellText: function(r,c) { 728 getCellText: function(r,c) {
720 var p = this.photos[r]; 729 var p = this.photos[r];
721 if(c.id=='sr_title') return p.title; 730 if(c.id=='sr_title') return p.title;
722 return c.id; 731 return c.id;
723 }, 732 },
724 setTree: function(t) { this.tree = t }, 733 setTree: function(t) { this.tree = t },
725 isContainer: function(r) { return false }, 734 isContainer: function(r) { return false },
726 isSeparator: function(r) { return false }, 735 isSeparator: function(r) { return false },
727 isSorted: function(r) { return false }, 736 isSorted: function(r) { return false },
728 getLevel: function(r) { return 0 }, 737 getLevel: function(r) { return 0 },
729 getImageSrc: function(r,c) { return null }, 738 getImageSrc: function(r,c) { return null },
730 getRowProperties: function(r,p) { }, 739 getRowProperties: function(r,p) { },
731 getCellProperties: function(cid,cel,p) { }, 740 getCellProperties: function(cid,cel,p) { },
732 getColumnProperties: function(cid,cel,p) { }, 741 getColumnProperties: function(cid,cel,p) { },
733 cycleHeader: function(cid,e) { }, 742 cycleHeader: function(cid,e) { },
734 getParentIndex: function(r) { return -1 }, 743 getParentIndex: function(r) { return -1 },
735 drop: function(r,o) { }, 744 drop: function(r,o) { },
736 canDropBeforeAfter: function(r,b) { return false }, 745 canDropBeforeAfter: function(r,b) { return false },
737 746
738 importXPR: function(xp) { 747 importXPR: function(xp) {
739 this.selection.clearSelection(); 748 this.selection.clearSelection();
740 this.selection.currentIndex = -1; 749 this.selection.currentIndex = -1;
741 this.searchresult_props.hidden = true; 750 this.searchresult_props.hidden = true;
742 this.tree.beginUpdateBatch(); 751 this.tree.beginUpdateBatch();
743 this.photos = new Array(); 752 this.photos = new Array();
744 var n; while(n=xp.iterateNext()) { 753 var n; while(n=xp.iterateNext()) {
745 this.photos.push(new Photo(n)); 754 this.photos.push(new Photo(n));
746 } 755 }
747 this.rowCount = this.photos.length; 756 this.rowCount = this.photos.length;
748 this.tree.endUpdateBatch(); 757 this.tree.endUpdateBatch();
749 }, 758 },
750 paging: { 759 paging: {
751 pars: null, 760 pars: null,
752 page: null, pages: null, perpage: null, total: null 761 page: null, pages: null, perpage: null, total: null
753 }, 762 },
754 search_photos: function() { 763 search_photos: function() {
755 var pars = { 764 var pars = {
756 method: 'flickr.photos.search', 765 method: 'flickr.photos.search',
757 auth_token: 'default', 766 auth_token: 'default',
758 extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update,geo' 767 extras: 'license,date_upload,date_taken,owner_name,icon_server,original_format,last_update,geo'
759 }; 768 };
760 if(this.search_mine.checked) 769 if(this.search_mine.checked)
761 pars.user_id='me'; 770 pars.user_id='me';
762 if(this.search_tags.checked) { 771 if(this.search_tags.checked) {
763 pars.tags=this.search_for.value.split(/ +/).join(','); 772 pars.tags=this.search_for.value.split(/ +/).join(',');
764 }else{ 773 }else{
765 pars.text=this.search_for.value; 774 pars.text=this.search_for.value;
766 } 775 }
767 this.paging.pars = new Object(); 776 this.paging.pars = new Object();
768 this.paging.page = null; this.paging.pages = null; 777 this.paging.page = null; this.paging.pages = null;
769 this.paging.perpage = null; this.paging.total = null; 778 this.paging.perpage = null; this.paging.total = null;
770 for(var p in pars) this.paging.pars[p] = pars[p]; 779 for(var p in pars) this.paging.pars[p] = pars[p];
771 this.perform_search(pars); 780 this.perform_search(pars);
772 }, 781 },
773 perform_search: function(p) { 782 perform_search: function(p) {
774 var _this = this; 783 var _this = this;
775 this.fireflix.flickr.api_call( p, 784 this.fireflix.flickr.api_call( p,
776 function(xr) { 785 function(xr) {
777 var x = xr.responseXML; 786 var x = xr.responseXML;
778 var xp = xp_nodes('/rsp/photos/photo',x); 787 var xp = xp_nodes('/rsp/photos/photo',x);
779 _this.importXPR(xp); 788 _this.importXPR(xp);
780 _this.tree.ensureRowIsVisible(0); 789 _this.tree.ensureRowIsVisible(0);
781 xp = xp_node('/rsp/photos',x); 790 xp = xp_node('/rsp/photos',x);
782 _this.paging.page = parseInt(xp.getAttribute('page')); 791 _this.paging.page = parseInt(xp.getAttribute('page'));
783 _this.paging.pages = parseInt(xp.getAttribute('pages')); 792 _this.paging.pages = parseInt(xp.getAttribute('pages'));
784 _this.paging.perpage = parseInt(xp.getAttribute('perpage')); 793 _this.paging.perpage = parseInt(xp.getAttribute('perpage'));
785 _this.paging.total = parseInt(xp.getAttribute('total')); 794 _this.paging.total = parseInt(xp.getAttribute('total'));
786 _this.update_paging(); 795 _this.update_paging();
787 _this.on_select(); 796 _this.on_select();
788 }, function(x,s,c,m) { 797 }, function(x,s,c,m) {
789 _this.fireflix.flickr_failure(x,s,c,m); 798 _this.fireflix.flickr_failure(x,s,c,m);
790 } 799 }
791 ); 800 );
792 }, 801 },
793 on_cmd_prev: function(ev) { 802 on_cmd_prev: function(ev) {
794 var pars = new Object(); 803 var pars = new Object();
795 for(var p in this.paging.pars) pars[p] = this.paging.pars[p]; 804 for(var p in this.paging.pars) pars[p] = this.paging.pars[p];
796 pars.page=this.paging.page-1; pars.per_page=this.paging.perpage; 805 pars.page=this.paging.page-1; pars.per_page=this.paging.perpage;
797 this.perform_search(pars); 806 this.perform_search(pars);
798 }, 807 },
799 on_cmd_next: function(ev) { 808 on_cmd_next: function(ev) {
800 var pars = new Object(); 809 var pars = new Object();
801 for(var p in this.paging.pars) pars[p] = this.paging.pars[p]; 810 for(var p in this.paging.pars) pars[p] = this.paging.pars[p];
802 pars.page=this.paging.page+1; pars.per_page=this.paging.perpage; 811 pars.page=this.paging.page+1; pars.per_page=this.paging.perpage;
803 this.perform_search(pars); 812 this.perform_search(pars);
804 }, 813 },
805 update_paging: function() { 814 update_paging: function() {
806 if(! (this.paging.pars && this.paging.page && this.paging.pages) ) { 815 if(! (this.paging.pars && this.paging.page && this.paging.pages) ) {
807 this.search_page.value=''; this.search_page.hidden = true; 816 this.search_page.value=''; this.search_page.hidden = true;
808 this.cmd_search_prev_page.setAttribute('disabled','true'); 817 this.cmd_search_prev_page.setAttribute('disabled','true');
809 this.cmd_search_next_page.setAttribute('disabled','true'); 818 this.cmd_search_next_page.setAttribute('disabled','true');
810 }else{ 819 }else{
811 this.search_page.value=this.fireflix.loc_strings.getFormattedString('search_page',[this.paging.page,this.paging.pages]); 820 this.search_page.value=this.fireflix.loc_strings.getFormattedString('search_page',[this.paging.page,this.paging.pages]);
812 this.search_page.hidden=false; 821 this.search_page.hidden=false;
813 this.cmd_search_prev_page.setAttribute('disabled',(this.paging.page>1)?'false':'true'); 822 this.cmd_search_prev_page.setAttribute('disabled',(this.paging.page>1)?'false':'true');
814 this.cmd_search_next_page.setAttribute('disabled',(this.paging.page<this.paging.pages)?'false':'true'); 823 this.cmd_search_next_page.setAttribute('disabled',(this.paging.page<this.paging.pages)?'false':'true');
815 } 824 }
816 }, 825 },
817 render_description_frame: function(content) { 826 render_description_frame: function(content) {
818 this.searchresult_description.innerHTML = ''; 827 this.searchresult_description.innerHTML = '';
819 if(content) { 828 if(content) {
820 var dp = new DOMParser(); 829 var dp = new DOMParser();
821 var pd = dp.parseFromString( 830 var pd = dp.parseFromString(
822 '<div xmlns="http://www.w3.org/1999/xhtml">'+content+'</div>', 'text/xml' ); 831 '<div xmlns="http://www.w3.org/1999/xhtml">'+content+'</div>', 'text/xml' );
823 var de = pd.documentElement; 832 var de = pd.documentElement;
824 if(de.tagName=='parsererror') 833 if(de.tagName=='parsererror')
825 this.searchresult_description.innerHTML=this.fireflix.loc_strings.getString('broken_description'); 834 this.searchresult_description.innerHTML=this.fireflix.loc_strings.getString('broken_description');
826 else 835 else
827 this.searchresult_description.appendChild(de); 836 this.searchresult_description.appendChild(de);
828 /* of all linking elements flickr only allows a */ 837 /* of all linking elements flickr only allows a */
829 var as = this.searchresult_description.getElementsByTagName('a'); 838 var as = this.searchresult_description.getElementsByTagName('a');
830 for(var a=0;a<as.length;++a) 839 for(var a=0;a<as.length;++a)
831 as.item(a).setAttribute('target','_blank'); 840 as.item(a).setAttribute('target','_blank');
832 } 841 }
833 }, 842 },
834 on_select: function() { 843 on_select: function() {
835 if(this.selection.currentIndex<0) { 844 if(this.selection.currentIndex<0) {
836 this.searchresult_props.hidden = true; 845 this.searchresult_props.hidden = true;
837 }else{ 846 }else{
838 var p = this.photos[this.selection.currentIndex]; 847 var p = this.photos[this.selection.currentIndex];
839 if(!p) { 848 if(!p) {
840 this.searchresult_props.hidden = true; 849 this.searchresult_props.hidden = true;
841 }else{ 850 }else{
842 this.search_photo.src = this.fireflix.flickr.make_photo_url(p,'t'); 851 this.search_photo.src = this.fireflix.flickr.make_photo_url(p,'t');
843 this.searchresult_title.value = p.title; 852 this.searchresult_title.value = p.title;
844 this.searchresult_title.tooltipText = p.title; 853 this.searchresult_title.tooltipText = p.title;
845 this.render_description_frame(null); 854 this.render_description_frame(null);
846 if(p.description==null && p.description==undefined) { 855 if(p.description==null && p.description==undefined) {
847 var pid = p.id; 856 var pid = p.id;
848 var ci = this.selection.currentIndex; 857 var ci = this.selection.currentIndex;
849 var _this = this; 858 var _this = this;
850 this.fireflix.flickr.api_call( 859 this.fireflix.flickr.api_call(
851 { 860 {
852 method: 'flickr.photos.getInfo', 861 method: 'flickr.photos.getInfo',
853 auth_token: 'default', 862 auth_token: 'default',
854 photo_id: p.id, 863 photo_id: p.id,
855 secret: p.secret 864 secret: p.secret
856 }, function(xr) { 865 }, function(xr) {
857 var pp = _this.photos[ci]; 866 var pp = _this.photos[ci];
858 if(ci==_this.selection.currentIndex && pp.id==pid) { 867 if(ci==_this.selection.currentIndex && pp.id==pid) {
859 var n = xp_node('/rsp/photo',xr.responseXML); 868 var n = xp_node('/rsp/photo',xr.responseXML);
860 pp.fromNode_(n); 869 pp.fromNode_(n);
861 _this.render_description_frame(pp.description); 870 _this.render_description_frame(pp.description);
862 } 871 }
863 }, function(x,s,c,m) { 872 }, function(x,s,c,m) {
864 _this.fireflix.flickr_failure(x,s,c,m); 873 _this.fireflix.flickr_failure(x,s,c,m);
865 } 874 }
866 ); 875 );
867 this.searchresult_props.hidden = false; 876 this.searchresult_props.hidden = false;
868 }else{ 877 }else{
869 this.render_description_frame(p.description); 878 this.render_description_frame(p.description);
870 } 879 }
871 } 880 }
872 } 881 }
873 }, 882 },
874 on_cmd_open: function(ev) { 883 on_cmd_open: function(ev) {
875 if(this.selection.currentIndex<0) 884 if(this.selection.currentIndex<0)
876 return; 885 return;
877 var p = this.photos[this.selection.currentIndex]; 886 var p = this.photos[this.selection.currentIndex];
878 if(!p.id) 887 if(!p.id)
879 return; 888 return;
880 this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p')); 889 this.fireflix.openTab(this.fireflix.flickr.make_photo_url(p,'p'));
881 } 890 }
882 }, 891 },
883 892
884 photo_html: function(p,i,l) { 893 photo_html: function(p,i,l) {
885 // TODO: add alt/title when possible 894 // TODO: add alt/title when possible
886 var rv = 895 var rv =
887 '<a href="'+this.flickr.make_photo_url(p,l)+'">' + 896 '<a href="'+this.flickr.make_photo_url(p,l)+'">' +
888 '<img src="'+this.flickr.make_photo_url(p,i)+'" />'+ 897 '<img src="'+this.flickr.make_photo_url(p,i)+'" />'+
889 '</a>'; 898 '</a>';
890 return rv; 899 return rv;
891 }, 900 },
892 build_html: function(photos,uti,utl) { 901 build_html: function(photos,uti,utl) {
893 var rv = ''; 902 var rv = '';
894 for(var i in photos) { 903 for(var i in photos) {
895 var p = photos[i]; 904 var p = photos[i];
896 rv += this.photo_html(p,uti,utl)+'\n'; 905 rv += this.photo_html(p,uti,utl)+'\n';
897 } 906 }
898 return rv; 907 return rv;
899 }, 908 },
900 909
901 popup_content: function(s) { 910 popup_content: function(s) {
902 window.openDialog( 911 window.openDialog(
903 "chrome://fireflix/content/generated-content.xul", 912 "chrome://fireflix/content/generated-content.xul",
904 null, "dialog,chrome", this, s ); 913 null, "dialog,chrome", this, s );
905 }, 914 },
906 copy_to_clipboard: function(s) { 915 copy_to_clipboard: function(s) {
907 var ch = Components.classes["@mozilla.org/widget/clipboardhelper;1"] 916 var ch = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
908 .getService(Components.interfaces.nsIClipboardHelper); 917 .getService(Components.interfaces.nsIClipboardHelper);
909 ch.copyString(s); 918 ch.copyString(s);
910 }, 919 },
911 openTab: function(l) { 920 openTab: function(l) {
912 var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService( 921 var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(
913 Components.interfaces.nsIWindowMediator ); 922 Components.interfaces.nsIWindowMediator );
914 var bw = wm.getMostRecentWindow('navigator:browser'); 923 var bw = wm.getMostRecentWindow('navigator:browser');
915 var b = bw.getBrowser(); 924 var b = bw.getBrowser();
916 var t = b.addTab(l); 925 var t = b.addTab(l);
917 b.selectedTab = t; 926 b.selectedTab = t;
918 }, 927 },
919 928
920 build_menus: function() { 929 build_menus: function() {
921 this.append_html_menu( 930 this.append_html_menu(
922 document.getElementById('sets_html_menu'), 931 document.getElementById('sets_html_menu'),
923 'stm_','m_bop','cmdset_sets','cmd_sets_html' 932 'stm_','m_bop','cmdset_sets','cmd_sets_html'
924 ); 933 );
925 this.append_html_menu( 934 this.append_html_menu(
935 document.getElementById('setphotos_html_menu'),
936 'stm_','m_bop','cmdset_setphotos','cmd_setphotos_html'
937 );
938 this.append_html_menu(
926 document.getElementById('uploads_html_menu'), 939 document.getElementById('uploads_html_menu'),
927 'stm_','m_bop','cmdset_uploads','cmd_uploads_html' 940 'stm_','m_bop','cmdset_uploads','cmd_uploads_html'
928 ); 941 );
929 return; 942 return;
930 }, 943 },
931 append_html_menu: function(m,imgt,lnkt,csid,cpfx) { 944 append_html_menu: function(m,imgt,lnkt,csid,cpfx) {
932 var mp = m.appendChild(document.createElement('menupopup')); 945 var mp = m.appendChild(document.createElement('menupopup'));
933 var t; 946 var t;
934 t=mp.appendChild(document.createElement('menuitem')); 947 t=mp.appendChild(document.createElement('menuitem'));
935 t.setAttribute('label',this.loc_strings.getString('menutitle_Images')); 948 t.setAttribute('label',this.loc_strings.getString('menutitle_Images'));
936 t.setAttribute('class','menuhead');t.setAttribute('disabled','true'); 949 t.setAttribute('class','menuhead');t.setAttribute('disabled','true');
937 mp.appendChild(document.createElement('menuseparator')); 950 mp.appendChild(document.createElement('menuseparator'));
938 var cs = document.getElementById(csid); 951 var cs = document.getElementById(csid);
939 for(var iti=0;iti<imgt.length;++iti) { 952 for(var iti=0;iti<imgt.length;++iti) {
940 t = mp.appendChild(document.createElement('menu')); 953 t = mp.appendChild(document.createElement('menu'));
941 t.setAttribute('label',this.loc_strings.getString('urltype_'+imgt.charAt(iti))); 954 t.setAttribute('label',this.loc_strings.getString('urltype_'+imgt.charAt(iti)));
942 var smp = t.appendChild(document.createElement('menupopup')); 955 var smp = t.appendChild(document.createElement('menupopup'));
943 t=smp.appendChild(document.createElement('menuitem')); 956 t=smp.appendChild(document.createElement('menuitem'));
944 t.setAttribute('label',this.loc_strings.getString('menutitle_Links')); 957 t.setAttribute('label',this.loc_strings.getString('menutitle_Links'));
945 t.setAttribute('class','menuhead');t.setAttribute('disabled','true'); 958 t.setAttribute('class','menuhead');t.setAttribute('disabled','true');
946 smp.appendChild(document.createElement('menuseparator')); 959 smp.appendChild(document.createElement('menuseparator'));
947 for(var lti=0;lti<lnkt.length;++lti) { 960 for(var lti=0;lti<lnkt.length;++lti) {
948 var csfx = imgt.charAt(iti)+lnkt.charAt(lti); 961 var csfx = imgt.charAt(iti)+lnkt.charAt(lti);
949 t=smp.appendChild(document.createElement('menuitem')); 962 t=smp.appendChild(document.createElement('menuitem'));
950 t.setAttribute('label',this.loc_strings.getString('urltype_'+lnkt.charAt(lti))); 963 t.setAttribute('label',this.loc_strings.getString('urltype_'+lnkt.charAt(lti)));
951 t.setAttribute('command',cpfx+'_'+csfx); 964 t.setAttribute('command',cpfx+'_'+csfx);
952 t=cs.appendChild(document.createElement('command')); 965 t=cs.appendChild(document.createElement('command'));
953 t.setAttribute('id',cpfx+'_'+csfx); 966 t.setAttribute('id',cpfx+'_'+csfx);
954 t.setAttribute('oncommand','fireflix.on_'+cpfx+"('"+csfx+"',event)"); 967 t.setAttribute('oncommand','fireflix.on_'+cpfx+"('"+csfx+"',event)");
955 } 968 }
956 } 969 }
957 return mp; 970 return mp;
958 }, 971 },
959 972
960 flickr_failure: function(x,s,c,m) { 973 flickr_failure: function(x,s,c,m) {
961 if(c==98) { // Invalid auth token 974 if(c==98) { // Invalid auth token
962 this.flickr.reset_token(); 975 this.flickr.reset_token();
963 this.set_auth_state(false,false); 976 this.set_auth_state(false,false);
964 return; 977 return;
965 } 978 }
966 // TODO: is that beauty? 979 // TODO: is that beauty?
967 alert('flickr api call failed\n'+c+' '+m); 980 alert('flickr api call failed\n'+c+' '+m);
968 } 981 }
969 982
970}; 983};
diff --git a/locale/en-US/fireflix.dtd b/locale/en-US/fireflix.dtd
index 09112dc..668b684 100644
--- a/locale/en-US/fireflix.dtd
+++ b/locale/en-US/fireflix.dtd
@@ -1,85 +1,87 @@
1<!ENTITY % autoconf SYSTEM "chrome://fireflix/content/autoconf.dtd"> 1<!ENTITY % autoconf SYSTEM "chrome://fireflix/content/autoconf.dtd">
2%autoconf; 2%autoconf;
3 3
4<!-- About Box --> 4<!-- About Box -->
5 5
6<!ENTITY aboutFireflix "About Fireflix" > 6<!ENTITY aboutFireflix "About Fireflix" >
7<!ENTITY about.ok.label "OK"> 7<!ENTITY about.ok.label "OK">
8<!ENTITY about.license.label "License"> 8<!ENTITY about.license.label "License">
9<!ENTITY about.license.tip "Show copying policy"> 9<!ENTITY about.license.tip "Show copying policy">
10 10
11<!-- COPYING --> 11<!-- COPYING -->
12 12
13<!ENTITY copying.title "Filreflix: copying policy"> 13<!ENTITY copying.title "Filreflix: copying policy">
14 14
15<!-- Sidebar --> 15<!-- Sidebar -->
16 16
17<!ENTITY panel.auth_info "Authorization info"> 17<!ENTITY panel.auth_info "Authorization info">
18<!ENTITY panel.no_auth_info "No auth info available"> 18<!ENTITY panel.no_auth_info "No auth info available">
19 19
20<!ENTITY panel.auth.auth.label "Authorize"> 20<!ENTITY panel.auth.auth.label "Authorize">
21<!ENTITY panel.auth.done.label "Authorization complete"> 21<!ENTITY panel.auth.done.label "Authorization complete">
22<!ENTITY panel.auth.flickr.label "Flickr"> 22<!ENTITY panel.auth.flickr.label "Flickr">
23<!ENTITY panel.auth.flickr.tip "Open Flickr in new tab"> 23<!ENTITY panel.auth.flickr.tip "Open Flickr in new tab">
24<!ENTITY panel.auth.unauth.label "Sign off"> 24<!ENTITY panel.auth.unauth.label "Sign off">
25 25
26<!ENTITY panel.tabs.search "Search" > 26<!ENTITY panel.tabs.search "Search" >
27<!ENTITY panel.tabs.sets "Sets" > 27<!ENTITY panel.tabs.sets "Sets" >
28<!ENTITY panel.tabs.tags "Tags" > 28<!ENTITY panel.tabs.tags "Tags" >
29<!ENTITY panel.tabs.upload "Upload" > 29<!ENTITY panel.tabs.upload "Upload" >
30 30
31<!ENTITY panel.search.cmd_search.label "Search" > 31<!ENTITY panel.search.cmd_search.label "Search" >
32<!ENTITY panel.search.search_for.label "Search for:" > 32<!ENTITY panel.search.search_for.label "Search for:" >
33<!ENTITY panel.search.mode.tagsonly.label "tags"> 33<!ENTITY panel.search.mode.tagsonly.label "tags">
34<!ENTITY panel.search.mode.tagsonly.tip "Search tags only"> 34<!ENTITY panel.search.mode.tagsonly.tip "Search tags only">
35<!ENTITY panel.search.mode.mine.label "mine"> 35<!ENTITY panel.search.mode.mine.label "mine">
36<!ENTITY panel.search.col.title.label "Title"> 36<!ENTITY panel.search.col.title.label "Title">
37<!ENTITY panel.search.cmd_search_open.label "Open"> 37<!ENTITY panel.search.cmd_search_open.label "Open">
38<!ENTITY panel.search.cmd_search_prev_page.label " « "> 38<!ENTITY panel.search.cmd_search_prev_page.label " « ">
39<!ENTITY panel.search.cmd_search_next_page.label " » "> 39<!ENTITY panel.search.cmd_search_next_page.label " » ">
40 40
41<!ENTITY panel.sets.name.label "Set"> 41<!ENTITY panel.sets.name.label "Set">
42<!ENTITY panel.sets.name.tip "Photoset name"> 42<!ENTITY panel.sets.name.tip "Photoset name">
43<!ENTITY panel.sets.photos.label "Photos"> 43<!ENTITY panel.sets.photos.label "Photos">
44<!ENTITY panel.sets.photos.tip "Number of photos in set"> 44<!ENTITY panel.sets.photos.tip "Number of photos in set">
45 45
46<!ENTITY panel.sets.cmd_refresh_sets "Refresh"> 46<!ENTITY panel.sets.cmd_refresh_sets "Refresh">
47<!ENTITY panel.sets.cmd_properties "Properties"> 47<!ENTITY panel.sets.cmd_properties "Properties">
48 48
49<!ENTITY panel.sets.generate_html "Generate HTML"> 49<!ENTITY panel.sets.generate_html "Generate HTML">
50 50
51<!ENTITY panel.setphotos.title.label "Title"> 51<!ENTITY panel.setphotos.title.label "Title">
52<!ENTITY panel.setphotos.title.tip "Picture title"> 52<!ENTITY panel.setphotos.title.tip "Picture title">
53<!ENTITY panel.setphotos.taken.label "Taken"> 53<!ENTITY panel.setphotos.taken.label "Taken">
54<!ENTITY panel.setphotos.taken.tip "When the picture was taken"> 54<!ENTITY panel.setphotos.taken.tip "When the picture was taken">
55<!ENTITY panel.setphotos.upload.label "Uploaded"> 55<!ENTITY panel.setphotos.upload.label "Uploaded">
56<!ENTITY panel.setphotos.upload.tip "When the picure was uploaded"> 56<!ENTITY panel.setphotos.upload.tip "When the picure was uploaded">
57 57
58<!ENTITY panel.setphotos.generate_html "Generate HTML">
59
58<!ENTITY panel.tagslist.tag.label "Tag"> 60<!ENTITY panel.tagslist.tag.label "Tag">
59 61
60<!ENTITY panel.uploadlist.file.label "File name"> 62<!ENTITY panel.uploadlist.file.label "File name">
61<!ENTITY panel.uploadlist.title.label "Title"> 63<!ENTITY panel.uploadlist.title.label "Title">
62<!ENTITY panel.uploadlist.status.label "Status"> 64<!ENTITY panel.uploadlist.status.label "Status">
63 65
64<!ENTITY panel.upload_props.filename.label "File:"> 66<!ENTITY panel.upload_props.filename.label "File:">
65<!ENTITY panel.upload_props.title.label "Title:"> 67<!ENTITY panel.upload_props.title.label "Title:">
66<!ENTITY panel.upload_props.tags.label "Tags:"> 68<!ENTITY panel.upload_props.tags.label "Tags:">
67 69
68<!ENTITY panel.uploads.upload.label "Upload"> 70<!ENTITY panel.uploads.upload.label "Upload">
69<!ENTITY panel.uploads.clear.label "Clear"> 71<!ENTITY panel.uploads.clear.label "Clear">
70<!ENTITY panel.uploads.remove.label "Remove"> 72<!ENTITY panel.uploads.remove.label "Remove">
71<!ENTITY panel.uploads.add.label "Add"> 73<!ENTITY panel.uploads.add.label "Add">
72<!ENTITY panel.uploads.generate_html "Generate HTML"> 74<!ENTITY panel.uploads.generate_html "Generate HTML">
73 75
74<!ENTITY generated.title "Fireflix: Generated content"> 76<!ENTITY generated.title "Fireflix: Generated content">
75<!ENTITY generated.copy "copy"> 77<!ENTITY generated.copy "copy">
76<!ENTITY generated.nolf "remove linebreaks"> 78<!ENTITY generated.nolf "remove linebreaks">
77 79
78<!ENTITY browser.sidebar.label "Fireflix"> 80<!ENTITY browser.sidebar.label "Fireflix">
79<!ENTITY browser.sidebar.title "Fireflix"> 81<!ENTITY browser.sidebar.title "Fireflix">
80<!ENTITY browser.sidebar.tooltip "Fireflix"> 82<!ENTITY browser.sidebar.tooltip "Fireflix">
81 83
82<!ENTITY photosetprops.title "Photoset properties"> 84<!ENTITY photosetprops.title "Photoset properties">
83<!ENTITY photosetprops.set_title.label "Photoset title:"> 85<!ENTITY photosetprops.set_title.label "Photoset title:">
84<!ENTITY photosetprops.set_desc.label "Photoset description:"> 86<!ENTITY photosetprops.set_desc.label "Photoset description:">
85 87