text: /* jshint browser:true */
  /* eslint-env browser */
  /* eslint no-use-before-define:0 */
  /* global Uint8Array, Uint16Array, ArrayBuffer */
  /* global XLSX */
  
  var X = XLSX;
  var XW = {
      /* worker message */
      msg: 'xlsx',
      /* worker scripts */
      worker: 'Excel/xlsxworker.js'
  };
  
  var global_wb;
  
  var process_wb = (function () {
      var OUT = document.getElementById('out');
      var HTMLOUT = document.getElementById('htmlout');
  
      var get_format = (function () {
          var radios = document.getElementsByName("format");
          return function () {
              for (var i = 0; i < radios.length; ++i) if (radios[i].checked || radios.length === 1) return radios[i].value;
          };
      })();
  
      var to_json = function to_json(workbook) {
          var result = {};
          workbook.SheetNames.forEach(function (sheetName) {
              var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName], { header: 1 });
              if (roa.length) result[sheetName] = roa;
          });
          return JSON.stringify(result, 2, 2);
      };
  
      var to_csv = function to_csv(workbook) {
          var result = [];
          workbook.SheetNames.forEach(function (sheetName) {
              var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]);
              if (csv.length) {
                  result.push("SHEET: " + sheetName);
                  result.push("");
                  result.push(csv);
              }
          });
          return result.join("\n");
      };
  
      var to_fmla = function to_fmla(workbook) {
          var result = [];
          workbook.SheetNames.forEach(function (sheetName) {
              var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]);
              if (formulae.length) {
                  result.push("SHEET: " + sheetName);
                  result.push("");
                  result.push(formulae.join("\n"));
              }
          });
          return result.join("\n");
      };
  
      var to_html = function to_html(workbook) {
          HTMLOUT.innerHTML = "";
          workbook.SheetNames.forEach(function (sheetName) {
              var htmlstr = X.write(workbook, { sheet: sheetName, type: 'string', bookType: 'html' });
              HTMLOUT.innerHTML += htmlstr;
          });
          return "";
      };
  
      return function process_wb(wb) {
          global_wb = wb;
          var output = "";
          switch (get_format()) {
              case "form": output = to_fmla(wb); break;
              case "html": output = to_html(wb); break;
              case "json": output = to_json(wb); break;
              default: output = to_csv(wb);
          }
          if (OUT.innerText === undefined) OUT.textContent = output;
          else OUT.innerText = output;
          if (typeof console !== 'undefined') console.log("output", new Date());
      };
  })();
  
  var setfmt = window.setfmt = function setfmt() { if (global_wb) process_wb(global_wb); };
  
  var b64it = window.b64it = (function () {
      var tarea = document.getElementById('b64data');
      return function b64it() {
          if (typeof console !== 'undefined') console.log("onload", new Date());
          var wb = X.read(tarea.value, { type: 'base64', WTF: false });
          process_wb(wb);
      };
  })();
  
  var do_file = (function () {
      var rABS = typeof FileReader !== "undefined" && (FileReader.prototype || {}).readAsBinaryString;
      var domrabs = document.getElementsByName("userabs")[0];
      if (!rABS) domrabs.disabled = !(domrabs.checked = false);
  
      var use_worker = typeof Worker !== 'undefined';
      var domwork = document.getElementsByName("useworker")[0];
      if (!use_worker) domwork.disabled = !(domwork.checked = false);
  
      var xw = function xw(data, cb) {
          var worker = new Worker(XW.worker);
          worker.onmessage = function (e) {
              switch (e.data.t) {
                  case 'ready': break;
                  case 'e': console.error(e.data.d); break;
                  case XW.msg: cb(JSON.parse(e.data.d)); break;
              }
          };
          worker.postMessage({ d: data, b: rABS ? 'binary' : 'array' });
      };
  
      return function do_file(files) {
          rABS = domrabs.checked;
          use_worker = domwork.checked;
          var f = files[0];
          var reader = new FileReader();
          reader.onload = function (e) {
              if (typeof console !== 'undefined') console.log("onload", new Date(), rABS, use_worker);
              var data = e.target.result;
              if (!rABS) data = new Uint8Array(data);
              if (use_worker) xw(data, process_wb);
              else process_wb(X.read(data, { type: rABS ? 'binary' : 'array' }));
          };
          if (rABS) reader.readAsBinaryString(f);
          else reader.readAsArrayBuffer(f);
      };
  })();
  
  (function () {
      var drop = document.getElementById('drop');
      if (!drop.addEventListener) return;
  
      function handleDrop(e) {
          e.stopPropagation();
          e.preventDefault();
          do_file(e.dataTransfer.files);
      }
  
      function handleDragover(e) {
          e.stopPropagation();
          e.preventDefault();
          e.dataTransfer.dropEffect = 'copy';
      }
  
      drop.addEventListener('dragenter', handleDragover, false);
      drop.addEventListener('dragover', handleDragover, false);
      drop.addEventListener('drop', handleDrop, false);
  })();
  
  (function () {
      var xlf = document.getElementById('xlf');
  
      if (!xlf.addEventListener)
          return;
  
      function handleFile(e) {
          do_file(e.target.files);
      }
  
      xlf.addEventListener('change', handleFile, false);
  
  })();
  
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-36810333-1']);
  _gaq.push(['_trackPageview']);
  
  // (function () {
  //     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  //     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  //     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  // })();