this.g_elem = g_elem;
this.witnesses = g_elem.children('text').text().split( /,\s*/ );
this.is_incoming = false;
+ this.start_node_id = g_elem.children('title').text().split('-')[0];
+ this.end_node_id = g_elem.children('title').text().split('>')[1];
this.detach_witnesses = function( witnesses_to_detach ) {
var detached = [];
return clone;
}
- this.attach = function( node_id_maybe ) {
- //update title
- return null;
+ this.attach_witnesses = function( witnesses ) {
+ self.witnesses.concat( witnesses );
+ self.g_elem.children( 'text' ).text( self.create_label( self.witnesses ) );
+ var edge_weight = 0.8 + ( 0.2 * self.witnesses.length );
+ self.g_elem.children( 'path' ).attr( 'stroke-width', edge_weight );
+
+ }
+
+ this.attach_endpoint = function( target_node_id ) {
+ // first let's find out if the startpoint might also be linked to the target already
+ // in that case we need to remove this edge and transfer the witnesses to the
+ // appropriate edge of the target_node
+ $.each( edges_of( get_ellipse( target_node_id ) ), function( index, target_edge ) {
+ if( (self != null) && (self.start_node_id == target_edge.start_node_id) ) {
+ target_edge.attach_witnesses( self.witnesses );
+ self.g_elem.remove();
+ self = null;
+ }
+ } );
+ // if not let's really move the end pointer towards the target node
+ if( self != null ) {
+ var polygon = self.g_elem.children( 'polygon' );
+ if( polygon.size() > 0 ) {
+ var end_point_arrowhead = new svgshape( polygon );
+ var path_segments = self.g_elem.children('path')[0].pathSegList;
+ var edge_path = new svgpath( path_segments.getItem(path_segments.numberOfItems - 1), self.g_elem.children('path') );
+ var target_ellipse = get_ellipse( target_node_id );
+ var target_cx = target_ellipse.attr( 'cx' );
+ var target_cy = target_ellipse.attr( 'cy' );
+ var target_rx = target_ellipse.attr( 'rx' );
+ var source_ellipse = get_ellipse( self.end_node_id );
+ var source_cx = source_ellipse.attr( 'cx' );
+ var source_cy = source_ellipse.attr( 'cy' );
+ var source_rx = source_ellipse.attr( 'rx' );
+ var dx = (target_cx - target_rx) - (source_cx - source_rx);
+ var dy = (target_cy - source_cy);
+ end_point_arrowhead.reposition( dx, dy );
+ edge_path.reposition( dx, dy );
+ }
+ }
+ }
+
+ this.attach_startpoint = function( target_node_id ) {
+ // first let's find out if the endpoint might also be linked to the target already
+ // in that case we need to remove this edge and transfer the witnesses to the
+ // appropriate edge of the target_node
+ $.each( edges_of( get_ellipse( target_node_id ) ), function( index, target_edge ) {
+ if( (self != null) && (self.end_node_id == target_edge.end_node_id) ) {
+ target_edge.attach_witnesses( self.witnesses );
+ self.g_elem.remove();
+ self = null;
+ }
+ } );
+ // if not let's really move the end pointer towards the target node
+ if( self != null ) {
+ var path_segments = self.g_elem.children('path')[0].pathSegList;
+ var edge_path = new svgpath( path_segments.getItem(0), self.g_elem.children('path') );
+ var target_ellipse = get_ellipse( target_node_id );
+ var target_cx = target_ellipse.attr( 'cx' );
+ var target_cy = target_ellipse.attr( 'cy' );
+ var target_rx = target_ellipse.attr( 'rx' );
+ var source_ellipse = get_ellipse( self.start_node_id );
+ var source_cx = source_ellipse.attr( 'cx' );
+ var source_cy = source_ellipse.attr( 'cy' );
+ var source_rx = source_ellipse.attr( 'rx' );
+ var dx = (target_cx + target_rx) - (source_cx + source_rx);
+ var dy = (target_cy - source_cy);
+ edge_path.reposition( dx, dy );
+ }
}
}
$.getJSON( rdgpath, function( data ) {
readingdata = data;
$('#svgenlargement ellipse').each( function( i, el ) { color_inactive( el ) });
- // detach_node(null);
+ $('#loading_overlay').hide();
});
- $('#loading_overlay').hide();
});
//initialize marquee
var sy = parseInt( source_ellipse.attr('cy') );
var ex = parseInt( target_ellipse.attr('cx') );
var ey = parseInt( target_ellipse.attr('cy') );
- var relation = svg.group( $("#svgenlargement svg g"),
- { 'class':'relation', 'id':relation_id } );
+ var relation = svg.group( $("#svgenlargement svg g"), { 'class':'relation', 'id':relation_id } );
svg.title( relation, source_id + '->' + target_id );
svg.path( relation, path.move( sx, sy ).curveC( sx + (2*rx), sy, ex + (2*rx), ey, ex, ey ), {fill: 'none', stroke: relation_color, strokeWidth: 4});
var relation_element = $('#svgenlargement .relation').filter( ':last' );
ellipse_elem.data( 'node_obj', new_node );
// Move the node somewhat up for 'dramatic effect' :-p
- new_node.reposition( 0, -54 );
+ new_node.reposition( 0, -70 );
} );
+}
+function merge_nodes( source_node_id, target_node_id, consequences ) {
+ if( consequences.status != null && consequences.status == 'ok' ) {
+ merge_node( source_node_id, target_node_id );
+ if( consequences.checkalign != null ) {
+ $.each( consequences.checkalign, function( index, node_ids ) {
+ temp_relation = draw_relation( node_ids[0], node_ids[1], "#89a02c" );
+ var sy = parseInt( temp_relation.children('path').attr('d').split('C')[0].split(',')[1] );
+ var ey = parseInt( temp_relation.children('path').attr('d').split(' ')[2].split(',')[1] );
+ var yC = ey + (( sy - ey )/2);
+ // TODO: compute xC to be always the same distance to the amplitude of the curve
+ var xC = parseInt( temp_relation.children('path').attr('d').split(' ')[1].split(',')[0] );
+ var svg = $('#svgenlargement').children('svg').svg('get');
+ parent_g = svg.group( $('#svgenlargement svg g') );
+ var ids_text = node_ids[0] + '-' + node_ids[1];
+ var merge_id = 'merge-' + ids_text;
+ svg.image( parent_g, xC, (yC-8), 16, 16, '/images/tick_circle_frame.png', { id: merge_id } );
+ svg.image( parent_g, (xC+20), (yC-8), 16, 16, '/images/no_entry.png', { id: 'no' + merge_id } );
+ $( '#' + merge_id ).hover( function(){ $(this).addClass( 'draggable' ) }, function(){ $(this).removeClass( 'draggable' ) } );
+ $( '#no' + merge_id ).hover( function(){ $(this).addClass( 'draggable' ) }, function(){ $(this).removeClass( 'draggable' ) } );
+ $( '#' + merge_id ).click( function( evt ){
+ merge_node( node_ids[0], node_ids[1] );
+ temp_relation.remove();
+ $( '#' + merge_id ).parent().remove();
+ } );
+ $( '#no' + merge_id ).click( function( evt ) {
+ temp_relation.remove();
+ $( '#' + merge_id ).parent().remove();
+ } );
+ } );
+ }
+ }
+}
+
+function merge_node( source_node_id, target_node_id ) {
+ $.each( edges_of( get_ellipse( source_node_id ) ), function( index, edge ) {
+ if( edge.is_incoming == true ) {
+ edge.attach_endpoint( target_node_id );
+ } else {
+ edge.attach_startpoint( target_node_id );
+ }
+ } );
+ $( jq( source_node_id ) ).remove();
}
function Marquee() {
// merge dialog where appropriate.
if( editable ) {
- $( "#dialog-form" ).dialog({
+ $( '#dialog-form' ).dialog( {
autoOpen: false,
height: 270,
width: 290,
modal: true,
buttons: {
- "Merge readings": function( evt ) {
- $(evt.target).button("disable");
- $('#status').empty();
- form_values = $('#collapse_node_form').serialize();
+ 'Merge readings': function( evt ) {
+ $( evt.target ).button( 'disable' );
+ $( '#status' ).empty();
+ form_values = $( '#collapse_node_form' ).serialize();
ncpath = getTextURL( 'merge' );
- var jqjson = $.post( ncpath, form_values, function(data) {
- alert( "Did a node merge" );
- });
+ var jqjson = $.post( ncpath, form_values, function( data ) {
+ merge_nodes( $( '#source_node_id' ).val(), $( '#target_node_id' ).val(), data );
+ $( '#dialog-form' ).dialog( 'close' );
+ } );
},
OK: function( evt ) {
- $(evt.target).button("disable");
- $('#status').empty();
- form_values = $('#collapse_node_form').serialize();
+ $( evt.target ).button( 'disable' );
+ $( '#status' ).empty();
+ form_values = $( '#collapse_node_form' ).serialize();
ncpath = getTextURL( 'relationships' );
- var jqjson = $.post( ncpath, form_values, function(data) {
- $.each( data, function(item, source_target) {
+ var jqjson = $.post( ncpath, form_values, function( data ) {
+ $.each( data, function( item, source_target ) {
var source_found = get_ellipse( source_target[0] );
var target_found = get_ellipse( source_target[1] );
- var relation_found = $.inArray( source_target[2], $('#keymap').data('relations') );
+ var relation_found = $.inArray( source_target[2], $( '#keymap' ).data( 'relations' ) );
if( source_found.size() && target_found.size() && relation_found > -1 ) {
var relation = relation_manager.create( source_target[0], source_target[1], relation_found );
relation.data( 'type', source_target[2] );
relation.data( 'note', $('#note').val() );
relation_manager.toggle_active( relation.attr('id') );
}
- $(evt.target).button("enable");
+ $(evt.target).button( 'enable' );
});
- $( "#dialog-form" ).dialog( "close" );
+ $( '#dialog-form' ).dialog( 'close' );
}, 'json' );
},
Cancel: function() {
- $( this ).dialog( "close" );
+ $( this ).dialog( 'close' );
}
},
create: function(event, ui) {