Skip to content
tenprint.html 45 KiB
Newer Older
<!DOCTYPE html>
<html>
    <head>
        {% for src in js %}
            <script type="text/javascript" src="{{ src }}"></script>
        {% endfor %}
        {% for src in css %}
            <link type="text/css" rel="stylesheet" href="{{ src }}">
        {% endfor %}
        
        <script type="text/javascript" src="{{ url_for( 'files.send_app_files', subpath = 'functions.js' ) }}"></script>
        <link type="text/css" rel="stylesheet" href="{{ url_for( 'files.send_app_files', subpath = 'app.css' ) }}">
            .icnml_button > div > a {
        <script type="text/javascript">
            baseurl = "{{ baseurl }}";
            submission_id = "{{ submission_id }}";
            {% if not admin %}
                var password_local = decrypt( sessionStorage.getItem( "session_key" ), "{{ session_security_key }}" );
                var nickname = decrypt( "{{ nickname }}", password_local );
                var filename = decrypt( "{{ file[ 'filename' ] }}", password_local );
                var note     = decrypt( "{{ file[ 'note' ] }}", password_local );
            {% endif %}
            var zones_array = new Array();
            {% for zone in zones %}
                zones_array.push( {{ zone[ 'fpc' ] }} );
Marco De Donno's avatar
Marco De Donno committed
            {% endfor %}
Marco De Donno's avatar
Marco De Donno committed
            var zonesData = {};
            {% for zone in zones %}
                zonesData[ "{{ zone[ 'fpc' ] }}" ] = {
                    "fpc": {{ zone[ 'fpc' ] }},
                    "x": {{ zone[ 'x' ] }},
                    "y": {{ zone[ 'y' ] }},
                    "width": {{ zone[ 'width' ] }},
                    "height": {{ zone[ 'height' ] }},
                    "orientation": {{ zone[ 'orientation' ] }}
Marco De Donno's avatar
Marco De Donno committed
            
            var segments_position_code = {};
            {% for fpc in segments_position_code %}
                segments_position_code[ "{{ fpc }}" ] = "{{ segments_position_code[ fpc ] }}".replace( "&#39;", "'" );
            var to_annotate = [];
            {% for ta in to_annotate %}
                to_annotate.push( {{ ta }} );
            {% endfor %}
            
            var orientationsData = {};
            {% for zone in zones %}
                orientationsData[ "{{ zone[ 'fpc' ] }}" ] = {{ zone[ 'orientation' ] }};
            {% endfor %}
            
            var update_quality_db = function()
            {
                var quality = $( "#file_{{ file[ 'uuid' ] }}_quality > select > option:checked" ).val();
                
                $.ajax( {
                    url: "{{ url_for( 'submission.submission_tenprint_set_quality', submission_id = submission_id, tenprint_id = file[ 'uuid' ] ) }}",
                    dataType: "json",
                    method: "POST",
                    data: {
                        quality: quality
                    },
                    success: function( data )
                    {
                        if( data.error )
                            toastr.error( "Error while saving the quality value" );
                    },
                    error: function( data )
                    {
                        toastr.error( "Network error" );
                    }
                } );
            }
            
            {% if not admin %}
                var update_note_db = function()
                {
                    var note = $( "#file_note" ).val() || null;
                    note = encrypt( note, password_local );
                    
                    $.ajax( {
                        url: "{{ url_for( 'submission.submission_file_set_note', submission_id = submission_id, tenprint_id = file[ 'uuid' ], file_type = 'tenprint' ) }}",
                        dataType: "json",
                        method: "POST",
                        data: {
                            note: note
                        }
                    } );
                }
            {% endif %}
            var update_coordinates_informations = function()
Marco De Donno's avatar
Marco De Donno committed
            {
                svg_height = $( window ).height() - 100;
                svg_width = svg_height * {{ svg_hw_factor }};
            }
Marco De Donno's avatar
Marco De Donno committed
                $( "#segmentation_button_span_text" ).text( "Segmenting..." );
                $( "#segmentation_button" ).append(
                    $( "<span />" )
                        .attr( "id", "segmentation_button_span_spinner" )
                        .attr( "class", "ld ld-ring ld-cycle" )
                        .css( "position", "absolute" )
                        .css( "right", "20px" )
                )
                
                $( "#segmentation_button" ).off( "click" );
                
                $.ajax( {
                    url: "{{ url_for( 'image.image_tenprint_segmentation', tenprint_id = file[ 'uuid' ] ) }}",
Marco De Donno's avatar
Marco De Donno committed
                    dataType: "json",
                    success: function( data )
                    {
                        $( "#segmentation_button_span_text" ).text( "Segementation updated" );
                        $( "#segmentation_button_span_spinner" ).remove();
                    },
                    error: function( data )
                    {
                        $( "#segmentation_button_span_text" ).text( "Error while segmenting..." );
                        $( "#segmentation_button_span_spinner" ).remove();
                    }
                } );
                $( "#tenprint_svg_div" )
Marco De Donno's avatar
Marco De Donno committed
                    .css( "width", svg_width )
                    .css( "height", svg_height );
                
                $( ".icnml_central" )
                    .css( "width", svg_width * 2 )
                    .css( "height", svg_height );
                
                $( "#zoomed_image" ).attr( "width", svg_width );
                $( "#zoomed_image" ).attr( "height", svg_height );
                
                $( "#tp_polygones" ).empty();
                
                for( var i = 0; i < zones_array.length; i++ )
                {
                    var fpc = zones_array[ i ];
                    var zone = zonesData[ fpc ];
Marco De Donno's avatar
Marco De Donno committed
                    
                    var x = zone[ "x" ] * svg_width;
                    var y = zone[ "y" ] * svg_height;
                    var height = zone[ "height" ] * svg_height;
                    var width = zone[ "width" ] * svg_width;
                    var orientation = zone[ "orientation" ];
                        .append( segment_svg( fpc, x, y, height, width, orientation ) );
Marco De Donno's avatar
Marco De Donno committed
                }
                
                $( "#tp_polygones > g > rect" ).on( "mousewheel", mouse_wheel );
            
            var delete_tenprint = function()
            {
Marco De Donno's avatar
Marco De Donno committed
                $( "<div />" )
                    .attr( "id", "delete_confirmation" )
                    .text( "Do you really want to delete this tenprint card?" )
                    .dialog( {
                        title: "Confirm tenprint deletion",
                        modal: true,
                        buttons: {
                            "OK": function()
Marco De Donno's avatar
Marco De Donno committed
                                $.ajax( {
                                    url: "{{ url_for( 'submission.submission_tenprint_delete', submission_id = submission_id, tenprint_id = file[ 'uuid' ] ) }}",
Marco De Donno's avatar
Marco De Donno committed
                                    dataType: "json",
                                    success: function( data )
                                    {
                                        $( "#delete_confirmation" ).remove();
                                        window.location = "{{ url_for( 'submission.submission_tenprint_list', submission_id = submission_id ) }}";
Marco De Donno's avatar
Marco De Donno committed
                                    },
                                    error: function( data )
                                    {
                                        $( "#delete_confirmation" ).remove();
                                    }
                                } );
                            "Cancel": function()
                                $( this ).dialog( "close" );
                            },
                        },
                        close: function()
                        {
                            $( this ).remove();
                        }
                    } );
            }
            var update_zone_db = function( fpc, x, y, height, width, orientation )
                var img = $( "#tenprint_svg > image" );
                
                $.ajax( {
                    url: "{{ url_for( 'submission.submission_segment_setcoordinates', submission_id = submission_id, tenprint_id = file[ 'uuid' ] ) }}",
                    dataType: "json",
                    method: "POST",
                    data: {
                        fpc: fpc,
                        x: x,
                        y: y,
                        w: width,
                        h: height,
                        img_height: img.height(),
                        img_width: img.width(),
                        orientation: orientation
                    },
                    success: function( data )
                    {
                    },
                    error: function( data )
                    {
                        toastr.error( "Segment data not saved", "Network error" );
                    }
                } );
            }
            
            var delete_zone_db = function()
            {
                $.ajax( {
                    url: "{{ url_for( 'submission.submission_segment_deletecoordinates', submission_id = submission_id, tenprint_id = file[ 'uuid' ] ) }}",
                    dataType: "json",
                    success: function( data )
                    {
                        $( "#tp_polygones > g" ).remove();
                        
                        current_fpc = null;
                        current_fpc_pointer = -1;
                        next_fpc();
                    },
                    error: function( data )
                    {
                        toastr.error( "Segment data not deleted", "Network error" );
                    }
                } );
            }
            
            var start_click_pos = null;
            var current_action = null;
            var move_text = null;
            var svg_mouse_on = false;
            var current_fpc = null;
            var current_fpc_pointer = -1;
            
            var svg_mouseenter = function( event )
            {
                svg_mouse_on = true;
            }
            var svg_mouseleave = function( event )
            {
                svg_mouse_on = false;
                $( "#mouse_move_cross > line" ).css( "opacity", "0" );
                
                move_text = null;
                $( "#move_text" )
                    .attr( "x", 0 )
                    .attr( "y", 0 )
                    .text( "" )
            }
            
            var start_action = function( event )
            {
                event.preventDefault();
                
                start_click_pos = {
                    x: event.offsetX,
                    y: event.offsetY
                }
                
Marco De Donno's avatar
Marco De Donno committed
                switch( event.target.nodeName )
                        if( event.button === 0 )
                            start_add_segment( event );
                        else
                            next_fpc();
                        
                        break;
                    
                    case "polygon":
                    case "rect":
                        if( dist_to_br_corner( event ) < 30 )
                            start_resize_segment( event );
                        else
                            start_move_segment( event );
                        console.log( "no start action" );
                        break;
                }
                
                return false;
            }
            var end_action = function( event )
            {
                event.preventDefault();
                
                start_click_pos = null;
Marco De Donno's avatar
Marco De Donno committed
                switch( current_action )
                    case "add_segment":
                        end_add_segment( event );
                        break;
                    
                    case "move_segment":
                        end_move_segment( event );
                    case "resize_segment":
                        end_resize_segment( event );
                        break;
                    
                        console.log( "no end action" );
            var move_action = function( event )
            {
Marco De Donno's avatar
Marco De Donno committed
                switch( current_action )
                    case "move_segment":
                        move_move_segment( event );
                        break;
                    
                    case "add_segment":
                        move_add_segment( event );
                        break;
                    
                    case "resize_segment":
                        move_resize_segment( event );
                        break;
                    
                        switch( event.target.nodeName )
                        {
                            case "rect":
                                move_hover_rect( event );
                                break;
                        }
            var next_fpc = function()
            {
                current_fpc_pointer += 1;
                
                if( current_fpc_pointer >= to_annotate.length )
                {
                    current_fpc = null;
                } else {
                    while( $( "#segment_fpc_" + to_annotate[ current_fpc_pointer ] ).length === 1 )
                    {
                        return next_fpc();
                    }
                
                    current_fpc = to_annotate[ current_fpc_pointer ];
                }
                move_text = current_fpc;
            }
            
            var click_and_drag_value = {
                startx: 0,
                starty: 0,
                endx: 0,
                endy: 0
            };
            var start_add_segment = function( event )
            {
Marco De Donno's avatar
Marco De Donno committed
                current_action = "add_segment";
                click_and_drag_value = {
                    startx: 0,
                    starty: 0,
                    endx: 0,
                    endy: 0
                };
                
                click_and_drag_value.startx = event.offsetX;
                click_and_drag_value.starty = event.offsetY;
                
                $( SVG( "rect" ) )
                    .attr( "id", "tmp_rect" )
                    .attr( "x", click_and_drag_value.startx )
                    .attr( "y", click_and_drag_value.starty )
                    .attr( "height", 0 )
                    .attr( "width", 0 )
                    .attr( "fill", "rgb( 255, 0, 0 )" )
                    .attr( "fill-opacity", "0.1" )
                    .attr( "stroke", "red" )
                    .attr( "stroke-width", "1" )
                    .appendTo( $( "#tp_polygones" ) );
            var move_add_segment = function( evnet )
            {
                diff_x = event.offsetX - start_click_pos.x;
                diff_y = event.offsetY - start_click_pos.y;
                
                var a = Math.min( event.offsetX, start_click_pos.x );
                var b = Math.min( event.offsetY, start_click_pos.y );
                
                $( "#tmp_rect" )
                    .attr( "x", a )
                    .attr( "y", b )
                    .attr( "width", Math.abs( diff_x ) )
                    .attr( "height", Math.abs( diff_y ) )
            }
            var end_add_segment = function( event )
            {
                click_and_drag_value.endx = event.offsetX;
                click_and_drag_value.endy = event.offsetY;
                
                var x = Math.min( click_and_drag_value.startx, click_and_drag_value.endx );
                var y = Math.min( click_and_drag_value.starty, click_and_drag_value.endy );
                var width = click_and_drag_value.endx - click_and_drag_value.startx;
                var height = click_and_drag_value.endy - click_and_drag_value.starty;
                
                height = Math.abs( height );
                width = Math.abs( width );
                if( height > 10 && width > 10 )
                {
                        .append( segment_svg( current_fpc, x, y, height, width, orientation ) );
                    $( "#tp_polygones > g > rect" ).on( "mousewheel", mouse_wheel );
                    
                    zones_array.push( current_fpc );
                    zonesData[ current_fpc ] = {
                        fpc: current_fpc,
                        x: x / svg_width,
                        y: y / svg_height,
                        height: height / svg_height,
                        width: width / svg_width,
                        orientation: 0
                    }
                    orientationsData[ current_fpc ] = 0;
                    update_zone_db( current_fpc, x, y, height, width, 0 );
                
                click_and_drag_value = {
                    startx: 0,
                    starty: 0,
                    endx: 0,
                    endy: 0
                };
Marco De Donno's avatar
Marco De Donno committed
                current_action = null;
            var move_target_initial_pos = {};
            var move_target_line_initial_pos = {};
            var start_move_segment = function( event )
            {
Marco De Donno's avatar
Marco De Donno committed
                current_action = "move_segment";
                move_target = event.target;
                move_target_initial_pos = {
                    x: parseFloat( $( move_target ).attr( "x" ) ),
                    y: parseFloat( $( move_target ).attr( "y" ) )
                move_target_line_initial_pos = {
                    x1: parseFloat( $( move_target ).parent().children( "line" ).attr( "x1" ) ),
                    x2: parseFloat( $( move_target ).parent().children( "line" ).attr( "x2" ) ),
                    y1: parseFloat( $( move_target ).parent().children( "line" ).attr( "y1" ) ),
                    y2: parseFloat( $( move_target ).parent().children( "line" ).attr( "y2" ) )
                }
                
                click_and_drag_value.startx = event.offsetX;
                click_and_drag_value.starty = event.offsetY;
            }
            var move_move_segment = function( event )
            {
                diff_x = event.offsetX - start_click_pos.x;
                diff_y = event.offsetY - start_click_pos.y;
                
                $( move_target ).attr( "x", move_target_initial_pos.x + diff_x );
                $( move_target ).attr( "y", move_target_initial_pos.y + diff_y );
                
                $( move_target ).parent().children( "text" ).attr( "x", move_target_initial_pos.x + diff_x );
                $( move_target ).parent().children( "text" ).attr( "y", move_target_initial_pos.y + diff_y - 5 );
                
                $( move_target ).parent().children( "line" ).attr( "x1", move_target_line_initial_pos.x1 + diff_x );
                $( move_target ).parent().children( "line" ).attr( "y1", move_target_line_initial_pos.y1 + diff_y );
                $( move_target ).parent().children( "line" ).attr( "x2", move_target_line_initial_pos.x2 + diff_x );
                $( move_target ).parent().children( "line" ).attr( "y2", move_target_line_initial_pos.y2 + diff_y );
            var end_move_segment = function( event )
            {
                var x = $( move_target ).attr( "x" );
                var y = $( move_target ).attr( "y" );
                var w = $( move_target ).attr( "width" );
                var h = $( move_target ).attr( "height" );
                x = parseFloat( x );
                y = parseFloat( y );
                w = parseFloat( w );
                h = parseFloat( h );
                
                var target_id = $( move_target ).attr( "id" );
                target_id = target_id.replace( "segment_fpc_", "" );
                
                var orientation = orientationsData[ target_id ];
                
                update_zone_db( target_id, x, y, h, w, orientation );
                
                click_and_drag_value = {
                    startx: 0,
                    starty: 0,
                    endx: 0,
                    endy: 0
                };
                move_target = null;
                move_target_initial_pos = {};
                move_target_line_initial_pos = {};
Marco De Donno's avatar
Marco De Donno committed
                current_action = null;
            
            var move_hover_rect = function( event )
                if( ( dist_to_br_corner( event ) ) <= 30 )
                    $( event.target ).css( "cursor", "nwse-resize" );
                } else {
                    $( event.target ).css( "cursor", "move" );
            var move_hover_cross = function( event )
            {
                
                $( "#line_move_n" ).attr( "x1", event.offsetX );
                $( "#line_move_n" ).attr( "x2", event.offsetX );
                $( "#line_move_n" ).attr( "y1", 0 );
                $( "#line_move_n" ).attr( "y2", event.offsetY - cross_offset );
                
                $( "#line_move_w" ).attr( "x1", 0 );
                $( "#line_move_w" ).attr( "x2", event.offsetX - cross_offset );
                $( "#line_move_w" ).attr( "y1", event.offsetY );
                $( "#line_move_w" ).attr( "y2", event.offsetY );
                
                $( "#line_move_e" ).attr( "x1", event.offsetX + cross_offset );
                $( "#line_move_e" ).attr( "x2", svg_width );
                $( "#line_move_e" ).attr( "y1", event.offsetY );
                $( "#line_move_e" ).attr( "y2", event.offsetY );
                
                $( "#line_move_s" ).attr( "x1", event.offsetX );
                $( "#line_move_s" ).attr( "x2", event.offsetX );
                $( "#line_move_s" ).attr( "y1", event.offsetY + cross_offset );
                $( "#line_move_s" ).attr( "y2", svg_height );
                
                if( event.target.nodeName === "image" )
                {
                    $( "#mouse_move_cross > line" ).css( "opacity", "1" );
                } else {
                    $( "#mouse_move_cross > line" ).css( "opacity", "0.3" );
                }
                update_move_text();
            }
            
            var update_move_text = function()
            {
                if( move_text !== null )
                {
                    $( "#move_text" )
                        .attr( "x", event.offsetX + 10 )
                        .attr( "y", event.offsetY - 10 )
                        .text( "segment " + move_text + " (" + segments_position_code[ move_text ] + ")" )
            var resize_target = null;
            var resize_target_initial_size = {};
            var resize_target_line_initial_pos = {};
            var resize_target_orientation = null;
            var start_resize_segment = function( event )
            {
Marco De Donno's avatar
Marco De Donno committed
                current_action = "resize_segment";
                
                resize_target = event.target;
                resize_target_initial_size = {
                    width: parseFloat( $( resize_target ).attr( "width" ) ),
                    height: parseFloat( $( resize_target ).attr( "height" ) )
                }
                
                resize_target_line_initial_pos = {
                    x1: parseFloat( $( resize_target ).parent().children( "line" ).attr( "x1" ) ),
                    x2: parseFloat( $( resize_target ).parent().children( "line" ).attr( "x2" ) ),
                    y1: parseFloat( $( resize_target ).parent().children( "line" ).attr( "y1" ) ),
                    y2: parseFloat( $( resize_target ).parent().children( "line" ).attr( "y2" ) )
                }
                
                var target_id = $( resize_target ).attr( "id" );
                target_id = target_id.replace( "segment_fpc_", "" );
                
                resize_target_orientation = orientationsData[ target_id ];
            }
            var move_resize_segment = function( event )
            {
                diff_x = event.offsetX - start_click_pos.x;
                diff_y = event.offsetY - start_click_pos.y;
                
                $( resize_target ).attr( "width", resize_target_initial_size.width + diff_x );
                $( resize_target ).attr( "height", resize_target_initial_size.height + diff_y );
                
                switch( resize_target_orientation )
                {
                    case 0:
                        $( resize_target ).parent().children( "line" ).attr( "x2", resize_target_line_initial_pos.x2 + diff_x );
                        break;
                    
                    case 90:
                        $( resize_target ).parent().children( "line" ).attr( "y2", resize_target_line_initial_pos.y2 + diff_y );
                        break;
                    
                    case 180:
                        $( resize_target ).parent().children( "line" ).attr( "y1", resize_target_line_initial_pos.y1 + diff_y );
                        $( resize_target ).parent().children( "line" ).attr( "y2", resize_target_line_initial_pos.y2 + diff_y );
                        $( resize_target ).parent().children( "line" ).attr( "x2", resize_target_line_initial_pos.x2 + diff_x );
                        break;
                    
                    case 270:
                        $( resize_target ).parent().children( "line" ).attr( "x1", resize_target_line_initial_pos.x1 + diff_x );
                        $( resize_target ).parent().children( "line" ).attr( "x2", resize_target_line_initial_pos.x2 + diff_x );
                        $( resize_target ).parent().children( "line" ).attr( "y2", resize_target_line_initial_pos.y2 + diff_y );
                        break;
                }
            }
            var end_resize_segment = function( event )
            {
                var x = $( resize_target ).attr( "x" );
                var y = $( resize_target ).attr( "y" );
                var w = $( resize_target ).attr( "width" );
                var h = $( resize_target ).attr( "height" );
                x = parseFloat( x );
                y = parseFloat( y );
                w = parseFloat( w );
                h = parseFloat( h );
                
                var target_id = $( resize_target ).attr( "id" );
                target_id = target_id.replace( "segment_fpc_", "" );
                
                var orientation = orientationsData[ target_id ];
                
                update_zone_db( target_id, x, y, h, w, orientation );
                
                click_and_drag_value = {
                    startx: 0,
                    starty: 0,
                    endx: 0,
                    endy: 0
                };
                resize_target = null;
                resize_target_initial_size = null;
                resize_target_orientation = null;
Marco De Donno's avatar
Marco De Donno committed
                current_action = null;
            var dist_to_br_corner = function( event )
            {
                var targetx = $( event.target ).attr( "x" );
                var targety = $( event.target ).attr( "y" );
                var targetwidth = $( event.target ).attr( "width" );
                var targetheight = $( event.target ).attr( "height" );
                
                targetx = parseFloat( targetx );
                targety = parseFloat( targety );
                targetwidth = parseFloat( targetwidth );
                targetheight = parseFloat( targetheight );
                
                var dx = ( targetx + targetwidth ) - event.offsetX;
                var dy = ( targety + targetheight ) - event.offsetY;
                
            var segment_svg = function( fpc, x, y, height, width, orientation )
                var orientation_distance = 20;
                var colour = "red";
                
                var svggroup = SVG( "g" );
                
                $( SVG( "rect" ) )
                    .attr( "id", "segment_fpc_" + fpc )
                    .attr( "x", x )
                    .attr( "y", y )
                    .attr( "height", height )
                    .attr( "width", width )
                    .attr( "fill-opacity", "0.1" )
                    .attr( "stroke-width", "1" )
                    .appendTo( svggroup );
                
                if( orientation === 0 )
                {
                    $( SVG( "line" ) )
                        .attr( "id", "segment_fpc_orientationline_" + fpc )
                        .attr( "x1", x )
                        .attr( "y1", y + orientation_distance )
                        .attr( "x2", x + width )
                        .attr( "y2", y + orientation_distance )
                        .attr( "stroke", colour )
                        .attr( "stroke-width", "1" )
                        .appendTo( svggroup );
                
                } else if( orientation === 90 )
                {
                    $( SVG( "line" ) )
                        .attr( "id", "segment_fpc_orientationline_" + fpc )
                        .attr( "x1", x + orientation_distance )
                        .attr( "y1", y )
                        .attr( "x2", x + orientation_distance )
                        .attr( "y2", y + height )
                        .attr( "stroke", colour )
                        .attr( "stroke-width", "1" )
                        .appendTo( svggroup );
                
                } else if( orientation === 180 )
                {
                    $( SVG( "line" ) )
                        .attr( "id", "segment_fpc_orientationline_" + fpc )
                        .attr( "x1", x )
                        .attr( "y1", y + height - orientation_distance )
                        .attr( "x2", x + width )
                        .attr( "y2", y + height - orientation_distance )
                        .attr( "stroke", colour )
                        .attr( "stroke-width", "1" )
                        .appendTo( svggroup );
                
                } else if( orientation === 270 )
                {
                    $( SVG( "line" ) )
                        .attr( "id", "segment_fpc_orientationline_" + fpc )
                        .attr( "x1", x + width - orientation_distance )
                        .attr( "y1", y )
                        .attr( "x2", x + width - orientation_distance )
                        .attr( "y2", y + height )
                        .attr( "stroke", colour )
                        .attr( "stroke-width", "1" )
                        .appendTo( svggroup );
                }
                
                $( SVG( "text" ) )
                    .attr( "x", x )
                    .attr( "y", y - 5 )
                    .text( "segment " + fpc + " (" + segments_position_code[ fpc ] + ")" )
                    .appendTo( svggroup );
                
                return svggroup;
            }
            
            var mouse_wheel_function_active = true;
            var mouse_wheel = function( event )
            {
                if( mouse_wheel_function_active )
                {
                    mouse_wheel_function_active = false;
                    
                    var crancks = Math.sign( event.originalEvent.wheelDelta );
                    
                    var target = event.target;
                    var target_id = $( target ).attr( "id" );
                    target_id = target_id.replace( "segment_fpc_", "" );
                    
                    var tmp = ( 360 + orientationsData[ target_id ] + crancks * 90 ) % 360;
                    orientationsData[ target_id ] = tmp;
                    zonesData[ target_id ].orientation = tmp;
                    
                    updateSVG();
                    
                    var x = $( target ).attr( "x" );
                    var y = $( target ).attr( "y" );
                    var w = $( target ).attr( "width" );
                    var h = $( target ).attr( "height" );
                    x = parseFloat( x );
                    y = parseFloat( y );
                    w = parseFloat( w );
                    h = parseFloat( h );
                    
                    update_zone_db( target_id, x, y, h, w, tmp );
                    
                    setTimeout( function(){
                        mouse_wheel_function_active = true;
                    }, 200 );
                }
            }
        </script>
    </head>
    <body class="icnml_main_layout">
        {% include "header.html" %}
        <div class="icnml_content">
            <div class="icnml_tp_oneperpage">
                <form id="icnml_file_update_{{ file[ 'uuid' ] }}">
                    {% if admin %}
                        <div class="ui-widget-header ui-corner-top icnml_box_top">File '<span id="header_filename">{{ file[ 'uuid' ] }}</span>'</div>
                    {% else %}
                        <div class="ui-widget-header ui-corner-top icnml_box_top">File '<span id="header_filename">-</span>'</div>
                    {% endif %}
                    
                    <div class="ui-widget-content ui-corner-bottom icnml_box_content">
                        <div class="icnml_tp_cardbox">
                            <div id="tenprint_svg_div">
                                <svg id="tenprint_svg" width="100%" height="100%">
                                    <image x="0" y="0" width="100%" height="100%" xlink:href="{{ url_for( 'image.image_file_serve', file_id = file[ 'uuid' ] ) }}"></image>
                                    <g id="tp_polygones"></g>
                                    <g id="mouse_move_cross">
                                        <line id="line_move_e" x1="-1" y1="-1" x2="-1" y2="-1" style="stroke:rgb(0,0,255); stroke-width: 2" />
                                        <line id="line_move_w" x1="-1" y1="-1" x2="-1" y2="-1" style="stroke:rgb(0,0,255); stroke-width: 2" />
                                        <line id="line_move_n" x1="-1" y1="-1" x2="-1" y2="-1" style="stroke:rgb(0,0,255); stroke-width: 2" />
                                        <line id="line_move_s" x1="-1" y1="-1" x2="-1" y2="-1" style="stroke:rgb(0,0,255); stroke-width: 2" />
                                    </g>
                                    <text id="move_text" style="fill: red"></text>
                                </svg>
                            </div>
                        
                            <div>
                                <div class="icnml_box_fields">
                                    {% if not admin %}
                                        <div>Name</div>
                                        <div id="box_filename"></div>
                                    {% endif %}
                                    
                                    <div>Format</div>
                                    <div>{{ file[ 'format' ] }}</div>
                                    
                                    <div>Resolution</div>
                                    <div>{{ file[ 'resolution' ] }} dpi</div>
                                    
                                    <div>Width</div>
                                    <div>{{ file[ 'width' ] }} px</div>
                                    
                                    <div>Height</div>
                                    <div>{{ file[ 'height' ] }} px</div>
                                    
                                    <div>Size</div>
                                    <div>{{ file[ 'size' ] }} Mo</div>
                                    
                                    <div>Upload time</div>
                                    <div id="file_{{ file[ 'uuid' ] }}_uploadtime">-</div>
                                    <div>Quality</div>
                                    <div id="file_{{ file[ 'uuid' ] }}_quality">
                                        <select name="tenprint_quality_select">
                                            <option value="0" id="tenprint_quality_none_option" selected>None</option>
                                            {% for quality_type in quality_type %}
                                                <option value="{{ quality_type[ 'id' ] }}" id="tenprint_quality_{{ quality_type[ 'id' ] }}_option">
                                                    {{ quality_type[ 'name' ] }}
                                                </option>
                                            {% endfor %}
                                        </select>
                                    </div>
                                    
                                    {% if not admin %}
                                        <div>Notes</div>
                                        <div><textarea rows="6" id="file_note"></textarea></div>
                                    {% endif %}
                                <div class="icnml_button">
                                    <div id="delete_segments_information_button_div">
                                        <a class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" id="delete_segments_information_button" role="button" aria-disabled="false">
                                            <span class="ui-button-text" id="delete_segments_information_button_text">Delete segments informations</span>
                                        </a>
                                    </div>
                                    <div id="segmentation_button_div">
                                        <a class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" id="segmentation_button" role="button" aria-disabled="false">
                                            <span class="ui-button-text" id="segmentation_button_span_text">Update segmentation</span>
                                        </a>
                                    </div>
                                    <div id="go_to_segmentation_button_div">
                                        {% if admin %}
                                            {% set go_to_segmentation_button_url = url_for( 'submission.admin_submission_tenprint_segments_list', submission_id = submission_id, tenprint_id = file[ 'uuid' ] ) %}
                                        {% else %}
                                            {% set go_to_segmentation_button_url = url_for( 'submission.submission_tenprint_segments_list', submission_id = submission_id, tenprint_id = file[ 'uuid' ] ) %}
                                        {% endif %}
                                        <a class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" id="go_to_segmentation_button" href="{{ go_to_segmentation_button_url }}">
                                            <span class="ui-button-text" id="go_to_segmentation_button_span_text">Go to segments list</span>
                                        </a>
                                    </div>
Marco De Donno's avatar
Marco De Donno committed
                                    <div id="delete_button_div" style="margin-top: 30px;">
                                        <a class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" id="delete_button">
                                            <span class="ui-button-text" id="delete_button_span_text">Delete tenprint card</span>
                                        </a>
                                    </div>
        </div>
    </body>
    <script type="text/javascript">
        window.addEventListener( "resize", function( event )
Marco De Donno's avatar
Marco De Donno committed
        {
            update_coordinates_informations();
            updateSVG();
        } );
        
        update_coordinates_informations();
        updateSVG();
Marco De Donno's avatar
Marco De Donno committed
        
        {% if not admin %}
            $( "#header_filename" ).text( filename );
            $( "#box_filename" ).text( filename );
            $( "#file_note" ).text( note );
            
            $( "#file_note" ).on( "change", update_note_db );
        {% endif %}
Marco De Donno's avatar
Marco De Donno committed
        
        $( "#delete_button" ).on( "click", delete_tenprint );
        $( "#delete_segments_information_button" ).on( "click", delete_zone_db );
Marco De Donno's avatar
Marco De Donno committed
        
        $( "#file_{{ file[ 'uuid' ] }}_quality > select" ).on( "change", update_quality_db );
Marco De Donno's avatar
Marco De Donno committed
        
        $( "#tenprint_quality_{{ file[ 'quality' ] }}_option" ).prop( "selected", true );
        
Marco De Donno's avatar
Marco De Donno committed
        $( "#file_{{ file[ 'uuid' ] }}_uploadtime" )
            .text( moment.utc( "{{ file[ 'creation_time' ] }}" ).local().format( "MMMM Do YYYY, HH:mm:ss" ) );
        
        $( "#segmentation_button" ).on( "click", start_segmentation );
        $( "#tenprint_svg" ).on( "mousedown", start_action );
        $( "#tenprint_svg" ).on( "mousemove", move_action );
        $( "#tenprint_svg" ).on( "mousemove", move_hover_cross );
        $( "#tenprint_svg" ).on( "mouseup", end_action );
        $( "#tenprint_svg" ).on( "contextmenu", function( event )
        {
            event.preventDefault();
            return false;
        } );
        $( "#tenprint_svg" ).on( "mouseenter", svg_mouseenter );
        $( "#tenprint_svg" ).on( "mouseleave", svg_mouseleave );
        $( "#tenprint_svg" ).css( "cursor", "none" );
        $( "#tp_polygones > g > rect" ).on( "mousewheel", mouse_wheel );
        $( "#icnml_navigation_updatedonor" )
Marco De Donno's avatar
Marco De Donno committed
            .addClass( "activated" );
        {% if admin %}
            {% set nav_a = url_for( 'submission.admin_submission_list' ) %}
            {% set nav_b = url_for( 'submission.admin_submission_home', submission_id = submission_id ) %}
            var donor_display_name = "{{ file[ 'username' ] }}";
            {% set nav_c = url_for( 'submission.admin_tenprint_list', submission_id = submission_id ) %}
            var file_display_name = "{{ file[ 'uuid' ] }}";
        {% else %}
            {% set nav_a = url_for( 'submission.submission_list' ) %}
            {% set nav_b = url_for( 'submission.submission_upload_tplp', submission_id = submission_id ) %}
            var donor_display_name = nickname;