<?php
/**
 * @file
 * particle_emitter.
 */

define('PARTICLE_EMITTER_DEFAULT_CANVAS', 'particle-emitter-canvas');
define('PARTICLE_EMITTER_DEFAULT_BLOCK_PER_PAGE', 1);

 /**
  * Implements hook_block_info().
  * 
  * Info standard hook.
  */
function particle_emitter_block_info() {

  $blocks = array();

  $blocks['particle_emitter'] = array(
    'info' => 'Particle Emitter',
  );

  $blocks_custom = variable_get('particle_emitter_blocks', '');
  if (!empty($blocks_custom)) {
    foreach ($blocks_custom as $key => $cb) {
      $blocks['particle_emitter_' . $cb['particle_emitter_block_id']] = array(
        'info' => $cb['particle_emitter_block_name'],
      );
    }
  }
  return $blocks;
}

 /**
  * Implements hook_block_view().
  */
function particle_emitter_block_view($delta = '') {

  $block = array();
  $blocks_custom = variable_get('particle_emitter_blocks', '');
  if (empty($blocks_custom)) {
    $blocks_custom = array();
  }
  $blocks_custom[] = array('particle_emitter_block_id' => 'particle_emitter', 'particle_emitter_block_name' => 'Particle Emitter');
  foreach ($blocks_custom as $key => $cb) {
    if ($delta == 'particle_emitter_' . $cb['particle_emitter_block_id'] || $delta == 'particle_emitter') {
      $static = &drupal_static(__FUNCTION__);
      if (empty($static)) {
        $static['blocks_on_page'] = 1;
      }
      if ($static['blocks_on_page'] <= PARTICLE_EMITTER_DEFAULT_BLOCK_PER_PAGE) {
        $block = array(
          'subject' => '',
          'content' => '',
        );
        $block['content'][$delta] = array(
          '#theme' => 'particle_emitter',
          '#variables' => array('content' => NULL),
          '#content' => array('delta' => $delta),
        );
        $block['content']['#attached']['js'][] = drupal_get_path('module', 'particle_emitter') . '/js/particle_emitter.js';
        $block['content']['#attached']['css'][] = drupal_get_path('module', 'particle_emitter') . '/css/particle_emitter.css';
        $static['blocks_on_page']++;
      }
    }
  }

  return $block;
}

 /**
  * Implements hook_block_configure().
  */
function particle_emitter_block_configure($delta = '') {

  $form = array();
  $form['particle_emitter_title'] = array(
    '#type' => 'item',
    '#title' => t('Particle Emitter settings'),
  );
  $form['particle_emitter'] = array(
    '#type' => 'vertical_tabs',
    '#attached' => array(),
  );

  $include_forms = array(
    'config_global',
    'config_emitter',
    'config_particles',
    'config_canvas',
    'config_colors',
  );
  foreach ($include_forms as $inc_form_name) {
    module_load_include('inc', 'particle_emitter', 'particle_emitter.' . $inc_form_name);
  }
  $form['particle_emitter'][] = particle_emitter_global_form_inc($delta);
  $form['particle_emitter'][] = particle_emitter_emitter_form_inc($delta);
  $form['particle_emitter'][] = particle_emitter_particles_form_inc($delta);
  $form['particle_emitter'][] = particle_emitter_canvas_form_inc($delta);
  $form['particle_emitter'][] = particle_emitter_colors_form_inc($delta);

  return $form;
}

 /**
  * Implements hook_block_save().
  */
function particle_emitter_block_save($delta = '', $edit = array()) {

  // @todo factory reset per block.
  // if ($edit['particle_emitter_factory_reset'] == 1) {.
  // if particle_emitter_factory_reset delete all for delta...
  // }.
  // Emitter.
  $_fields = array(
    'particle_emitter_container' => '#' . str_replace('_', '-', $delta),
    'particle_emitter_emitter_position_type' => 'center',
    'particle_emitter_emitter_offset_x' => 0,
    'particle_emitter_emitter_offset_y' => 0,
    'particle_emitter_particle_count' => 10,
    'particle_emitter_particle_composite_type' => 'darker',
    'particle_emitter_particle_life' => 'random',
    'particle_emitter_particle_life_fix' => 10,
    'particle_emitter_particle_life_min' => 10,
    'particle_emitter_particle_life_max' => 10,
    'particle_emitter_particle_type' => 'circle',
    'particle_emitter_particle_radius' => 'random',
    'particle_emitter_particle_radius_transform' => 'shrink',
    'particle_emitter_particle_radius_fix' => 10,
    'particle_emitter_particle_radius_min' => 10,
    'particle_emitter_particle_radius_max' => 30,
    'particle_emitter_particle_rect_transform' => 'shrink',
    'particle_emitter_particle_rect_width' => 10,
    'particle_emitter_particle_rect_height' => 10,
    'particle_emitter_particle_image_transform' => 'off',
    'particle_emitter_particle_image_set' => array(),
    'particle_emitter_particle_text_string' => 'Drupal',
    'particle_emitter_particle_text_style' => 'bold 36px Arial',

    'particle_emitter_canvas_width' => 0,
    'particle_emitter_canvas_height' => 0,
    'particle_emitter_canvas_composite_type' => 'source-over',

    'particle_emitter_canvas_fill_style' => 'full',
    'particle_emitter_canvas_bgcolor' => '#ffffff',
    'particle_emitter_particles_fill_style' => 'gradient',
    'particle_emitter_particles_fill_type' => 'gradient',
    'particle_emitter_particles_color_hex' => '#000000',
  );
  foreach ($_fields as $_field => $_preset) {
    if ($edit[$_field]) {
      $d = variable_get($_field, array($delta => $_preset));
      $d[$delta] = $edit[$_field];
      variable_set($_field, $d);
    }
  }
}

 /**
  * Implements hook_theme().
  */
function particle_emitter_theme($existing, $type, $theme, $path) {

  return array(
    'particle_emitter' => array(
      'variables' => array(
        'content' => NULL,
      ),
      'template' => 'particle_emitter',
    ),
  );
}

 /**
  * Preprocesses particle_emitter variables.
  */
function template_preprocess_particle_emitter(&$variables) {

  $delta = $variables['content']['delta'];

  $_fields = array(
    'particle_emitter_frame_rate' => 30,
    /*'particle_emitter_container' => '#' . str_replace('_', '-', $delta),*/
    'particle_emitter_emitter_position_type' => 'center',
    'particle_emitter_emitter_offset_x' => 0,
    'particle_emitter_emitter_offset_y' => 0,
    'particle_emitter_particle_count' => 10,
    'particle_emitter_particle_composite_type' => 'darker',
    'particle_emitter_particle_life' => 'random',
    'particle_emitter_particle_life_fix' => 10,
    'particle_emitter_particle_life_min' => 10,
    'particle_emitter_particle_life_max' => 10,
    'particle_emitter_particle_type' => 'circle',
    'particle_emitter_particle_radius' => 'random',
    'particle_emitter_particle_radius_transform' => 'shrink',
    'particle_emitter_particle_radius_fix' => 10,
    'particle_emitter_particle_radius_min' => 10,
    'particle_emitter_particle_radius_max' => 30,
    'particle_emitter_particle_rect_transform' => 'shrink',
    'particle_emitter_particle_rect_width' => 10,
    'particle_emitter_particle_rect_height' => 10,
    'particle_emitter_particle_image_transform' => 'off',
    'particle_emitter_particle_text_string' => 'Drupal',
    'particle_emitter_particle_text_style' => 'bold 36px Arial',

    'particle_emitter_canvas_width' => 0,
    'particle_emitter_canvas_height' => 0,
    'particle_emitter_canvas_composite_type' => 'source-over',

    'particle_emitter_canvas_fill_style' => 'full',
    'particle_emitter_canvas_bgcolor' => '#ffffff',
    'particle_emitter_particles_fill_style' => 'gradient',
    'particle_emitter_particles_fill_type' => 'random',
    'particle_emitter_particles_color_hex' => '#000000',
  );

  $images = variable_get("particle_emitter_images");
  $image_paths = array();
  for ($i = 0; $i < count($images); $i++) {
    $img = $images[$i]['file']['file_managed_container']['file_managed_element'];
    if($img != 0) {
      $image_file = file_load($img);
      if (isset($image_file->uri)) {
        $image_paths[] = file_create_url($image_file->uri);
      }
    }
  }

  $js_settings = array(
    'canvas' => PARTICLE_EMITTER_DEFAULT_CANVAS,
    'container' => str_replace('_', '-', $delta),
    'container_id' => '#' . str_replace('_', '-', $delta),
    'particle_image_set' => $image_paths,
  );

  $d = array();
  foreach ($_fields as $_field => $_preset) {
    $default = array($delta => $_preset);
    $d[$_field] = variable_get($_field, $default);
    if (empty($d[$_field][$delta])) {
      $d[$_field][$delta] = $default[$delta];
    }
    $js_settings[str_replace('particle_emitter_', '', $_field)] = $d[$_field][$delta];
  }

  drupal_add_js(array('particle_emitter' => $js_settings), 'setting');
}

 /**
  * Gets the html5 canvas composite types.
  */
function _particle_emitter_get_composite_types() {

  $ctypes = array(
    'Source' => array(
      'source-over' => 'Source-over',
      'source-in' => 'Source-in',
      'source-out' => 'Source-out',
      'source-atop' => 'Source-atop',
    ),
    'Destination' => array(
      'destination-over' => 'Destination-over',
      'destination-in' => 'Destination-in',
      'destination-out' => 'Destination-out',
      'destination-atop' => 'Destination-atop',
    ),
    'Other' => array(
      'lighter' => 'Lighter',
      'darker' => 'Darker',
      'copy' => 'Copy',
      'xor' => 'Xor',
    ),
  );
  return $ctypes;
}

 /**
  * Implements hook_menu().
  */
function particle_emitter_menu() {

  $items['admin/config/system/particle_emitter'] = array(
    'title' => 'Particle Emitter',
    'description' => 'Particle Emitter Configuration.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('particle_emitter_general_form_inc'),
    'access arguments' => array('administer site configuration'),
    'type' => MENU_NORMAL_ITEM,
    'file' => 'particle_emitter.config_general.inc',
  );
  $items['admin/config/system/particle_emitter/general'] = array(
    'title' => 'General',
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => 0,
  );
  $items['admin/config/system/particle_emitter/blocks'] = array(
    'title' => 'Blocks',
    'description' => 'Block Administration.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('particle_emitter_blocks_form'),
    'access arguments' => array('administer site configuration'),
    'access callback' => 'user_access',
    'type' => MENU_LOCAL_TASK,
    'file' => 'particle_emitter.config_blocks.inc',
    'weight' => 1,
  );
  $items['admin/config/system/particle_emitter/images'] = array(
    'title' => 'Images',
    'description' => 'Image Administration.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('particle_emitter_images_form'),
    'access arguments' => array('administer site configuration'),
    'access callback' => 'user_access',
    'type' => MENU_LOCAL_TASK,
    'file' => 'particle_emitter.config_images.inc',
    'weight' => 1,
  );
  return $items;
}

 /**
  * Implements hook_help().
  */
function particle_emitter_help($path, $arg) {

  switch ($path) {
    case 'admin/help#particle_emitter':
      return '<h3>' . t('About') . '</h3>' .
      t('Particle Emitter is a highly configurable module which provides a particle emitter system using HTML5 canvas.') . '<br/>' .
      t('You can change the behaviour of this module on the particle_emitter configuration') . '<br/>' .
      t('To add the block to a region go to <a href="@blocks">block configuration page</a>.', array('@blocks' => url('admin/structure/block'))) .
      '<h3>' . t('Configuration') . '</h3>' .
      t("For more configuration details, please the project page of this module on drupal dot org and visit the documentation sites.");
  }
}
