// Copyright 2013 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.


/**
 * @fileoverview Rendering for iframed most visited thumbnails.
 */

window.addEventListener('DOMContentLoaded', function() {
  'use strict';

  fillMostVisited(document.location, function(params, data) {
    function logEvent(eventName) {
      chrome.embeddedSearch.newTabPage.logEvent(eventName);
    }
    function logMostVisitedImpression(tileIndex, provider) {
      chrome.embeddedSearch.newTabPage.logMostVisitedImpression(
          tileIndex, provider);
    }
    function displayLink(link) {
      document.body.appendChild(link);
      window.parent.postMessage('linkDisplayed', '{{ORIGIN}}');
    }
    function showDomainElement() {
      var link = createMostVisitedLink(
          params, data.url, data.title, undefined, data.direction,
          data.provider);
      var domain = document.createElement('div');
      domain.textContent = data.domain;
      link.appendChild(domain);
      displayLink(link);
    }
    // Called on intentionally empty tiles for which the visuals are handled
    // externally by the page itself.
    function showEmptyTile() {
      displayLink(createMostVisitedLink(
          params, data.url, data.title, undefined, data.direction,
          data.provider));
    }
    // Creates and adds an image.
    function createThumbnail(src) {
      var image = document.createElement('img');
      image.onload = function() {
        var link = createMostVisitedLink(
            params, data.url, data.title, undefined, data.direction,
            data.provider);
        link.appendChild(image);
        displayLink(link);
      };
      image.onerror = function() {
        // If no external thumbnail fallback (etfb), and have domain.
        if (!params.etfb && data.domain) {
          showDomainElement();
          logEvent(NTP_LOGGING_EVENT_TYPE.NTP_GRAY_TILE_FALLBACK);
        } else {
          showEmptyTile();
          logEvent(NTP_LOGGING_EVENT_TYPE.NTP_EXTERNAL_TILE_FALLBACK);
        }
        logEvent(NTP_LOGGING_EVENT_TYPE.NTP_THUMBNAIL_ERROR);
      };
      image.src = src;
    }

    if (data.thumbnailUrl) {
      createThumbnail(data.thumbnailUrl);
      logEvent(NTP_LOGGING_EVENT_TYPE.NTP_THUMBNAIL_TILE);
    } else if (data.domain) {
      showDomainElement();
      logEvent(NTP_LOGGING_EVENT_TYPE.NTP_GRAY_TILE);
    } else {
      showEmptyTile();
      logEvent(NTP_LOGGING_EVENT_TYPE.NTP_EXTERNAL_TILE);
    }
    logEvent(NTP_LOGGING_EVENT_TYPE.NTP_TILE);

    // Log an impression if we know the position of the tile.
    if (isFinite(params.pos) && data.provider) {
      logMostVisitedImpression(parseInt(params.pos, 10), data.provider);
    }
  });
});
