<?php

require_once "tripal_views.views.inc";

require_once "includes/tripal_views_integration.inc";
require_once "includes/tripal_views_form_elements.inc";
require_once "includes/tripal_views_integration_port.inc";

/**
 * Implements hook_menu()
 *
 * Purpose: this hook provides details about new menu items added by this module
 *
 * @ingroup tripal_views
 */
function tripal_views_menu() {
  $items = array();

  $items['chado'] = array(
    'title' => 'Search Biological Data',
    'description' => 'Listings of the various biological data available categorized by type.',
    'page callback' => 'tripal_views_biological_data_page',
    'access arguments' => array('access content'),
    'expanded' => TRUE,
    'type' => MENU_NORMAL_ITEM,
  );

  $items['admin/tripal/views'] = array(
    'title' => 'Views Integration',
    'description' => 'Integration with Drupal Views',
    'page callback' => 'tripal_views_description_page',
    'access arguments' => array('administer site configuration'),
    'type' => MENU_NORMAL_ITEM,
  );

  $items['admin/tripal/views/integration/list'] = array(
    'title' => 'List of Integrated Tables',
    'description' => 'Provide a list of all integrated tables and allows for adding new tables or editing already integrated tables.',
    'page callback' => 'tripal_views_integration_setup_list',
    'access arguments' => array('manage tripal_views_integration'),
    'type' => MENU_NORMAL_ITEM,
    'weight' => 0,
  );

  $items['admin/tripal/views/integration/new'] = array(
    'title' => 'Integrate A Table',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_views_integration_form'),
    'access arguments' => array('manage tripal_views_integration'), 
    'type' => MENU_NORMAL_ITEM,
  );

  $items['admin/tripal/views/integration/edit/%'] = array(
    'title' => 'Edit Views Integration',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_views_integration_form', 5),
    'access arguments' => array('manage tripal_views_integration'), 
    'type' => MENU_CALLBACK,
  );

  $items['admin/tripal/views/integration/delete/%'] = array(
    'title' => 'Delete Views Integration',
    'page callback' => 'tripal_views_integration_delete',
    'page arguments' => array(5),
    'access arguments' => array('manage tripal_views_integration'), 
    'type' => MENU_CALLBACK,
  );

  $items['admin/tripal/views/import'] = array(
    'title' => 'Import Views Integration',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_views_integration_import_form'),
    'access arguments' => array('manage tripal_views_integration'), 
    'type' => MENU_NORMAL_ITEM,
  );

  $items['admin/tripal/views/integration/export/%'] = array(
    'title' => 'Import Views Integration',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('tripal_views_integration_export_form', 5),
    'access arguments' => array('manage tripal_views_integration'),
    'type' => MENU_CALLBACK,
  );
  
  // Menu item for the AJAX callback function that retrieves the 
  // portion of the form that contains all of the fields for the table being integrated
  $items['tripal/views/integration/ajax/view_setup_table'] = array(
    'title' => 'Import Views Integration',
    'page callback' => 'tripal_views_integration_ajax_view_setup_table',
    'page arguments' => array(),
    'access arguments' => array('manage tripal_views_integration'), 
    'type' => MENU_CALLBACK,
  );
  
  // Menu item for the AJAX callback function that retrieves the list of 
  // column names for the table that is selected to be joined. 
  $items['tripal/views/integration/ajax/join_field/%/%'] = array(
    'title' => 'Import Views Integration',
    'page callback' => 'tripal_views_integration_ajax_join_field',
    'page arguments' => array(5, 6),
    'access arguments' => array('manage tripal_views_integration'), 
    'type' => MENU_CALLBACK,
  );
  
  return $items;
}

/**
 * Implements hook_init().
 */
function tripal_views_init() {

  // Need to ensure that all chado tables are integrated w/out making
  // the user go to views UI. It would be ideal to do this in a hook called only once
  // directly after install/enabling of the module but such a hook doesn't
  // exist in Drupal 6
  $tripal_views = db_fetch_object(db_query("SELECT true as has_rows FROM {tripal_views}"));
  if (!$tripal_views->has_rows) {
    tripal_views_integrate_all_chado_tables();
  }
}

/**
 * Implements hook_views_api()
 *
 * Purpose: Set the permission types that the chado module uses.
 *
 * @ingroup tripal_views
 */
function tripal_views_perm() {
  return array(
    'manage tripal_views_integration',
  );
}

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

/**
 * Implements hook_theme()
 *
 * Purpose: this hook provides details about themable objects added by
 *   this module
 *
 * @ingroup tripal_views
 */
function tripal_views_theme() {
  return array(
    'tripal_views_integration_form' => array(
      'arguments' => array('form' => NULL),
      'template'  => 'tripal_views_integration_fields_form',
    ),
    'tripal_views_data_export_download_form' => array(
      'arguments' => array('form' => NULL),
      'template'  => 'tripal_views_data_export_download_form',
    ),
    'file_upload_combo' => array(
      'arguments' => array('element' => NULL)
    ),
    'sequence_combo' => array(
      'arguments' => array('element' => NULL)
    ),
  );
}

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

/**
 * A landing page for all views of chado content. Simply lists all menu items that
 * are children of it.
 */
function tripal_views_biological_data_page() {
  $output = '';

  $item = menu_get_item();
  $content = system_admin_menu_block($item);

  $output .= '<dl class="admin-list">';
  foreach ($content as $item) {
    $output .= '<dt>'. l($item['title'], $item['href'], $item['localized_options']) .'</dt>';
    $output .= '<dd>'. $item['description'] .'</dd>';
  }
  $output .= '</dl>';

  return $output;
}

/*
 * 
 */
function tripal_views_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == "tripal_views_integration_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']['setup_id']) {
      $form['#action'] = url("admin/tripal/views/integration/edit/" . $form_state['values']['setup_id']);
    }
    else {
      $form['#action'] = url("admin/tripal/views/integration/new");
    }
  }
}