Changed click/select behavior because of added marquee multiselect. Some CSS tweaks...
[scpubgit/stemmaweb.git] / root / js / relationship.js
index 4cb62f1..7298613 100644 (file)
@@ -5,6 +5,17 @@ var start_element_height = 0;
 var reltypes = {};
 var readingdata = {};
 
+function arrayUnique(array) {
+    var a = array.concat();
+    for(var i=0; i<a.length; ++i) {
+        for(var j=i+1; j<a.length; ++j) {
+            if(a[i] === a[j])
+                a.splice(j--, 1);
+        }
+    }
+    return a;
+};
+
 function getTextURL( which ) {
        return basepath + textid + '/' + which;
 }
@@ -41,6 +52,14 @@ function node_dblclick_listener( evt ) {
        }
        $('#reading_normal_form').attr( 'size', nfboxsize )
        $('#reading_normal_form').val( normal_form );
+       if( editable ) {
+               // Fill in the witnesses for the de-collation box.
+               $('#reading_decollate_witnesses').empty();
+               $.each( reading_info['witnesses'], function( idx, wit ) {
+                       $('#reading_decollate_witnesses').append( $('<option/>').attr(
+                               'value', wit ).text( wit ) );
+               });
+       }
        // Now do the morphological properties.
        morphology_form( reading_info['lexemes'] );
        // and then open the dialog.
@@ -165,11 +184,6 @@ function svgEnlargementLoaded() {
            $('#update_workspace_button').data('locked', false);
        $('#update_workspace_button').css('background-position', '0px 44px');
     }
-       var rdgpath = getTextURL( 'readings' );
-               $.getJSON( rdgpath, function( data ) {
-               readingdata = data;
-           $('#svgenlargement ellipse').each( function( i, el ) { color_inactive( el ) });
-       });
     $('#svgenlargement ellipse').parent().dblclick( node_dblclick_listener );
     var graph_svg = $('#svgenlargement svg');
     var svg_g = $('#svgenlargement svg g')[0];
@@ -200,7 +214,19 @@ function svgEnlargementLoaded() {
     svg_g.setAttribute('transform', transform);
     //used to calculate min and max zoom level:
     start_element_height = $('#__START__').children('ellipse')[0].getBBox().height;
-    add_relations( function() { $('#loading_overlay').hide(); });
+    //some use of call backs to ensure succesive execution
+    add_relations( function() { 
+        var rdgpath = getTextURL( 'readings' );
+        $.getJSON( rdgpath, function( data ) {
+            readingdata = data;
+            $('#svgenlargement ellipse').each( function( i, el ) { color_inactive( el ) });
+        });
+        $('#loading_overlay').hide(); 
+    });
+    
+    //initialize marquee
+    marquee = new Marquee();
+    
 }
 
 function add_relations( callback_fn ) {
@@ -230,10 +256,10 @@ function add_relations( callback_fn ) {
                                relation.data( 'note', rel_info.note );
                                if( editable ) {
                                        var node_obj = get_node_obj(rel_info.source);
-                                       node_obj.set_draggable( false );
+                                       node_obj.set_selectable( false );
                                        node_obj.ellipse.data( 'node_obj', null );
                                        node_obj = get_node_obj(rel_info.target);
-                                       node_obj.set_draggable( false );
+                                       node_obj.set_selectable( false );
                                        node_obj.ellipse.data( 'node_obj', null );
                                }
                        }
@@ -268,16 +294,41 @@ function node_obj(ellipse) {
     return $(self.ellipse).parent().attr('id')
   }
   
+  this.set_selectable = function( clickable ) {
+      if( clickable && editable ) {
+          $(self.ellipse).attr( {stroke:'black', fill:'#fff'} );
+          $(self.ellipse).parent().hover( this.enter_node, this.leave_node );
+          $(self.ellipse).parent().mousedown( function(evt) { evt.stopPropagation() } ); 
+          $(self.ellipse).parent().click( function(evt) { 
+              evt.stopPropagation();              
+              if( $('ellipse[fill="#9999ff"]').size() > 0 ) {
+                $('ellipse[fill="#9999ff"]').each( function() { 
+                    $(this).data( 'node_obj' ).set_draggable( false );
+                } );
+              }
+              self.set_draggable( true ) 
+          });
+      } else {
+          $(self.ellipse).attr( {stroke:'black', fill:'#fff'} );
+          self.ellipse.siblings('text').attr('class', '');
+          $(self.ellipse).parent().unbind(); 
+          $('body').unbind('mousemove');
+          $('body').unbind('mouseup');
+      }
+  }
+  
   this.set_draggable = function( draggable ) {
     if( draggable && editable ) {
-      $(self.ellipse).attr( {stroke:'black', fill:'#fff'} );
+      $(self.ellipse).attr( {stroke:'black', fill:'#9999ff'} );
       $(self.ellipse).parent().mousedown( this.mousedown_listener );
-      $(self.ellipse).parent().hover( this.enter_node, this.leave_node ); 
+      $(self.ellipse).parent().unbind( 'mouseenter' ).unbind( 'mouseleave' );
       self.ellipse.siblings('text').attr('class', 'noselect draggable');
     } else {
+      $(self.ellipse).attr( {stroke:'black', fill:'#fff'} );
       self.ellipse.siblings('text').attr('class', '');
-         $(self.ellipse).parent().unbind( 'mouseenter' ).unbind( 'mouseleave' ).unbind( 'mousedown' );     
-      color_inactive( self.ellipse );
+      $(self.ellipse).parent().unbind( 'mousedown ');
+      $(self.ellipse).parent().mousedown( function(evt) { evt.stopPropagation() } ); 
+      $(self.ellipse).parent().hover( this.enter_node, this.leave_node );
     }
   }
 
@@ -288,7 +339,7 @@ function node_obj(ellipse) {
     $('body').mousemove( self.mousemove_listener );
     $('body').mouseup( self.mouseup_listener );
     $(self.ellipse).parent().unbind('mouseenter').unbind('mouseleave')
-    self.ellipse.attr( 'fill', '#ff66ff' );
+    self.ellipse.attr( 'fill', '#6b6bb2' );
     first_node_g_element = $("#svgenlargement g .node" ).filter( ":first" );
     if( first_node_g_element.attr('id') !== self.get_g().attr('id') ) { self.get_g().insertBefore( first_node_g_element ) };
   }
@@ -316,8 +367,7 @@ function node_obj(ellipse) {
     };
     $('body').unbind('mousemove');
     $('body').unbind('mouseup');
-    self.ellipse.attr( 'fill', '#fff' );
-    $(self.ellipse).parent().hover( self.enter_node, self.leave_node );
+    self.ellipse.attr( 'fill', '#9999ff' );
     self.reset_elements();
   }
   
@@ -365,7 +415,11 @@ function node_obj(ellipse) {
       self.node_elements = node_elements_for(self.ellipse);
   }
 
-  self.set_draggable( true );
+  this.get_witnesses = function() {
+      return readingdata[self.get_id()].witnesses
+  }
+  
+  self.set_selectable( true );
 }
 
 function svgshape( shape_element ) {
@@ -513,11 +567,11 @@ function relation_factory() {
         }
     }
     this.showinfo = function(relation) {
-       var htmlstr = 'type: ' + relation.data( 'type' ) + '<br/>scope: ' + relation.data( 'scope' );
+       $('#delete_relation_type').text( relation.data('type') );
+       $('#delete_relation_scope').text( relation.data('scope') );
        if( relation.data( 'note' ) ) {
-               htmlstr = htmlstr + '<br/>note: ' + relation.data( 'note' );
+               $('#delete_relation_note').text('note: ' + relation.data( 'note' ) );
        }
-        $('#delete-form-text').html( htmlstr );
         var points = relation.children('path').attr('d').slice(1).replace('C',' ').split(' ');
         var xs = parseFloat( points[0].split(',')[0] );
         var xe = parseFloat( points[1].split(',')[0] );
@@ -575,29 +629,128 @@ function draw_relation( source_id, target_id, relation_color ) {
     return relation_element;
 }
 
+function Marquee() {
+    
+    var self = this;
+    
+    this.x = 0;
+    this.y = 0;
+    this.dx = 0;
+    this.dy = 0;
+    this.enlargementOffset = $('#svgenlargement').offset();
+    this.svg_rect = $('#svgenlargement svg').svg('get');
+
+    this.show = function( event ) {
+        // TODO: uncolor possible selected
+        // TODO: unless SHIFT?
+        self.x = event.clientX;
+        self.y = event.clientY;
+        p = svg_root.createSVGPoint();
+        p.x = event.clientX - self.enlargementOffset.left;
+        p.y = event.clientY - self.enlargementOffset.top;
+        self.svg_rect.rect( p.x, p.y, 0, 0, { fill: 'black', 'fill-opacity': '0.1', stroke: 'black', 'stroke-dasharray': '4,2', strokeWidth: '0.02em', id: 'marquee' } );
+    };
+
+    this.expand = function( event ) {
+        self.dx = (event.clientX - self.x);
+        self.dy = (event.clientY - self.y);
+        var rect = $('#marquee');
+        if( rect.length != 0 ) {            
+            var rect_w =  Math.abs( self.dx );
+            var rect_h =  Math.abs( self.dy );
+            var rect_x = self.x - self.enlargementOffset.left;
+            var rect_y = self.y - self.enlargementOffset.top;
+            if( self.dx < 0 ) { rect_x = rect_x - rect_w }
+            if( self.dy < 0 ) { rect_y = rect_y - rect_h }
+            rect.attr("x", rect_x).attr("y", rect_y).attr("width", rect_w).attr("height", rect_h);
+        }
+    };
+    
+    this.select = function() {
+        var rect = $('#marquee');
+        if( rect.length != 0 ) {
+            //unselect any possible selected first
+            if( $('ellipse[fill="#9999ff"]').size() > 0 ) {
+              $('ellipse[fill="#9999ff"]').each( function() { 
+                  $(this).data( 'node_obj' ).set_draggable( false );
+              } );
+            }
+            //compute dimension of marquee
+            var left = $('#marquee').offset().left;
+            var top = $('#marquee').offset().top;
+            var right = left + parseInt( $('#marquee').attr( 'width' ) );
+            var bottom = top + parseInt( $('#marquee').attr( 'height' ) );
+            var tf = svg_root_element.getScreenCTM().inverse(); 
+            var p = svg_root.createSVGPoint();
+            p.x=left;
+            p.y=top;
+            var cx_min = p.matrixTransform(tf).x;
+            var cy_min = p.matrixTransform(tf).y;
+            p.x=right;
+            p.y=bottom;
+            var cx_max = p.matrixTransform(tf).x;
+            var cy_max = p.matrixTransform(tf).y;
+            //select any node with its center inside the marquee
+            //also merge witness sets from nodes
+            var witnesses = [];
+            $('#svgenlargement ellipse').each( function( index ) {
+                var cx = parseInt( $(this).attr('cx') );
+                var cy = parseInt( $(this).attr('cy') );
+                if( cx > cx_min && cx < cx_max) {
+                    if( cy > cy_min && cy < cy_max) {
+                        // we actually heve no real 'selected' state for nodes, except coloring
+                        $(this).attr( 'fill', '#9999ff' );
+                        var this_witnesses = $(this).data( 'node_obj' ).get_witnesses();
+                        witnesses = arrayUnique( witnesses.concat( this_witnesses ) );
+                    }
+                }
+            });
+            if( $('ellipse[fill="#9999ff"]').size() > 0 ) {
+                //add interesectio of witnesses sets to the multi select form and open it
+                $.each( witnesses, function( index, value ) {
+                    $('#multipleselect-form').append( '<input type="checkbox" name="witnesses" value="' + value + '">' + value + '<br>' );
+                });
+                $('#multipleselect-form').dialog( 'open' );
+            }
+            self.svg_rect.remove( $('#marquee') );
+        }
+    };
+    
+    this.unselect = function() {
+        $('ellipse[fill="#9999ff"]').attr( 'fill', '#fff' );
+    }
+     
+}
+
 
 $(document).ready(function () {
     
   timer = null;
   relation_manager = new relation_factory();
-  $('#update_workspace_button').data('locked', false);
   
+  $('#update_workspace_button').data('locked', false);
+                
   $('#enlargement').mousedown(function (event) {
     $(this)
         .data('down', true)
         .data('x', event.clientX)
         .data('y', event.clientY)
         .data('scrollLeft', this.scrollLeft)
-        stateTf = svg_root_element.getCTM().inverse();
-        var p = svg_root.createSVGPoint();
-        p.x = event.clientX;
-        p.y = event.clientY;
-        stateOrigin = p.matrixTransform(stateTf);
-        event.returnValue = false;
-        event.preventDefault();
-        return false;
+    stateTf = svg_root_element.getCTM().inverse();
+    var p = svg_root.createSVGPoint();
+    p.x = event.clientX;
+    p.y = event.clientY;
+    stateOrigin = p.matrixTransform(stateTf);
+
+    // Activate marquee if in interaction mode
+    if( $('#update_workspace_button').data('locked') == true ) { marquee.show( event ) };
+        
+    event.returnValue = false;
+    event.preventDefault();
+    return false;
   }).mouseup(function (event) {
-        $(this).data('down', false);
+    marquee.select(); 
+    $(this).data('down', false);
   }).mousemove(function (event) {
     if( timer != null ) { clearTimeout(timer); } 
     if ( ($(this).data('down') == true) && ($('#update_workspace_button').data('locked') == false) ) {
@@ -609,6 +762,7 @@ $(document).ready(function () {
         var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")";
         svg_root_element.setAttribute("transform", s);
     }
+    marquee.expand( event ); 
     event.returnValue = false;
     event.preventDefault();
   }).mousewheel(function (event, delta) {
@@ -639,6 +793,7 @@ $(document).ready(function () {
     'cursor' : '-moz-grab'
   });
   
+  
   if( editable ) {
        $( "#dialog-form" ).dialog({
        autoOpen: false,
@@ -674,12 +829,21 @@ $(document).ready(function () {
        },
        create: function(event, ui) { 
                $(this).data( 'relation_drawn', false );
+               $('#rel_type').data( 'changed_after_open', false );
                $.each( relationship_types, function(index, typedef) {   
                         $('#rel_type').append( $('<option />').attr( "value", typedef.name ).text(typedef.name) ); 
                });
                $.each( relationship_scopes, function(index, value) {   
                         $('#scope').append( $('<option />').attr( "value", value ).text(value) ); 
-               });        
+               });
+               // Handler to clear the annotation field, the first time the relationship is
+               // changed after opening the form.
+               $('#rel_type').change( function () {
+                       if( !$(this).data( 'changed_after_open' ) ) {
+                               $('#note').val('');
+                       }
+                       $(this).data( 'changed_after_open', true );
+               });
        },
        open: function() {
                relation_manager.create_temporary( $('#source_node_id').val(), $('#target_node_id').val() );
@@ -688,6 +852,7 @@ $(document).ready(function () {
                $("#dialog_overlay").height( $("#enlargement_container").height() );
                $("#dialog_overlay").width( $("#enlargement_container").innerWidth() );
                $("#dialog_overlay").offset( $("#enlargement_container").offset() );
+               $('#rel_type').data( 'changed_after_open', false );
        },
        close: function() {
                relation_manager.remove_temporary();
@@ -695,45 +860,44 @@ $(document).ready(function () {
                $("#dialog_overlay").hide();
        }
        }).ajaxError( function(event, jqXHR, ajaxSettings, thrownError) {
-         if( ajaxSettings.url == getTextURL('relationships') 
-               && ajaxSettings.type == 'POST' && jqXHR.status == 403 ) {
-                 var errobj = jQuery.parseJSON( jqXHR.responseText );
-                 $('#status').append( '<p class="error">Error: ' + errobj.error + '</br>The relationship cannot be made.</p>' );
-         }
-         $(event.target).parent().find('.ui-button').button("enable");
+               if( ajaxSettings.url == getTextURL('relationships') 
+                       && ajaxSettings.type == 'POST' && jqXHR.status == 403 ) {
+                       var error;
+                       if( jqXHR.responseText.indexOf('do not have permission to modify') > -1 ) {
+                               error = 'You are not authorized to modify this tradition. (Try logging in again?)';
+                       } else {
+                               try {
+                                       var errobj = jQuery.parseJSON( jqXHR.responseText );
+                                       error = errobj.error + '</br>The relationship cannot be made.</p>';
+                               } catch(e) {
+                                       error = jqXHR.responseText;
+                               }
+                       }
+                       $('#status').append( '<p class="error">Error: ' + error );
+               }
+               $(event.target).parent().find('.ui-button').button("enable");
        } );
   }
 
+  var deletion_buttonset = {
+        cancel: function() { $( this ).dialog( "close" ); },
+        global: function () { delete_relation( true ); },
+        delete: function() { delete_relation( false ); }
+  };   
+  
   $( "#delete-form" ).dialog({
     autoOpen: false,
     height: 135,
-    width: 160,
+    width: 250,
     modal: false,
-    buttons: {
-        Cancel: function() {
-            $( this ).dialog( "close" );
-        },
-        Delete: function() {
-          form_values = $('#delete_relation_form').serialize();
-          ncpath = getTextURL( 'relationships' );
-          var jqjson = $.ajax({ url: ncpath, data: form_values, success: function(data) {
-              $.each( data, function(item, source_target) { 
-                  relation_manager.remove( get_relation_id( source_target[0], source_target[1] ) );
-              });
-              $( "#delete-form" ).dialog( "close" );
-          }, dataType: 'json', type: 'DELETE' });
-        }
-    },
     create: function(event, ui) {
-       // Swap out the buttons if we are in readonly mode
-       if( !editable ) {
-               $( this ).dialog( "option", "buttons", 
-                       [{ text: "OK", click: function() { $( this ).dialog( "close" ); }}] );
-       }
-       
        // TODO What is this logic doing?
+       // This scales the buttons in the dialog and makes it look proper
+       // Not sure how essential it is, does anything break if it's not here?
         var buttonset = $(this).parent().find( '.ui-dialog-buttonset' ).css( 'width', '100%' );
         buttonset.find( "button:contains('Cancel')" ).css( 'float', 'right' );
+       // A: This makes sure that the pop up delete relation dialogue for a hovered over
+       // relation auto closes if the user doesn't engage (mouseover) with it.
         var dialog_aria = $("div[aria-labelledby='ui-dialog-title-delete-form']");  
         dialog_aria.mouseenter( function() {
             if( mouseWait != null ) { clearTimeout(mouseWait) };
@@ -743,15 +907,94 @@ $(document).ready(function () {
         })
     },
     open: function() {
+       if( !editable ) {
+               $( this ).dialog( "option", "buttons", 
+                       [{ text: "OK", click: deletion_buttonset['cancel'] }] );
+       } else if( $('#delete_relation_scope').text() === 'local' ) {
+               $( this ).dialog( "option", "width", 160 );
+               $( this ).dialog( "option", "buttons",
+                       [{ text: "Delete", click: deletion_buttonset['delete'] },
+                        { text: "Cancel", click: deletion_buttonset['cancel'] }] );
+       } else {
+               $( this ).dialog( "option", "width", 200 );
+               $( this ).dialog( "option", "buttons",
+                       [{ text: "Delete", click: deletion_buttonset['delete'] },
+                        { text: "Delete all", click: deletion_buttonset['global'] },
+                        { text: "Cancel", click: deletion_buttonset['cancel'] }] );
+               }       
+                       
         mouseWait = setTimeout( function() { $("#delete-form").dialog( "close" ) }, 2000 );
     },
-    close: function() {
+    close: function() {}
+  });
+
+  var multipleselect_buttonset = {
+        cancel: function() { $( this ).dialog( "close" ); },
+        button1: function () {  },
+        button2: function() {  }
+  };   
+
+  $( "#multipleselect-form" ).dialog({
+    autoOpen: false,
+    height: 150,
+    width: 250,
+    modal: true,
+    create: function(event, ui) {
+        var buttonset = $(this).parent().find( '.ui-dialog-buttonset' ).css( 'width', '100%' );
+        buttonset.find( "button:contains('Cancel')" ).css( 'float', 'right' );
+    },
+    open: function() {
+        $( this ).dialog( "option", "width", 200 );
+        $( this ).dialog( "option", "buttons",
+            [{ text: "Button_1", click: multipleselect_buttonset['button1'] },
+             { text: "Button_2", click: multipleselect_buttonset['button2'] },
+             { text: "Cancel", click: multipleselect_buttonset['cancel'] }] );
+        $(".ui-widget-overlay").css("background", "none");
+        $("#dialog_overlay").show();
+        $("#dialog_overlay").height( $("#enlargement_container").height() );
+        $("#dialog_overlay").width( $("#enlargement_container").innerWidth() );
+        $("#dialog_overlay").offset( $("#enlargement_container").offset() );
+    },
+    close: function() { 
+        marquee.unselect();
+        $("#dialog_overlay").hide();
     }
   });
 
+  // Helpers for relationship deletion
+  
+  function delete_relation( scopewide ) {
+         form_values = $('#delete_relation_form').serialize();
+         if( scopewide ) {
+               form_values += "&scopewide=true";
+         }
+         ncpath = getTextURL( 'relationships' );
+         var jqjson = $.ajax({ url: ncpath, data: form_values, success: function(data) {
+                 $.each( data, function(item, source_target) { 
+                         relation_manager.remove( get_relation_id( source_target[0], source_target[1] ) );
+                 });
+                 $( "#delete-form" ).dialog( "close" );
+         }, dataType: 'json', type: 'DELETE' });
+  }
+  
+  function toggle_relation_active( node_id ) {
+      $('#svgenlargement .relation').find( "title:contains('" + node_id +  "')" ).each( function(index) {
+          matchid = new RegExp( "^" + node_id );
+          if( $(this).text().match( matchid ) != null ) {
+                 var relation_id = $(this).parent().attr('id');
+              relation_manager.toggle_active( relation_id );
+          };
+      });
+  }
+
   // function for reading form dialog should go here; 
   // just hide the element for now if we don't have morphology
   if( can_morphologize ) {
+         if( editable ) {
+                 $('#reading_decollate_witnesses').multiselect();
+         } else {
+                 $('#decollation').hide();
+         }
          $('#reading-form').dialog({
                autoOpen: false,
                // height: 400,
@@ -807,6 +1050,8 @@ $(document).ready(function () {
                },
                open: function() {
                        $(".ui-widget-overlay").css("background", "none");
+                       $('#reading_decollate_witnesses').multiselect("refresh");
+                       $('#reading_decollate_witnesses').multiselect("uncheckAll");
                        $("#dialog_overlay").show();
                        $('#reading_status').empty();
                        $("#dialog_overlay").height( $("#enlargement_container").height() );
@@ -818,12 +1063,22 @@ $(document).ready(function () {
                        $("#dialog_overlay").hide();
                }
          }).ajaxError( function(event, jqXHR, ajaxSettings, thrownError) {
-                 if( ajaxSettings.url.lastIndexOf( getReadingURL('') ) > -1
+               if( ajaxSettings.url.lastIndexOf( getReadingURL('') ) > -1
                        && ajaxSettings.type == 'POST' && jqXHR.status == 403 ) {
-                         var errobj = jQuery.parseJSON( jqXHR.responseText );
-                         $('#reading_status').append( '<p class="error">Error: ' + errobj.error + '</p>' );
-                 }
-                 $(event.target).parent().find('.ui-button').button("enable");
+                       var error;
+                       if( jqXHR.responseText.indexOf('do not have permission to modify') > -1 ) {
+                               error = 'You are not authorized to modify this tradition. (Try logging in again?)';
+                       } else {
+                               try {
+                                       var errobj = jQuery.parseJSON( jqXHR.responseText );
+                                       error = errobj.error + '</br>The relationship cannot be made.</p>';
+                               } catch(e) {
+                                       error = jqXHR.responseText;
+                               }
+                       }
+                       $('#status').append( '<p class="error">Error: ' + error );
+               }
+               $(event.target).parent().find('.ui-button').button("enable");
          });
        } else {
                $('#reading-form').hide();
@@ -840,7 +1095,8 @@ $(document).ready(function () {
          $('#svgenlargement ellipse' ).each( function( index ) {
              if( $(this).data( 'node_obj' ) != null ) {
                  $(this).data( 'node_obj' ).ungreyout_edges();
-                 $(this).data( 'node_obj' ).set_draggable( false );
+                 $(this).data( 'node_obj' ).set_selectable( false );
+                 color_inactive( $(this) );
                  var node_id = $(this).data( 'node_obj' ).get_id();
                  toggle_relation_active( node_id );
                  $(this).data( 'node_obj', null );
@@ -864,7 +1120,7 @@ $(document).ready(function () {
                  if( $(this).data( 'node_obj' ) == null ) {
                      $(this).data( 'node_obj', new node_obj( $(this) ) );
                  } else {
-                     $(this).data( 'node_obj' ).set_draggable( true );
+                     $(this).data( 'node_obj' ).set_selectable( true );
                  }
                  $(this).data( 'node_obj' ).greyout_edges();
                  var node_id = $(this).data( 'node_obj' ).get_id();
@@ -891,17 +1147,6 @@ $(document).ready(function () {
          scrollbars:1 
   }); 
 
-  
-  function toggle_relation_active( node_id ) {
-      $('#svgenlargement .relation').find( "title:contains('" + node_id +  "')" ).each( function(index) {
-          matchid = new RegExp( "^" + node_id );
-          if( $(this).text().match( matchid ) != null ) {
-                 var relation_id = $(this).parent().attr('id');
-              relation_manager.toggle_active( relation_id );
-          };
-      });
-  }
-
   expandFillPageClients();
   $(window).resize(function() {
     expandFillPageClients();
@@ -928,6 +1173,7 @@ function loadSVG(svgData) {
 }
 
 
+
 /*     OS Gadget stuff
 
 function svg_select_callback(topic, data, subscriberData) {