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

function attachListeners() {
  var radioEls = document.querySelectorAll('input[type="radio"]');
  for (var i = 0; i < radioEls.length; ++i) {
    radioEls[i].addEventListener('click', onRadioClicked);
  }

  // Wire up the 'click' event for each function's button.
  var functionEls = document.querySelectorAll('.function');
  for (var i = 0; i < functionEls.length; ++i) {
    var functionEl = functionEls[i];
    var id = functionEl.getAttribute('id');
    var buttonEl = functionEl.querySelector('button');

    // The function name matches the element id.
    var func = window[id + 'ButtonClicked'];
    buttonEl.addEventListener('click', func);
  }
}

function onRadioClicked(e) {
  var divId = this.id.slice(5);  // skip "radio"
  var functionEls = document.querySelectorAll('.function');
  for (var i = 0; i < functionEls.length; ++i) {
    var visible = functionEls[i].id === divId;
    if (functionEls[i].id === divId)
      functionEls[i].removeAttribute('hidden');
    else
      functionEls[i].setAttribute('hidden');
  }
}

function getButtonClicked(e) {
  var key = document.getElementById('getKey').value;
  common.naclModule.postMessage({cmd: 'Get', key: key});
}

function setButtonClicked(e) {
  var key = document.getElementById('setKey').value;
  var valueString = document.getElementById('setValue').value;
  var value;
  try {
    value = JSON.parse(valueString);
  } catch (e) {
    common.logMessage('Error parsing value: ' + e);
    return;
  }

  common.naclModule.postMessage({cmd: 'Set', key: key, value: value});
}

function deleteButtonClicked(e) {
  var key = document.getElementById('deleteKey').value;
  common.naclModule.postMessage({cmd: 'Delete', key: key});
}

function getkeysButtonClicked(e) {
  common.naclModule.postMessage({cmd: 'GetKeys'});
}

function haskeyButtonClicked(e) {
  var key = document.getElementById('haskeyKey').value;
  common.naclModule.postMessage({cmd: 'HasKey', key: key});
}

// Called by the common.js module.
function handleMessage(message_event) {
  var msg = message_event.data;

  var cmd = msg.cmd;
  var result = msg.result;
  var newDict = msg.dict;

  // cmd will be empty when the module first loads and sends the contents of
  // its dictionary.
  //
  // Note that cmd is a String object, not a primitive, so the comparison cmd
  // !== '' will always fail.
  if (cmd != '') {
    common.logMessage(
        'Function ' + cmd + ' returned ' + JSON.stringify(result));
  }

  var dictEl = document.getElementById('dict');
  dictEl.textContent = JSON.stringify(newDict, null, '  ');
}
