| 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 |
}; |
|---|