From 8561de6e2e7ad39a83686fc1ff8ef694d76393d4 Mon Sep 17 00:00:00 2001
From: SheetJS <dev@sheetjs.com>
Date: Fri, 22 Nov 2013 14:58:11 -0800
Subject: [PATCH] added web workers

---
 index.html    | 25 +++++++++++++++++++++----
 xlsxworker.js | 11 +++++++++++
 2 files changed, 32 insertions(+), 4 deletions(-)
 create mode 100644 xlsxworker.js

diff --git a/index.html b/index.html
index 74e7de3..aeba2da 100644
--- a/index.html
+++ b/index.html
@@ -32,6 +32,19 @@
 <script src="jszip.js"></script>
 <script src="xlsx.js"></script>
 <script>
+function xlsxworker(data, cb) {
+	var worker = new Worker('./xlsxworker.js');
+	worker.onmessage = function(e) {
+		switch(e.data.t) {
+			case 'ready': break;
+			case 'e': console.error(e.data.d);
+			case 'xlsx': cb(JSON.parse(e.data.d)); break;
+		}
+	};
+    var arr = btoa(String.fromCharCode.apply(null, new Uint8Array(data)));
+	worker.postMessage(arr);
+}
+
 function get_radio_value( radioName ) {
 	var radios = document.getElementsByName( radioName );
 	for( var i = 0; i < radios.length; i++ ) {
@@ -111,10 +124,14 @@ function handleDrop(e) {
 		var name = f.name;
 		reader.onload = function(e) {
 			var data = e.target.result;
-			//var wb = XLSX.read(data, {type: 'binary'});
-			var arr = String.fromCharCode.apply(null, new Uint8Array(data));
-			var wb = XLSX.read(btoa(arr), {type: 'base64'});
-			process_wb(wb);
+			if(typeof Worker !== 'undefined') {
+				xlsxworker(data, process_wb);
+			} else {
+				//var wb = XLSX.read(data, {type: 'binary'});
+				var arr = String.fromCharCode.apply(null, new Uint8Array(data));
+				var wb = XLSX.read(btoa(arr), {type: 'base64'});
+				process_wb(wb);
+			}
 		};
 		//reader.readAsBinaryString(f);
 		reader.readAsArrayBuffer(f);
diff --git a/xlsxworker.js b/xlsxworker.js
new file mode 100644
index 0000000..c58d05c
--- /dev/null
+++ b/xlsxworker.js
@@ -0,0 +1,11 @@
+importScripts('jszip.js');
+importScripts('xlsx.js');
+postMessage({t:"ready"});
+
+onmessage = function (oEvent) {
+  var v;
+  try {
+    v = XLSX.read(oEvent.data, {type: 'base64'});
+  } catch(e) { postMessage({t:"e",d:e.stack}); }
+  postMessage({t:"xlsx", d:JSON.stringify(v)});
+};