? teleport-esc-click-close.patch
Index: teleport.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/teleport/teleport.js,v
retrieving revision 1.1.4.3
diff -u -p -r1.1.4.3 teleport.js
--- teleport.js	10 Feb 2008 18:20:14 -0000	1.1.4.3
+++ teleport.js	15 Feb 2008 00:15:26 -0000
@@ -6,22 +6,21 @@ Drupal.Teleport = {};
 // Attach hidden Teleport button to DOM, and teleport DIV to body.
 Drupal.Teleport.init = function() {
   var teleport = $("<div id='teleport'></div>");
-  var button = $("<a accesskey='"+ Drupal.settings.teleport.hotkey + "'>Teleport</a>");  var teleport = $("<div id='teleport'></div>");
-  var close = $("<a href='#'>Close</a>");
-  
+  var button = $("<a id='teleport-button' accesskey='"+ Drupal.settings.teleport.hotkey + "'>Teleport</a>");
+
   teleport
     .hide()
     .html(Drupal.settings.teleport.form)
     .click(function() {$('#edit-teleport-title')[0].focus();});
-  
+
   button
     .hide()
     .click(Drupal.Teleport.toggle);
-  
+
   $("BODY")
     .append(button)
     .append(teleport);
-   
+
   $("#teleport-close-link")
     .attr('href', '#')
     .click(function(){ teleport.hide(); return false; });
@@ -35,12 +34,16 @@ Drupal.Teleport.toggle = function() {
   }
 };
 
-Drupal.Teleport.appear = function() {
-  $('#teleport').show("fast", Drupal.Teleport.focus);
+Drupal.Teleport.vanish = function() {
+  $('#teleport').fadeOut("fast");
+  $(document).unbind('click', Drupal.Teleport.clickHandle);
+  $(document).unbind('keydown', Drupal.Teleport.keyHandle);
 };
 
-Drupal.Teleport.vanish = function() {
-  $('#teleport').hide("fast");
+Drupal.Teleport.appear = function() {
+  $('#teleport').fadeIn("fast", Drupal.Teleport.focus);
+  $(document).bind('click', Drupal.Teleport.clickHandle);
+  $(document).bind('keydown', Drupal.Teleport.keyHandle);
 };
 
 Drupal.Teleport.focus = function() {
@@ -48,4 +51,48 @@ Drupal.Teleport.focus = function() {
   $('#edit-teleport-title')[0].select();
 };
 
+Drupal.Teleport.clickHandle = function (e) {
+  if (!e) {
+    var e = window.event;
+  };
+  // set tg to the clicked element
+  if (e.target) var tg = e.target;
+  else if (e.srcElement) var tg = e.srcElement;
+  if (!Drupal.Teleport.checkParents(tg, 'teleport') && !Drupal.Teleport.checkParents(tg, 'teleport-button')) {
+    Drupal.Teleport.vanish();
+  }
+}
+
+Drupal.Teleport.keyHandle = function (input, e) {
+  if (!e) {
+    e = window.event;
+  }
+  switch (e.keyCode) {
+    case 27: // esc
+      Drupal.Teleport.vanish();
+      return false;
+    default: // all other keys
+      return true;
+  }
+}
+
+/**
+ * find out if the object or any of its parents has a given id
+ * returns TRUE or FALSE
+ */
+Drupal.Teleport.checkParents = function (obj, id) {
+  if (obj.id == id) {
+    return true;
+  }
+  if (obj && obj.parentNode) {
+    while (obj = obj.parentNode) {
+      if (obj.id == id) {
+        return true;
+      }
+    }
+  }
+
+  return false;
+}
+
 $(Drupal.Teleport.init);
\ No newline at end of file
