Index: /issm/trunk-jpl/src/m/solve/solve.js
===================================================================
--- /issm/trunk-jpl/src/m/solve/solve.js	(revision 22823)
+++ /issm/trunk-jpl/src/m/solve/solve.js	(revision 22824)
@@ -124,21 +124,49 @@
 	toolkitsstring= md.toolkits.ToolkitsFile(md.miscellaneous.name + '.toolkits'); // toolkits file
 
-	//callback function: 
-	function callbackfunction(){solving=false;}; //default, do nothing if no callback function requested.
-	if (options.getfieldvalue('callbackfunction',false)){
-		callbackfunction=options.getfieldvalue('callbackfunction');
-	}
-	
-	//callback error function: 
-	function callbackerrorfunction(){solving=false;}; //default, do nothing if no callback function requested.
-	if (options.getfieldvalue('callbackerrorfunction',false)){
-		callbackerrorfunction=options.getfieldvalue('callbackerrorfunction');
-	}
-	
-	//callback id: 
-	var callbackid = '.run-button'; //default, update .run-button elements with progress updates.
-	if (options.getfieldvalue('callbackid',false)){
-		callbackid=options.getfieldvalue('callbackid');
-	}
+
+	/*
+		Set success callback function
+	*/
+	//{{{
+	
+	// Default: do nothing if no success callback function requested
+	function successCallback() {
+		solving = false;
+	}; 
+	
+	if (options.getfieldvalue('successCallback',false)){
+		successCallback = options.getfieldvalue('successCallback');
+	}
+	//}}}
+	
+	
+	/*
+		Set error callback function
+	*/
+	//{{{
+	
+	// Default: do nothing if no error callback function requested
+	function errorCallback() {
+		solving = false;
+	}; 
+	
+	if (options.getfieldvalue('errorCallback',false)){
+		errorCallback = options.getfieldvalue('errorCallback');
+	}
+	//}}}
+	
+	
+	/*
+		Set solve button ID
+	*/
+	//{{{
+	
+	// Default: update #solve-button element with progress updates
+	var solveButtonId = '#solve-button';
+	
+	if (options.getfieldvalue('solveButtonId', false)){
+		solveButtonId = options.getfieldvalue('solveButtonId');
+	}
+	//}}}
 
 	if (cluster.classname() == 'local'){  //{{{
@@ -156,6 +184,6 @@
 		md = loadresultsfrombuffer(md,outputbuffer,outputbuffersize); 
 		
-		//Call back? 
-		callbackfunction();
+		// Call success callback 
+		successCallback();
 
 		return md;
@@ -166,5 +194,5 @@
 		/*We are running somewhere else on a computational server. Send the buffer to that server and retrieve output: */
 		console.log('running issm remotely');
-		cluster.UploadAndRun(md,callbackfunction,callbackerrorfunction,callbackid,fid,toolkitsstring,solutionstring,md.miscellaneous.name,md.priv.runtimename);
+		cluster.UploadAndRun(md,successCallback,errorCallback,solveButtonId,fid,toolkitsstring,solutionstring,md.miscellaneous.name,md.priv.runtimename);
 
 		return md;
