/* phylotree d3js graphs */

(function ($) {
    
  "use strict";

  // Will be dynamically sized.
  var height = 0; 

  // Store our function as a property of Drupal.behaviors.
  Drupal.behaviors.TripalPhylotree = {
    attach: function (context, settings) {
      
      // Retrieve the data for this tree.
      var data_url = Drupal.settings.tripal_chado.phylotree_url;
      $.getJSON(data_url, function(treeData) {
        phylogeny_display_data(treeData);
        $('.phylogram-ajax-loader').hide();
      });
    }
  }

  // Callback function to determine node size.
  var phylogeny_node_size = function(d) {
    var size;
    var tree_options = Drupal.settings.tripal_chado.tree_options;
    if (d.cvterm_name == "phylo_root") {
      size = tree_options['root_node_size']; 
    }
    if (d.cvterm_name == "phylo_interior") {
      size = tree_options['interior_node_size']; 
    }
    if (d.cvterm_name == "phylo_leaf") {
      size = tree_options['leaf_node_size']; 
    }
    return size;
  }

  // Callback function to determine the node color.
  var phylogeny_organism_color = function(d) {
    var organism_color = Drupal.settings.tripal_chado.org_colors;
    var color = null;
    if (d.genus) {
      color = organism_color[d.organism_id];
    }
    if (color) { 
      return color; 
    }
    else { 
      return 'grey'; 
    }
  };

  // Callback for mouseover event on graph node d.
  var phylogeny_node_mouse_over = 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 phylogeny_node_mouse_out = 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', phylogeny_organism_color(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 phylogeny_node_mouse_down = 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_nid) {
        window.location.replace(baseurl + '/node/' + d.organism_nid);
      }
      if (!d.feature_id && d.organism_eid) {
        window.location.replace(baseurl + '/bio_data/' + d.organism_eid);
      }
      // leaf node
    }
  };

  // Creates the tree using the d3.phylogram.js library.
  function phylogeny_display_data(treeData) {
    var height = phylogeny_graph_height(treeData);
    var tree_options = Drupal.settings.tripal_chado.tree_options;
    d3.phylogram.build('#phylogram', treeData, {
      'width' : tree_options['phylogram_width'],
      'height' : height,
      'fill' : phylogeny_organism_color,
      'size' : phylogeny_node_size,
      'nodeMouseOver' : phylogeny_node_mouse_over,
      'nodeMouseOut' : phylogeny_node_mouse_out,
      'nodeMouseDown' : phylogeny_node_mouse_down,
      'skipTicks' : tree_options['skipTicks']
    });
  }

  /* graphHeight() generate graph height based on leaf nodes */
  function phylogeny_graph_height(data) {
    function count_leaf_nodes(node) {
      if(! node.children) {
        return 1;
      }
      var ct = 0;
      node.children.forEach( function(child) {
        ct+= count_leaf_nodes(child);
      });
      return ct;
    }
    var leafNodeCt = count_leaf_nodes(data);
    return 22 * leafNodeCt;
  }
})(jQuery);
