<?php
require_once drupal_get_path('module', 'fileviewer') . '/fileviewer.field.inc';

/*
 * Implement hook_permission().
 */
function fileviewer_permission() {
  return array(
    'administer fileviewer' => array(
      'title' => t('Administer file viewer'),
      'description' => t('Access the file viewer administration pages.'),
    ),
    'access fileviewer' => array(
      'title' => t('Access file viewer'),
      'description' => t('Use file viewer to browse file.'),
    ),
    'download file from fileviewer' => array(
      'title' => t('Download file from fileviewer'),
      'description' => t('Access download lin from file viewer.'),
    ),
  );
}

function fileviewer_menu() {
  $items = array();
  $items['file/%'] = array(
    'title' => 'File virewer',
    'page callback' => 'fileviewer_page',
    'page arguments' => array(1),
    'access arguments' => array('access fileviewer'),
    'file' => 'includes/page.inc',
    'type' => MENU_CALLBACK,
  );
  $items['admin/config/media/fileviewer/flush'] = array(
    'title' => 'Flush files for file viewer',
    'description' => 'Settings for file viewer.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('fileviewer_flush_confirm'),
    'access arguments' => array('administer fileviewer'),
  );
  $items['admin/config/media/fileviewer'] = array(
    'title' => 'File viewer',
    'description' => 'Settings for file viewer.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('fileviewer_settings'),
    'access arguments' => array('administer fileviewer'),
//    'file' => 'admin.inc',
    'type' => MENU_NORMAL_ITEM,
  );
  $items['admin/config/media/fileviewer/settings'] = array(
    'title' => 'File viewer',
    'description' => 'Settings for file viewer.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('fileviewer_settings'),
    'access arguments' => array('administer fileviewer'),
//    'file' => 'admin.inc',
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => 0
  );
  $items['admin/config/media/fileviewer/filetype'] = array(
    'title' => 'File types',
    'description' => 'Settings for filetypes.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('fileviewer_filetype_settings'),
    'access arguments' => array('administer fileviewer'),
//    'file' => 'admin.inc',
    'type' => MENU_LOCAL_TASK,
    'weight' => 1
  );
  return $items;
}

function fileviewer_settings(){
  drupal_set_message(t('You need to !flush all the cached files after changing the directory.', array('!flush' => l(t('flush'), 'admin/config/media/fileviewer/flush'))), 'warning');
  $form['fileviewer_path'] = array(
    '#type' => 'textfield',
    '#title' => t('Fileviewer directory'),
    '#default_value' => variable_get('fileviewer_path', 'fileviewer'),
    '#description' => t('A file system path where uploaded files will be extracted or parsed after uploaded.'),
  );

  $form['fileviewer_flush'] = array(
    '#type' => 'submit',
    '#value' => t('Flush all files'),
    '#submit' => array('fileviewer_flush_submit'),
  );
  return system_settings_form($form);
}

function fileviewer_filetype_settings(){
  $form =array();
  $form['fileviewer_pdf'] = array(
    '#type' => 'fieldset',
    '#title' => t('PDF'),
    '#collapsible' => TRUE, 
    '#collapsed' => FALSE
  );
  $form['fileviewer_pdf']['fileviewer_pdf_iabookreader_search_inside'] = array(
    '#type' => 'checkbox',
    '#title' => t('Enable "search inside" for PDF file in the Internet Archive BookReader'),
    '#default_value' => variable_get('fileviewer_pdf_iabookreader_search_inside', TRUE),
  );
  $form['fileviewer_epub'] = array(
    '#type' => 'fieldset',
    '#title' => t('EPUB'),
    '#description' => t('If you want epub to be support, please contribute for epub readers or donate. I don\'t have time now.'),
    '#collapsible' => TRUE, 
    '#collapsed' => FALSE,
  );
  $form['fileviewer_epub']['epubjs'] = array(
    '#type' => 'checkbox',
    '#title' => t('EPUB'),
    '#description' => t('try http://threepress.org/static/epubjs/, stop update :(')
  );
  $form['fileviewer_epub']['bibliotype'] = array(
    '#type' => 'checkbox',
    '#title' => t('EPUB'),
    '#description' => t('try http://craigmod.com/bibliotype/, never upate :(')
  );
  return system_settings_form($form);
}
function fileviewer_flush_submit($form, &$form_state) {
  drupal_goto('admin/config/media/fileviewer/flush');
  return;
}

function fileviewer_flush_confirm_submit($form, &$form_state) {
  file_unmanaged_delete_recursive('public://' . variable_get('fileviewer_path', 'fileviewer'));
  foreach (db_select('file_managed', 'fid')->fields('fid', array('fid'))->execute()->fetchCol() as $fid){
    $file = file_load($fid);
    fileviewer_file_update($file);
  }
  drupal_set_message(t('Files for fileviewer have been flushed'));
  drupal_goto('admin/config/media/fileviewer');
  return;
}

function fileviewer_flush_confirm($form, &$form_state) {
  return confirm_form(
    $form,
    t('Are you sure you want to flush all the files for fileviewer?'),
    'admin/config/media/fileviewer',
    t('This will clear all the collected performance statistics stored in APC. This action cannot be undone.'),
    t('Confirm flush'),
    t('Cancel'));
}

function fileviewer_block_info($op = 'list', $delta = 0, $edit = array()){
  $blocks = array();
  $blocks['fileviewer'] = array(
    'info' => t('File viewer toc'), 
    'status' => TRUE,
    'region' => 'sidebar_first',
    'visibility' => 1,
    'pages' => 'file/*',
  );
  return $blocks;
}

function fileviewer_block_view($delta = ''){
  $block = array();
  switch ($delta) {
    case 'fileviewer':
      $block['subject'] = t('Contents');
      $block['content'] = '<div id="toc-container"><ul id="toc"></ul></div>';
  }
  return $block;
}

function fileviewer_file_update($file) {
  $destination = fileviewer_path($file->fid);
  file_prepare_directory($destination, FILE_CREATE_DIRECTORY);
  $meta_path = $destination . '/meta';
  file_prepare_directory($meta_path, FILE_CREATE_DIRECTORY);
  $destination = $destination . '/';

  switch ($file->filemime) {
    case 'application/pdf':
      return fileviewer_pdftopng(drupal_realpath($file->uri), $destination);
  }

  $file_extension = strtolower(array_pop(explode('.', $file->filename)));
  switch ($file_extension) {
    case 'epub':
      return fileviewer_extract_zip(drupal_realpath($file->uri), $destination);
  }
}

function fileviewer_file_delete($file) {
  return file_unmanaged_delete_recursive(fileviewer_path($file->fid));
}

/**
 * Return all CCK fields that are of type 'file'
 */
/*
function fileviewer_get_cck_file_fields() {
  $file_fields = array();
  if (module_exists('filefield')) {
    $fields = content_fields();
    foreach($fields as $key => $values){
      if($values['type'] == 'filefield') {
        $file_fields[] = $key;
      }
    }
  }
  return $file_fields;
}
*/

function fileviewer_pdftopng($filepath, $destination) {
  $cmd = 'pdftohtml -xml "' . $filepath . '" "' . $destination . '/meta/text.xml"';
  shell_exec($cmd);
  $cmd = 'pdftoppm -png "' . $filepath . '" "' . $destination . 'page"';
  shell_exec($cmd);
}

function fileviewer_extract_zip($filepath, $destination) {
  $extracted = array();

  if ($z = zip_open($filepath)) {
    while ($entry = zip_read($z)) {
      if (zip_entry_open($z, $entry, 'r') && ($zip_entry_filesize = zip_entry_filesize($entry))) {
        $entry_name = zip_entry_name($entry);
        $data = zip_entry_read($entry, $zip_entry_filesize);

        $filepath = $destination . $entry_name;
        $parent_dir = dirname($filepath);
        if (!file_exists($parent_dir)) {
          file_prepare_directory($parent_dir, FILE_CREATE_DIRECTORY);
        }

        if ($filepath = file_unmanaged_save_data($data, $filepath, FILE_EXISTS_REPLACE)) {
          $file = new StdClass();
          $file->filename = $entry_name;
          $file->filemime = file_get_mimetype($filepath);
          $file->filesize = filesize($filepath);
          $extracted[] = $file;
        }
        zip_entry_close($entry);
      }
    }
    zip_close($z);
  }
  return $extracted;
}


function fileviewer_theme() {
  $path = drupal_get_path('module', 'fileviewer') . '/theme';
  $theme = array(
    'fileviewer_formatter_default' => array(
      'variables' => array('file' => NULL, 'icon_directory' => NULL),
    ),
    'fileviewer_formatter_embed' => array(
      'variables' => array('file' => NULL, 'icon_directory' => NULL),
    ),
    'fileviewer_formatter_preview' => array(
      'variables' => array(
        'item' => NULL, 
        'image_style' => NULL, 
        'path' => NULL,
        'icon_directory' => NULL, 
      ),
    ),
  );
  $theme['bookreader_viewer'] = array(
    'template' => 'bookreader-viewer',
    'variables' => array('file' => NULL),
    'path' => $path,
  );
  /*
  $theme['epub_viewer'] = array(
    'template' => 'epub-viewer',
    'variables' => array('file' => NULL),
    'path' => $path,
  );
  $theme['epubjs_viewer'] = array(
    'template' => 'epubjs-viewer',
    'variables' => array('file' => NULL),
    'path' => $path,
  );
  */
  $theme['googledocs_viewer'] = array(
    'template' => 'googledocs-viewer',
    'variables' => array('file' => NULL),
    'path' => $path,
  );
  return $theme;
}


function fileviewer_path($fid){
  return drupal_realpath('public://') . '/' . variable_get('fileviewer_path', 'fileviewer') . '/' . $fid;
}

