// Copyright (c) 2010 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.

/**
 * This view displays information on the host resolver:
 *
 *   - Shows the default address family.
 *   - Has a button to enable IPv6, if it is disabled.
 *   - Shows the current host cache contents.
 *   - Has a button to clear the host cache.
 *   - Shows the parameters used to construct the host cache (capacity, ttl).
 *
 *  @constructor
 */
function DnsView(mainBoxId,
                 cacheTbodyId,
                 clearCacheButtonId,
                 defaultFamilySpanId,
                 ipv6DisabledSpanId,
                 enableIPv6ButtonId,
                 capacitySpanId,
                 ttlSuccessSpanId,
                 ttlFailureSpanId) {
  DivView.call(this, mainBoxId);

  // Hook up the UI components.
  this.cacheTbody_ = document.getElementById(cacheTbodyId);
  this.defaultFamilySpan_ = document.getElementById(defaultFamilySpanId);
  this.ipv6DisabledSpan_ = document.getElementById(ipv6DisabledSpanId);

  document.getElementById(enableIPv6ButtonId).onclick =
      g_browser.enableIPv6.bind(g_browser);

  this.capacitySpan_ = document.getElementById(capacitySpanId);
  this.ttlSuccessSpan_ = document.getElementById(ttlSuccessSpanId);
  this.ttlFailureSpan_ = document.getElementById(ttlFailureSpanId);

  var clearCacheButton = document.getElementById(clearCacheButtonId);
  clearCacheButton.onclick =
      g_browser.sendClearHostResolverCache.bind(g_browser);

  // Register to receive changes to the host resolver info.
  g_browser.addHostResolverInfoObserver(this);
}

inherits(DnsView, DivView);

DnsView.prototype.onHostResolverInfoChanged = function(hostResolverInfo) {
  // Clear the existing values.
  this.defaultFamilySpan_.innerHTML = '';
  this.capacitySpan_.innerHTML = '';
  this.ttlSuccessSpan_.innerHTML = '';
  this.ttlFailureSpan_.innerHTML = '';
  this.cacheTbody_.innerHTML = '';

  // No info.
  if (!hostResolverInfo)
    return;

  var family = hostResolverInfo.default_address_family;
  addTextNode(this.defaultFamilySpan_, getKeyWithValue(AddressFamily, family));

  var ipv6Disabled = (family == AddressFamily.ADDRESS_FAMILY_IPV4);
  setNodeDisplay(this.ipv6DisabledSpan_, ipv6Disabled);

  // Fill in the basic cache information.
  var hostResolverCache = hostResolverInfo.cache;
  addTextNode(this.capacitySpan_, hostResolverCache.capacity);
  addTextNode(this.ttlSuccessSpan_, hostResolverCache.ttl_success_ms);
  addTextNode(this.ttlFailureSpan_, hostResolverCache.ttl_failure_ms);

  // Fill in the cache contents table.
  for (var i = 0; i < hostResolverCache.entries.length; ++i) {
    var e = hostResolverCache.entries[i];
    var tr = addNode(this.cacheTbody_, 'tr');

    var hostnameCell = addNode(tr, 'td');
    addTextNode(hostnameCell, e.hostname);

    var familyCell = addNode(tr, 'td');
    addTextNode(familyCell, getKeyWithValue(AddressFamily, e.address_family));

    var addressesCell = addNode(tr, 'td');

    if (e.error != undefined) {
      addTextNode(addressesCell, 'error: ' + e.error);
    } else {
      for (var j = 0; j < e.addresses.length; ++j) {
        var address = e.addresses[j];
        if (j != 0)
          addNode(addressesCell, 'br');
        addTextNode(addressesCell, address);
      }
    }

    var expiresDate = g_browser.convertTimeTicksToDate(e.expiration);
    var expiresCell = addNode(tr, 'td');
    addTextNode(expiresCell, expiresDate.toLocaleString());
  }
};