Index: /issm/trunk-jpl/src/m/classes/clusters/generic.js
===================================================================
--- /issm/trunk-jpl/src/m/classes/clusters/generic.js	(revision 20587)
+++ /issm/trunk-jpl/src/m/classes/clusters/generic.js	(revision 20588)
@@ -49,10 +49,34 @@
 		var oReq = new XMLHttpRequest();
 		oReq.open("POST", this.url, true);
-		oReq.responseType = 'arraybuffer';
-
+		oReq.responseType = 'application/octet-stream';
+		oReq.position = 0
+	
+		//TODO: dynamic progress update with package lengths and parsing
+		oReq.onprogress = function (oEvent) {
+			var newResponse = oReq.responseText;
+			if (newResponse.length == 13) { //"Starting" length as encoded in base64 length
+				$(".run-button").html("COMPUTING...").prop("disabled", true);
+				console.log("base64 repsonse: " + newResponse + " string response: " + window.atob(oReq.responseText));
+			}
+		};
+		
 		oReq.onload = function (oEvent) {
-			var returnBuffer = new Uint8Array(oReq.response.slice());
+			//get context to this.str2ab to avoid duplciation
+			function str2ab(str) {
+				var buf = new Uint8Array(str.length);
+				for (var i=0, strLen=str.length; i < strLen; i++) {
+					buf[i] = str.charCodeAt(i);
+				}
+				return buf;
+			} //}}}
+			var buffer2 = str2ab(window.atob(oReq.responseText.slice(13)));			
+			var returnBuffer = new Uint8Array(buffer2);
 			var returnBuffer_size=returnBuffer.byteLength;
-			md.results= parseresultsfrombuffer(returnBuffer,returnBuffer_size);
+			try {
+				md.results= parseresultsfrombuffer(returnBuffer,returnBuffer_size);
+			}
+			catch (e) {
+				console.log(e);
+			}
 			callbackfunction();
 		};
