123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /* phylotree d3js graphs */
- (function ($) {
- var height = 0; // will be dynamically sized
- $(document).ready( function () {
- // Callback function to determine node size.
- var nodeSize = function(d) {
- var size;
- if (d.cvterm_name == "phylo_root") {
- size = treeOptions['root_node_size'];
- }
- if (d.cvterm_name == "phylo_interior") {
- size = treeOptions['interior_node_size'];
- }
- if (d.cvterm_name == "phylo_leaf") {
- size = treeOptions['leaf_node_size'];
- }
- return size;
- }
- // Callback function to determine the node color.
- var organismColor = function(d) {
- var color = null;
- if (d.genus) {
- color = organismColors[d.genus + ' ' + d.species];
- }
- if (color) {
- return color;
- }
- else {
- return 'grey';
- }
- };
- // Callback for mouseover event on graph node d.
- var nodeMouseOver = function(d) {
- var el = $(this);
- el.attr('cursor', 'pointer');
- var circle = el.find('circle');
- // highlight in yellow no matter if leaf or interior node
- circle.attr('fill', 'yellow');
- if(!d.children) {
- // only leaf nodes have descriptive text
- var txt = el.find('text');
- txt.attr('font-weight', 'bold');
- }
- };
-
- // Callback for mouseout event on graph node d.
- var nodeMouseOut = function(d) {
- var el = $(this);
- el.attr('cursor', 'default');
- var circle = el.find('circle');
- if(!d.children) {
- // restore the color based on organism id for leaf nodes
- circle.attr('fill', organismColor(d));
- var txt = el.find('text');
- txt.attr('font-weight', 'normal');
- }
- else {
- // restore interior nodes to white
- circle.attr('fill', 'white');
- }
- };
-
- // Callback for mousedown/click event on graph node d.
- var nodeMouseDown = function(d) {
- var el = $(this);
- var title = (! d.children ) ? d.name : 'interior node ' + d.phylonode_id;
- if(d.children) {
- // interior node
- if(d.phylonode_id) {
- }
- else {
- // this shouldn't happen but ok
- }
- }
- else {
- // If this node is not associated with a feature but it has an
- // organism node then this is a taxonomic node and we want to
- // link it to the organism page.
- if (!d.feature_id && d.organism_node_id) {
- window.location.replace(baseurl + '/node/' + d.organism_node_id);
- }
- // leaf node
- }
- };
- // AJAX function for retrieving the tree data.
- $.getJSON(phylotreeDataURL, function(treeData) {
- displayData(treeData);
- $('.phylogram-ajax-loader').hide();
- });
- // Creates the tree using the d3.phylogram.js library.
- function displayData(treeData) {
- height = graphHeight(treeData);
- d3.phylogram.build('#phylogram', treeData, {
- 'width' : treeOptions['phylogram_width'],
- 'height' : height,
- 'fill' : organismColor,
- 'size' : nodeSize,
- 'nodeMouseOver' : nodeMouseOver,
- 'nodeMouseOut' : nodeMouseOut,
- 'nodeMouseDown' : nodeMouseDown,
- 'skipTicks' : treeOptions['skipTicks']
- });
- }
- /* graphHeight() generate graph height based on leaf nodes */
- function graphHeight(data) {
- function countLeafNodes(node) {
- if(! node.children) {
- return 1;
- }
- var ct = 0;
- node.children.forEach( function(child) {
- ct+= countLeafNodes(child);
- });
- return ct;
- }
- var leafNodeCt = countLeafNodes(data);
- return 22 * leafNodeCt;
- }
- });
- })(jQuery);
|