| // Copyright 2014 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. | 
 |  | 
 | /** | 
 |  * Debug information about an active copresence directive. | 
 |  * @typedef {{ | 
 |  *   type: string, | 
 |  *   medium: string, | 
 |  *   duration: string | 
 |  * }} | 
 |  */ | 
 | var Directive; | 
 |  | 
 | /** | 
 |  * Debug information about a recent copresence token. | 
 |  * @typedef {{ | 
 |  *   id: string, | 
 |  *   statuses: string, | 
 |  *   medium: string, | 
 |  *   time: string | 
 |  * }} | 
 |  */ | 
 | var Token; | 
 |  | 
 | /** | 
 |  * Callback to refresh the list of directives. | 
 |  * @param {Array<Directive>} directives | 
 |  */ | 
 | function refreshDirectives(directives) { | 
 |   var table = $('directives-table').tBodies[0]; | 
 |  | 
 |   // Fix the directives table to have the correct number of rows. | 
 |   while (table.rows.length < directives.length) | 
 |     table.insertRow(); | 
 |   while (table.rows.length > directives.length) | 
 |     table.deleteRow(); | 
 |  | 
 |   // Populate the directives into the table. | 
 |   directives.forEach(function(directive, index) { | 
 |     var row = table.rows.item(index); | 
 |     while (row.cells.length < 3) | 
 |       row.insertCell(); | 
 |  | 
 |     row.cells.item(0).textContent = directive.type; | 
 |     row.cells.item(1).textContent = directive.medium; | 
 |     row.cells.item(2).textContent = directive.duration; | 
 |   }); | 
 | } | 
 |  | 
 | /** | 
 |  * Callback to add or update transmitted tokens. | 
 |  * @param {Token} token | 
 |  */ | 
 | function updateTransmittedToken(token) { | 
 |   updateTokenTable($('transmitted-tokens-table'), token); | 
 | } | 
 |  | 
 | /** | 
 |  * Callback to add or update received tokens. | 
 |  * @param {Token} token | 
 |  */ | 
 | function updateReceivedToken(token) { | 
 |   updateTokenTable($('received-tokens-table'), token); | 
 | } | 
 |  | 
 | /** | 
 |  * Callback to clear out the token tables. | 
 |  */ | 
 | function clearTokens() { | 
 |   clearTable($('transmitted-tokens-table')); | 
 |   clearTable($('received-tokens-table')); | 
 | } | 
 |  | 
 | /** | 
 |  * Add or update a token in the specified table. | 
 |  * @param {HTMLTableElement} table | 
 |  * @param {Token} token | 
 |  */ | 
 | function updateTokenTable(table, token) { | 
 |   var rows = table.tBodies[0].rows; | 
 |  | 
 |   var index; | 
 |   for (index = 0; index < rows.length; index++) { | 
 |     var row = rows.item(index); | 
 |     if (row.cells[0].textContent == token.id) { | 
 |       updateTokenRow(row, token); | 
 |       break; | 
 |     } | 
 |   } | 
 |  | 
 |   if (index == rows.length) | 
 |     updateTokenRow(table.tBodies[0].insertRow(), token); | 
 | } | 
 |  | 
 | /** | 
 |  * Update a token on the specified row. | 
 |  * @param {HTMLTableRowElement} row | 
 |  * @param {Token} token | 
 |  */ | 
 | function updateTokenRow(row, token) { | 
 |   while (row.cells.length < 4) | 
 |     row.insertCell(); | 
 |   row.className = token.statuses; | 
 |  | 
 |   row.cells[0].textContent = token.id; | 
 |   row.cells[1].textContent = | 
 |       token.statuses.replace('confirmed', '(Confirmed)'); | 
 |   row.cells[2].textContent = token.medium; | 
 |   row.cells[3].textContent = token.time; | 
 | } | 
 |  | 
 | /** | 
 |  * Delete all the rows in a table. | 
 |  * @param {HTMLTableElement} table | 
 |  */ | 
 | function clearTable(table) { | 
 |   var body = table.tBodies[0]; | 
 |   while (body.rows.length > 0) | 
 |     body.deleteRow(); | 
 | } | 
 |  | 
 | document.addEventListener('DOMContentLoaded', function() { | 
 |   chrome.send('populateCopresenceState'); | 
 |  | 
 |   $('reset-button').addEventListener('click', function() { | 
 |     if (confirm(loadTimeData.getString('confirm_delete'))) | 
 |       chrome.send('clearCopresenceState'); | 
 |   }); | 
 | }); |