function PlWordnet(data) {
  console.log(data);
  PlWordnet.data = data;
  this.analyseData(data);
}

PlWordnet.wordClick = function(ev) {
  Lexp.target = PlWordnet.id;
  var target = ev.target.getAttribute('href');
  Lexp.go2URL(target)

  return false;
}

PlWordnet.prototype.sortUnits = function(_units) {
  // console.log(_units);
  var i;
  _units.sort(function(a, b) {
    if (a.synset == b.synset) {
      return a.unitid > b.unitid ? 1 : -1;
    }
    return a.synset > b.synset ? 1 : -1;
  });

  for (i = 0; i < _units.length - 1; i++) {
    if (_units[i].synset == _units[i + 1].synset) {
      _units[i + 1].smallestunitid = _units[i].smallestunitid;
    }
  }

  _units.sort(function(a, b) {
    if (a.smallestunitid == b.smallestunitid) {
      return a.unitid > b.unitid ? 1 : -1;
    }
    return a.smallestunitid > b.smallestunitid ? 1 : -1;
  });

  var i = 0,
      num = 0,
      first = -1,
      ind = 0;

  while (i < _units.length) {
    _units[i].rowspan = 0;
    if (_units[i].synset != ind) {
      if (first >= 0) {
        _units[first].rowspan = num;
      }
      first = i;
      num = 1;
      ind = _units[i].synset;
    } else {
      num += 1;
    }
    i += 1;
  }
  _units[first].rowspan = num;
}

PlWordnet.fullQualifiermapa = {"og.":"ogólne","pot.":"potoczne","wulg.":"wulgarne","posp.":"pospolite","książk.":"książkowe","urz.":"urzędowe","daw.":"dawne","specj.":"specjalistyczne","nienorm.":"nienormatywne","środ.":"środowiskowe","reg.":"regionalne"}
PlWordnet.fullQualifiermapaEnglish = {"og.":"general","pot.":"colloquial","wulg.":"vulgar","posp.":"common","książk.":"bookish","urz.":"official","daw.":"former","specj.":"special","nienorm.":"imprescriptive","środ.":"environmental","reg.":"regional"}

PlWordnet.fullQualifier = function(str) {
  if (str in PlWordnet.fullQualifiermapa) {
    if(document.body.className == 'pl') {
      return PlWordnet.fullQualifiermapa[str];
    } else {
      return PlWordnet.fullQualifiermapaEnglish[str];
    }
  }
  return "";
}

PlWordnet.citeSourcemapa = {
    "P":"przykład spreparowany przez lingwistę mający formę zdania",
    "W":"przykład z Wikipedii",
    "WN":"cytat z WikiNews",
    "Z":"zasłyszane albo wymyślone, teksty z języka mówionego"
}

PlWordnet.citeSourcemapaEnglish = {
    "P":"example developed by linguist having form of a sentence",
    "W":"example from Wikipedia",
    "WN":"quote from WikiNews",
    "Z":"overheard or made-up, texts from spoken language"
}

PlWordnet.citeSource = function(str) {
  if (str in PlWordnet.citeSourcemapa) {
    if(document.body.className == 'pl') {
      return PlWordnet.citeSourcemapa[str];
    } else {
      return PlWordnet.citeSourcemapaEnglish[str];
    }
  }
  return "";
}

PlWordnet.prototype.analyseData = function(data) {
  // console.log(data);

  function clean(str) {
    if (str != null) {
      return str.slice(0, -1)
    }
    return "";
  }

  var _units = [];

  let language = window.location.href.split("/")[4];

  for (var rid in data.synsets) {
    var synset = data.synsets[rid];
    var synsetDescription = data.synsets[rid].definition;
    for (var uid in synset.units) {
      var unit = synset.units[uid];
      var _unit = new Object();
      _unit.unitname = unit.str.split("(")[0];
      _unit.unitid = unit.id;
      _unit.smallestunitid = unit.id;
      _unit.synset = synset.id;
      _unit.url = "/lemma/" + language + "/" + unit.lemma;
      _unit.definition = clean(unit.definition);
      if (!_unit.definition) {
        _unit.definition = synsetDescription;
      }
      // console.log(_unit.definition);
      _unit.qualifier = unit.usage_notes;
      _unit.link = "";
      _unit.islemma = unit.lemma == Lexp.element.lemma;

      if (unit.external_links.length == 0) {
        _unit.link += '&nbsp';
      } else {
        for (var elid in unit.external_links) {
          var link = unit.external_links[elid];
          if (link.length > 0) {
            _unit.link += '<a href="' + link + '" style="color: inherit;">' +
            '<span lang="pl" data-toggle="tooltip" data-placement="top" title="Link do zasobu zewnętrznego" class="source glyphicon glyphicon glyphicon-link"></span></a>' +
            '<span lang="en" data-toggle="tooltip" data-placement="top" title="Link for external resource" class="source glyphicon glyphicon glyphicon-link"></span></a>';
          }
        }
      }
      _unit.examples = "";
      for (var seid in unit.sense_examples) {
        if (unit.sense_examples[seid].length > 0)
       _unit.examples += unit.sense_examples[seid] +
        '<span rel="tooltip"  data-original-title="' + PlWordnet.citeSource(unit.sense_examples_sources[seid]) +
        '"> #' + unit.sense_examples_sources[seid] + "</span><br>";
      }
      _units.push(_unit);
    }
  }

  if($('#type').val() == 'synsetid') {
    /* Synset way */
    this.sortUnits(data.units);
    this.data = data.units;
  } else {
    /* Normal way */
    this.sortUnits(_units);
    this.data = _units;
  }
}

PlWordnet.prototype.createAdditionalInfo = function(jsonData, title, titleEn, lang = 'pl') {
  let textData = '',
      quantity = 0;
  $(jsonData).each(function(index, element) {
    $(element[2].units).each(function(index2, element2) {
      let definition = '',
          horizontalLine = '<hr />';
      quantity++;
      if (element2.definition !== null && element2.definition !== ',' && element2.definition !== '.') {
        definition = '<p class="description">' + element2.definition + '</p>';
      }
      if (jsonData.length - 1 == index) {
        if (element[2].units.length - 1 == index2) {
          horizontalLine = '';
        }
      }
      textData +=
        // '<a href="http://plwordnet.pwr.wroc.pl/wordnet/lemma/' + element2.lemma + '" title="lemma" target="_blank">' +
        '<a href="/synsetid/plwordnet/' + element2.synset + '">' +
        '<p class="title">' + element2.lemma + '</p>' +
        '</a>' +
        `<img width="40" height="20" class="img-responsive show-icon" src="/img/lang-${lang}-32.png" alt="Language1" />` +
        definition +
        horizontalLine;
    });
  });

  if (quantity != 0) {
    let data =
    '<div class="plwordnet-box">' +
      '<h2>' +
        '<img class="img-responsive show-icon" src="/img/lang-' + lang + '-32.png" alt="Language2" />' +
        '<span lang="pl">' + title + ' (' + quantity + ')' + '</span>' +
        '<span lang="en">' + titleEn + ' (' + quantity + ')' + '</span>' +
      '</h2>' +
      textData +
    '</div>';

    $('#lexpelement_plwordnet #plwordnet-box-left').append(data);
  }
}

PlWordnet.emotionMap = {
  "+ s":"weak positive", "+ m":"strong positive"
};

PlWordnet.prototype.showHTMLForSynset = function() {
  let synsetID = this.data[0].synset;
  $('#lexpelement_plwordnet').append(
    '<div class="plwordnet-container">' +
      '<div id="plwordnet-box-right"></div>' +
      '<div id="plwordnet-box-left"></div>' +
    '</div>');

  this.createAdditionalInfo(PlWordnet.data.related.fuzzynimia_synsetów, 'Fuzzynimia synsetów', 'Fuzzyimia of synsets');
  this.createAdditionalInfo(PlWordnet.data.related.hiperonimia, 'Hiperonimia', 'Hiperonimia');
  this.createAdditionalInfo(PlWordnet.data.related.hiponimia, 'Hiponimia', 'Hyponymy');
  this.createAdditionalInfo(PlWordnet.data.related["holonimia/część"], 'Holonimia część', 'Holonimia part');
  this.createAdditionalInfo(PlWordnet.data.related["holonimia/miejsce"], 'Holonimia miejsce', 'Holonimia place');
  this.createAdditionalInfo(PlWordnet.data.related["synonimia_międzyjęzykowa/Syn_plWN-PWN"], 'Synonimia', 'Synonymy', 'en');

  this.createAdditionalInfo(PlWordnet.data.related["Hyponym"], 'Hiponim', 'Hyponymy', 'en');
  this.createAdditionalInfo(PlWordnet.data.related["synonimia_międzyjęzykowa/Syn_PWN-plWN"], 'Synonimia', 'Synonymy');

  $(PlWordnet.data.units).each(function(index, element) {
    let examples = '',
        definition = element.definition || PlWordnet.data.definition || '-',
        language = (element.pos.indexOf('en') > -1) ? 'en' : 'pl';

    $(element.sense_examples).each(function(index2, element2) {
      if (element2 != '') {
        examples += '<p class="description">"' + element2 + '" - <i>' + PlWordnet.citeSource(element.sense_examples_sources[index2]) + '</i></p>';
      }
    });

    if (examples == '') { examples = '-'; }

    let data =
      '<div class="plwordnet-box slides">' +
        '<div class="fixed-space category"><span lang="pl">Słowo</span><span lang="en">Word</span></div>' +
        '<div class="fixed-space">' +
          '<h2 class="lemma">' + element.lemma + '</h2>' +
          '<img class="img-responsive show-icon" src="/img/lang-' + language + '-32.png" alt="Language3" />' +
          '<p class="description">' + definition + '</p>' +
        '</div>' +
        '<hr />' +

        '<div class="fixed-space category"><span lang="pl">Domena</span><span lang="en">Domain</span></div>' +
        '<div class="fixed-space">' +
          '<p class="description">' + element.domain + '</p>' +
        '</div>' +
        '<hr />' +

        '<div class="fixed-space category"><span lang="pl">Przykłady</span><span lang="en">Examples</span></div>' +
        '<div class="fixed-space">' +
          examples +
        '</div>' +
        '<hr />' +

        '<div class="fixed-space category"><span lang="pl">Hiperonimy</span><span lang="en">Hiperonims</span></div>' +
        '<div class="fixed-space">' +
          '<p id="show-path" class="description" data-toggle="modal" data-target="#path-modal"><span lang="pl">Pokaż ścieżkę do najwyższego hiperonimu</span><span lang="en">Show path to the highest hiperonim</span></p>' +
        '</div>' +
        '<hr />' +
        showEmotion(element) +
      '</div>';

    $('#lexpelement_plwordnet #plwordnet-box-right').append(data);
  });

  addArrows();
  showSlides(slideIndex);

  $('#lexpelement_plwordnet #plwordnet-box-right').append(
    // '<p id="show-graph" class="description" data-toggle="modal" data-target="#graph-modal" onClick="PlWordnet.showGraph"><span lang="pl">Wyświetl wizualizację graficzną</span><span lang="en">Show graphic visualization</span></p>'
    '<div class="fixed-space category"><span lang="pl">Graf</span><span lang="en">Graph</span></div>' +
    '<div class="fixed-space">' +
      '<p id="show-graph" class="description" data-toggle="modal" data-target="#graph-modal" onClick="PlWordnet.showGraph"><span lang="pl">Wyświetl wizualizację graficzną</span><span lang="en">Show graphic visualization</span></p>' +
    '</div>'
  );

  $('#lexpelement_plwordnet').append(
    '<div id="graph-visualisation">' +
      '<div class="modal fade" id="graph-modal" role="dialog">' +
        '<div class="modal-content">' +
          '<div class="modal-header">' +
            '<span data-dismiss="modal" class="close" id="aboutAppClose">&times;</span>' +
            '<h2 lang="pl">Wizualizacja graficzna</h2>' +
            '<h2 lang="en">Graphic visualisation</h2>' +
          '</div>' +
          '<div id="graph" class="modal-body"></div>' +
          '<div class="modal-footer">webserwisy@clarin-pl.eu</div>' +
        '</div>' +
      '</div>' +
    '</div>');

  $('#lexpelement_plwordnet').append(
    '<div id="path-visualisation">' +
      '<div class="modal fade" id="path-modal" role="dialog">' +
        '<div class="modal-content">' +
          '<div class="modal-header">' +
            '<span data-dismiss="modal" class="close" id="aboutAppClose">&times;</span>' +
            '<h2 lang="pl">Wizualizacja graficzna</h2>' +
            '<h2 lang="en">Graphic visualisation</h2>' +
          '</div>' +
          '<div id="path" class="modal-body">' +
            '<svg id="path-to-highest-hiperonim"></svg>' +
            // '<svg id="path-to-highest-hiperonim" viewBox="0 0 793 1122"></svg>' +
          '</div>' +
          '<div class="modal-footer">webserwisy@clarin-pl.eu</div>' +
        '</div>' +
      '</div>' +
    '</div>');

  $('#show-graph').on('click', function() {
    setTimeout(function() {
      showGraph(synsetID);
    }, 200);
  });

}

function showEmotion(element) {
  let emotionEmotions = '',
      emotionValuations = '',
      emotionPolarity = element.emotion_markedness || '-',
      emotionExamples = element.emotion_example || '-';

  if (emotionPolarity in PlWordnet.emotionMap) {
    emotionPolarity = PlWordnet.emotionMap[emotionPolarity];
  }

  $(element.emotion_names).each(function(index2, element2) {
    if (element2 != '') {
      emotionEmotions += (index2 == element.emotion_names.length - 1) ? element2 : element2 + ', ';
    }
  });

  $(element.emotion_valuations).each(function(index2, element2) {
    if (element2 != '') {
      emotionValuations += (index2 == element.emotion_valuations.length - 1) ? element2 : element2 + ', ';
    }
  });

  if (emotionEmotions == '' && emotionValuations == '' && emotionPolarity == '-' && emotionExamples == '-') {
    return '';
  }

  if (emotionEmotions == '') { emotionEmotions = '-'; }
  if (emotionValuations == '') { emotionValuations = '-'; }

  let emotionHTML =
    '<div class="fixed-space category"><span lang="pl">Annotacje emocjonalne</span><span lang="en">Emotional annotations</span></div>' +
    '<div class="fixed-space">' +
      '<div class="emotion-box">' +
        '<div class="fixed-space-emotion category d-inline-block"><span lang="pl">Nacechowanie</span><span lang="en">Polarity</span></div>' +
        '<div class="d-inline-block emotion-description">' + emotionPolarity + '</div>' +
      '</div>' +
      '<div class="emotion-box">' +
        '<div class="fixed-space-emotion category d-inline-block"><span lang="pl">Emocje</span><span lang="en">Emotions</span></div>' +
        '<div class="d-inline-block emotion-description">' + emotionEmotions + '</div>' +
      '</div>' +
      '<div class="emotion-box">' +
        '<div class="fixed-space-emotion category d-inline-block"><span lang="pl">Wartościowanie</span><span lang="en">Valuations</span></div>' +
        '<div class="d-inline-block emotion-description">' + emotionValuations + '</div>' +
      '</div>' +
      '<div class="emotion-box">' +
        '<div class="fixed-space-emotion category d-inline-block"><span lang="pl">Przykłady</span><span lang="en">Examples</span></div>' +
        '<div class="d-inline-block emotion-description">' + emotionExamples + '</div>' +
      '</div>' +
    '</div>' +
    '<hr />';

  return emotionHTML;
}

function showGraph(synsetID) {
  let width = window.innerWidth - 200 || docEl.clientWidth - 200 || bodyEl.clientWidth - 200,
      height = window.innerHeight - 200 || docEl.clientHeight - 200 || bodyEl.clientHeight - 200;

  width = document.getElementById('graph').offsetWidth;

  const graph = new GraphCreator.GraphCreator('graph', false, width, height);
  graph.showMiniMap(.25, null, 0, 0);
  graph.initializeFromSynsetId(synsetID);
}

function createNetworkGraph() {
  console.log(PlWordnet.data.path);
  let graph = PlWordnet.data.path;

  let width = window.innerWidth - 200 || docEl.clientWidth - 200 || bodyEl.clientWidth - 200;
  let height = window.innerHeight - 200 || docEl.clientHeight - 200 || bodyEl.clientHeight - 200;

  let svg = d3.select("svg#path-to-highest-hiperonim")
    .attr("width", width)
    .attr("height", height)
    .call(d3.zoom().on("zoom", function () {
      svg.attr("transform", d3.event.transform);
    }));

  let simulation = d3.forceSimulation()
      .force("link", d3.forceLink().id(function(d) { return d.id; }))
      // .force("charge", d3.forceManyBody().strength(-5000).distanceMax(900).distanceMin(100))
      .force("charge", d3.forceManyBody().strength(-2000).distanceMax(900).distanceMin(100))
      .force("center", d3.forceCenter(width / 2, height / 2));

  graph.links.forEach(function(d) {
    d.source = d.source_id;
    d.target = d.target_id;
  });

  let link = svg.append("g")
    .style("stroke", "#AAA")
    .selectAll("line")
    .data(graph.links)
    .enter().append("line");

  let node = svg.append("g")
    .attr("class", "nodes")
    .selectAll("rect")
    .data(graph.nodes)
    .enter()
    .append("rect")
      .attr("x", function(d) { return d.x; })
      .attr("y", function(d) { return d.y; })
      .attr("width", 200)
      .attr("height", 50)
      .call(d3.drag()
        .on("start", dragstarted)
        .on("drag", dragged)
        .on("end", dragended));

  let label = svg.append("g")
      .attr("class", "labels")
      .selectAll("text")
      .data(graph.nodes)
      .enter().append("text")
        .attr("class", "label")
        .text(function(d) { return d.name; });

  simulation.nodes(graph.nodes).on("tick", ticked);

  simulation.force("link").links(graph.links);

  function ticked() {
    link.attr("x1", function(d) { return d.source.x + 100; })
        .attr("y1", function(d) { return d.source.y; })
        .attr("x2", function(d) { return d.target.x + 100; })
        .attr("y2", function(d) { return d.target.y; });

    node.style("fill", "#D9D9D9")
        .style("stroke", "#969696")
        .style("stroke-width", "1px")
       .attr("x", function(d) { return d.x; })
       .attr("y", function(d) { return d.y; })
       .attr("width", 200)
       .attr("height", 50)

    label.attr("x", function(d) { return d.x + 20; })
          .attr("y", function (d) { return d.y + 30; })
          .style("font-size", "18px").style("fill", "#4393C3");
  }

  function dragstarted(d) {
    if (!d3.event.active) {
      simulation.alphaTarget(0.3).restart();
    }
    d.fx = d.x;
    d.fy = d.y;
  }

  function dragged(d) {
    d.fx = d3.event.x;
    d.fy = d3.event.y;
  }

  function dragended(d) {
    if (!d3.event.active) {
      simulation.alphaTarget(0);
    }
  }
}

function addArrows() {
  $('#plwordnet-box-right').append(
    '<div id="arrow-left" onClick="plusSlides(-1)"><</div>' +
    '<div id="arrow-right" onClick="plusSlides(1)">></div>'
  );
}

var slideIndex = 1;

function plusSlides(n) {
  showSlides(slideIndex += n);
}

function currentSlide(n) {
  showSlides(slideIndex = n);
}

function showSlides(n) {
  let i, slides = $(".slides");

  if (n > slides.length) {slideIndex = 1}
  if (n < 1) {slideIndex = slides.length}

  for (i = 0; i < slides.length; i++) {
    slides[i].style.display = "none";
  }

  slides[slideIndex - 1].style.display = "block";
}

PlWordnet.prototype.showHTML = function(tag) {
  if($('#type').val() == 'synsetid') {
    this.showHTMLForSynset();
    $('#lexpelement_plwordnet img').hide();
      // Append Network Graph
    createNetworkGraph();
  } else {
    tag.html("");
    var _html =
      '<div class="table-responsive" align="left">' +
        '<table class="table">' +
          '<thead>' +
            '<tr>' +
              '<th style="min-width: 110px">Synset ID</th>' +
              '<th><span lang="pl">Jednostka</span><span lang="en">Lexical unit</span></th>' +
              '<th><span lang="pl">Kwalifikator</span><span lang="en">Qualifier</span></th>' +
              '<th><span lang="pl">Glosa</span><span lang="en">Gloss</span></th>' +
              '<th>&nbsp;</th>' +
              '<th><span lang="pl">Przykład użycia</span><span lang="en">Usage example</span></th>' +
            '</tr>' +
          '</thead>' +
          '<tbody>';

    for (var uid in this.data) {
      var unit = this.data[uid];
      // console.log(unit);

      var spanb = "";
      var spane = "";
      if (unit.islemma) {
        spanb = '<span style="color:green;">';
        spane = '</span>';
      }

      _html += '<tr>';

      if (unit.rowspan > 0) {
        // _html += '<td rowspan=' + unit.rowspan + '>' + unit.synset +'</td>';
        _html += '<td rowspan=' + unit.rowspan + '><a type="lexp" href="/synsetid/plwordnet/' + unit.synset +'">' + unit.synset + '</a></td>';
      }

      _html += '<td>' + spanb;
      if (unit.islemma) {
        _html += unit.unitname;
      } else {
        if($('#type').val() == 'synsetid') {
          /* Synset way */
          let language = window.location.href.split("/")[4];
          x = unit.str.substr(0, unit.str.indexOf('('));
          _html += '<a type="lexp" href="/lemma/' + language + '/' + unit.lemma + '">' + x + '</a>';
        } else {
          /* Normal way */
          _html += '<a type="lexp" href="' + unit.url + '">' + unit.unitname + '</a>';
        }
      }

      // console.log(unit);

      var glosaLink = '';

      if($('#type').val() == 'synsetid') {
        /* Synset way */
        if (unit.external_links.length > 0) {
          glosaLink +=
          '<a type="lexp" href="' + unit.external_links[0] + '" style="color: inherit;">' +
          '<span lang="pl" data-toggle="tooltip" data-placement="top" title="ALink do zasobu zewnętrznego" class="source glyphicon glyphicon glyphicon-link"></span></a>' +
          '<span lang="en" data-toggle="tooltip" data-placement="top" title="ALink for external resource" class="source glyphicon glyphicon glyphicon-link"></span></a>';
        }
      } else {
        /* Normal way */
        glosaLink = unit.link;
      }

      if($('#type').val() == 'synsetid') {
        let definition = '',
            example = '',
            exampleLink = '',
            qualifier = '';

        if (unit.definition != null) {
          definition = unit.definition;
        }
        if (unit.sense_examples[0] != undefined && unit.sense_examples[0] != null && unit.sense_examples[0].length != 0) {
          example = unit.sense_examples[0];
        }
        if (unit.usage_notes[0] != undefined && unit.usage_notes[0] != null && unit.usage_notes[0].length != 0) {
          qualifier = unit.usage_notes[0];
        }
        if (unit.sense_examples_sources != null  && unit.sense_examples_sources.length != 0) {
          exampleLink = unit.sense_examples_sources[0];
        }
        /* Synset way */
        _html += spane + '</td>';
        _html += '<td>' + spanb + '<span rel="tooltip"  data-original-title="' + PlWordnet.fullQualifier(unit.qualifier)+'">' + qualifier + '</span>' + spane + '</td>';
        _html += '<td>' + spanb + definition + spane + '</td>';
        _html += '<td>' + glosaLink + '</td>';
        _html += '<td>' + spanb + example + " #" + exampleLink + spane + '</td>';
        _html += '</tr>';
      } else {
        let definition = '-',
            examples = '-',
            qualifier = '-';

        console.log(unit);

        if (unit.definition != null && unit.definition != '') {
          definition = unit.definition;
        }
        if (unit.examples != null && unit.examples != '') {
          examples = unit.examples;
        }
        if (unit.qualifier != null  && unit.qualifier.length != 0) {
          qualifier = unit.qualifier[0];
        }
        /* Normal way */
        // console.log(unit.examples);
        _html += spane + '</td>';
        _html += '<td>' + spanb + '<span rel="tooltip"  data-original-title="' + PlWordnet.fullQualifier(unit.qualifier)+'">'+ qualifier + '</span>' + spane + '</td>';
        _html += '<td>' + spanb + definition + spane + '</td>';
        _html += '<td>' + glosaLink + '</td>';
        _html += '<td>' + spanb + examples + spane + '</td>';
        _html += '</tr>';
      }
    }
    _html += '</tbody></table></div>';

    tag.html(_html);
    tag.find("a[type='lexp']" ).click(PlWordnet.wordClick);
    tag.find('[rel=tooltip]').tooltip();
  }


}

PlWordnet.id = "plwordnet";

$(function () {
  Element.addVisualizer(PlWordnet.id, PlWordnet);

  $('#lexp_results').on('mouseup', '#lexpelement_plwordnet', function(event) {
    let lemma = selectWord() || '',
        lang = $('#lang').val(),
        data = new Object();

    data.lemma = lemma;
    data.lang = lang || 'pl';
    data.left = event.originalEvent.clientX - 80 || 0;
    data.top = event.originalEvent.clientY - 55 || 0;

    if (lemma.length < 10) {
      data.left = event.originalEvent.clientX - 65 || 0;
    }

    positionTooltip(data);
  });
});