<commit_before>'use strict';

// Useful functions
var accentMap = {
    "á": "a",
    "à": "a",
    "â": "a",
    "é": "e",
    "è": "e",
    "ê": "e",
    "ë": "e",
    "ç": "c",
    "î": "i",
    "ï": "i",
    "ô": "o",
    "ö": "o",
    "ù": "u",
    "Û": "u",
    "ü": "u"
},  clean_accents  = function(term) {
    var ret = "";
    for ( var i = 0; i < term.length; i++ ) {
        ret += accentMap[ term.charAt(i) ] || term.charAt(i);
    }
    return ret;
},  opacity_amdts = function(d){
    if (d > 1000) d = 1000;
    return 0.05+0.75*d/1000;
},  opacity_mots = function(d){
    if (d > 100000) d = 100000;
    return 0.05+0.75*d/100000;
},  upperFirst = function(s){
    return (!s ? "" : s.charAt(0).toUpperCase() + s.substring(1));
};

/* Directives */

angular.module('theLawFactory.directives', []).directive('mod1', ['api', '$rootScope', '$location', '$compile',
function(api, $rootScope, $location, $compile) {
    return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/mod1.html',
        controller: function($scope,$element,$attrs) {
            $scope.mod="mod1";
            $scope.setHelpText("Chaque boîte représente un article dont la taille indique la longueur du texte et la couleur le degré de modifications à cette étape. Cliquez sur un article pour lire le texte et voir le détail des modifications.");
            $scope.vizTitle = "ARTICLES";
        },
        link : function postLink(scope, element, attrs) {


            var mod1 = thelawfactory.mod1();

            function update() {

                scope.startSpinner();

                api.getArticle(scope.loi).then(function(data) {
                    $rootScope.lawTitle = data.short_title
                    $rootScope.pageTitle =  $rootScope.lawTitle + " - Articles | ";
                    d3.select(element[0]).datum(data).call(mod1);
                    scope.stopSpinner();
                }, function(error) {
                    scope.display_error("impossible de trouver les articles de ce texte");
                })
            }
            update();
        }
    };
}]).directive('mod2', ['api', '$rootScope', '$location', '$compile',
function(api, $rootScope, $location, $compile) {
    return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/mod2.html',
        controller : function($scope, $element, $attrs) {
            $scope.step = 0;
            $scope.mod="mod2";
            $scope.setHelpText("Chaque boîte représente un amendement dont le pictogramme indique le sort et la couleur le groupe politique de ses auteurs. Cliquez sur un amendement pour en lire le contenu et les détails.");
            $scope.vizTitle = "AMENDEMENTS";
        },
        link : function postLink(scope, element, attrs) {

            var mod2 = thelawfactory.mod2();

            function update() {

                scope.startSpinner();

                if (scope.etape != null) api.getAmendement(scope.loi, scope.etape).then(function(data) {
                    scope.data = data;
                    $rootScope.pageTitle =  $rootScope.lawTitle + " - Amendements | ";
                    d3.select(element[0]).datum(data).call(mod2);
                }, function(error) {
                    scope.display_error("impossible de trouver les amendements pour ce texte à cette étape");
                });
            }
            update();
        }
    }
}])
.directive('mod2b', ['api', '$rootScope', '$location', '$compile',
function(api, $rootScope, $location, $compile) {
    return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/mod2b.html',
        controller : function($scope, $element, $attrs) {
            $scope.step = 0;
            $scope.mod="mod2b";
            $scope.setHelpText("Chaque boîte représente un groupe d'orateurs intervenus dans les débats sur un sujet. La longueur indique le nombre de mots prononcés et la couleur le groupe politique. Cliquez sur une boîte pour voir la liste des orateurs et consulter le texte des débats.");
            $scope.vizTitle = "DÉBATS";
        },
        link : function postLink(scope, element, attrs) {

            function update() {

                scope.startSpinner();

                if (scope.etape != null) {

                    api.getIntervention(scope.loi).then(function(data) {
                        scope.data = data;
                        $rootScope.pageTitle =  $rootScope.lawTitle + " - Débats | ";
                        init(data, scope.etape);
                    }, function(error) {
                        scope.display_error("impossible de trouver les interventions pour ce texte à cette étape");
                    })
                }
            }
            update();
        }
    };
}])
.directive('mod0', ['api', '$rootScope', '$location', '$compile',
function(api, $rootScope, $location, $compile) {
    return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/mod0.html',
        controller : function($scope, $element, $attrs) {
            $scope.mod="mod0";
            $scope.setHelpText("Chaque ligne représente la chronologie des débats sur un projet ou une proposition de loi. La couleur indique l'institution en charge du texte à un instant donné (Assemblée en bleu, Sénat en rouge...). Cliquez sur un texte pour en consulter le résumé et en explorer les articles.");
            $scope.vizTitle = "NAVETTES";
        },
        link : function postLink(scope, element, attrs) {

            $rootScope.pageTitle = "";

            $(".title").html('<h4 class="law-title">Explorer les textes promulgués depuis 2010</h4>');
            $("#mod0-slider").slider({
                min:1,
                max:10,
                animate: true,
                value:1,
                slide: function( event, ui ) {
                    zooming(ui.value);
                }
            })
            var mod0 = thelawfactory.mod0();

            function update() {
                scope.startSpinner();
                api.getDossiers().then(function(data) {
                  d3.select(element[0]).datum(data).call(mod0);
                }, function(error) {
                    scope.display_error("impossible de trouver les données relatives aux textes");
                })
            }
            update();

        }
    };
}])
.directive('lawlist', ['api', '$rootScope', "$location",
function(api, $rootScope, $location) {
    return {
        restrict : 'A',
        replace : false,
        link : function postLink(scope, element, attrs, lawlistCtrl) {
           function update() {
                api.getLawlist().then(function(data) {
                    scope.ll = data;
                    // Process data to a list of law object
                    // with properties' names set by headers
                    var headers, laws, rows = scope.ll.split(/\r\n|\n/);
                    headers = rows.splice(0,1)[0].split(";").map(function(x){return x.replace(/(^"|"$)/g, '')});
                    laws = $.map(rows, function(row) {
                        var law = {}, lawdata = row.split(';').map(function(x){return x.replace(/(^"|"$)/g, '')});
                        $.each(headers, function(i, header) {
                            law[header] = lawdata[i];
                        });
                        return law;
                    });

                    document.lawlist = laws;

                    $("#search").mouseenter(function() {
                        $(".form-law").css('opacity', 1);
                    }).mouseleave(function() {
                        $(".form-law").css('opacity', 0.3);
                    }).autocomplete({
                        source : function(request, response) {
                            var matcher = new RegExp($.ui.autocomplete.escapeRegex(clean_accents(request.term)), "i");
                            response($.map($.grep(laws.sort(function(a,b){ return b["Date de promulgation"] > a["Date de promulgation"];}), function(value) {
                                                            value = clean_accents(value.Titre +" "+ value.id +" "+ value["Thèmes"] + " " + value.short_title);
                                return matcher.test(clean_accents(value));
                            }), function(n, i) {
                                return {
                                    "label" : n.short_title.replace(/ \([^)]*\)/g, '') + " (" + n.Titre + ")",
                                    "value" : n.id,
                                    "themes": n["Thèmes"],
                                    "amendements": n.total_amendements,
                                    "words": n.total_mots,
                                    "dates": n["Date initiale"] + (n["Date de promulgation"] ? " → " + n["Date de promulgation"] : "")
                                }
                            }));
                        },
                        focus : function(event, ui) {
                            $(".form-law").css('opacity', 1);
                            event.preventDefault();
                            $(".src-fcs").removeClass("src-fcs");
                            $("."+ui.item.value).addClass("src-fcs");
                        },
                        open : function() {
                            $(".form-law").css('opacity', 1);
                            var h = $(".ui-autocomplete").position().top;
                            $(".ui-autocomplete").css({
                              'max-height': $(window).height() - h - 100,
                              'overflow-y': 'scroll'
                            });
                        },
                        close: function() {
                            $(".form-law").css('opacity', 0.3);
                            $('#header-search .message').text('');
                        },
                        appendTo : ".lawlist",
                        select : function(event, ui) {
                            $rootScope.$apply(function() {
                                $("body").css("overflow", "auto");
                                $location.path(($location.path()==='/lois.html' ? 'loi' : 'article') + "s.html");
                                $location.search("loi=" + ui.item.value);
                                $(".form-law").css('opacity', 0.3);
                            });
                        },
                        messages: {
                            noResults: function(d) { var msg = 'Aucune loi trouvée'; $('#header-search .message').text(msg); return msg; },
                            results: function(d) { var msg = d + " loi" + (d > 1 ? "s trouvées" : " trouvée"); $('#header-search .message').text(msg); return msg;}
                        }
                    })
                    .data( "ui-autocomplete" )._renderItem = function( ul, item ) {
                    var themesdiv=$("<div>")
                    item.themes.replace(/ et /g, ', ').split(', ').forEach(function(e,j){
                        themesdiv.append("<span class='glyphicon glyphicon-tag'></span> "+e.toLowerCase()+" ");
                    })

                    var icodiv=$("<div class='src-ico'>")
                        .append('<div><span class="glyphicon glyphicon-calendar"></span> '+item.dates+"</div>")
                        .append('<div title="'+item.amendements+' amendements déposés sur ce texte" class="search" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-folder-open" style="opacity: '+opacity_amdts(item.amendements)+'"></span> '+item.amendements+"</div>")
                        .append('<div title="'+item.words+' mots prononcés lors des débats sur ce texte" class="search" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-comment" style="opacity: '+opacity_mots(item.words)+'"></span> '+1000*(Math.round(item.words / 1000.))+"</div>")
                        .append(themesdiv);
                        $(".search").tooltip();

                    var txtdiv=$("<div class='src-txt'>")
                        .append( "<a>" +item.label + "</a>" )
                        .append(icodiv);

                    return $( "<li class="+item.value+">" )
                        .append(txtdiv)
                        .appendTo( ul );
                    };
                }, function(error) {
                    scope.display_error("impossible de trouver les données de recherche sur les textes");
                })
            }
            update();
        }
    }
}])
.directive('movescroll', [ '$rootScope',function($rootScope) {
return {
    restrict : 'A',
    controller : function($scope, $element, $attrs) {
        $scope.pos=[-1,-1];
        $scope.xmouselerp=d3.scale.linear().range([-100,0,0,100]).clamp(true);
        $scope.ymouselerp=d3.scale.linear().range([-100,0,0,100]).clamp(true);
    },
    link : function postLink(scope, element, attrs,movescrollCtrl) {

        scope.xmouselerp.domain([0,element.width()*0.2,element.width()*0.8, element.width()])
        scope.ymouselerp.domain([0,element.height()*0.2,element.height()*0.8, element.height()])

        var clicking = false;
        var inpos=[-1,-1];
        // No dragging in the borders because of issues with the overflow scollbar
        var gantt_o = $('#gantt').offset(),
            mouse_xmax = gantt_o.left + $('#gantt').width() - 20,
            mouse_ymax = gantt_o.top + $('#gantt').height() - 20;

        element.mousedown(function(e){
            if (e.pageX > mouse_xmax || e.pageY > mouse_ymax)
                return;
            clicking = true;
            inpos[0]= e.pageX;
            inpos[1]= e.pageY;
        });

        $(document).mouseup(function(){
            clicking = false;
            inpos=[-1,-1];
        });

        element.mousemove(function(e){
            if(clicking == false) return;
            e.stopPropagation();
            var x = (e.pageX-inpos[0])*2;
            var y = (e.pageY-inpos[1])*2;
            element.scrollTop(element.scrollTop()-y);
            element.scrollLeft(element.scrollLeft()-x);
            inpos[0]=e.pageX;
            inpos[1]=e.pageY;
        });
    }
};
}])
.directive('stepsbar', ['$timeout','api', '$rootScope', "$location",
    function(timer,api, $rootScope, $location) { return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/stepsbar.html',
        controller : function($scope, $element, $attrs) {
        },

        link : function preLink(scope, element, attrs, stepsbarCtrl) {

            scope.total=0;
            api.getProcedure(scope.loi).then(function(data) {

                var tit = upperFirst(data.long_title),
                    leg = "";
                if (tit.length > 60) {
                    leg = ' data-toggle="tooltip" data-placement="right" title="'+tit+'"';
                    tit = scope.loi.substr(0,3).toUpperCase() + " " + upperFirst(data.short_title);
                }
                $(".title").html(
                  '<h4 class="law-title"'+leg+'>'+tit+'</h4>' +
                  '<div class="allinks darkonintrojs"><span class="links">' +
                    (data.url_jo ? '<a href="'+data.url_jo+'" target="_blank" class="darkonintrojs"><span class="glyphicon glyphicon-link"></span> Loi sur Légifrance</a><br/>' : '') +
                    '<a href="'+scope.APIRootUrl + scope.loi+'/" target="_blank" class="darkonintrojs"><span class="glyphicon glyphicon-link"></span> Open Data</a>'+
	            '&nbsp; /<a href="http://git.lafabriquedelaloi.fr/parlement/' + scope.loi+'/" target="_blank" class="darkonintrojs">Git</a>' +
                  '</span><span class="links">' +
                    '<a href="'+data.url_dossier_senat+'" target="_blank" class="darkonintrojs"><span class="glyphicon glyphicon-link"></span> Dossier Sénat</a><br/>' +
                    '<a href="'+data.url_dossier_assemblee+'" target="_blank" class="darkonintrojs"><span class="glyphicon glyphicon-link"></span> Dossier Assemblée</a>' +
                  '</span></div>'
                );
                if (leg) $(".law-title").tooltip();
<commit_msg>no link to dossier if no url<commit_after>'use strict';

// Useful functions
var accentMap = {
    "á": "a",
    "à": "a",
    "â": "a",
    "é": "e",
    "è": "e",
    "ê": "e",
    "ë": "e",
    "ç": "c",
    "î": "i",
    "ï": "i",
    "ô": "o",
    "ö": "o",
    "ù": "u",
    "Û": "u",
    "ü": "u"
},  clean_accents  = function(term) {
    var ret = "";
    for ( var i = 0; i < term.length; i++ ) {
        ret += accentMap[ term.charAt(i) ] || term.charAt(i);
    }
    return ret;
},  opacity_amdts = function(d){
    if (d > 1000) d = 1000;
    return 0.05+0.75*d/1000;
},  opacity_mots = function(d){
    if (d > 100000) d = 100000;
    return 0.05+0.75*d/100000;
},  upperFirst = function(s){
    return (!s ? "" : s.charAt(0).toUpperCase() + s.substring(1));
};

/* Directives */

angular.module('theLawFactory.directives', []).directive('mod1', ['api', '$rootScope', '$location', '$compile',
function(api, $rootScope, $location, $compile) {
    return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/mod1.html',
        controller: function($scope,$element,$attrs) {
            $scope.mod="mod1";
            $scope.setHelpText("Chaque boîte représente un article dont la taille indique la longueur du texte et la couleur le degré de modifications à cette étape. Cliquez sur un article pour lire le texte et voir le détail des modifications.");
            $scope.vizTitle = "ARTICLES";
        },
        link : function postLink(scope, element, attrs) {


            var mod1 = thelawfactory.mod1();

            function update() {

                scope.startSpinner();

                api.getArticle(scope.loi).then(function(data) {
                    $rootScope.lawTitle = data.short_title
                    $rootScope.pageTitle =  $rootScope.lawTitle + " - Articles | ";
                    d3.select(element[0]).datum(data).call(mod1);
                    scope.stopSpinner();
                }, function(error) {
                    scope.display_error("impossible de trouver les articles de ce texte");
                })
            }
            update();
        }
    };
}]).directive('mod2', ['api', '$rootScope', '$location', '$compile',
function(api, $rootScope, $location, $compile) {
    return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/mod2.html',
        controller : function($scope, $element, $attrs) {
            $scope.step = 0;
            $scope.mod="mod2";
            $scope.setHelpText("Chaque boîte représente un amendement dont le pictogramme indique le sort et la couleur le groupe politique de ses auteurs. Cliquez sur un amendement pour en lire le contenu et les détails.");
            $scope.vizTitle = "AMENDEMENTS";
        },
        link : function postLink(scope, element, attrs) {

            var mod2 = thelawfactory.mod2();

            function update() {

                scope.startSpinner();

                if (scope.etape != null) api.getAmendement(scope.loi, scope.etape).then(function(data) {
                    scope.data = data;
                    $rootScope.pageTitle =  $rootScope.lawTitle + " - Amendements | ";
                    d3.select(element[0]).datum(data).call(mod2);
                }, function(error) {
                    scope.display_error("impossible de trouver les amendements pour ce texte à cette étape");
                });
            }
            update();
        }
    }
}])
.directive('mod2b', ['api', '$rootScope', '$location', '$compile',
function(api, $rootScope, $location, $compile) {
    return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/mod2b.html',
        controller : function($scope, $element, $attrs) {
            $scope.step = 0;
            $scope.mod="mod2b";
            $scope.setHelpText("Chaque boîte représente un groupe d'orateurs intervenus dans les débats sur un sujet. La longueur indique le nombre de mots prononcés et la couleur le groupe politique. Cliquez sur une boîte pour voir la liste des orateurs et consulter le texte des débats.");
            $scope.vizTitle = "DÉBATS";
        },
        link : function postLink(scope, element, attrs) {

            function update() {

                scope.startSpinner();

                if (scope.etape != null) {

                    api.getIntervention(scope.loi).then(function(data) {
                        scope.data = data;
                        $rootScope.pageTitle =  $rootScope.lawTitle + " - Débats | ";
                        init(data, scope.etape);
                    }, function(error) {
                        scope.display_error("impossible de trouver les interventions pour ce texte à cette étape");
                    })
                }
            }
            update();
        }
    };
}])
.directive('mod0', ['api', '$rootScope', '$location', '$compile',
function(api, $rootScope, $location, $compile) {
    return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/mod0.html',
        controller : function($scope, $element, $attrs) {
            $scope.mod="mod0";
            $scope.setHelpText("Chaque ligne représente la chronologie des débats sur un projet ou une proposition de loi. La couleur indique l'institution en charge du texte à un instant donné (Assemblée en bleu, Sénat en rouge...). Cliquez sur un texte pour en consulter le résumé et en explorer les articles.");
            $scope.vizTitle = "NAVETTES";
        },
        link : function postLink(scope, element, attrs) {

            $rootScope.pageTitle = "";

            $(".title").html('<h4 class="law-title">Explorer les textes promulgués depuis 2010</h4>');
            $("#mod0-slider").slider({
                min:1,
                max:10,
                animate: true,
                value:1,
                slide: function( event, ui ) {
                    zooming(ui.value);
                }
            })
            var mod0 = thelawfactory.mod0();

            function update() {
                scope.startSpinner();
                api.getDossiers().then(function(data) {
                  d3.select(element[0]).datum(data).call(mod0);
                }, function(error) {
                    scope.display_error("impossible de trouver les données relatives aux textes");
                })
            }
            update();

        }
    };
}])
.directive('lawlist', ['api', '$rootScope', "$location",
function(api, $rootScope, $location) {
    return {
        restrict : 'A',
        replace : false,
        link : function postLink(scope, element, attrs, lawlistCtrl) {
           function update() {
                api.getLawlist().then(function(data) {
                    scope.ll = data;
                    // Process data to a list of law object
                    // with properties' names set by headers
                    var headers, laws, rows = scope.ll.split(/\r\n|\n/);
                    headers = rows.splice(0,1)[0].split(";").map(function(x){return x.replace(/(^"|"$)/g, '')});
                    laws = $.map(rows, function(row) {
                        var law = {}, lawdata = row.split(';').map(function(x){return x.replace(/(^"|"$)/g, '')});
                        $.each(headers, function(i, header) {
                            law[header] = lawdata[i];
                        });
                        return law;
                    });

                    document.lawlist = laws;

                    $("#search").mouseenter(function() {
                        $(".form-law").css('opacity', 1);
                    }).mouseleave(function() {
                        $(".form-law").css('opacity', 0.3);
                    }).autocomplete({
                        source : function(request, response) {
                            var matcher = new RegExp($.ui.autocomplete.escapeRegex(clean_accents(request.term)), "i");
                            response($.map($.grep(laws.sort(function(a,b){ return b["Date de promulgation"] > a["Date de promulgation"];}), function(value) {
                                                            value = clean_accents(value.Titre +" "+ value.id +" "+ value["Thèmes"] + " " + value.short_title);
                                return matcher.test(clean_accents(value));
                            }), function(n, i) {
                                return {
                                    "label" : n.short_title.replace(/ \([^)]*\)/g, '') + " (" + n.Titre + ")",
                                    "value" : n.id,
                                    "themes": n["Thèmes"],
                                    "amendements": n.total_amendements,
                                    "words": n.total_mots,
                                    "dates": n["Date initiale"] + (n["Date de promulgation"] ? " → " + n["Date de promulgation"] : "")
                                }
                            }));
                        },
                        focus : function(event, ui) {
                            $(".form-law").css('opacity', 1);
                            event.preventDefault();
                            $(".src-fcs").removeClass("src-fcs");
                            $("."+ui.item.value).addClass("src-fcs");
                        },
                        open : function() {
                            $(".form-law").css('opacity', 1);
                            var h = $(".ui-autocomplete").position().top;
                            $(".ui-autocomplete").css({
                              'max-height': $(window).height() - h - 100,
                              'overflow-y': 'scroll'
                            });
                        },
                        close: function() {
                            $(".form-law").css('opacity', 0.3);
                            $('#header-search .message').text('');
                        },
                        appendTo : ".lawlist",
                        select : function(event, ui) {
                            $rootScope.$apply(function() {
                                $("body").css("overflow", "auto");
                                $location.path(($location.path()==='/lois.html' ? 'loi' : 'article') + "s.html");
                                $location.search("loi=" + ui.item.value);
                                $(".form-law").css('opacity', 0.3);
                            });
                        },
                        messages: {
                            noResults: function(d) { var msg = 'Aucune loi trouvée'; $('#header-search .message').text(msg); return msg; },
                            results: function(d) { var msg = d + " loi" + (d > 1 ? "s trouvées" : " trouvée"); $('#header-search .message').text(msg); return msg;}
                        }
                    })
                    .data( "ui-autocomplete" )._renderItem = function( ul, item ) {
                    var themesdiv=$("<div>")
                    item.themes.replace(/ et /g, ', ').split(', ').forEach(function(e,j){
                        themesdiv.append("<span class='glyphicon glyphicon-tag'></span> "+e.toLowerCase()+" ");
                    })

                    var icodiv=$("<div class='src-ico'>")
                        .append('<div><span class="glyphicon glyphicon-calendar"></span> '+item.dates+"</div>")
                        .append('<div title="'+item.amendements+' amendements déposés sur ce texte" class="search" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-folder-open" style="opacity: '+opacity_amdts(item.amendements)+'"></span> '+item.amendements+"</div>")
                        .append('<div title="'+item.words+' mots prononcés lors des débats sur ce texte" class="search" data-toggle="tooltip" data-placement="bottom"><span class="glyphicon glyphicon-comment" style="opacity: '+opacity_mots(item.words)+'"></span> '+1000*(Math.round(item.words / 1000.))+"</div>")
                        .append(themesdiv);
                        $(".search").tooltip();

                    var txtdiv=$("<div class='src-txt'>")
                        .append( "<a>" +item.label + "</a>" )
                        .append(icodiv);

                    return $( "<li class="+item.value+">" )
                        .append(txtdiv)
                        .appendTo( ul );
                    };
                }, function(error) {
                    scope.display_error("impossible de trouver les données de recherche sur les textes");
                })
            }
            update();
        }
    }
}])
.directive('movescroll', [ '$rootScope',function($rootScope) {
return {
    restrict : 'A',
    controller : function($scope, $element, $attrs) {
        $scope.pos=[-1,-1];
        $scope.xmouselerp=d3.scale.linear().range([-100,0,0,100]).clamp(true);
        $scope.ymouselerp=d3.scale.linear().range([-100,0,0,100]).clamp(true);
    },
    link : function postLink(scope, element, attrs,movescrollCtrl) {

        scope.xmouselerp.domain([0,element.width()*0.2,element.width()*0.8, element.width()])
        scope.ymouselerp.domain([0,element.height()*0.2,element.height()*0.8, element.height()])

        var clicking = false;
        var inpos=[-1,-1];
        // No dragging in the borders because of issues with the overflow scollbar
        var gantt_o = $('#gantt').offset(),
            mouse_xmax = gantt_o.left + $('#gantt').width() - 20,
            mouse_ymax = gantt_o.top + $('#gantt').height() - 20;

        element.mousedown(function(e){
            if (e.pageX > mouse_xmax || e.pageY > mouse_ymax)
                return;
            clicking = true;
            inpos[0]= e.pageX;
            inpos[1]= e.pageY;
        });

        $(document).mouseup(function(){
            clicking = false;
            inpos=[-1,-1];
        });

        element.mousemove(function(e){
            if(clicking == false) return;
            e.stopPropagation();
            var x = (e.pageX-inpos[0])*2;
            var y = (e.pageY-inpos[1])*2;
            element.scrollTop(element.scrollTop()-y);
            element.scrollLeft(element.scrollLeft()-x);
            inpos[0]=e.pageX;
            inpos[1]=e.pageY;
        });
    }
};
}])
.directive('stepsbar', ['$timeout','api', '$rootScope', "$location",
    function(timer,api, $rootScope, $location) { return {
        restrict : 'A',
        replace : false,
        templateUrl : 'templates/stepsbar.html',
        controller : function($scope, $element, $attrs) {
        },

        link : function preLink(scope, element, attrs, stepsbarCtrl) {

            scope.total=0;
            api.getProcedure(scope.loi).then(function(data) {

                var tit = upperFirst(data.long_title),
                    leg = "";
                if (tit.length > 60) {
                    leg = ' data-toggle="tooltip" data-placement="right" title="'+tit+'"';
                    tit = scope.loi.substr(0,3).toUpperCase() + " " + upperFirst(data.short_title);
                }
                $(".title").html(
                  '<h4 class="law-title"'+leg+'>'+tit+'</h4>' +
                  '<div class="allinks darkonintrojs"><span class="links">' +
                    (data.url_jo ? '<a href="'+data.url_jo+'" target="_blank" class="darkonintrojs"><span class="glyphicon glyphicon-link"></span> Loi sur Légifrance</a><br/>' : '') +
                    '<a href="'+scope.APIRootUrl + scope.loi+'/" target="_blank" class="darkonintrojs"><span class="glyphicon glyphicon-link"></span> Open Data</a>'+
	            '&nbsp; /<a href="http://git.lafabriquedelaloi.fr/parlement/' + scope.loi+'/" target="_blank" class="darkonintrojs">Git</a>' +
                  '</span><span class="links">' +
                    (data.url_dossier_senat ? '<a href="'+data.url_dossier_senat+'" target="_blank" class="darkonintrojs"><span class="glyphicon glyphicon-link"></span> Dossier Sénat</a>' : '') + '<br/>' +
                    (data.url_dossier_assemblee ? '<a href="'+data.url_dossier_assemblee+'" target="_blank" class="darkonintrojs"><span class="glyphicon glyphicon-link"></span> Dossier Assemblée</a>' : '') +
                  '</span></div>'
                );
                if (leg) $(".law-title").tooltip();

{'fraction_non_alphanumeric': 0.15756366983737344, 'fraction_numerical': 0.009941699907947223, 'mean_word_length': 1.5983417045363948, 'pattern_counts': {'":': 38, '<': 105, '<?xml version=': 0, '>': 117, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 18, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1271998', 'n_tokens_mistral': 9582, 'n_tokens_neox': 9090, 'n_words': 1849}