<?php

/**
 * @file form_builder_crud.module
 * Provides CRUD functionality for form_builder.
 */

/**
 * Loads the form information from the database.
 */
function form_builder_crud_load($form_id) {
  return db_query("SELECT * FROM {form_builder_forms} WHERE form_id = :form_id", array(':form_id' => array($form_id)))->fetchAssoc();
}

/**
 * Implements hook_form_builder_load().
 */
function form_builder_crud_form_builder_load($form_type, $form_id) {
  if ($form_type == 'crud') {
    $form_builder = form_builder_crud_load($form_id);
    if ($form_builder) {
      return unserialize($form_builder['form']);
    }
  }
}

/**
 * Wrapper for form_builder_crud_form_builder_load().
 */
function form_builder_crud_form_load($form_id) {
  return form_builder_crud_form_builder_load('crud', $form_id);
}

/**
 * Saves the crud form information to the database.
 */
function form_builder_crud_save($form_builder) {
  $exists = form_builder_crud_load($form_builder['form_id']);
  if (empty($exists)) {
    drupal_write_record('form_builder_forms', $form_builder);
  }
  else {
    drupal_write_record('form_builder_forms', $form_builder, array('form_id'));
  }
}

/**
 * Wrapper for form_builder_save_form
 */
function form_builder_crud_save_form($form_id) {
  module_load_include('inc', 'form_builder', 'includes/form_builder.api');
  $form = form_builder_cache_load('crud', $form_id);
  form_builder_save_form($form, 'crud', $form_id);
}

/**
 * Implements hook_form_builder_save().
 *
 * Saves the crud form from the cache into permanent storage.
 */
function form_builder_crud_form_builder_save($form, $form_type, $form_id) {
  if ($form_type == 'crud') {
    $form_builder = form_builder_crud_load($form_id);
    $form_builder['form_id'] = $form_id;
    $form_builder['description'] = isset($form_builder['description']) ? $form_builder['description'] : '';
    $form_builder['status'] = isset($form_builder['status']) ? $form_builder['status'] : 1;
    if (!empty($form)) {
      $form_builder['form'] = serialize($form);
    }
    else {
      $ha = form_builder_cache_load('crud', $form_id);
    }
    form_builder_crud_save($form_builder);
  }
}

/**
 * Implementation of hook_form_builder_field_access().
 */
function form_builder_crud_form_builder_field_access($op, $form_type, $form_id, $element) {
  // If desiring to add extra access permissions return FALSE if access is denied.
  // return user_access('administer content types');
}

/**
 * Implements hook_form_builder_types().
 *
 * Define the supported fields and properties supported by CCK.
 */
function form_builder_crud_form_builder_types() {
  $fields = array();

  $fields['fieldset'] = array(
    'title' => t('Fieldset'),
    'properties' => array(
      'title',
      'description',
      'collapsible',
      'collapsed',
    ),
    'default' => array(
      '#title' => t('New fieldset'),
      '#type' => 'fieldset',
      '#collapsible' => TRUE,
      '#collapsed' => FALSE,
    ),
  );

  $fields['number'] = array(
    'title' => t('Number'),
    'properties' => array(
      'title',
      'description',
      'field_prefix',
      'field_suffix',
      'default_value',
      'required',
    ),
    // TODO: how to handle validate functions?
    'validate' => array(
      'number',
    ),
    'default' => array(
      '#key' => 'number',
      '#title' => t('New number'),
      '#type' => 'textfield',
    ),
  );

  $fields['select'] = array(
    'title' => t('Select list'),
    'properties' => array(
      'title',
      'description',
      'default_value',
      'required',
      'options',
      'multiple', // Handled by options element.
      'key_type', // Handled by options element.
      'key_type_toggle', // Handled by options element.
      'key_type_toggled', // Handled by options element.
    ),
    'default' => array(
      '#title' => t('New select list'),
      '#type' => 'select',
      '#options' => array(
        '1' => 'one',
        '2' => 'two',
        '3' => 'three',
      ),
      '#multiple_toggle' => TRUE,
    ),
  );

  // TODO: Merge checkbox with checkboxes?
  /*
   $fields['checkbox'] = array(
   'title' => t('Checkbox'),
   'properties' => array(
   'title',
   'description',
   'return_value',
   'default_value',
   'required',
   ),
   'default' => array(
   '#title' => t('New checkbox'),
   '#type' => 'checkbox',
   ),
   );
   */

  $fields['checkboxes'] = array(
    'title' => t('Checkboxes'),
    'properties' => array(
      'title',
      'description',
      'default_value',
      'required',
      'options',
      'multiple',
      'key_type', // Handled by options element.
      'key_type_toggle', // Handled by options element.
      'key_type_toggled', // Handled by options element.
    ),
    'default' => array(
      '#title' => t('New checkboxes'),
      '#type' => 'checkboxes',
      '#options' => array(
        'one' => 'one',
        'two' => 'two',
        'three' => 'three',
      ),
    ),
  );

  $fields['radios'] = array(
    'title' => t('Radios'),
    'properties' => array(
      'title',
      'description',
      'default_value',
      'required',
      'options',
      'key_type', // Handled by options element.
      'key_type_toggle', // Handled by options element.
      'key_type_toggled', // Handled by options element.
    ),
    'default' => array(
      '#title' => t('New radios'),
      '#type' => 'radios',
      '#options' => array(
        'one' => 'one',
        'two' => 'two',
        'three' => 'three',
      ),
    ),
  );

  $fields['textfield'] = array(
    'title' => t('Textfield'),
    'properties' => array(
      'title',
      'description',
      'field_prefix',
      'field_suffix',
      'default_value',
      'required',
      'size',
    ),
    'default' => array(
      '#title' => t('New textfield'),
      '#type' => 'textfield',
    ),
  );

  $fields['textarea'] = array(
    'title' => t('Textarea'),
    'properties' => array(
      'title',
      'description',
      'default_value',
      'required',
      'rows',
      'cols',
      'input_format',
    ),
    'default' => array(
      '#title' => t('New textarea'),
      '#type' => 'textarea',
    ),
  );

  $fields['file'] = array(
    'title' => t('File'),
    'properties' => array(
      'title',
      'description',
      'required',
      'size',
      'file_extension_validate',
      'file_size_validate',
    ),
    'default' => array(
      '#title' => t('New file'),
      '#type' => 'file',
      '#size' => 30,
    ),
  );

  $fields['image'] = array(
    'title' => t('Image'),
    'properties' => array(
      'title',
      'description',
      'required',
    ),
    'validate' => array(
      'file_extension_validate',
      'file_size_validate',
      'file_image_size',
    ),
    'default' => array(
      '#title' => t('New image'),
      '#type' => 'file',
      '#size' => 30,
    ),
  );

  return array(
    'crud' => $fields,
  );
}

/**
 * Implements hook_form_builder_preview_alter().
 */
function form_builder_crud_form_builder_preview_alter($element, $form_type, $form_id) {
  if ($form_type == 'crud') {
    if (isset($element['#description'])) {
      $element['#description'] = filter_xss($element['#description']);
    }
  }
}

function form_builder_crud_interface($form_id) {
  module_load_include('inc', 'form_builder', 'includes/form_builder.admin');

  return form_builder_interface('crud', $form_id);
}
