<?php

require_once "includes/charts.inc";
require_once "includes/trees.inc";
require_once "includes/obo_loader.inc";
require_once "api/tripal_cv.api.inc";

require_once "includes/cv_form.inc";
require_once "includes/cvterm_form.inc";
require_once "includes/cvtermpath_form.inc";


/**
 * @defgroup tripal_cv CV Module
 * @ingroup tripal_modules
 */

/**
 * Implements hook_init().
 * Adds CSS and JS needed for this modules rendered content
 *
 * @ingroup tripal_cv
 */
function tripal_cv_init() {

  // add the tripal_cv JS and CSS
  drupal_add_css(drupal_get_path('theme', 'tripal') . '/css/tripal_cv.css');
  drupal_add_js(drupal_get_path('theme', 'tripal') . '/js/tripal_cv.js');

  // add the jgCharts.js
  drupal_add_js(drupal_get_path('theme', 'tripal') . '/js/jgcharts/jgcharts.js');

  // add the jsTree JS and CSS
  drupal_add_css(drupal_get_path('theme', 'tripal') . '/js/jsTree/source/tree_component.css');
  drupal_add_js(drupal_get_path('theme', 'tripal') . '/js/jsTree/source/_lib.js');
  drupal_add_js(drupal_get_path('theme', 'tripal') . '/js/jsTree/source/tree_component.js');
}

/**
 * Implements hook_menu().
 * Registers all menu items associated with this module
 *
 * @ingroup tripal_cv
 */
function tripal_cv_menu() {
  $items = array();

  $items['admin/tripal/chado/tripal_cv'] = array(
    'title' => 'Controlled Vocabularies',
    'description' => 'Controlled Vocabularies control the terms available for various chado fields.',
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_NORMAL_ITEM,
  );

  $items['admin/tripal/chado/tripal_cv/help'] = array(
    'title' => 'Help',
    'description' => "A description of the Tripal Controlled Vocabulary module including a short description of it's usage.",
    'page callback' => 'theme',
    'page arguments' => array('tripal_cv_admin'),
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_NORMAL_ITEM,
    'weight' => 10
  );

  $items['admin/tripal/chado/tripal_cv/obo_loader'] = array(
    'title' => 'Load Ontology',
    'description' => 'Load an Ontology into chado as a controlled vocabulary.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_cv_obo_form'),
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_NORMAL_ITEM,
  );

  /*
   * Menu for updating the cvtermpath
   */

  $items['admin/tripal/chado/tripal_cv/cvtermpath'] = array(
    'title' => 'Update Chado cvtermpath table',
    'description' => 'The Chado cvtermpath table provides lineage for terms and is useful for quickly finding any ancestor parent of a term.  However, this table must be populated.  This page allows for populating of this table one vocabulary at a time',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_cv_cvtermpath_form'),
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_NORMAL_ITEM,
  );

  /*
   * Menu items for adding and editing CVs
   */
  $items['admin/tripal/chado/tripal_cv/edit_cv'] = array(
    'title' => 'Edit a Controlled Vocabulary',
    'description' => 'Edit the details such as name and description for an existing controlled vocabulary.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_cv_cv_edit_form'),
    'access callback' => 'user_access',
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_NORMAL_ITEM,
  );

  $items['admin/tripal/chado/tripal_cv/add_cv'] = array(
    'title' => 'Add a Controlled Vocabulary',
    'description' => 'Manually a new controlled vocabulary.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_cv_cv_add_form'),
    'access callback' => 'user_access',
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_NORMAL_ITEM,
  );

  /*
   * Menu items for adding and editing CVterms
   */
  $items['admin/tripal/chado/tripal_cv/cvterm/add'] = array(
    'title' => 'Add a Controlled Vocabulary Term',
    'description' => 'Add a new controlled vocabulary term.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_cv_cvterm_add_form'),
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['admin/tripal/chado/tripal_cv/cvterm/edit'] = array(
    'title' => 'Edit a Controlled Vocabulary Term',
    'description' => 'Edit an existing controlled vocabulary term.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_cv_cvterm_edit_form'),
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_NORMAL_ITEM,
  );
  $items['admin/tripal/chado/tripal_cv/cvterm/auto_name/%/%'] = array(
    'page callback' => 'tripal_cv_cvterm_name_autocomplete',
    'page arguments' => array(5, 6),
    'access arguments' => array('administer controlled vocabularies'),
    'type' => MENU_CALLBACK,
  );

  /*
   * Charts
   */
  $items['tripal_cv_chart'] = array(
    'path' => 'tripal_cv_chart',
    'page callback' => 'tripal_cv_chart',
    'page arguments' => array(1),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK
  );


  /*
   * Menu items for working with CV Trees
   */
  $items['cv_browser'] = array(
    'page callback' => 'tripal_cv_show_browser',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK
  );

  $items['tripal_cv_tree'] = array(
    'path' => 'tripal_cv_tree',
    'page callback' => 'tripal_cv_tree',
    'page arguments' => array(1),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK
  );

  $items['tripal_cv_init_browser'] = array(
    'path' => 'tripal_cv_init_browser',
    'page callback' => 'tripal_cv_init_browser',
    'page arguments' => array(1),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK
  );

  // menu item for interaction with the tree
  $items['tripal_cv_update_tree'] = array(
    'path' => 'tripal_cv_update_tree',
    'page callback' => 'tripal_cv_update_tree',
    'page arguments' => array(2, 3),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK
  );

  // menu items for working with terms
  $items['tripal_cv_cvterm_info'] = array(
    'path' => 'tripal_cv_cvterm_info',
    'title' => 'CV Term Viewer',
    'page callback' => 'tripal_cv_cvterm_info',
    'page arguments' => array(1),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK
  );

  return $items;
}

/**
 * Implements hook_help()
 * Purpose: Adds a help page to the module list
 */
function tripal_cv_help ($path, $arg) {
  if ($path == 'admin/help#tripal_cv') {
    return theme('tripal_cv_admin', array());
  }
}

/**
 *  Set the permission types that the chado module uses.  Essentially we
 *  want permissionis that protect creation, editing and deleting of chado
 *  data objects
 *
 * @ingroup tripal_cv
 */
function tripal_cv_permission() {
  return array(
    'administer controlled vocabularies' => array(
      'title' => t('Administer controlled vocabularies (CVs).'),
      'description' => t('Allow a user to add, edit and delete controlled vocabularies as well as add and edit terms.')
    ),
  );
}

/**
 * Implements hook_views_api()
 * Purpose: Essentially this hook tells drupal that there is views support for
 *  for this module which then includes tripal_cv.views.inc where all the
 *  views integration code is
 *
 * @ingroup tripal_cv
 */
function tripal_cv_views_api() {
  return array('api' => 2.0);
}

/**
 * Implements hook_coder_ignore().
 * Defines the path to the file (tripal_cv.coder_ignores.txt) where ignore rules for coder are stored
 */
function tripal_cv_coder_ignore() {
  return array(
    'path' => drupal_get_path('module', 'tripal_cv'),
    'line prefix' => drupal_get_path('module', 'tripal_cv'),
  );
}

/*
 *
 */
function tripal_cv_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == "tripal_cv_cvterm_form") {
    // updating the form through the ahah callback sets the action of
    // the form to the ahah callback URL. We need to set it back
    // to the normal form URL
    if ($form_state['values']['form_action'] == 'edit') {
      $form['#action'] = url("admin/tripal/tripal_cv/cvterm/edit");
    }
    else {
      $form['#action'] = url("admin/tripal/tripal_cv/cvterm/add");
    }
  }
}

/**
 *  We need to let drupal know about our theme functions and their arguments.
 *  We create theme functions to allow users of the module to customize the
 *  look and feel of the output generated in this module
 *
 * @ingroup tripal_db
 */
function tripal_cv_theme() {
  return array(
    'tripal_cv_admin' => array(
      'template' => 'tripal_cv_admin',
      'arguments' =>  array(NULL),
      'path' => drupal_get_path('module', 'tripal_cv') . '/theme',
    ),
  );
}