Zepto(function($) { // a jQuery.getScript() equivalent to asyncronously load javascript files // credits to http://stackoverflow.com/a/8812950/1597388 var getScript = function(src, func) { var script = document.createElement('script'); script.async = 'async'; script.src = src; if (func) { script.onload = func; } document.getElementsByTagName('head')[0].appendChild( script ); }; // load prettify asyncronously to speedup page rendering getScript('//cdnjs.cloudflare.com/ajax/libs/prettify/r224/prettify.js', function() { prettyPrint(); }); var $frameContainer = $('.frames-container'); var $container = $('.details-container'); var $activeLine = $frameContainer.find('.frame.active'); var $activeFrame = $container.find('.frame-code.active'); var $ajaxEditors = $('.editor-link[data-ajax]'); var headerHeight = $('header').height(); var highlightCurrentLine = function() { // Highlight the active and neighboring lines for this frame: var activeLineNumber = +($activeLine.find('.frame-line').text()); var $lines = $activeFrame.find('.linenums li'); var firstLine = +($lines.first().val()); $($lines[activeLineNumber - firstLine - 1]).addClass('current'); $($lines[activeLineNumber - firstLine]).addClass('current active'); $($lines[activeLineNumber - firstLine + 1]).addClass('current'); } // Highlight the active for the first frame: highlightCurrentLine(); $frameContainer.on('click', '.frame', function() { var $this = $(this); var id = /frame\-line\-([\d]*)/.exec($this.attr('id'))[1]; var $codeFrame = $('#frame-code-' + id); if ($codeFrame) { $activeLine.removeClass('active'); $activeFrame.removeClass('active'); $this.addClass('active'); $codeFrame.addClass('active'); $activeLine = $this; $activeFrame = $codeFrame; highlightCurrentLine(); $container.scrollTop(0); } }); var clipboard = new Clipboard('.clipboard'); var showTooltip = function(elem, msg) { elem.setAttribute('class', 'clipboard tooltipped tooltipped-s'); elem.setAttribute('aria-label', msg); }; clipboard.on('success', function(e) { e.clearSelection(); showTooltip(e.trigger, 'Copied!'); }); clipboard.on('error', function(e) { showTooltip(e.trigger, fallbackMessage(e.action)); }); var btn = document.querySelector('.clipboard'); btn.addEventListener('mouseleave', function(e) { e.currentTarget.setAttribute('class', 'clipboard'); e.currentTarget.removeAttribute('aria-label'); }); function fallbackMessage(action) { var actionMsg = ''; var actionKey = (action === 'cut' ? 'X' : 'C'); if (/Mac/i.test(navigator.userAgent)) { actionMsg = 'Press ⌘-' + actionKey + ' to ' + action; } else { actionMsg = 'Press Ctrl-' + actionKey + ' to ' + action; } return actionMsg; } $(document).on('keydown', function(e) { if(e.ctrlKey) { // CTRL+Arrow-UP/Arrow-Down support: // 1) select the next/prev element // 2) make sure the newly selected element is within the view-scope // 3) focus the (right) container, so arrow-up/down (without ctrl) scroll the details if (e.which === 38 /* arrow up */) { $activeLine.prev('.frame').click(); $activeLine[0].scrollIntoView(); $container.focus(); e.preventDefault(); } else if (e.which === 40 /* arrow down */) { $activeLine.next('.frame').click(); $activeLine[0].scrollIntoView(); $container.focus(); e.preventDefault(); } } }); // Avoid to quit the page with some protocol (e.g. IntelliJ Platform REST API) $ajaxEditors.on('click', function(e){ e.preventDefault(); $.get(this.href); }); });