// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

function highlightIfChanged(node, oldVal, newVal) {
  function clearHighlight() {
    this.removeAttribute('highlighted');
  }

  var oldStr = oldVal.toString();
  var newStr = newVal.toString();
  if (oldStr != '' && oldStr != newStr) {
    // Note the addListener function does not end up creating duplicate
    // listeners.  There can be only one listener per event at a time.
    // Reference: https://developer.mozilla.org/en/DOM/element.addEventListener
    node.addEventListener('webkitAnimationEnd', clearHighlight, false);
    node.setAttribute('highlighted', '');
  }
}

(function() {
// Contains the latest snapshot of sync about info.
chrome.sync.aboutInfo = {};

// TODO(akalin): Make aboutInfo have key names likeThis and not
// like_this.
function refreshAboutInfo(aboutInfo) {
  chrome.sync.aboutInfo = aboutInfo;
  var aboutInfoDiv = $('aboutInfo');
  jstProcess(new JsEvalContext(aboutInfo), aboutInfoDiv);
}

function onLoad() {
  $('status-data').hidden = true;
  chrome.sync.getAboutInfo(refreshAboutInfo);

  chrome.sync.onServiceStateChanged.addListener(function() {
    chrome.sync.getAboutInfo(refreshAboutInfo);
  });

  var dumpStatusButton = $('dump-status');
  dumpStatusButton.addEventListener('click', function(event) {
    var aboutInfo = chrome.sync.aboutInfo;
    if (!$('include-ids').checked) {
      aboutInfo.details = chrome.sync.aboutInfo.details.filter(function(el) {
        return !el.is_sensitive;
      });
    }
    var data = '';
    data += new Date().toString() + '\n';
    data += '======\n';
    data += 'Status\n';
    data += '======\n';
    data += JSON.stringify(aboutInfo, null, 2) + '\n';

    $('status-text').value = data;
    $('status-data').hidden = false;
  });

  var importStatusButton = $('import-status');
  importStatusButton.addEventListener('click', function(event) {
    $('status-data').hidden = false;
    if ($('status-text').value.length == 0) {
      $('status-text').value = 'Paste sync status dump here then click import.';
      return;
    }

    // First remove any characters before the '{'.
    var data = $('status-text').value;
    var firstBrace = data.indexOf('{');
    if (firstBrace < 0) {
      $('status-text').value = 'Invalid sync status dump.';
      return;
    }
    data = data.substr(firstBrace);

    // Remove listeners to prevent sync events from overwriting imported data.
    chrome.sync.onServiceStateChanged.removeListeners();

    var aboutInfo = JSON.parse(data);
    refreshAboutInfo(aboutInfo);
  });
}

document.addEventListener('DOMContentLoaded', onLoad, false);
})();
