/* globals jQuery */ 
 | 
/** 
 | 
 * ext-polygon.js 
 | 
 * 
 | 
 * 
 | 
 * @copyright 2010 CloudCanvas, Inc. All rights reserved 
 | 
 * 
 | 
 */ 
 | 
export default { 
 | 
  name: 'polygon', 
 | 
  async init (S) { 
 | 
    const svgEditor = this; 
 | 
    const $ = jQuery; 
 | 
    const svgCanvas = svgEditor.canvas; 
 | 
    const {importLocale} = S, // {svgcontent} 
 | 
      // addElem = svgCanvas.addSVGElementFromJson, 
 | 
      editingitex = false; 
 | 
    const strings = await importLocale(); 
 | 
    let selElems, 
 | 
      // svgdoc = S.svgroot.parentNode.ownerDocument, 
 | 
      // newFOG, newFOGParent, newDef, newImageName, newMaskID, modeChangeG, 
 | 
      // edg = 0, 
 | 
      // undoCommand = 'Not image'; 
 | 
      started, newFO; 
 | 
  
 | 
    // const ccZoom; 
 | 
    // const wEl, hEl; 
 | 
    // const wOffset, hOffset; 
 | 
    // const ccRBG; 
 | 
    // const ccOpacity; 
 | 
    // const brushW, brushH; 
 | 
  
 | 
    // const ccDebug = document.getElementById('debugpanel'); 
 | 
  
 | 
    /* const properlySourceSizeTextArea = function(){ 
 | 
     // TODO: remove magic numbers here and get values from CSS 
 | 
     const height = $('#svg_source_container').height() - 80; 
 | 
     $('#svg_source_textarea').css('height', height); 
 | 
     }; */ 
 | 
    function showPanel (on) { 
 | 
      let fcRules = $('#fc_rules'); 
 | 
      if (!fcRules.length) { 
 | 
        fcRules = $('<style id="fc_rules"></style>').appendTo('head'); 
 | 
      } 
 | 
      fcRules.text(!on ? '' : ' #tool_topath { display: none !important; }'); 
 | 
      $('#polygon_panel').toggle(on); 
 | 
    } 
 | 
  
 | 
    /* 
 | 
    function toggleSourceButtons(on){ 
 | 
      $('#tool_source_save, #tool_source_cancel').toggle(!on); 
 | 
      $('#polygon_save, #polygon_cancel').toggle(on); 
 | 
    } 
 | 
    */ 
 | 
  
 | 
    function setAttr (attr, val) { 
 | 
      svgCanvas.changeSelectedAttribute(attr, val); 
 | 
      svgCanvas.call('changed', selElems); 
 | 
    } 
 | 
  
 | 
    function cot (n) { 
 | 
      return 1 / Math.tan(n); 
 | 
    } 
 | 
  
 | 
    function sec (n) { 
 | 
      return 1 / Math.cos(n); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
    * Obtained from http://code.google.com/p/passenger-top/source/browse/instiki/public/svg-edit/editor/extensions/ext-itex.js?r=3 
 | 
    * This function sets the content of of the currently-selected foreignObject element, 
 | 
    *   based on the itex contained in string. 
 | 
    * @param {string} tex The itex text. 
 | 
    * @returns {boolean} This function returns false if the set was unsuccessful, true otherwise. 
 | 
    */ 
 | 
    /* 
 | 
    function setItexString(tex) { 
 | 
      const mathns = 'http://www.w3.org/1998/Math/MathML', 
 | 
        xmlnsns = 'http://www.w3.org/2000/xmlns/', 
 | 
        ajaxEndpoint = '../../itex'; 
 | 
      const elt = selElems[0]; 
 | 
      try { 
 | 
        const math = svgdoc.createElementNS(mathns, 'math'); 
 | 
        math.setAttributeNS(xmlnsns, 'xmlns', mathns); 
 | 
        math.setAttribute('display', 'inline'); 
 | 
        const semantics = document.createElementNS(mathns, 'semantics'); 
 | 
        const annotation = document.createElementNS(mathns, 'annotation'); 
 | 
        annotation.setAttribute('encoding', 'application/x-tex'); 
 | 
        annotation.textContent = tex; 
 | 
        const mrow = document.createElementNS(mathns, 'mrow'); 
 | 
        semantics.append(mrow, annotation); 
 | 
        math.append(semantics); 
 | 
        // make an AJAX request to the server, to get the MathML 
 | 
        $.post(ajaxEndpoint, {tex, display: 'inline'}, function(data){ 
 | 
          const children = data.documentElement.childNodes; 
 | 
          while (children.length > 0) { 
 | 
             mrow.append(svgdoc.adoptNode(children[0], true)); 
 | 
          } 
 | 
          svgCanvas.sanitizeSvg(math); 
 | 
          svgCanvas.call('changed', [elt]); 
 | 
        }); 
 | 
        elt.firstChild.replaceWith(math); 
 | 
        svgCanvas.call('changed', [elt]); 
 | 
        svgCanvas.clearSelection(); 
 | 
      } catch(e) { 
 | 
        console.log(e); 
 | 
        return false; 
 | 
      } 
 | 
  
 | 
      return true; 
 | 
    } 
 | 
    */ 
 | 
    const buttons = [{ 
 | 
      id: 'tool_polygon', 
 | 
      icon: svgEditor.curConfig.extIconsPath + 'polygon.png', 
 | 
      type: 'mode', 
 | 
      position: 11, 
 | 
      events: { 
 | 
        click () { 
 | 
          svgCanvas.setMode('polygon'); 
 | 
          showPanel(true); 
 | 
        } 
 | 
      } 
 | 
    }]; 
 | 
    const contextTools = [{ 
 | 
      type: 'input', 
 | 
      panel: 'polygon_panel', 
 | 
      id: 'polySides', 
 | 
      size: 3, 
 | 
      defval: 5, 
 | 
      events: { 
 | 
        change () { 
 | 
          setAttr('sides', this.value); 
 | 
        } 
 | 
      } 
 | 
    }]; 
 | 
    return { 
 | 
      name: strings.name, 
 | 
      svgicons: svgEditor.curConfig.extIconsPath + 'polygon-icons.svg', 
 | 
      buttons: strings.buttons.map((button, i) => { 
 | 
        return Object.assign(buttons[i], button); 
 | 
      }), 
 | 
      context_tools: strings.contextTools.map((contextTool, i) => { 
 | 
        return Object.assign(contextTools[i], contextTool); 
 | 
      }), 
 | 
  
 | 
      callback () { 
 | 
        $('#polygon_panel').hide(); 
 | 
  
 | 
        const endChanges = function () { 
 | 
        }; 
 | 
  
 | 
        // TODO: Needs to be done after orig icon loads 
 | 
        setTimeout(function () { 
 | 
          // Create source save/cancel buttons 
 | 
          /* const save = */ $('#tool_source_save').clone().hide().attr('id', 'polygon_save').unbind().appendTo('#tool_source_back').click(function () { 
 | 
            if (!editingitex) { 
 | 
              return; 
 | 
            } 
 | 
            // Todo: Uncomment the setItexString() function above and handle ajaxEndpoint? 
 | 
            /* 
 | 
            if (!setItexString($('#svg_source_textarea').val())) { 
 | 
              $.confirm('Errors found. Revert to original?', function (ok) { 
 | 
                if (!ok) { 
 | 
                  return false; 
 | 
                } 
 | 
                endChanges(); 
 | 
              }); 
 | 
            } else { */ 
 | 
            endChanges(); 
 | 
            // } 
 | 
            // setSelectMode(); 
 | 
          }); 
 | 
  
 | 
          /* const cancel = */ $('#tool_source_cancel').clone().hide().attr('id', 'polygon_cancel').unbind().appendTo('#tool_source_back').click(function () { 
 | 
            endChanges(); 
 | 
          }); 
 | 
        }, 3000); 
 | 
      }, 
 | 
      mouseDown (opts) { 
 | 
        // const e = opts.event; 
 | 
        const rgb = svgCanvas.getColor('fill'); 
 | 
        // const ccRgbEl = rgb.substring(1, rgb.length); 
 | 
        const sRgb = svgCanvas.getColor('stroke'); 
 | 
        // ccSRgbEl = sRgb.substring(1, rgb.length); 
 | 
        const sWidth = svgCanvas.getStrokeWidth(); 
 | 
  
 | 
        if (svgCanvas.getMode() === 'polygon') { 
 | 
          started = true; 
 | 
  
 | 
          newFO = svgCanvas.addSVGElementFromJson({ 
 | 
            element: 'polygon', 
 | 
            attr: { 
 | 
              cx: opts.start_x, 
 | 
              cy: opts.start_y, 
 | 
              id: svgCanvas.getNextId(), 
 | 
              shape: 'regularPoly', 
 | 
              sides: document.getElementById('polySides').value, 
 | 
              orient: 'x', 
 | 
              edge: 0, 
 | 
              fill: rgb, 
 | 
              strokecolor: sRgb, 
 | 
              strokeWidth: sWidth 
 | 
            } 
 | 
          }); 
 | 
  
 | 
          return { 
 | 
            started: true 
 | 
          }; 
 | 
        } 
 | 
      }, 
 | 
      mouseMove (opts) { 
 | 
        if (!started) { 
 | 
          return; 
 | 
        } 
 | 
        if (svgCanvas.getMode() === 'polygon') { 
 | 
          // const e = opts.event; 
 | 
          const c = $(newFO).attr(['cx', 'cy', 'sides', 'orient', 'fill', 'strokecolor', 'strokeWidth']); 
 | 
          let x = opts.mouse_x; 
 | 
          let y = opts.mouse_y; 
 | 
          const {cx, cy, fill, strokecolor, strokeWidth, sides} = c, // {orient} = c, 
 | 
            edg = (Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy))) / 1.5; 
 | 
          newFO.setAttribute('edge', edg); 
 | 
  
 | 
          const inradius = (edg / 2) * cot(Math.PI / sides); 
 | 
          const circumradius = inradius * sec(Math.PI / sides); 
 | 
          let points = ''; 
 | 
          for (let s = 0; sides >= s; s++) { 
 | 
            const angle = 2.0 * Math.PI * s / sides; 
 | 
            x = (circumradius * Math.cos(angle)) + cx; 
 | 
            y = (circumradius * Math.sin(angle)) + cy; 
 | 
  
 | 
            points += x + ',' + y + ' '; 
 | 
          } 
 | 
  
 | 
          // const poly = newFO.createElementNS(NS.SVG, 'polygon'); 
 | 
          newFO.setAttribute('points', points); 
 | 
          newFO.setAttribute('fill', fill); 
 | 
          newFO.setAttribute('stroke', strokecolor); 
 | 
          newFO.setAttribute('stroke-width', strokeWidth); 
 | 
          // newFO.setAttribute('transform', 'rotate(-90)'); 
 | 
          // const shape = newFO.getAttribute('shape'); 
 | 
          // newFO.append(poly); 
 | 
          // DrawPoly(cx, cy, sides, edg, orient); 
 | 
          return { 
 | 
            started: true 
 | 
          }; 
 | 
        } 
 | 
      }, 
 | 
  
 | 
      mouseUp (opts) { 
 | 
        if (svgCanvas.getMode() === 'polygon') { 
 | 
          const attrs = $(newFO).attr('edge'); 
 | 
          const keep = (attrs.edge !== '0'); 
 | 
          // svgCanvas.addToSelection([newFO], true); 
 | 
          return { 
 | 
            keep, 
 | 
            element: newFO 
 | 
          }; 
 | 
        } 
 | 
      }, 
 | 
      selectedChanged (opts) { 
 | 
        // Use this to update the current selected elements 
 | 
        selElems = opts.elems; 
 | 
  
 | 
        let i = selElems.length; 
 | 
        while (i--) { 
 | 
          const elem = selElems[i]; 
 | 
          if (elem && elem.getAttribute('shape') === 'regularPoly') { 
 | 
            if (opts.selectedElement && !opts.multiselected) { 
 | 
              $('#polySides').val(elem.getAttribute('sides')); 
 | 
  
 | 
              showPanel(true); 
 | 
            } else { 
 | 
              showPanel(false); 
 | 
            } 
 | 
          } else { 
 | 
            showPanel(false); 
 | 
          } 
 | 
        } 
 | 
      }, 
 | 
      elementChanged (opts) { 
 | 
        // const elem = opts.elems[0]; 
 | 
      } 
 | 
    }; 
 | 
  } 
 | 
}; 
 |