root/trunk/uploadr/MacUploadr.app/Contents/Resources/chrome/content/uploadr/meta.js

Revision 462, 24.4 kB (checked in by jdecq, 1 year ago)

b2 #8574, remember the last selected choice for private photo, w.r.t friends and family... sticky per session for now, not per photo.

Line 
1 /*
2  * Flickr Uploadr
3  *
4  * Copyright (c) 2007-2008 Yahoo! Inc.  All rights reserved.  This library is
5  * free software; you can redistribute it and/or modify it under the terms of
6  * the GNU General Public License (GPL), version 2 only.  This library is
7  * distributed WITHOUT ANY WARRANTY, whether express or implied. See the GNU
8  * GPL for more details (http://www.gnu.org/licenses/gpl.html)
9  */
10
11 var meta = {
12
13         // Map of set IDs to names
14         sets: [],
15         created_sets: 0,
16
17         // Show a special status message for their first batch
18         first: true,
19
20         // Auto-select, which is cancellable by a click during thumbing
21         auto_select: conf.auto_select,
22
23     // Last private setting: 0=private, 1=family, 2=friends, 3=f&f
24     last_private_settings: 0,
25
26         // Load a photo's metadata from JS into the DOM
27         load: function(id) {
28
29                 // Start the sets list all enabled
30                 var ul = document.getElementById((null == id ? 'batch' : 'single') +
31                         '_sets_add').getElementsByTagName('li');
32                 var ii = ul.length;
33                 for (var i = 0; i < ii; ++i) {
34                         if ('sets_none' != ul[i].className) {
35                                 ul[i].className = 'sets_plus';
36                         }
37                 }
38
39                 // Load the defaults for a partial batch
40                 if (null == id) {
41
42                         // Proper diction
43                         var p_count = 0;
44                         var v_count = 0;
45                         for each (var id in photos.selected) {
46                                 if (null == photos.list[id]) {
47                                         continue;
48                                 }
49                                 if (photos.is_photo(photos.list[id].path)) {
50                                         ++p_count;
51                                 } else {
52                                         ++v_count;
53                                 }
54                         }
55                         if (p_count && v_count) {
56                                 document.getElementById('batch_who').firstChild.nodeValue =
57                                         locale.getString('meta.batch.who.items');
58                         } else if (v_count) {
59                                 document.getElementById('batch_who').firstChild.nodeValue =
60                                         locale.getString('meta.batch.who.videos');
61                         } else {
62                                 document.getElementById('batch_who').firstChild.nodeValue =
63                                         locale.getString('meta.batch.who.photos');                             
64                         }
65
66                         // Prompt
67                         if (meta.first) {
68                                 document.getElementById('batch_prompt').firstChild.nodeValue =
69                                         locale.getString('meta.first');
70                         } else {
71                                 if (p_count && v_count) {
72                                         document.getElementById('batch_prompt').firstChild.nodeValue =
73                                                 locale.getFormattedString('meta.batch.prompt.items',
74                                                 [photos.selected.length]);
75                                 } else if (v_count) {
76                                         document.getElementById('batch_prompt').firstChild.nodeValue =
77                                                 locale.getFormattedString('meta.batch.prompt.videos',
78                                                 [photos.selected.length]);
79                                 } else {
80                                         document.getElementById('batch_prompt').firstChild.nodeValue =
81                                                 locale.getFormattedString('meta.batch.prompt.photos',
82                                                 [photos.selected.length]);
83                                 }
84                         }
85
86                         // Blank slate metadata
87                         document.getElementById('batch_title').value = '';
88                         document.getElementById('batch_description').value = '';
89                         document.getElementById('batch_tags').value = '';
90                         document.getElementById('batch_is_public').value = 2;
91                         var is_friend = document.getElementById('batch_is_friend');
92                         is_friend.checked = false;
93                         is_friend.disabled = true;
94                         var is_family = document.getElementById('batch_is_family');
95                         is_family.checked = false;
96                         is_family.disabled = true;
97                         document.getElementById('batch_content_type').value = 0;
98                         document.getElementById('batch_hidden').value = 0;
99                         var safety_level = document.getElementById('batch_safety_level');
100                         safety_level.value = 0;
101                         safety_level.selectedItem.label = '';
102
103                         // Clear the old sets list
104                         ul = document.getElementById('batch_sets_added');
105                         while (ul.hasChildNodes()) {
106                                 ul.removeChild(ul.firstChild);
107                         }
108                         var li = document.createElementNS(NS_HTML, 'li')
109                         li.className = 'sets_none';
110                         li.appendChild(document.createTextNode(
111                                 locale.getString('meta.sets.added.none')));
112                         ul.appendChild(li);
113                         document.getElementById('batch_sets_create').style.display =
114                                 meta.created_sets == users.sets ? 'none' : 'block';
115
116                 }
117
118                 // Load the values from a specific photo
119                 else {
120                         var p = photos.list[id];
121                         if (null == p) {
122                                 return;
123                         }
124
125                         // Proper diction
126                         if (photos.is_video(p.path)) {
127                                 document.getElementById('single_who').firstChild.nodeValue =
128                                         locale.getString('meta.single.who.video');
129                         } else {
130                                 document.getElementById('single_who').firstChild.nodeValue =
131                                         locale.getString('meta.single.who.photo');
132                         }
133
134                         // Show a preview of the image with file size and dimensions
135                         if (!meta.first) {
136                                 document.getElementById('single_prompt').style.display = 'none';
137                                 document.getElementById('single_preview').style.display = '-moz-box';
138                                 var img = document.getElementById('photo' + id).getElementsByTagName('img')[0];
139                                 var meta_div = document.getElementById('meta_div');
140                                 while (meta_div.hasChildNodes()) {
141                                         meta_div.removeChild(meta_div.firstChild);
142                                 }
143                                 var w = parseInt(img.getAttribute('width'));
144                                 var h = parseInt(img.getAttribute('height'));
145                                 meta_div.setAttribute('width', w + 4);
146                                 meta_div.setAttribute('height', h + 4);
147                                 var meta_img = document.createElementNS(NS_HTML, 'img');
148                                 meta_img.setAttribute('width', w);
149                                 meta_img.setAttribute('height', h);
150                                 meta_img.src = img.src;
151                                 meta_div.appendChild(meta_img);
152                                 document.getElementById('meta_dim').value =
153                                         locale.getFormattedString('meta.dim', [p.width, p.height]);
154                                 if (1024 > p.size) {
155                                         document.getElementById('meta_size').value =
156                                                 locale.getFormattedString('kb', [p.size]);
157                                 } else {
158                                         document.getElementById('meta_size').value =
159                                                 locale.getFormattedString('mb',
160                                                 [Math.round(p.size / 102.4) / 10]);
161                                 }
162                                 if (photos.is_video(p.path)) {
163                                         var min = 0, sec = p.duration;
164                                         if (60 <= sec) {
165                                                 min = parseInt(sec / 60);
166                                                 sec = sec % 60;
167                                                 if (10 > sec) { sec = '0' + sec; }
168                                         }
169                                         document.getElementById('meta_duration').value =
170                                                 locale.getFormattedString('meta.duration', [min, sec]);
171                                 } else {
172                                         document.getElementById('meta_duration').value = '';
173                                 }
174                         }
175
176                         // Pre-populate metadata
177                         document.getElementById('single_title').value = p.title;
178                         document.getElementById('single_description').value = p.description;
179                         document.getElementById('single_tags').value = p.tags;
180                         document.getElementById('single_is_public').value = p.is_public;
181                         document.getElementById('single_is_friend').checked = 1 == p.is_friend;
182                         document.getElementById('single_is_family').checked = 1 == p.is_family;
183                         document.getElementById('single_content_type').value = p.content_type;
184                         document.getElementById('single_hidden').value = p.hidden;
185                         document.getElementById('single_safety_level').value = p.safety_level;
186
187                         // Sets list
188                         var ul = document.getElementById('single_sets_added');
189                         while (ul.hasChildNodes()) {
190                                 ul.removeChild(ul.firstChild);
191                         }
192                         var ii = p.sets.length;
193                         if (0 == ii) {
194                                 var li = document.createElementNS(NS_HTML, 'li');
195                                 li.className = 'sets_none';
196                                 li.appendChild(document.createTextNode(
197                                         locale.getString('meta.sets.added.none')));
198                                 ul.appendChild(li);
199                         } else {
200                                 for (var i = 0; i < ii; ++i) {
201                                         document.getElementById('single_sets_add_' + p.sets[i])
202                                                 .className = 'sets_disabled';
203                                         var li = document.createElementNS(NS_HTML, 'li');
204                                         li.id = 'single_sets_added_' + p.sets[i];
205                                         li.className = 'sets_trash';
206                                         li.appendChild(document.createTextNode(
207                                                 meta.sets[p.sets[i]].title));
208                                         ul.appendChild(li);
209                                 }
210                         }
211                         document.getElementById('single_sets_create').style.display =
212                                 meta.created_sets == users.sets ? 'none' : 'block';
213
214                 }
215
216                 // Send the selected photos list to extensions
217                 extension.after_select.exec(photos.selected);
218
219         },
220
221         // Save photo metadata from the DOM into JS
222         save: function(id) {
223
224                 // Save a partial batch into the selected photos
225                 if (null == id) {
226                         var ii = photos.selected.length;
227                         for (var i = 0; i < ii; ++i) {
228                                 var p = photos.list[photos.selected[i]];
229                                 if (null == p) {
230                                         return;
231                                 }
232
233                                 // Overwrite title if one is given
234                                 var title = document.getElementById('batch_title').value;
235                                 if ('' != title) {
236                                         p.title = title;
237                                 }
238
239                                 // Append description if one is given
240                                 var description = document.getElementById('batch_description').value;
241                                 if ('' != description) {
242                                         p.description += ('' == p.description ? '' : '\n\n') + description;
243                                 }
244
245                                 // Append tags, but then parse and remove duplicates
246                                 p.tags = meta.tags(p.tags,
247                                         document.getElementById('batch_tags').value);
248
249                                 // Overwrite privacy, content type, hidden and safety level
250                                 var is_public = parseInt(document.getElementById('batch_is_public').value);
251                                 if (2 != is_public) {
252                                         p.is_public = is_public;
253                                         p.is_friend = document.getElementById('batch_is_friend').checked ? 1 : 0;
254                                         p.is_family = document.getElementById('batch_is_family').checked ? 1 : 0;
255                                 }
256                                 var content_type = parseInt(document.getElementById('batch_content_type').value);
257                                 if (0 != content_type) {
258                                         p.content_type = content_type;
259                                 }
260                                 var hidden = parseInt(document.getElementById('batch_hidden').value);
261                                 if (0 != hidden) {
262                                         p.hidden = hidden;
263                                 }
264                                 var safety_level = parseInt(document.getElementById('batch_safety_level').value);
265                                 if (0 != safety_level) {
266                                         p.safety_level = safety_level;
267                                 }
268
269                         }
270                 }
271
272                 // Save a single photo
273                 else {
274                         var p = photos.list[id];
275                         if (null == p) {
276                                 return;
277                         }
278                         p.title = document.getElementById('single_title').value;
279                         p.description = document.getElementById('single_description').value;
280                         p.tags = document.getElementById('single_tags').value;
281                         p.is_public = parseInt(document.getElementById('single_is_public').value);
282                         p.is_friend = document.getElementById('single_is_friend').checked ? 1 : 0;
283                         p.is_family = document.getElementById('single_is_family').checked ? 1 : 0;
284                         p.content_type = parseInt(document.getElementById('single_content_type').value);
285                         p.hidden = parseInt(document.getElementById('single_hidden').value);
286                         p.safety_level = parseInt(document.getElementById('single_safety_level').value);
287                 }
288
289                 // Send the selected photos list to extensions
290                 extension.after_edit.exec(photos.selected);
291
292         },
293
294         // Enable the right-side metadata column on the photos page
295         enable: function() {
296                 var is_public = document.getElementById('single_is_public');
297                 is_public.disabled = false;
298                 var dis = 1 == parseInt(is_public.value);
299                 document.getElementById('single_is_friend').disabled = dis;
300                 document.getElementById('single_is_family').disabled = dis;
301                 document.getElementById('meta').style.display = '-moz-box';
302                 document.getElementById('batch_meta').style.display = 'none';
303                 meta._enable();
304         },
305         batch: function() {
306                 meta.load();
307                 document.getElementById('meta').style.display = 'none';
308                 document.getElementById('batch_meta').style.display = '-moz-box';
309                 meta._enable();
310         },
311
312         // Common to batch and single enabling
313         _enable: function() {
314                 document.getElementById('no_meta').style.display = 'none';
315                 buttons.remove.enable();
316
317                 // Only allow rotation for photos or mixed selections
318                 var have_photos = false;
319                 for each (var i in photos.selected) {
320                         if (null == photos.list[i]) {
321                                 continue;
322                         }
323                         have_photos = photos.is_photo(photos.list[i].path) ? true : have_photos;
324                 }
325                 if (have_photos) {
326                         document.getElementById('t_rotate_l').className = 'enabled';
327                         document.getElementById('t_rotate_r').className = 'enabled';
328                 }
329
330         },
331
332         // Disable the right-side metadata column on the photos page
333         disable: function() {
334                 document.getElementById('meta').style.display = 'none';
335                 document.getElementById('batch_meta').style.display = 'none';
336                 document.getElementById('no_meta').style.display = '-moz-box';
337                 buttons.remove.disable();
338                 document.getElementById('t_rotate_l').className = 'disabled';
339                 document.getElementById('t_rotate_r').className = 'disabled';
340         },
341
342         // Properly enable/disable the checkboxes available for private photos to be shared with
343         // friends and/or family
344         is_public: function(value) {
345
346                 // Single photo or group of photos?
347                 var prefix = 1 == photos.selected.length ? 'single' : 'batch';
348
349                 if (1 == parseInt(value)) {
350                         meta.last_private_settings = document.getElementById(prefix + '_is_friend').checked | (document.getElementById(prefix + '_is_family').checked << 1);
351                         document.getElementById(prefix + '_is_friend').checked = false;
352                         document.getElementById(prefix + '_is_family').checked = false;
353                         document.getElementById(prefix + '_is_friend').disabled = true;
354                         document.getElementById(prefix + '_is_family').disabled = true;
355                 } else {
356                     if (document.getElementById(prefix + '_is_friend').disabled === true) {
357                             document.getElementById(prefix + '_is_friend').disabled = false;
358                             document.getElementById(prefix + '_is_friend').checked = meta.last_private_settings & 1;
359                     }
360                     if (document.getElementById(prefix + '_is_family').disabled === true) {
361                             document.getElementById(prefix + '_is_family').disabled = false;
362                             document.getElementById(prefix + '_is_family').checked = meta.last_private_settings & 2;
363                     }
364                 }
365         },
366
367         // If a user leaves a partial batch before committing, warn them
368         //   If conf.confirm_save_batch is off, this will always save rather than abandon
369         abandon: function() {
370                 if ('-moz-box' == document.getElementById('batch_meta').style.display &&
371                         1 < photos.selected.length) {
372                         if (conf.confirm_save_batch) {
373                                 if (confirm(locale.getString('meta.abandon.text'),
374                                         locale.getString('meta.abandon.title'),
375                                         locale.getString('meta.abandon.ok'),
376                                         locale.getString('meta.abandon.cancel'))) {
377                                         meta.save();
378                                         meta.load();
379                                 }
380                         } else {
381                                 meta.save();
382                                 meta.load();
383                         }
384                 }
385         },
386
387         // Parse a string into an array of tags
388         tags: function() {
389                 var out = [];
390                 var out_delim = ' ';
391                 var ii = arguments.length;
392                 for (var i = 0; i < ii; ++i) {
393                         var str = arguments[i];
394                         while (/".*?"/.test(str)) {
395                                 var match = /"(.*?)"/.exec(str);
396                                 str = str.replace(/".*?"/, meta.tags_transform(match[1]));
397                         }
398                         var arr;
399                         var delim;
400                         if (-1 == str.indexOf(',')) {
401                                 arr = str.split(/\s/);
402                                 delim = ' ';
403                         } else {
404                                 arr = str.split(/,/);
405                                 delim = ', ';
406                                 out_delim = ', ';
407                         }
408                         var jj = arr.length;
409                         for (var j = 0; j < jj; ++j) {
410                                 if (arr[j]) {
411                                         var tmp = meta.tags_untransform(arr[j]);
412                                         if (-1 == out.indexOf(tmp)) { out.push(tmp); }
413                                 }
414                         }
415                 }
416                 return out.join(out_delim);
417         },
418
419         // Transform and untransform tags for splitting
420         tags_transform: function(tag) {
421                 var match;
422                 while (match = /(\s+)/.exec(tag)) {
423                         tag = tag.replace(/\s+/,
424                                 '{WHITESPACE-' + match[1].charCodeAt(0) + '}');
425                 }
426                 while (/,/.test(tag)) {
427                         var match = /(,)/.exec(tag);
428                         tag = tag.replace(/,/, '{COMMA}');
429                 }
430                 return tag;
431         },
432         tags_untransform: function(tag) {
433                 var match;
434                 var quotes = false;
435                 while (match = /\{WHITESPACE-([0-9]+)\}/.exec(tag)) {
436                         tag = tag.replace(/\{WHITESPACE-[0-9]+\}/,
437                                 String.fromCharCode(parseInt(match[1])));
438                         quotes = true;
439                 }
440                 while (/\{COMMA\}/.test(tag)) {
441                         var match = /\{COMMA\}/.exec(tag);
442                         tag = tag.replace(/\{COMMA\}/, ',');
443                         quotes = true;
444                 }
445                 return (quotes ? '"' : '') + tag.replace(/^\s+/, '')
446                         .replace(/\s+$/, '') + (quotes ? '"' : '');
447         },
448
449         // Create a new set if we have any left
450         create_set: function() {
451                 if (-1 == users.sets || 0 < users.sets) {
452                         var result = {};
453                         window.openDialog('chrome://uploadr/content/set.xul',
454                                 'dialog_set', 'chrome,modal', result);
455                         var name = result.name;
456                         var desc = result.desc;
457                         if (!name) { return; }
458                         meta.sets.push({
459                                 title: name, // Sorry
460                                 description: desc,
461                                 busy: false,
462                                 add: []
463                         });
464                         ++meta.created_sets;
465                         var prefixes = ['single', 'batch'];
466                         for each (var prefix in prefixes) {
467                                 var ul = document.getElementById(prefix + '_sets_add');
468                                 if ('sets_none' == ul.firstChild.className) {
469                                         ul.removeChild(ul.firstChild);
470                                 }
471                                 var li = document.createElementNS(NS_HTML, 'li');
472                                 li.id = prefix + '_sets_add_' + (meta.sets.length - 1);
473                                 li.className = 'sets_plus';
474                                 li.style.fontWeight = 'bold';
475                                 li.appendChild(document.createTextNode(name));
476                                 ul.insertBefore(li, ul.firstChild);
477                         }
478                         var prefix = 1 == photos.selected.length ? 'single' : 'batch';
479                         meta.add_to_set({target:
480                                 document.getElementById(prefix + '_sets_add').firstChild});
481                         if (meta.created_sets == users.sets) {
482                                 document.getElementById(prefix + '_sets_create')
483                                         .style.visibility = 'hidden';
484                         }
485                 }
486         },
487
488         // Add selected photos to the selected set
489         add_to_set: function(e) {
490
491                 // Get the item that was clicked
492                 if ('li' != e.target.nodeName || 'sets_plus' != e.target.className) {
493                         return;
494                 }
495                 var li = e.target;
496                 li.className = 'sets_disabled';
497                 var set_index = parseInt(li.id.replace(/^(single|batch)_sets_add_/,
498                         ''));
499                 var title = li.firstChild.nodeValue;
500
501                 // Add each selected photo to this set
502                 var ii = photos.selected.length;
503                 for (var i = 0; i < ii; ++i) {
504                         var p = photos.list[photos.selected[i]];
505                         if (null != p && -1 == p.sets.indexOf(set_index)) {
506                                 p.sets.push(set_index);
507                         }
508                 }
509
510                 // Update the UI
511                 var prefix = 1 == photos.selected.length ? 'single' : 'batch';
512                 var ul = document.getElementById(prefix + '_sets_added');
513                 if ('sets_none' == ul.firstChild.className) {
514                         ul.removeChild(ul.firstChild);
515                 }
516                 var li = document.createElementNS(NS_HTML, 'li');
517                 li.id = prefix + '_sets_added_' + set_index;
518                 li.className = 'sets_trash';
519                 li.appendChild(document.createTextNode(title));
520                 ul.appendChild(li);
521
522         },
523
524         remove_from_set: function(e) {
525
526                 // Get the item that was clicked
527                 if ('li' != e.target.nodeName || 'sets_trash' != e.target.className) {
528                         return;
529                 }
530                 var li = e.target;
531                 var set_index = parseInt(li.id.replace(/^(single|batch)_sets_added_/,
532                         ''));
533                 var name = li.firstChild.nodeValue;
534
535                 // Remove each selected photo from this set
536                 var ii = photos.selected.length;
537                 for (var i = 0; i < ii; ++i) {
538                         var p = photos.list[photos.selected[i]];
539                         if (null == p) { continue; }
540                         var new_sets = [];
541                         var jj = p.sets.length;
542                         for (var j = 0; j < jj; ++j) {
543                                 if (set_index != p.sets[j]) {
544                                         new_sets.push(p.sets[j]);
545                                 }
546                         }
547                         p.sets = new_sets;
548                 }
549
550                 // Update the UI
551                 li.parentNode.removeChild(li);
552                 var prefix = 1 == photos.selected.length ? 'single' : 'batch';
553                 var ul = document.getElementById(prefix + '_sets_added');
554                 if (0 == ul.getElementsByTagName('li').length) {
555                         li = document.createElementNS(NS_HTML, 'li');
556                         li.className = 'sets_none';
557                         li.appendChild(document.createTextNode(
558                                 locale.getString('meta.sets.added.none')));
559                         ul.appendChild(li);
560                 }
561                 document.getElementById(prefix + '_sets_add_' + set_index)
562                         .className = 'sets_plus';
563
564         },
565
566         // Note default values in the meta panes
567         defaults: function(map) {
568
569                 // Update the UI
570                 var def = ' ' + locale.getString('meta.default');
571                 for (var m in map) {
572                         for each (var prefix in ['single_', 'batch_']) {
573                                 var node = document.getElementById(prefix + m);
574                                 var loop = true;
575                                 if ('menulist' == node.nodeName) {
576                                         node = node.getElementsByTagName('menupopup')[0]
577                                                 .getElementsByTagName('menuitem');
578                                 } else if ('radiogroup' == node.nodeName) {
579                                         node = node.getElementsByTagName('radio');
580                                 } else if ('checkbox' == node.nodeName) {
581                                         var checked_value = -1 == node.id.indexOf('hidden') ? 1 : 2;
582                                         node.label = node.label.replace(def, '');
583                                         if (checked_value == map[m]) {
584                                                 node.label += def;
585                                                 loop = false;
586                                         }
587                                 }
588                                 if (loop) {
589                                         var ii = node.length;
590                                         for (var i = 0; i < ii; ++i) {
591                                                 node[i].label = node[i].label.replace(def, '');
592                                                 if (parseInt(node[i].value) == map[m]) {
593                                                         node[i].label += def;
594                                                 }
595                                         }
596                                 }
597                         }
598                 }
599
600                 // Go through photos and turn null/NaN into these defaults
601                 //   Null/NaN shows up on photos added before a user was logged in
602                 var ii = photos.list.length;
603                 for (var i = 0; i < ii; ++i) {
604                         var p = photos.list[i];
605                         if (null != p) {
606                                 for (var m in map) {
607                                         if (isNaN(p[m]) || null == p[m]) {
608                                                 p[m] = map[m];
609                                         }
610                                 }
611                         }
612                 }
613
614         },
615
616         // Only show sets to logged-in users
617         login: function() {
618                 document.getElementById('hide_single_sets').style.display = '-moz-box';
619                 document.getElementById('hide_batch_sets').style.display = '-moz-box';
620                 document.getElementById('hide_single_explain').style.display = 'none';
621                 document.getElementById('hide_batch_explain').style.display = 'none';
622         },
623         logout: function() {
624                 document.getElementById('hide_single_sets').style.display = 'none';
625                 document.getElementById('hide_batch_sets').style.display = 'none';
626                 document.getElementById('hide_single_explain').style.display = '-moz-box';
627                 document.getElementById('hide_batch_explain').style.display = '-moz-box';
628         },
629
630         // Enforce the no-restricted-videos policy
631         restricted: function(value) {
632                 if (3 == parseInt(value)) {
633
634                         // Tally up photos and videos
635                         var p_count = 0;
636                         var v_count = 0;
637                         for each (var id in photos.selected) {
638                                 var p = photos.list[id];
639                                 if (null == p) {
640                                         continue;
641                                 }
642                                 if (photos.is_photo(p.path)) {
643                                         ++p_count;
644                                 } else if (photos.is_video(p.path)) {
645                                         ++v_count;
646                                 }
647                         }
648
649                         // If there are videos then bother them
650                         if (v_count) {
651                                 var result = {};
652
653                                 // Decide the plurality string
654                                 //   Each dialog has identical strings but they're coded
655                                 //   as follows for varied pluralities:
656                                 //     XXX.sz.XXX: singular video, zero photos
657                                 //     XXX.sz.XXX: plural videos, zero photos
658                                 //     XXX.pp.XXX: singular video, plural photos
659                                 //     XXX.pp.XXX: plural videos, plural photos
660                                 //   Some strings appear in more than one place and use
661                                 //   'a' to indicate they're reused (not yet, but maybe)
662                                 var pl = (1 == v_count ? 's' : 'p') + (0 == p_count ? 'z' : 'p');
663
664                                 // Aforementioned bothering
665                                 window.openDialog(
666                                         'chrome://uploadr/content/video_restricted.xul',
667                                         'dialog_video_restricted', 'chrome,modal',
668                                         locale.getString('video.edit.restricted.' + pl + '.title'),
669                                         locale.getString('video.edit.restricted.' + pl + '.explain'),
670                                         locale.getString('video.edit.restricted.' + pl + '.action'),
671                                         locale.getString('video.edit.restricted.' + pl + '.note'),
672                                         locale.getString('video.edit.restricted.' + pl + '.guidelines'),
673                                         locale.getString('video.edit.restricted.' + pl + '.ok'),
674                                         locale.getString('video.edit.restricted.' + pl + '.cancel'),
675                                         '', result);
676
677                                 // Remove selected videos and restrict selected photos
678                                 if ('cancel' == result.result) {
679                                         var new_selected = [];
680                                         for each (var id in photos.selected) {
681                                                 if (null == photos.list[id]) { continue; }
682
683                                                 // Remove videos
684                                                 if (photos.is_video(photos.list[id].path)) {
685                                                         var li = document.getElementById('photo' + id);
686                                                         li.parentNode.removeChild(li);
687                                                         photos.batch_size -= photos.list[id].size;
688                                                         if (users.nsid && !users.is_pro &&
689                                                                 users.bandwidth &&
690                                                                 0 < users.bandwidth.remaining -
691                                                                 photos.batch_size) {
692                                                                 status.clear();
693                                                         }
694                                                         photos.list[id] = null;
695                                                         --photos.count;
696                                                 }
697
698                                                 // Restrict photos
699                                                 else {
700                                                         new_selected.push(id);
701                                                         photos.list[id].safety_level = 3;
702                                                 }
703
704                                         }
705                                         ui.bandwidth_updated();
706                                         photos.selected = new_selected;
707                                         if (photos.selected.length) {
708                                                 if (1 == photos.selected.length) {
709                                                         meta.load(photos.selected[0]);
710                                                         meta.enable();
711                                                 } else {
712                                                         meta.load();
713                                                         meta.batch();
714                                                 }
715                                         } else {
716                                                 meta.disable();
717                                                 photos._remove();
718                                         }
719
720                                         // If remove is blocked then we know photos.normalize
721                                         // will be called as it is unblocked
722                                         //   We're breaking the rules a bit here but the rules
723                                         //   are just for the UI
724                                         if (0 == _block_remove) { photos.normalize(); }
725
726                                 }
727
728                                 // Set a different safety level for videos
729                                 //   This will be applied when the selection changes,
730                                 //   just like always
731                                 else if ('ok' == result.result && result.safety_level) {
732
733                                         // Update the safety level of only the videos
734                                         for each (var id in photos.selected) {
735                                                 if (null == photos.list[id]) { continue; }
736                                                 if (photos.is_video(photos.list[id].path)) {
737                                                         photos.list[id].safety_level =
738                                                                 result.safety_level;
739                                                 } else {
740                                                         photos.list[id].safety_level = 3;
741                                                 }
742                                         }
743
744                                         // If just one video is selected adjust the safety level
745                                         if (1 == photos.selected.length) {
746                                                 document.getElementById('single_safety_level')
747                                                         .value = result.safety_level;
748                                         }
749
750                                         // If multiple photos are selected, indicate the safety
751                                         // level inconsistency in the display
752                                         else {
753                                                 var safety_level = document.getElementById(
754                                                         'batch_safety_level');
755                                                 safety_level.value = 0;
756                                                 safety_level.selectedItem.label =
757                                                         locale.getString('video.safety_level.mixed');
758                                         }
759
760                                 }
761
762                         }
763
764                 }
765
766                 // If they select something besides restricted, clean up
767                 else {
768                         document.getElementById('batch_safety_level')
769                                 .getElementsByTagName('menupopup')[0]
770                                 .getElementsByTagName('menuitem')[0].label = '';
771                 }
772
773         }
774
775 };
Note: See TracBrowser for help on using the browser.