Taskar.UI.InfoBubble = {
  move: function(e){
    var bubble = $('info_bubble');
    if (e.findElement('aside')){
      bubble.show().setStyle({
        top: e.pointerY() + 20 + 'px',
        left: e.pointerX() + 'px'
      });
    } else {
      bubble.hide();
    }
  },
  hide: function(e){
    $('info_bubble').hide();
  }
}
@@ -20,66 +20,196 @@
 e = 
-%7B%0A  move: function(e)%7B%0A    var bubble = $('info_bubble');%0A
+(function(UI)%7B  %0A  var InfoBubble = Class.create(%7B%0A    initialize: function(element, e)%7B%0A      this.element = $(element);%0A      this.positionate(e);%0A    %7D,%0A    positionate: function(e)%7B%0A  
     
@@ -243,22 +243,30 @@
 %7B%0A      
-bubble
+  this.element
 .show().
@@ -272,24 +272,26 @@
 .setStyle(%7B%0A
+  
         top:
@@ -317,16 +317,18 @@
 + 'px',%0A
+  
         
@@ -363,12 +363,16 @@
     
+  
 %7D);%0A
+  
     
@@ -386,22 +386,30 @@
 %7B%0A      
-bubble
+  this.element
 .hide();
@@ -413,70 +413,559 @@
 ();%0A
+  
     %7D%0A
+  
   %7D,%0A  
-hide: function(e)%7B%0A    $('info_bubble').hide();%0A  %7D%0A%7D
+  destroy: function()%7B%0A      this.element.hide();%0A      this.element = null;%0A    %7D%0A  %7D);%0A  %0A  function moveBubble(e)%7B%0A    this.instance.positionate(e);%0A  %7D%0A  %0A  function createBubble(e)%7B%0A    this.instance = new InfoBubble('info_bubble', e);%0A    this.move     = moveBubble;%0A  %7D%0A  %0A  var widget = %7B%0A    instance: null,%0A    move:     createBubble,%0A    hide:     function()%7B%0A      if (this.instance)%7B%0A        this.instance.destroy();%0A        this.instance = null;%0A        this.move = createBubble;%0A      %7D%0A    %7D%0A  %7D;%0A  %0A  return widget;%0A%7D)();

move the info bubble logic into its own class