/* globals jQuery */ 
 | 
/** 
 | 
 * ext-overview_window.js 
 | 
 * 
 | 
 * @license MIT 
 | 
 * 
 | 
 * @copyright 2013 James Sacksteder 
 | 
 * 
 | 
 */ 
 | 
export default { 
 | 
  name: 'overview_window', 
 | 
  init ({isChrome, isIE}) { 
 | 
    const $ = jQuery; 
 | 
    const overviewWindowGlobals = {}; 
 | 
    // Disabled in Chrome 48-, see https://github.com/SVG-Edit/svgedit/issues/26 and 
 | 
    // https://code.google.com/p/chromium/issues/detail?id=565120. 
 | 
    if (isChrome()) { 
 | 
      const verIndex = navigator.userAgent.indexOf('Chrome/') + 7; 
 | 
      const chromeVersion = parseInt(navigator.userAgent.substring(verIndex), 10); 
 | 
      if (chromeVersion < 49) { 
 | 
        return; 
 | 
      } 
 | 
    } 
 | 
  
 | 
    // Define and insert the base html element. 
 | 
    const propsWindowHtml = 
 | 
      '<div id="overview_window_content_pane" style="width:100%; word-wrap:break-word;  display:inline-block; margin-top:20px;">' + 
 | 
        '<div id="overview_window_content" style="position:relative; left:12px; top:0px;">' + 
 | 
          '<div style="background-color:#A0A0A0; display:inline-block; overflow:visible;">' + 
 | 
            '<svg id="overviewMiniView" width="150" height="100" x="0" y="0" viewBox="0 0 4800 3600" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">' + 
 | 
              '<use x="0" y="0" xlink:href="#svgroot"> </use>' + 
 | 
            '</svg>' + 
 | 
            '<div id="overview_window_view_box" style="min-width:50px; min-height:50px; position:absolute; top:30px; left:30px; z-index:5; background-color:rgba(255,0,102,0.3);">' + 
 | 
            '</div>' + 
 | 
          '</div>' + 
 | 
        '</div>' + 
 | 
      '</div>'; 
 | 
    $('#sidepanels').append(propsWindowHtml); 
 | 
  
 | 
    // Define dynamic animation of the view box. 
 | 
    const updateViewBox = function () { 
 | 
      const portHeight = parseFloat($('#workarea').css('height')); 
 | 
      const portWidth = parseFloat($('#workarea').css('width')); 
 | 
      const portX = $('#workarea').scrollLeft(); 
 | 
      const portY = $('#workarea').scrollTop(); 
 | 
      const windowWidth = parseFloat($('#svgcanvas').css('width')); 
 | 
      const windowHeight = parseFloat($('#svgcanvas').css('height')); 
 | 
      const overviewWidth = $('#overviewMiniView').attr('width'); 
 | 
      const overviewHeight = $('#overviewMiniView').attr('height'); 
 | 
  
 | 
      const viewBoxX = portX / windowWidth * overviewWidth; 
 | 
      const viewBoxY = portY / windowHeight * overviewHeight; 
 | 
      const viewBoxWidth = portWidth / windowWidth * overviewWidth; 
 | 
      const viewBoxHeight = portHeight / windowHeight * overviewHeight; 
 | 
  
 | 
      $('#overview_window_view_box').css('min-width', viewBoxWidth + 'px'); 
 | 
      $('#overview_window_view_box').css('min-height', viewBoxHeight + 'px'); 
 | 
      $('#overview_window_view_box').css('top', viewBoxY + 'px'); 
 | 
      $('#overview_window_view_box').css('left', viewBoxX + 'px'); 
 | 
    }; 
 | 
    $('#workarea').scroll(function () { 
 | 
      if (!(overviewWindowGlobals.viewBoxDragging)) { 
 | 
        updateViewBox(); 
 | 
      } 
 | 
    }); 
 | 
    $('#workarea').resize(updateViewBox); 
 | 
    updateViewBox(); 
 | 
  
 | 
    // Compensate for changes in zoom and canvas size. 
 | 
    const updateViewDimensions = function () { 
 | 
      const viewWidth = $('#svgroot').attr('width'); 
 | 
      const viewHeight = $('#svgroot').attr('height'); 
 | 
  
 | 
      let viewX = 640; 
 | 
      let viewY = 480; 
 | 
      if (isIE()) { 
 | 
        // This has only been tested with Firefox 10 and IE 9 (without chrome frame). 
 | 
        // I am not sure if if is Firefox or IE that is being non compliant here. 
 | 
        // Either way the one that is noncompliant may become more compliant later. 
 | 
        // TAG:HACK 
 | 
        // TAG:VERSION_DEPENDENT 
 | 
        // TAG:BROWSER_SNIFFING 
 | 
        viewX = 0; 
 | 
        viewY = 0; 
 | 
      } 
 | 
  
 | 
      const svgWidthOld = $('#overviewMiniView').attr('width'); 
 | 
      const svgHeightNew = viewHeight / viewWidth * svgWidthOld; 
 | 
      $('#overviewMiniView').attr('viewBox', viewX + ' ' + viewY + ' ' + viewWidth + ' ' + viewHeight); 
 | 
      $('#overviewMiniView').attr('height', svgHeightNew); 
 | 
      updateViewBox(); 
 | 
    }; 
 | 
    updateViewDimensions(); 
 | 
  
 | 
    // Set up the overview window as a controller for the view port. 
 | 
    overviewWindowGlobals.viewBoxDragging = false; 
 | 
    const updateViewPortFromViewBox = function () { 
 | 
      const windowWidth = parseFloat($('#svgcanvas').css('width')); 
 | 
      const windowHeight = parseFloat($('#svgcanvas').css('height')); 
 | 
      const overviewWidth = $('#overviewMiniView').attr('width'); 
 | 
      const overviewHeight = $('#overviewMiniView').attr('height'); 
 | 
      const viewBoxX = parseFloat($('#overview_window_view_box').css('left')); 
 | 
      const viewBoxY = parseFloat($('#overview_window_view_box').css('top')); 
 | 
  
 | 
      const portX = viewBoxX / overviewWidth * windowWidth; 
 | 
      const portY = viewBoxY / overviewHeight * windowHeight; 
 | 
  
 | 
      $('#workarea').scrollLeft(portX); 
 | 
      $('#workarea').scrollTop(portY); 
 | 
    }; 
 | 
    $('#overview_window_view_box').draggable({ 
 | 
      containment: 'parent', 
 | 
      drag: updateViewPortFromViewBox, 
 | 
      start () { overviewWindowGlobals.viewBoxDragging = true; }, 
 | 
      stop () { overviewWindowGlobals.viewBoxDragging = false; } 
 | 
    }); 
 | 
    $('#overviewMiniView').click(function (evt) { 
 | 
      // Firefox doesn't support evt.offsetX and evt.offsetY. 
 | 
      const mouseX = (evt.offsetX || evt.originalEvent.layerX); 
 | 
      const mouseY = (evt.offsetY || evt.originalEvent.layerY); 
 | 
      const overviewWidth = $('#overviewMiniView').attr('width'); 
 | 
      const overviewHeight = $('#overviewMiniView').attr('height'); 
 | 
      const viewBoxWidth = parseFloat($('#overview_window_view_box').css('min-width')); 
 | 
      const viewBoxHeight = parseFloat($('#overview_window_view_box').css('min-height')); 
 | 
  
 | 
      let viewBoxX = mouseX - 0.5 * viewBoxWidth; 
 | 
      let viewBoxY = mouseY - 0.5 * viewBoxHeight; 
 | 
      // deal with constraints 
 | 
      if (viewBoxX < 0) { 
 | 
        viewBoxX = 0; 
 | 
      } 
 | 
      if (viewBoxY < 0) { 
 | 
        viewBoxY = 0; 
 | 
      } 
 | 
      if (viewBoxX + viewBoxWidth > overviewWidth) { 
 | 
        viewBoxX = overviewWidth - viewBoxWidth; 
 | 
      } 
 | 
      if (viewBoxY + viewBoxHeight > overviewHeight) { 
 | 
        viewBoxY = overviewHeight - viewBoxHeight; 
 | 
      } 
 | 
  
 | 
      $('#overview_window_view_box').css('top', viewBoxY + 'px'); 
 | 
      $('#overview_window_view_box').css('left', viewBoxX + 'px'); 
 | 
      updateViewPortFromViewBox(); 
 | 
    }); 
 | 
  
 | 
    return { 
 | 
      name: 'overview window', 
 | 
      canvasUpdated: updateViewDimensions, 
 | 
      workareaResized: updateViewBox 
 | 
    }; 
 | 
  } 
 | 
}; 
 |