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

Revision 494, 24.5 kB (checked in by jdecq, 11 months ago)

prevents creation of sets with the same name

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                         var currentSets = meta.sets.map(function(x) {return (x ? x.title : "");});
459                         if (currentSets.indexOf(name) != -1) {
460                             return;
461                         }
462                         meta.sets.push({
463                                 title: name, // Sorry
464                                 description: desc,
465                                 busy: false,
466                                 add: []
467                         });
468                         ++meta.created_sets;
469                         var prefixes = ['single', 'batch'];
470                         for each (var prefix in prefixes) {
471                                 var ul = document.getElementById(prefix + '_sets_add');
472                                 if ('sets_none' == ul.firstChild.className) {
473                                         ul.removeChild(ul.firstChild);
474                                 }
475                                 var li = document.createElementNS(NS_HTML, 'li');
476                                 li.id = prefix + '_sets_add_' + (meta.sets.length - 1);
477                                 li.className = 'sets_plus';
478                                 li.style.fontWeight = 'bold';
479                                 li.appendChild(document.createTextNode(name));
480                                 ul.insertBefore(li, ul.firstChild);
481                         }
482                         var prefix = 1 == photos.selected.length ? 'single' : 'batch';
483                         meta.add_to_set({target:
484                                 document.getElementById(prefix + '_sets_add').firstChild});
485                         if (meta.created_sets == users.sets) {
486                                 document.getElementById(prefix + '_sets_create')
487                                         .style.visibility = 'hidden';
488                         }
489                 }
490         },
491
492         // Add selected photos to the selected set
493         add_to_set: function(e) {
494
495                 // Get the item that was clicked
496                 if ('li' != e.target.nodeName || 'sets_plus' != e.target.className) {
497                         return;
498                 }
499                 var li = e.target;
500                 li.className = 'sets_disabled';
501                 var set_index = parseInt(li.id.replace(/^(single|batch)_sets_add_/,
502                         ''));
503                 var title = li.firstChild.nodeValue;
504
505                 // Add each selected photo to this set
506                 var ii = photos.selected.length;
507                 for (var i = 0; i < ii; ++i) {
508                         var p = photos.list[photos.selected[i]];
509                         if (null != p && -1 == p.sets.indexOf(set_index)) {
510                                 p.sets.push(set_index);
511                         }
512                 }
513
514                 // Update the UI
515                 var prefix = 1 == photos.selected.length ? 'single' : 'batch';
516                 var ul = document.getElementById(prefix + '_sets_added');
517                 if ('sets_none' == ul.firstChild.className) {
518                         ul.removeChild(ul.firstChild);
519                 }
520                 var li = document.createElementNS(NS_HTML, 'li');
521                 li.id = prefix + '_sets_added_' + set_index;
522                 li.className = 'sets_trash';
523                 li.appendChild(document.createTextNode(title));
524                 ul.appendChild(li);
525
526         },
527
528         remove_from_set: function(e) {
529
530                 // Get the item that was clicked
531                 if ('li' != e.target.nodeName || 'sets_trash' != e.target.className) {
532                         return;
533                 }
534                 var li = e.target;
535                 var set_index = parseInt(li.id.replace(/^(single|batch)_sets_added_/,
536                         ''));
537                 var name = li.firstChild.nodeValue;
538
539                 // Remove each selected photo from this set
540                 var ii = photos.selected.length;
541                 for (var i = 0; i < ii; ++i) {
542                         var p = photos.list[photos.selected[i]];
543                         if (null == p) { continue; }
544                         var new_sets = [];
545                         var jj = p.sets.length;
546                         for (var j = 0; j < jj; ++j) {
547                                 if (set_index != p.sets[j]) {
548                                         new_sets.push(p.sets[j]);
549                                 }
550                         }
551                         p.sets = new_sets;
552                 }
553
554                 // Update the UI
555                 li.parentNode.removeChild(li);
556                 var prefix = 1 == photos.selected.length ? 'single' : 'batch';
557                 var ul = document.getElementById(prefix + '_sets_added');
558                 if (0 == ul.getElementsByTagName('li').length) {
559                         li = document.createElementNS(NS_HTML, 'li');
560                         li.className = 'sets_none';
561                         li.appendChild(document.createTextNode(
562                                 locale.getString('meta.sets.added.none')));
563                         ul.appendChild(li);
564                 }
565                 document.getElementById(prefix + '_sets_add_' + set_index)
566                         .className = 'sets_plus';
567
568         },
569
570         // Note default values in the meta panes
571         defaults: function(map) {
572
573                 // Update the UI
574                 var def = ' ' + locale.getString('meta.default');
575                 for (var m in map) {
576                         for each (var prefix in ['single_', 'batch_']) {
577                                 var node = document.getElementById(prefix + m);
578                                 var loop = true;
579                                 if ('menulist' == node.nodeName) {
580                                         node = node.getElementsByTagName('menupopup')[0]
581                                                 .getElementsByTagName('menuitem');
582                                 } else if ('radiogroup' == node.nodeName) {
583                                         node = node.getElementsByTagName('radio');
584                                 } else if ('checkbox' == node.nodeName) {
585                                         var checked_value = -1 == node.id.indexOf('hidden') ? 1 : 2;
586                                         node.label = node.label.replace(def, '');
587                                         if (checked_value == map[m]) {
588                                                 node.label += def;
589                                                 loop = false;
590                                         }
591                                 }
592                                 if (loop) {
593                                         var ii = node.length;
594                                         for (var i = 0; i < ii; ++i) {
595                                                 node[i].label = node[i].label.replace(def, '');
596                                                 if (parseInt(node[i].value) == map[m]) {
597                                                         node[i].label += def;
598                                                 }
599                                         }
600                                 }
601                         }
602                 }
603
604                 // Go through photos and turn null/NaN into these defaults
605                 //   Null/NaN shows up on photos added before a user was logged in
606                 var ii = photos.list.length;
607                 for (var i = 0; i < ii; ++i) {
608                         var p = photos.list[i];
609                         if (null != p) {
610                                 for (var m in map) {
611                                         if (isNaN(p[m]) || null == p[m]) {
612                                                 p[m] = map[m];
613                                         }
614                                 }
615                         }
616                 }
617
618         },
619
620         // Only show sets to logged-in users
621         login: function() {
622                 document.getElementById('hide_single_sets').style.display = '-moz-box';
623                 document.getElementById('hide_batch_sets').style.display = '-moz-box';
624                 document.getElementById('hide_single_explain').style.display = 'none';
625                 document.getElementById('hide_batch_explain').style.display = 'none';
626         },
627         logout: function() {
628                 document.getElementById('hide_single_sets').style.display = 'none';
629                 document.getElementById('hide_batch_sets').style.display = 'none';
630                 document.getElementById('hide_single_explain').style.display = '-moz-box';
631                 document.getElementById('hide_batch_explain').style.display = '-moz-box';
632         },
633
634         // Enforce the no-restricted-videos policy
635         restricted: function(value) {
636                 if (3 == parseInt(value)) {
637
638                         // Tally up photos and videos
639                         var p_count = 0;
640                         var v_count = 0;
641                         for each (var id in photos.selected) {
642                                 var p = photos.list[id];
643                                 if (null == p) {
644                                         continue;
645                                 }
646                                 if (photos.is_photo(p.path)) {
647                                         ++p_count;
648                                 } else if (photos.is_video(p.path)) {
649                                         ++v_count;
650                                 }
651                         }
652
653                         // If there are videos then bother them
654                         if (v_count) {
655                                 var result = {};
656
657                                 // Decide the plurality string
658                                 //   Each dialog has identical strings but they're coded
659                                 //   as follows for varied pluralities:
660                                 //     XXX.sz.XXX: singular video, zero photos
661                                 //     XXX.sz.XXX: plural videos, zero photos
662                                 //     XXX.pp.XXX: singular video, plural photos
663                                 //     XXX.pp.XXX: plural videos, plural photos
664                                 //   Some strings appear in more than one place and use
665                                 //   'a' to indicate they're reused (not yet, but maybe)
666                                 var pl = (1 == v_count ? 's' : 'p') + (0 == p_count ? 'z' : 'p');
667
668                                 // Aforementioned bothering
669                                 window.openDialog(
670                                         'chrome://uploadr/content/video_restricted.xul',
671                                         'dialog_video_restricted', 'chrome,modal',
672                                         locale.getString('video.edit.restricted.' + pl + '.title'),
673                                         locale.getString('video.edit.restricted.' + pl + '.explain'),
674                                         locale.getString('video.edit.restricted.' + pl + '.action'),
675                                         locale.getString('video.edit.restricted.' + pl + '.note'),
676                                         locale.getString('video.edit.restricted.' + pl + '.guidelines'),
677                                         locale.getString('video.edit.restricted.' + pl + '.ok'),
678                                         locale.getString('video.edit.restricted.' + pl + '.cancel'),
679                                         '', result);
680
681                                 // Remove selected videos and restrict selected photos
682                                 if ('cancel' == result.result) {
683                                         var new_selected = [];
684                                         for each (var id in photos.selected) {
685                                                 if (null == photos.list[id]) { continue; }
686
687                                                 // Remove videos
688                                                 if (photos.is_video(photos.list[id].path)) {
689                                                         var li = document.getElementById('photo' + id);
690                                                         li.parentNode.removeChild(li);
691                                                         photos.batch_size -= photos.list[id].size;
692                                                         if (users.nsid && !users.is_pro &&
693                                                                 users.bandwidth &&
694                                                                 0 < users.bandwidth.remaining -
695                                                                 photos.batch_size) {
696                                                                 status.clear();
697                                                         }
698                                                         photos.list[id] = null;
699                                                         --photos.count;
700                                                 }
701
702                                                 // Restrict photos
703                                                 else {
704                                                         new_selected.push(id);
705                                                         photos.list[id].safety_level = 3;
706                                                 }
707
708                                         }
709                                         ui.bandwidth_updated();
710                                         photos.selected = new_selected;
711                                         if (photos.selected.length) {
712                                                 if (1 == photos.selected.length) {
713                                                         meta.load(photos.selected[0]);
714                                                         meta.enable();
715                                                 } else {
716                                                         meta.load();
717                                                         meta.batch();
718                                                 }
719                                         } else {
720                                                 meta.disable();
721                                                 photos._remove();
722                                         }
723
724                                         // If remove is blocked then we know photos.normalize
725                                         // will be called as it is unblocked
726                                         //   We're breaking the rules a bit here but the rules
727                                         //   are just for the UI
728                                         if (0 == _block_remove) { photos.normalize(); }
729
730                                 }
731
732                                 // Set a different safety level for videos
733                                 //   This will be applied when the selection changes,
734                                 //   just like always
735                                 else if ('ok' == result.result && result.safety_level) {
736
737                                         // Update the safety level of only the videos
738                                         for each (var id in photos.selected) {
739                                                 if (null == photos.list[id]) { continue; }
740                                                 if (photos.is_video(photos.list[id].path)) {
741                                                         photos.list[id].safety_level =
742                                                                 result.safety_level;
743                                                 } else {
744                                                         photos.list[id].safety_level = 3;
745                                                 }
746                                         }
747
748                                         // If just one video is selected adjust the safety level
749                                         if (1 == photos.selected.length) {
750                                                 document.getElementById('single_safety_level')
751                                                         .value = result.safety_level;
752                                         }
753
754                                         // If multiple photos are selected, indicate the safety
755                                         // level inconsistency in the display
756                                         else {
757                                                 var safety_level = document.getElementById(
758                                                         'batch_safety_level');
759                                                 safety_level.value = 0;
760                                                 safety_level.selectedItem.label =
761                                                         locale.getString('video.safety_level.mixed');
762                                         }
763
764                                 }
765
766                         }
767
768                 }
769
770                 // If they select something besides restricted, clean up
771                 else {
772                         document.getElementById('batch_safety_level')
773                                 .getElementsByTagName('menupopup')[0]
774                                 .getElementsByTagName('menuitem')[0].label = '';
775                 }
776
777         }
778
779 };
Note: See TracBrowser for help on using the browser.