Index: rules_forms/rules_forms.admin.inc
===================================================================
--- rules_forms/rules_forms.admin.inc	(revision 0)
+++ rules_forms/rules_forms.admin.inc	(revision 0)
@@ -0,0 +1,110 @@
+<?php
+// $Id$
+
+
+/**
+ * @file
+ * Implements forms events management screen.
+ */
+ 
+/**
+ * Defines the forms events settings form
+ */
+function rules_forms_admin_events(&$form_state) {
+  $form = array();
+  $form_events = variable_get('rules_forms_events', array());
+  $form['enable_form_id_message'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable form ID event activation message'),
+    '#default_value' => variable_get('rules_forms_display_id', 0),
+    '#description' => t('If checked, there will be a message on each form containing the form ID and a link to enable events for the form. Only visible for your account.'),
+  );
+  if (!empty($form_events)) {
+    $form['form_events'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Form IDs that will provide events'),
+      '#default_value' => array_keys($form_events),
+      '#options' => $form_events,
+      '#description' => t('Currently activated form IDs that will fire events for usage with Rules.'),
+    );
+  }
+  $form['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+  return $form;
+}
+
+/**
+ * Submit handler for updating rules forms settings.
+ */
+function rules_forms_admin_events_submit($form_id, $form_values) {
+  $form_events_changed = $form_values['values']['form_events'];
+  if (!empty($form_events_changed)) {
+    $form_events = variable_get('rules_forms_events', array());
+    // check if an event has been unset
+    foreach ($form_events_changed as $form_id => $value) {
+      if (empty($value)) {
+        unset($form_events[$form_id]);
+      }
+    }
+    variable_set('rules_forms_events', $form_events);
+  }
+  $form_id_msg = $form_values['values']['enable_form_id_message'];
+  global $user;
+  $display_form_id_users = variable_get('rules_forms_display_id', array());
+  if ($form_id_msg) {
+    if (!in_array($user->uid, $display_form_id_users)) {
+      $display_form_id_users[] = $user->uid;
+      variable_set('rules_forms_display_id', $display_form_id_users);
+    }
+  }
+  else {
+    $key = array_search($user->uid, $display_form_id_users);
+    unset($display_form_id_users[$key]);
+    variable_set('rules_forms_display_id', $display_form_id_users);
+  }
+  drupal_set_message(t('The settings have been saved.'));
+}
+
+/**
+ * Activation page for a form ID.
+ */
+function rules_forms_activate($form_id_activate) {
+  $form_events = variable_get('rules_forms_events', array());
+  if (in_array($form_id_activate, array_keys($form_events))) {
+    return t('Events for %form_id have already been activated.', array('%form_id' => $form_id_activate));
+  }
+  return drupal_get_form('rules_forms_activate_form', $form_id_activate);
+}
+
+/**
+ * Confirmation form to activate events on a form.
+ */
+function rules_forms_activate_form(&$form_state, $form_id_activate) {
+  $form = array(
+    'form_id_label' => array(
+        '#type' => 'textfield',
+        '#title' => t('Custom Form ID label'),
+        '#default_value' => $form_id_activate,
+        '#required' => TRUE,
+        '#description' => t('Enter a custom label to better recognize the form ID in the administration user interface.'),
+    ),
+  );
+  $form_state['form_id_activate'] = $form_id_activate;
+
+  $path = array();
+  $path['path'] = isset($_GET['destination']) ? $_GET['destination'] : RULES_ADMIN_FORMS_PATH;
+
+  $title = t('Are you sure you want to activate events for %form?', array('%form' => $form_id_activate));
+  $msg = t('Once the activation is confirmed, events are triggered on this form and can be used in rules.');
+  return confirm_form($form, $title, $path, $msg, t('Activate'), t('Cancel'));
+}
+
+/**
+ * Submit handler for activation of a form.
+ */
+function rules_forms_activate_form_submit($form, &$form_state) {
+  $form_events = variable_get('rules_forms_events', array());
+  $form_events[$form_state['form_id_activate']] = $form_state['values']['form_id_label'];
+  variable_set('rules_forms_events', $form_events);
+  drupal_set_message(t("%form has been activated.", array('%form' => $form_state['form_id_activate'])));
+  $form_state['redirect'] = RULES_ADMIN_FORMS_PATH;
+}
\ No newline at end of file
Index: rules_forms/rules_forms.rules.inc
===================================================================
--- rules_forms/rules_forms.rules.inc	(revision 0)
+++ rules_forms/rules_forms.rules.inc	(revision 0)
@@ -0,0 +1,195 @@
+<?php
+// $Id$
+
+
+/**
+ * @file
+ * Rules integration to provide form support
+ *
+ * @addtogroup rules
+ * @{
+ */
+
+/**
+ * Implementation of hook_rules_event_info().
+ */
+function rules_forms_rules_event_info() {
+  $form_events = variable_get('rules_forms_events', array());
+  $events = array();
+  foreach ($form_events as $form_id => $label) {
+    $events[$form_id .'_form_built'] = array(
+      'label' => t('@form is being built', array('@form' => $label)),
+      'module' => 'Forms',
+      'arguments' => rules_forms_events_arguments(),
+    );
+  }
+  return $events;
+}
+
+/**
+ * Returns some arguments suitable for hook form alter.
+ */
+function rules_forms_events_arguments() {
+  return array(
+    'form' => array(
+      'type' => 'form',
+      'label' => t('Form'),
+    ),
+    'form_state' => array(
+      'type' => 'form_state',
+      'label' => t('Form state'),
+    ),
+    'form_id' => array(
+      'type' => 'string',
+      'label' => t('Form ID'),
+    ),
+  ) + rules_events_global_user_argument();
+}
+
+/**
+ * Implementation of hook_rules_action_info().
+ */
+function rules_forms_rules_action_info() {
+  return array(
+    'rules_forms_action_redirect' => array(
+      'label' => t('Set the redirect target of the form'),
+      'arguments' => array(
+        'form' => array('type' => 'form', 'label' => t('Form')),
+        'redirect' => array(
+          'type' => 'string',
+          'label' => t('Redirect target'),
+          'description' => t('A path where the user is redirected to after submitting the form.'),
+        ),
+      ),
+      'module' => 'Forms',
+    ),
+    'rules_forms_action_hide_element' => array(
+      'label' => t('Hide an element of the form'),
+      'arguments' => array(
+        'form' => array('type' => 'form', 'label' => t('Form')),
+        'hide' => array(
+          'type' => 'string',
+          'label' => t('Element ID to hide'),
+          'description' => t('The element that should not appear.'),
+        ),
+      ),
+      'module' => 'Forms',
+    ),
+    'rules_forms_action_adjust_weight' => array(
+      'label' => t('Adjust weight of an element in the form'),
+      'arguments' => array(
+        'form' => array('type' => 'form', 'label' => t('Form')),
+        'element' => array(
+          'type' => 'string',
+          'label' => t('Element ID to adjust weight'),
+          'description' => t('The element that should be adjusted.'),
+        ),
+        'weight' => array(
+          'type' => 'number',
+          'label' => t('Element weight'),
+          'description' => t('Low numbers make the element bubble up, high numbers sink it down.'),
+        ),
+      ),
+      'module' => 'Forms',
+    ),
+    'rules_forms_action_prefix_suffix_html' => array(
+      'label' => t('Insert HTML prefix/suffix code'),
+      'arguments' => array(
+        'form' => array('type' => 'form', 'label' => t('Form')),
+        'element' => array(
+          'type' => 'string',
+          'label' => t('Form element ID'),
+          'description' => t('ID of the form element to be targeted.'),
+        ),
+        'prefix' => array(
+          'type' => 'string',
+          'label' => t('Prefixed HTML'),
+          'description' => t('HTML inserted before.'),
+        ),
+        'suffix' => array(
+          'type' => 'string',
+          'label' => t('Suffixed HTML'),
+          'description' => t('HTML inserted after.'),
+        ),
+      ),
+      'module' => 'Forms',
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_rules_data_type_info().
+ */
+function rules_forms_rules_data_type_info() {
+  return array(
+    'form' => array(
+      'label' => t('form'),
+      'class' => 'rules_data_type',
+      'savable' => FALSE,
+      'identifiable' => FALSE,
+      'uses_input_form' => FALSE,
+      'module' => 'Forms',
+    ),
+    'form_state' => array(
+      'label' => t('form_state'),
+      'class' => 'rules_data_type',
+      'savable' => FALSE,
+      'identifiable' => FALSE,
+      'uses_input_form' => FALSE,
+      'module' => 'Forms',
+    ),
+  );
+}
+
+/**
+ * Action implementation: Set the redirect target.
+ */
+function rules_forms_action_redirect(&$form, $redirect) {
+  $form['#redirect'] = $redirect;
+}
+
+/**
+ * Action implementation: Hide a form element.
+ */
+function rules_forms_action_hide_element(&$form, $hide) {
+  $form[$hide]['#access'] = FALSE;
+}
+
+/**
+ * Action implementation: Adjust weight of a form element.
+ */
+function rules_forms_action_adjust_weight(&$form, $element, $weight) {
+  // CCK overrides weight settings in #content_extra_fields
+  if (isset($form['#content_extra_fields'][$element]['weight'])) {
+    $form['#content_extra_fields'][$element]['weight'] = $weight;
+  }
+  else {
+    $form[$element]['#weight'] = $weight;
+  }
+}
+
+/**
+ * Action implementation: Insert prefix/suffix HTML code.
+ */
+function rules_forms_action_prefix_suffix_html(&$form, $element, $prefix, $suffix) {
+  if (empty($element)) {
+    if (!empty($prefix)) {
+      $form['#prefix'] = $prefix;
+    }
+    if (!empty($suffix)) {
+      $form['#suffix'] = $suffix;
+    }
+  }
+  else {
+    if (!empty($prefix)) {
+      $form[$element]['#prefix'] = $prefix;
+    }
+    if (!empty($suffix)) {
+      $form[$element]['#suffix'] = $suffix;
+    }
+  }
+}
+
+/**
+ * @}
+ */
\ No newline at end of file
Index: rules_forms/rules_forms.module
===================================================================
--- rules_forms/rules_forms.module	(revision 0)
+++ rules_forms/rules_forms.module	(revision 0)
@@ -0,0 +1,74 @@
+<?php
+// $Id$
+
+
+/**
+ * @file
+ * Rules forms module.
+ */
+
+// Defines paths of the admin interface
+define('RULES_ADMIN_FORMS_PATH', RULES_ADMIN_PATH .'/forms');
+
+
+/**
+ * Implementation of hook_help().
+ */
+function rules_forms_help($path, $arg) {
+  if ($path === RULES_ADMIN_FORMS_PATH) {
+    return '<p>'. t('Overview of all forms on the site that can be enabled to trigger form events.') .'</p>';
+  }
+}
+
+/**
+ * Implementation of hook_menu().
+ */
+function rules_forms_menu() {
+  $items = array();
+  $items[RULES_ADMIN_FORMS_PATH] = array(
+    'title' => 'Form events',
+    'description' => 'Configure Rules forms events.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('rules_forms_admin_events'),
+    'access arguments' => array('administer rules'),
+    'type' => MENU_NORMAL_ITEM,
+    'weight' => 6,
+    'file' => 'rules_forms.admin.inc',
+  );
+  $items[RULES_ADMIN_FORMS_PATH .'/%/activate'] = array(
+    'title' => 'Activate events for a form',
+    'type' => MENU_CALLBACK,
+    'page callback' => 'rules_forms_activate',
+    'page arguments' => array(3),
+    'access arguments' => array('administer rules'),
+    'file' => 'rules_forms.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implementation of hook_form_alter().
+ */
+function rules_forms_form_alter(&$form, &$form_state, $form_id) {
+  $form_events = variable_get('rules_forms_events', array());
+  // Fire event if form is enabled
+  if (in_array($form_id, array_keys($form_events))) {
+    $action_args = array(
+      'form' => &$form,
+      'form_state' => &$form_state,
+      'form_id' => $form_id,
+    );
+    rules_invoke_event($form_id .'_form_built', $action_args);
+    //dsm($form);
+  }
+  // Display form ID message if enabled for the user.
+  global $user;
+  if ($user->uid) {
+    $display_form_id_users = variable_get('rules_forms_display_id', array());
+    if (in_array($user->uid, $display_form_id_users)) {
+      $msg = t('Form ID: %id, ', array('%id' => $form_id));
+      $link = l(t('activate events'), RULES_ADMIN_FORMS_PATH .'/'. $form_id .'/activate/');
+      drupal_set_message($msg . $link);
+    }
+  }
+}
\ No newline at end of file
Index: rules_forms/rules_forms.rules_forms.inc
===================================================================
--- rules_forms/rules_forms.rules_forms.inc	(revision 0)
+++ rules_forms/rules_forms.rules_forms.inc	(revision 0)
@@ -0,0 +1,75 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Contains forms for rules forms actions.
+ */
+
+/**
+ * Action adjust weight configuration form.
+ */
+function rules_forms_action_adjust_weight_form($settings, &$form) {
+  $form['settings']['weight']['#type'] = 'weight';
+  $form['settings']['weight']['#delta'] = 50;
+  if (isset($settings['weight'])) {
+    $form['settings']['weight']['#default_value'] = $settings['weight'];
+  }
+  else {
+    $form['settings']['weight']['#default_value'] = 0;
+  }
+}
+
+/**
+ * Action prefix/suffix code configuration form.
+ */
+function rules_forms_action_prefix_suffix_html_form($settings, &$form) {
+  $form['settings']['element']['#required'] = FALSE;
+  $form['settings']['element']['#description'] = t('ID of the form element to be targeted. Leave empty to apply prefix/suffix code to the whole form.');
+  $form['settings']['prefix']['#type'] = 'textarea';
+  $form['settings']['prefix']['#required'] = FALSE;
+  $form['settings']['suffix']['#type'] = 'textarea';
+  $form['settings']['suffix']['#required'] = FALSE;
+}
+
+/**
+ * Validation of the prefix/suffix action configuration form.
+ */
+function rules_forms_action_prefix_suffix_html_validate($form, $form_state) {
+  if (empty($form_state['values']['settings']['prefix']) && empty($form_state['values']['settings']['suffix'])) {
+    form_set_error('settings][prefix', t('You have to specify at least the prefix or suffix field.'));
+  }
+}
+
+/**
+ * Label callback for adjusting weights action.
+ */
+function rules_forms_action_adjust_weight_label($settings, $argument_labels) {
+  return t("Adjust weight of form element '@elem' to @weight", array('@elem' => $settings['element'], '@weight' => $settings['weight']));
+}
+
+/**
+ * Label callback for hiding form elements action.
+ */
+function rules_forms_action_hide_element_label($settings, $argument_labels) {
+  return t("Hide form element '@elem'", array('@elem' => $settings['hide']));
+}
+
+/**
+ * Label callback for redirect action.
+ */
+function rules_forms_action_redirect_label($settings, $argument_labels) {
+  return t("Set form redirect target to '@redirect'", array('@redirect' => $settings['redirect']));
+}
+
+/**
+ * Label callback for prefix/suffix action.
+ */
+function rules_forms_action_prefix_suffix_html_label($settings, $argument_labels) {
+  if (empty($settings['element'])) {
+    return t('Insert HTML prefix/suffix code on form');
+  }
+  else {
+    return t("Insert HTML prefix/suffix code on '@element'", array('@element' => $settings['element']));
+  }
+}
\ No newline at end of file
Index: rules_forms/rules_forms.info
===================================================================
--- rules_forms/rules_forms.info	(revision 0)
+++ rules_forms/rules_forms.info	(revision 0)
@@ -0,0 +1,6 @@
+; $Id$
+name = Rules Forms support
+description = Provides events, conditions and actions for forms.
+dependencies[] = rules
+package = Rules
+core = 6.x
\ No newline at end of file
Index: rules_scheduler/rules_scheduler.rules_forms.inc
===================================================================
--- rules_scheduler/rules_scheduler.rules_forms.inc	(revision 2939)
+++ rules_scheduler/rules_scheduler.rules_forms.inc	(working copy)
@@ -27,6 +27,6 @@ function rules_scheduler_action_delete_form($setti
  */
 function rules_scheduler_action_delete_validate($form, $form_state) {
   if ($form_state['values']['settings']['task_identifier'] === "" && empty($form_state['values']['settings']['ruleset'])) {
-    form_set_error('settings', t('You have specify at least one field.'));
+    form_set_error('settings', t('You have to specify at least one field.'));
   }
 }
