globi.viewInteractions = function (id, interactionType, sourceTaxonScientificName, interactionDescription, onClickScientificName) { var search = {"sourceTaxonScientificName": sourceTaxonScientificName, "interactionType": interactionType}; var callback = function (interactions) { var htmlText = '<b>' + interactionDescription + '</b>'; if (interactions && interactions.length === 0) { htmlText += ' <b> nothing</b>'; } d3.select('#' + id).html(htmlText); interactions.forEach(function (interaction) { var taxonInfo = globi.createTaxonInfo(interaction.target.name); taxonInfo.registerOnClick(onClickScientificName); taxonInfo.on('ready', function() { taxonInfo.appendTaxonInfoTo(document.getElementById(id)); }); }); }; globiData.findSpeciesInteractions(search, callback); };
globi.addInteractionGraph = function (options) { var ee = new EventEmitter(); var legendDiv = document.createElement('div'); legendDiv.setAttribute('class', 'globi-interaction-graph-legend'); addLegend(legendDiv, taxonColorMap, options.width, options.height); var graphDiv = document.createElement('div'); graphDiv.setAttribute('class', 'globi-interaction-graph'); var svg = d3.select(graphDiv).append('svg') .attr('width', options.width) .attr('height', options.height); var callback = function (interactions) { var mergedInteractions = {}; var nodes = {}; parse(interactions, mergedInteractions, nodes); var nodeKeys = []; var number_of_nodes = 0; for (var node_key in nodes) { if (nodes.hasOwnProperty(node_key)) { number_of_nodes++; nodeKeys.push(node_key); } } nodeKeys.sort(); var i = 0; var taxonNodes = []; for (var nodeKey in nodeKeys) { if (nodeKeys.hasOwnProperty(nodeKey)) { var key = nodeKeys[nodeKey]; var widthPerNode = options.width / (number_of_nodes + 1); nodes[key].x = widthPerNode + i * widthPerNode; /** * @gb: Added a second ordinate to fix y-scale problem * * Additionally this speeds up rendering because we don't need Bezier ploting in #addIteraction anymore */ nodes[key].y1 = widthPerNode; nodes[key].y2 = options.height - widthPerNode; nodes[key].radius = widthPerNode / 2.0; nodes[key].color = "pink"; taxonNodes.push(nodes[key]); i = i + 1; } } var interactionsArray = []; for (var mi in mergedInteractions) { if (mergedInteractions.hasOwnProperty(mi)) { mergedInteractions[mi].source = nodes[indexForNode(mergedInteractions[mi].source)]; mergedInteractions[mi].target = nodes[indexForNode(mergedInteractions[mi].target)]; interactionsArray.push(mergedInteractions[mi]); } } addSourceTaxonNodes(svg, taxonNodes, ee); addTargetTaxonNodes(svg, taxonNodes, ee); addInteraction(svg, interactionsArray, ee); ee.emit('ready'); }; globiData.findSpeciesInteractions(options, callback); ee.appendGraphTo = function (target) { target.appendChild(graphDiv); }; ee.appendLegendTo = function (target) { target.appendChild(legendDiv); }; return ee; };