<?php
// $Id: book_made_simple.module,v 1.1.2.1.2.5.2.5 2010/11/16 20:13:09 marcelbichon Exp $
// Author: M. Morin
/**
 * Implementation of hook_help().
 */
function book_made_simple_help($path, $arg) {
  switch ($path) {
    case 'admin/settings/book_made_simple':
      $output = t('On this page you can define context-types allowed as children of book and those that will be automatically created as main book pages.<br/>You can also define child pages by content-type in !content-type-settings in the BookMadeSimple section',array('!content-type-settings' => l(t('content type settings'),'admin/content/types/list')));
      return $output;
      break;
  }
}
function book_made_simple_init() {
  if (! variable_get('book_made_simple_admin_use_css',false)) {
    drupal_add_css(drupal_get_path('module', 'book_made_simple') . '/book_made_simple.css');
  }
}

function book_made_simple_perm() {
  return array('show book reorder link','show core Outline links');
}

/**
 * Implementation of hook_menu().
 */
function book_made_simple_menu() {
  $items = array();
  $items['admin/settings/book_made_simple'] = array(
    'title' => t('BookMadeSimple settings'),
    'page callback' => 'drupal_get_form',
    'page arguments' => array('book_made_simple_settings_form'),      
    'access arguments' => array('administer site configuration'),
    'description' => t('BookMadeSimple module settings.'),
    'type' => MENU_NORMAL_ITEM,
  );

  $items['node/%/reorder'] = array(
    'title' => t('Reorder the book'),
    'page callback' => 'book_made_simple_reorder',
    'page arguments' => array(1),
    'access callback' => 'is_book_access',
    'access arguments' => array(1),
    'type' => MENU_LOCAL_TASK,
    'weight' =>2
  );

  return $items;
}

/**
 * Return access rights for book
 */
function is_book_access($arg, $node = NULL) {
  if ($node == NULL && is_numeric($arg)) {
    $node = node_load($arg);
  }

  if (isset($node->book) && $node->book['bid'] > 0) {
    if (! _book_outline_access($node) || ! user_access('show book reorder link')) {
      return false;
    }

    // Cheching permissions according to rules/
    $book = $node->book;
    $linkVisibilty = variable_get('book_made_simple_reorder_link', "0");
    $allowed = true;
    if ($linkVisibilty == "0") {
      $mainBook = $book;
      if ($book['nid'] != $book['bid']) {
        $mainBook = node_load($book['bid'])->book;
      }    
      $allowed = (count(book_toc($mainBook['bid'],array(),9999)) > 2);
    }
    return $allowed;
  }
  return false;
}

/**
 * Shortcut to reorder book page
 */
function book_made_simple_reorder($id) {
  $node = node_load($id);
  drupal_goto("admin/content/book/" . $node->book['bid'] , "destination=node/" . $node->nid);
}

/**
 * Implementation of hook_settings_form).
 */
function book_made_simple_settings_form() {
  $types = node_get_types("names");
  $form['book_made_simple'] = array(
    '#type' => 'fieldset',
    '#attributes' => array('class' => 'allowed-child'),
    '#title' => t('Select node types that can be included in a book'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#description' => t('Check content-type that can be included as child in a book. This selection is overriden by selection in content-type settings.'),
  );

  $form['book_made_simple']['book_made_simple_add_types'] = array(
    '#type' => 'checkboxes',   
    '#options' => $types,
    '#multiple' => true,
    '#default_value' => variable_get('book_made_simple_add_types', array()),
  );

  $form['book_made_simple2'] = array(
    '#type' => 'fieldset',
    '#attributes' => array('class' => 'auto-main'),
    '#title' => t('Select node types to auto-create main book page'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#description' => t('Check content-types if you want they will automatically be created as main page of a book.'),
  );
  $form['book_made_simple2']['book_made_simple_auto_main_page'] = array(
    '#type' => 'checkboxes',   
    '#options' => $types,
    '#multiple' => true,
    '#default_value' => variable_get('book_made_simple_auto_main_page', array()),
  );

  $form['book_made_simple3'] = array(
    '#type' => 'fieldset',
    '#attributes' => array('class' => 'other-settings'),
    '#title' => t('Other settings'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
  );
  $form['book_made_simple3']['book_made_simple_limit_depth'] = array(
    '#type' => 'textfield',   
    '#title' => t('Default limit book depth'),
    '#default_value' => variable_get('book_made_simple_limit_depth', 99),
    '#description' => t('Maximum number of childs for a book'),
	'#maxlength' => 2,
	'#size' => 2,
  );
  $form['book_made_simple3']['book_made_simple_admin_use_css'] = array(
    '#type' => 'checkbox',   
    '#title' => t('Disable BMS settings layout'),
    '#default_value' => variable_get('book_made_simple_admin_use_css', false),
    '#description' => t('Check to disable BMS layout (content types as columns).'),
  );
  $form['book_made_simple3']['book_made_simple_hide_default_add_child'] = array(
    '#type' => 'checkbox',   
    '#title' => t('Hide default add child link'),
    '#default_value' => variable_get('book_made_simple_hide_default_add_child', true),
    '#description' => t('Check to hide default add child page link.'),
  );
  $form['book_made_simple3']['book_made_simple_child_list_style'] = array(
    '#type' => 'radios',   
    '#title' => t('Style of child list'),
    '#options' => array("DDLIST" => t("Dropdown listbox"),"LI" => t("Unordered list"),"THEME" => t("Themeable function")),
    '#default_value' => variable_get('book_made_simple_child_list_style', "DDLIST"),
    '#description' => t('Choose the style of the child list.'),
  );
  $form['book_made_simple3']['book_made_simple_reorder_link'] = array(
    '#type' => 'radios',   
    '#title' => t('Show reorder tab even if book is empty'),
    '#options' => array("0"=>t("No"),"1" => t("Yes")),
    '#default_value' => variable_get('book_made_simple_reorder_link', "0"),
    '#description' => t('Show reorder tab even if book is empty. A book is considered empty when it has less than 2 subpages. In this case, does reordering make sense ?'),
  );
  return system_settings_form($form);
}

/**
 * Implementation of hook_form_alter().
 */
function book_made_simple_form_alter(&$form, $form_state, $form_id) {
  if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] .'_node_form' == $form_id) {
 
    $isForbidden = array_key_exists($form['type']['#value'], variable_get('book_made_simple_forbid_main_page_creation', array()));
	if ($isForbidden && arg(1) == "add")
	{
	
		$isBook = ($form["book"]["menu_name"]["#value"] == "" ? false : true);
		if ($_GET['parent'] == '' || ($_GET['parent'] != "" &&  !$isBook )) {
 	        $form = array();
	        $form['#id'] = 'node-form';
	        $form['nid'] = Array('#type' => value,'#value' => '' );
	        $form['title'] = Array('#type' => 'item',
							  '#title' => '',
							  '#value' => t('This content-type cannot be created outside a book. Creation cancelled')
							  );
		    return $form;
		}
	}

    $node = $form['#node'];
    $nid = isset($node->nid) ? $node->nid : 'new';
    if ($isForbidden && $user->uid != 1) {
      unset($form['book']['bid']['#options'][$nid]);
      // The following two lines are to prevent that book_manager module sets the unset item again
      $form['#node']->nid = isset($form['#node']->nid) ? $form['#node']->nid : '0';
      $form['#node']->book['original_bid'] = $form['#node']->nid;
    }
    $book = $node->book;
    if (user_access("show core Outline links")) {
      if (_book_outline_access($node)) {
        if (is_book_access(null, $node)) {
          $form['book']['reorder'] = array(
            '#type' => 'item',
            '#value' => l(t("Reorder the book"), "admin/content/book/" . $book['bid'] , array('query' =>"destination=node/" . $node->nid)),
            '#description' => t("Shortcut to reorder the entire book"),
            '#weight' => 10,
          );
        }
      }
    }    
    else {$form['book']['#type'] = 'hidden';}
    return $form;
  }

  switch ($form["#id"]) {
    case "node-type-form" : // $type . '_node_settings': 
      $type = $form["#node_type"]->type;
      $default = array_key_exists($type,variable_get('book_made_simple_auto_main_page',array()));
      $form['book_made_simple'] = array(
        '#type' => 'fieldset',
        '#attributes' => array('class' => 'bms-fieldset'),   
        '#title' => t('BookMadeSimple'),
        '#collapsible' => TRUE,
        '#collapsed' => TRUE,
      );
      $form['book_made_simple']['1'] = array(
        '#attributes' => array('class' => 'allowed-child'),
        '#type' => 'fieldset',
        '#title' => t('Select content-types allowed as child.'),
        '#collapsible' => TRUE,
        '#collapsed' => FALSE,
      );

      $types = node_get_types("names");
      $form['book_made_simple']['1']['book_made_simple_for_type'] = array(
        '#type' => 'checkboxes',   
        '#options' => $types,
        '#multiple' => true,
        '#default_value' => variable_get('book_made_simple_for_type_' . $type, array()),
      );

      $aa = array();
      unset($types[$type]);

      foreach ($types as $ctype => $name) {
        $a = variable_get('book_made_simple_for_type_' . $ctype, array());
        if (array_search($type,$a) !== FALSE) {
          array_push($aa,$ctype);
        }
      }
      $form['book_made_simple']['2'] = array(
        '#attributes' => array('class' => 'allowed-child'),
        '#title' => t('Select content-types allowed as parent'),
        '#type' => 'fieldset',
        '#collapsible' => TRUE,
        '#collapsed' => FALSE,
      );
      $form['book_made_simple']['2']['book_made_simple_for_book'] = array(
        '#type' => 'checkboxes',   
        '#options' => $types,
        '#multiple' => true,
        '#default_value' => $aa,
      );

      $form['book_made_simple']['3'] = array(
        '#attributes' => array('class' =>'bms-other-settings'),   
        '#type' => 'fieldset',
        '#collapsible' => TRUE,
        '#collapsed' => FALSE,
      );

      $varTypes = variable_get('book_made_simple_auto_main_page',array());
      $default = (array_key_exists($type, $varTypes) && $varTypes[$type] != "0");
      $form['book_made_simple']['3']['book_made_simple_auto_main_page'] = array(
        '#attributes' => array('style' =>'float:none;clear:both'),   
        '#type' => 'checkbox',
        '#title' => t('Auto create book main page'),
        '#default_value' => $default,
        '#description' => t('Checked will create a new book main page when adding.'),
      );

      $varTypes = variable_get('book_made_simple_forbid_main_page_creation', array());
      $default = (array_key_exists($type, $varTypes) && $varTypes[$type] != "0");
      $form['book_made_simple']['3']['book_made_simple_forbid_main_page_creation'] = array(
        '#type' => 'checkbox',
        '#title' => t('Forbid creation of book main page'),
        '#default_value' => $default,
        '#description' => t('Checked will prevent books from being manually created with this content type as main page type.'),
      );
          
	  $varTypes = variable_get('book_made_simple_add_types',array());
      $default = (array_key_exists($type, $varTypes) && $varTypes[$type] != "0");
      $form['book_made_simple']['3']['book_made_simple_add_types'] = array(
        '#type' => 'checkbox',
        '#title' => t('Allow content type as child of default book.'),
        '#default_value' => $default,
        '#description' => t('Checked will add this content-type to books where no content-types has been selected.'),
      );

      array_push($form['#submit'],"book_made_simple_form_submit");
      break;
  } // endswitch $form_id
} // endfunction book_made_simple_form_alter()

/**
 * Implementation of hook_form_submit().
 */
function book_made_simple_form_submit($form, &$form_state) {
  $values = $form_state["values"];
  $text = $values["book_made_simple_auto_main_page"];
  $type = $values["type"];
  variable_del("book_made_simple_add_types_" . $type);
  variable_del("book_made_simple_auto_main_page_" . $type);
  $types = variable_get('book_made_simple_auto_main_page', array());
  if ($text != "0") {
    $types[$type]= $type;
  }
  else {
    unset($types[$type]);
  }
  variable_set('book_made_simple_auto_main_page', $types);


  $text = $values["book_made_simple_forbid_main_page_creation"];
  $type = $values["type"];
  variable_del("book_made_simple_forbid_main_page_creation_" . $type);
  $types = variable_get('book_made_simple_forbid_main_page_creation', array());
  if ($text != "0") {
    $types[$type]= $type;
  }
  else {
    unset($types[$type]);
  }
  variable_set('book_made_simple_forbid_main_page_creation', $types);
  
  
  $text = $values["book_made_simple_add_types"];
  $types = variable_get('book_made_simple_add_types', array());
  if ($text != "0") {
    $types[$type]= $type;
  }
  else {
    unset($types[$type]);
  }
  variable_set('book_made_simple_add_types', $types);

  $text = $values["book_made_simple_for_type"];
  if (count($text) == 0) {
    variable_del("book_made_simple_for_type_" . $type);
  }

  $types = node_get_types("names");
  $saved = $values["book_made_simple_for_book"];
  $a2 = array();
  foreach ($types as $ctype => $name) {
    if ($ctype != $type) {
      $a = variable_get('book_made_simple_for_type_' . $ctype, array());
      $ind = array_search($type,$a);
      if ($ind !== FALSE) {
        unset($a[$ind]);
      }
      variable_set('book_made_simple_for_type_' . $ctype, $a);
    }
  }
  foreach ($saved as $ctype => $name) {
    if ($name != "0") { 
      $a = variable_get('book_made_simple_for_type_' . $ctype, array());
      $a[$type]= $type;
      variable_set('book_made_simple_for_type_' . $ctype, $a);
    }
  }    
  variable_del("book_made_simple_for_book_" . $type);

}

/**
 * Implementation of hook_link(). Add dropdown listbox to links
 */
function book_made_simple_link($type, $node = null, $teaser = false) {
  $links = array();
  $max_depth = variable_get('book_made_simple_limit_depth',99);
  if ($type == 'node' && !$teaser && isset($node->book["bid"]) && user_access('add content to books') && $node->status == 1 && $node->book['depth'] < $max_depth) {
    $html = "";
    $allowedTypes = array();
    // Search for content-type for this one
    
    $aTypes = variable_get('book_made_simple_for_type_' . $node->type, array());
    $style =  variable_get('book_made_simple_child_list_style', "DDLIST");
    // No content-type, so print all
    if (count($aTypes) == 0) {
      $aTypes = variable_get('book_made_simple_add_types', array());        
    }
    foreach ($aTypes as $allowedType => $allowedName) {
      $type  = node_get_types("type",$allowedName);
      if (node_access('create', $type->type)) {
        $allowedTypes[str_replace("_","-",$type->type)] = $type->name;
      }
    }
    
    
    $book_link = $node->book;
    if (count($allowedTypes) > 0) {
      asort($allowedTypes,SORT_STRING);

      if ($style == "LI") {
        foreach ($allowedTypes as $type => $name ) {
          $links['book_add_' . $type] = array(
            'title' => t('Add !content-type', array('!content-type' => t($name))),
            'href' => "node/add/". $type,
            'query' => "parent=". $node->book['mlid'],
          ); 
        }
      }
      elseif ($style == "DDLIST") {
        $links['book_made_simple'] = array(
          'title' => "<span id='book_made_simple'>" . book_made_simple_add_child_book_content_types_ddlist($allowedTypes, $node)  . "</span>",
          'html'=>true
        );
      }
      else {
        $links['book_made_simple'] = array(
          'title' => theme('add_child_book_content_types',$allowedTypes, $node),
          'html'=>true
        );
      }
    }
  }
  //$links["book_add_child"] = array();
  return $links;

}

/**
 * Implementation of hook_theme().
 */
function book_made_simple_theme() {
return array(
  'add_child_book_content_types' => array(
    'arguments' => array(
      'allowedTypes' => NULL, "node"=>null),
    ),
  );
}

/**
 * Themeable function to display alloawed child types of book().
 * @param $allowedTypes
 *   Array of allowed child type.
 * @param $node
 *   Source node
 * @return 
 *   Html code to display allowed child type
 */
function theme_add_child_book_content_types($allowedTypes, &$node) {
  return "";
}

/**
 * Display alloawed child type as dropdown listbox.
 */
function book_made_simple_add_child_book_content_types_ddlist($allowedTypes, &$node) {
  $child_type = variable_get('book_child_type', 'book');
  $html = "<option value='" . str_replace('_', '-', $child_type) . "'>" . t("Add child page") . "</option>";
  foreach ($allowedTypes as $type => $name ) {
    $html .= "<option value='" .$type ."'>" . t($name) . "</option>";
  }
  $isCleanUrl = variable_get('clean_url', 0);
  $url = url("node/add/");
  $op = "&";
  if ($isCleanUrl) {
    $op = "?";
  }
  $newUrl =  $url ."\" + this.value + \"" . $op . "parent=" . $node->book["mlid"];
  return "<select onchange='location.href=\"" . $newUrl . "\"'>$html</select>";  
}
/**
 * Implementation of hook_nodeapi().
 */
function book_made_simple_nodeapi(&$node, $op, $teaser, $page) {
  if (empty($node->book["bid"])) {
  $type = $node->type;
  switch ($op) {
    // Node creation
    case 'insert':
	  $max_depth = variable_get('book_made_simple_limit_depth',99);
      if ((user_access('add content to books') || user_access('administer book outlines')) && node_access('create', $type) &&  $node->book['depth'] < $max_depth) {
        $bookTypes = variable_get('book_made_simple_auto_main_page',array());
        $bookType = $bookTypes[$type];
        $toCreate = false;
        if (null != $bookType && $bookType != "0") {$toCreate = true;}
        if ($toCreate && ! isset($_GET['parent'])) {
          $node->book["bid"] = $node->nid;
          $node->book['nid'] = $node->nid;
          $node->book['module'] = 'book';
          $node->book['menu_name'] = book_menu_name($node->book['bid']);
          _book_update_outline($node);
        }
      }
      break;

    // Hack for translation module. Adding parent property to automatically select parent book.
    case "prepare translation":        
      $translation = $node->translation_source;
      if (isset($translation->book) && (! isset($_GET["parent"]))) {
        // get parent menu link for the node + language
        $plid = $translation->book['plid'];
        $parentPage = book_link_load($plid);
        if (isset($parentPage) && $parentPage > 0) {
          $pnid = $parentPage['nid'];
          if (isset($pnid) && $pnid <> "") {
            $query= "SELECT bid, mlid FROM {node} n left join {book} b on b.nid = n.nid where tnid= $pnid and language='" . $node->language . "'";
            $translatedParent = db_fetch_object(db_query($query));
            if ($translatedParent) {
              $mlid = $translatedParent->mlid;
              $params = array();
              $params[] = "parent=$mlid";
              foreach ($_GET as $key => $value) {
                if ($key == "q") {$path = $value;}
                else {$params[] = $key . "=" . $value;}
              }
              $queryString = implode("&",$params);
              drupal_goto($path, $queryString);
              $ok = true;
            }
            else  {
              drupal_set_message(t("This node has no translated parent, so no book selected"),"warning");                            
            }
          }
        }
      }
      break;
    }
  }
  else {
    switch ($op) {
      // Hide standard add Child link        
      case 'alter':
        if (($node->links) && variable_get('book_made_simple_hide_default_add_child',true)) {
          if (array_key_exists("book_add_child",$node->links))  {
            unset($node->links["book_add_child"]);
          }            
        }
        break;
    }
  }
}

function book_made_simple_theme_registry_alter(&$theme_registry) {
  global $theme;

  $theme_registry['BMS']['menu_item_link'] = $theme_registry['menu_item_link'];
  // Replace them with our own. These will "preprocess" and call the real functions.
  $theme_registry['menu_item_link']['function'] = 'book_made_simple_theme_menu_item_link';
}

/**
 * Preprocessor for menu_item_link.
 * Adds an ID attribute to menu links and helps the module
 * follow the recursion of menu_tree_output().
 */

function book_made_simple_theme_menu_item_link($link) {
  // Find out which theme function to dispatch to after preprocessing.
  $registry = theme_get_registry();
  if (isset($link['path']) &&  $link['path'] == 'node/%/outline' && ! user_access("show core Outline links")) {
    return null;
  }
  $function = $registry['BMS']['menu_item_link']['function'];
  if ($function) {
    return $function($link);
  }
  return theme_menu_item_link($link);
}


