<%inherit file="/base/base.html"/>

<%block name="title">
    ${_('%s Files') % c.repo_name}
    %if hasattr(c,'file'):
        &middot; ${c.file.path or '/'}
    %endif
</%block>

<%def name="breadcrumbs_links()">
    ${_('Files')}
    %if c.file:
        @ ${h.show_id(c.changeset)}
    %endif
</%def>

<%block name="header_menu">
    ${self.menu('repositories')}
</%block>

<%def name="main()">
${self.repo_context_bar('files', c.revision)}
<div class="panel panel-primary">
    <div class="panel-heading clearfix">
        <div class="pull-left">
            ${self.breadcrumbs()}
        </div>
        <div class="pull-right">
              ${_("Branch filter:")} ${h.select('branch_selector',c.changeset.raw_id,c.revision_options)}
        </div>
    </div>
    <div class="panel-body">
        <div id="files_data">
            <%include file='files_ypjax.html'/>
        </div>
    </div>
</div>

<script>
'use strict';
var CACHE = {};
var CACHE_EXPIRE = 5*60*1000; //cache for 5*60s
//used to construct links from the search list
var _repo_files_url = ${h.jshtml(h.url("files_home",repo_name=c.repo_name,revision='',f_path='').replace('//', '/'))};
var url_base = ${h.js(h.url("files_home",repo_name=c.repo_name,revision='__REV__',f_path='__FPATH__'))};
//send the nodelist request to this url
var node_list_url = ${h.js(h.url("files_nodelist_home",repo_name=c.repo_name,revision='__REV__',f_path='__FPATH__'))};

## new pyroutes URLs
pyroutes.register('files_nodelist_home', ${h.js(h.url('files_nodelist_home', repo_name=c.repo_name,revision='%(revision)s',f_path='%(f_path)s'))}, ['revision', 'f_path']);
pyroutes.register('files_history_home', ${h.js(h.url('files_history_home', repo_name=c.repo_name,revision='%(revision)s',f_path='%(f_path)s'))}, ['revision', 'f_path']);
pyroutes.register('files_authors_home', ${h.js(h.url('files_authors_home', repo_name=c.repo_name,revision='%(revision)s',f_path='%(f_path)s'))}, ['revision', 'f_path']);

function ypjax_links(){
    $('.ypjax-link').click(function(e){

        //don't do ypjax on middle click
        if (e.which == 2) {
            return true;
        }

        var url = e.currentTarget.href;

        //extract rev and the f_path from url.
        var parts = url.split(_repo_files_url);
        if (parts.length != 2) {
            return false;
        }

        var parts2 = parts[1].split('/');
        var rev = parts2.shift(); // pop the first element which is the revision
        var f_path = parts2.join('/');

        //page title - make this consistent with title mako block above
        var title = ${h.jshtml(_('%s Files') % c.repo_name)} + " \u00B7 " + (f_path || '/') + " \u00B7 " + ${h.jshtml(c.site_name)};

        var _node_list_url = node_list_url.replace('__REV__',rev).replace('__FPATH__', f_path);
        var _url_base = url_base.replace('__REV__',rev);

        // Change our States and save some data for handling events
        var state = {url:url, title:title, url_base:_url_base,
                     node_list_url:_node_list_url, rev:rev, f_path:f_path};
        window.history.pushState(state, null, url);
        load_state(state);

        //now we're sure that we can do ypjax things
        e.preventDefault();
        return false;
    });
}

function load_state(state) {
    var $files_data = $('#files_data');
    var cache_key = state.url;
    var _cache_obj = CACHE[cache_key];
    var _cur_time = new Date().getTime();
    if (_cache_obj !== undefined && _cache_obj[0] > _cur_time) {
        $files_data.html(_cache_obj[1]);
        $files_data.css('opacity', '1.0');
        post_load_state(state);
    } else {
        asynchtml(state.url, $files_data, function() {
                  post_load_state(state);
                  var expire_on = new Date().getTime() + CACHE_EXPIRE;
                  CACHE[cache_key] = [expire_on, $files_data.html()];
            });
    }
}

function post_load_state(state) {
    ypjax_links();
    tooltip_activate();

    if(state !== undefined) {
        document.title = state.title;

        //initially loaded stuff
        var _f_path = state.f_path;
        var _rev = state.rev;

        fileBrowserListeners(state.node_list_url, state.url_base);
        // Inform Google Analytics of the change
        if ( typeof window.pageTracker !== 'undefined' ) {
            window.pageTracker._trackPageview(state.url);
        }
    }

    function highlight_lines(lines){
        for(let pos in lines){
          $('#L'+lines[pos]).css('background-color','#FFFFBE');
        }
    }
    let page_highlights = location.href.substring(location.href.indexOf('#')+1).split('L');
    if (page_highlights.length == 2){
       let highlight_ranges  = page_highlights[1].split(",");

       var h_lines = [];
       for (let pos in highlight_ranges){
            var _range = highlight_ranges[pos].split('-');
            if(_range.length == 2){
                var start = parseInt(_range[0]);
                var end = parseInt(_range[1]);
                if (start < end){
                    for(var i=start;i<=end;i++){
                        h_lines.push(i);
                    }
                }
            }
            else{
                h_lines.push(parseInt(highlight_ranges[pos]));
            }
      }
      highlight_lines(h_lines);
      $('#L'+h_lines[0]).each(function(){
          this.scrollIntoView();
      });
    }

    // select code link event
    $('#hlcode').mouseup(getSelectionLink);

    // history select field
    var cache = {};
    $('#diff1').prev('.select2-container').remove(); // Hack to handle repeated JS initialization on reused DOM
    $("#diff1").select2({
        placeholder: _TM['Select changeset'],
        dropdownAutoWidth: true,
        maxResults: 50,
        query: function(query){
          var key = 'cache';
          var cached = cache[key] ;
          if(cached) {
            var data = {results: []};
            var queryLower = query.term.toLowerCase();
            //filter results
            $.each(cached.results, function(){
                var section = this.text;
                var children = [];
                $.each(this.children, function(){
                    if(children.length < 50 ?
                       ((queryLower.length == 0) || (this.text.toLowerCase().indexOf(queryLower) >= 0)) :
                       ((queryLower.length != 0) && (this.text.toLowerCase().indexOf(queryLower) == 0))) {
                        children.push(this);
                    }
                });
                children = branchSort(children, undefined, query)
                data.results.push({'text': section, 'children': children});
            });
            //push the typed in changeset
            data.results.push({'text':_TM['Specify changeset'],
                               'children': [{'id': query.term, 'text': query.term, 'type': 'rev'}]});
            query.callback(data);
          }else{
              $.ajax({
                url: pyroutes.url('files_history_home', {'revision': _rev, 'f_path': _f_path}),
                data: {},
                dataType: 'json',
                type: 'GET',
                success: function(data) {
                  cache[key] = data;
                  query.callback(data);
                }
              });
          }
        }
    });
}

$(document).ready(function(){
    ypjax_links();

    // Process history navigation event and load its state
    window.addEventListener('popstate', function(e){
        if (e.state)
            load_state(e.state);
        else
            load_state(initial_state);
    });

    // init the search filter
    var _node_list_url = node_list_url.replace('__REV__', ${h.js(c.changeset.raw_id)}).replace('__FPATH__', ${h.js(c.file.path)});
    var _url_base = url_base.replace('__REV__', ${h.js(c.changeset.raw_id)});
    fileBrowserListeners(_node_list_url, _url_base);

    var initial_state = {url:window.location.href, title:document.title, url_base:_url_base,
         node_list_url:_node_list_url, rev:${h.js(c.changeset.raw_id)}, f_path:${h.js(c.file.path)}};

    // change branch filter
    $("#branch_selector").select2({
        dropdownAutoWidth: true,
        maxResults: 50,
        sortResults: branchSort
        });

    $("#branch_selector").change(function(e){
        var selected = e.currentTarget.options[e.currentTarget.selectedIndex].value;
        if(selected && selected != ${h.js(c.changeset.raw_id)}){
            window.location = pyroutes.url('files_home', {'repo_name': ${h.js(c.repo_name)}, 'revision': selected, 'f_path': ${h.js(c.file.path)}});
            $("#body").hide();
        } else {
            $("#branch_selector").val(${h.js(c.changeset.raw_id)});
        }
    });
    $('#show_authors').on('click', function(){
        $.ajax({
            url: pyroutes.url('files_authors_home', {'revision': ${h.js(c.changeset.raw_id)}, 'f_path': ${h.js(c.file.path)}}),
            success: function(data) {
                $('#file_authors').html(data);
                $('#file_authors').show();
                tooltip_activate();
            }
        });
    });

});

</script>

</%def>
