15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Quick template rendering function.  For each cell passed to it, check
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to see if the cell's text content is a key in the supplied data array.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If yes, replace the cell's contents with the corresponding value and
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * unhide the cell.  If no, then remove the cell's parent (tr) from the
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DOM.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function renderCells(cells, data) {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < cells.length; i++) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cell = cells[i];
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var key = cell.innerText;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (data[key]) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cell.innerText = data[key];
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cell.parentElement.className = "rendered";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cell.parentElement.parentElement.removeChild(cell.parentElement);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns true if the supplies object has no properties.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function isEmpty(obj) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var key in obj) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (obj.hasOwnProperty(key)) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resizes the window to the current dimensions of this page's body.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function resizeWindow() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window.setTimeout(function() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.tabs.getCurrent(function (tab) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var newHeight = Math.min(document.body.offsetHeight + 140, 700);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.windows.update(tab.windowId, {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        height: newHeight,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        width: 520
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, 150);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called directly by the background page with information about the
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * image.  Outputs image data to the DOM.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function renderImageInfo(imageinfo) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  console.log('imageinfo', imageinfo);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var divloader = document.querySelector('#loader');
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var divoutput = document.querySelector('#output');
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  divloader.style.display = "none";
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  divoutput.style.display = "block";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var divinfo = document.querySelector('#info');
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var divexif = document.querySelector('#exif');
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Render general image data.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var datacells = divinfo.querySelectorAll('td');
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderCells(datacells, imageinfo);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If EXIF data exists, unhide the EXIF table and render.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (imageinfo['exif'] && !isEmpty(imageinfo['exif'])) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    divexif.style.display = 'block';
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var exifcells = divexif.querySelectorAll('td');
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    renderCells(exifcells, imageinfo['exif']);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Renders the URL for the image, trimming if the length is too long.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function renderUrl(url) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var divurl = document.querySelector('#url');
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var urltext = (url.length < 45) ? url : url.substr(0, 42) + '...';
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var anchor = document.createElement('a');
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  anchor.href = url;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  anchor.innerText = urltext;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  divurl.appendChild(anchor);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Renders a thumbnail view of the image.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function renderThumbnail(url) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var canvas = document.querySelector('#thumbnail');
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var context = canvas.getContext('2d');
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas.width = 100;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas.height = 100;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var image = new Image();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image.addEventListener('load', function() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var src_w = image.width;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var src_h = image.height;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var new_w = canvas.width;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var new_h = canvas.height;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var ratio = src_w / src_h;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (src_w > src_h) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_h /= ratio;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_w *= ratio;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas.width = new_w;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas.height = new_h;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.drawImage(image, 0, 0, src_w, src_h, 0, 0, new_w, new_h);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image.src = url;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a function which will handle displaying information about the
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * image once the ImageInfo class has finished loading.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getImageInfoHandler(url) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return function() {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    renderUrl(url);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    renderThumbnail(url);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var imageinfo = ImageInfo.getAllFields(url);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    renderImageInfo(imageinfo);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resizeWindow();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load the image in question and display it, along with its metadata.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener("DOMContentLoaded", function () {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL of the image to load is passed on the URL fragment.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var imageUrl = window.location.hash.substring(1);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (imageUrl) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use the ImageInfo library to load the image and parse it.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImageInfo.loadInfo(imageUrl, getImageInfoHandler(imageUrl));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
146