Index: gp-includes/assets-loader.php
===================================================================
--- gp-includes/assets-loader.php	(revision 528)
+++ gp-includes/assets-loader.php	(working copy)
@@ -25,7 +25,7 @@
 	$scripts->add( 'jquery-ui-selectable', null, array('jquery-ui'), '1.8' );
 	$scripts->add( 'jquery-ui-tabs', null, array('jquery-ui'), '1.8' );
 	$scripts->add( 'common', '/common.js', array( 'jquery' ), '20100423' );
-	$scripts->add( 'editor', '/editor.js', array( 'common', 'google-js-api' ), '20100614' );
+	$scripts->add( 'editor', '/editor.js', array( 'common', 'google-js-api' ), '20100713' );
 	$scripts->add( 'translations-page', '/translations-page.js', array( 'common' ), '20100423' );
 	$scripts->add( 'mass-create-sets-page', '/mass-create-sets-page.js', array( 'common' ), '20100423' );
 	$scripts->add( 'google-js-api', 'http://www.google.com/jsapi', array(), '' );
Index: js/editor.js
===================================================================
--- js/editor.js	(revision 528)
+++ js/editor.js	(working copy)
@@ -26,6 +26,15 @@
 		$('tr:first', $gp.editor.table).hide();
 		$('textarea:first', editor).focus();
 	},
+	prev: function() {
+		if (!$gp.editor.current) return;
+		//TODO: go to previous page if needed
+		var prev = $gp.editor.current.prevAll('tr.editor');
+		if (prev.length)
+			$gp.editor.show(next.filter(':last'));
+		else
+			$gp.editor.hide();
+	},
 	next: function() {
 		if (!$gp.editor.current) return;
 		//TODO: go to next page if needed
@@ -52,7 +61,25 @@
 		$('button.ok', 'tr.editor').live('click', $gp.editor.hooks.ok);
 		$('tr.preview', $gp.editor.table).live('dblclick', $gp.editor.hooks.show);
 		$('select.priority', $gp.editor.table).live('change', $gp.editor.hooks.set_priority);
+		$('textarea', 'tr.editor').live('keydown', $gp.editor.hooks.keydown);
 	},
+	keydown: function(e) {
+		if (e.keyCode == 27)
+			$gp.editor.hide();
+		else if (e.keyCode == 33)
+			$gp.editor.prev();
+		else if (e.keyCode == 34)
+			$gp.editor.next();
+		else if (e.keyCode == 13 && e.shiftKey) {
+			var target = $(e.target);
+			if (target.nextAll('textarea').length)
+				target.nextAll('textarea').eq(0).focus()
+			else
+				$gp.editor.save(target.parents('tr.editor').find('button.ok'));
+		} else
+			return true;
+		return false;
+	},
 	replace_current: function(html) {
 		if (!$gp.editor.current) return;
 		$gp.editor.current.after(html);
@@ -73,7 +100,7 @@
 		}).get().join('&');
 		$.ajax({type: "POST", url: $gp_editor_options.url, data: data, dataType: 'json',
 			success: function(data){
-				button.attr('disabled', '');
+				button.removeAttr('disabled');
 				$gp.notices.success('Saved!');
 				for(original_id in data) {
 					$gp.editor.replace_current(data[original_id]);
@@ -85,7 +112,7 @@
 				}
 			},
 			error: function(xhr, msg, error) {
-				button.attr('disabled', '');
+				button.removeAttr('disabled');
 				msg = xhr.responseText? 'Error: '+ xhr.responseText : 'Error saving the translation!';
 				$gp.notices.error(msg);
 			}
@@ -176,6 +203,9 @@
 			$gp.editor.save($(this));
 			return false;
 		},
+		keydown: function(e) {
+			return $gp.editor.keydown(e);
+		},
 		copy: function() {
 			$gp.editor.copy($(this));
 			return false;

