Index: stormexpense/stormexpense.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormexpense/stormexpense.module,v
retrieving revision 1.4.4.33
diff -u -r1.4.4.33 stormexpense.module
--- stormexpense/stormexpense.module	25 Sep 2009 16:17:35 -0000	1.4.4.33
+++ stormexpense/stormexpense.module	8 Nov 2009 21:58:11 -0000
@@ -245,6 +245,21 @@
   db_query($s, $ticket_title, $ticket_nid, $ticket_title);
 }
 
+function stormexpense_stormproject_change_hierarchy($project_nid, $organization_nid, $organization_title) {
+  $s = "UPDATE {stormexpense} SET organization_nid=%d, organization_title='%s' WHERE project_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid);
+}
+
+function stormexpense_stormtask_change_hierarchy($task_nid, $organization_nid, $organization_title, $project_nid, $project_title) {
+  $s = "UPDATE {stormexpense} SET organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s' WHERE task_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid, $project_title, $task_nid);
+}
+
+function stormexpense_stormticket_change_hierarchy($ticket_nid, $organization_nid, $organization_title, $project_nid, $project_title, $task_nid, $task_title) {
+  $s = "UPDATE {stormexpense} SET organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s', task_nid=%d, task_title='%s' WHERE ticket_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid, $project_title, $task_nid, $task_title, $ticket_nid);
+}
+
 function stormexpense_form(&$node) {
   $breadcrumb = array();
   $breadcrumb[] = l(t('Storm'), 'storm');
Index: storminvoice/storminvoice.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/storminvoice/storminvoice.module,v
retrieving revision 1.4.4.64
diff -u -r1.4.4.64 storminvoice.module
--- storminvoice/storminvoice.module	6 Nov 2009 00:37:44 -0000	1.4.4.64
+++ storminvoice/storminvoice.module	8 Nov 2009 21:25:36 -0000
@@ -289,7 +289,7 @@
   return $cond;
 }
 
-// LOAD ORGANISATION AND PROJECT DETAILS
+// IMPLEMENT STORM HOOKS - ACCOUNT FOR CHANGES IN OTHER STORM NODES
 function storminvoice_stormorganization_change($organization_nid, $organization_title) {
   $s = "UPDATE {storminvoice} SET organization_title='%s' WHERE organization_nid=%d AND organization_title <> '%s'";
   db_query($s, $organization_title, $organization_nid, $organization_title);
@@ -300,6 +300,11 @@
   db_query($s, $project_title, $project_nid, $project_title);
 }
 
+function storminvoice_stormproject_change_hierarchy($project_nid, $organization_nid, $organization_title) {
+  $s = "UPDATE {storminvoice} SET organization_nid=%d, organization_title='%s' WHERE project_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid);
+}
+
 // INVOICE CREATE/EDIT FORM
 function storminvoice_form(&$node) {
   $breadcrumb = array();
Index: stormnote/stormnote.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormnote/stormnote.module,v
retrieving revision 1.6.4.22
diff -u -r1.6.4.22 stormnote.module
--- stormnote/stormnote.module	27 Sep 2009 23:20:59 -0000	1.6.4.22
+++ stormnote/stormnote.module	8 Nov 2009 21:45:17 -0000
@@ -211,6 +211,16 @@
   db_query($s, $task_title, $task_stepno, $task_nid, $task_title, $task_stepno);
 }
 
+function stormnote_stormproject_change_hierarchy($project_nid, $organization_nid, $organization_title) {
+  $s = "UPDATE {stormnote} SET organization_nid=%d, organization_title='%s' WHERE project_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid);
+}
+
+function stormnote_stormtask_change_hierarchy($task_nid, $organization_nid, $organization_title, $project_nid, $project_title) {
+  $s = "UPDATE {stormnote} SET organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s' WHERE task_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid, $project_title, $task_nid);
+}
+
 function stormnote_form(&$node) {
   $breadcrumb = array();
   $breadcrumb[] = l(t('Storm'), 'storm');
Index: stormproject/stormproject.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormproject/stormproject.module,v
retrieving revision 1.8.4.49
diff -u -r1.8.4.49 stormproject.module
--- stormproject/stormproject.module	16 Oct 2009 17:54:05 -0000	1.8.4.49
+++ stormproject/stormproject.module	8 Nov 2009 21:45:11 -0000
@@ -347,6 +347,11 @@
     '#process' => array('storm_dependent_select_process'),
   );
 
+  $form['group1']['organization_nid_old'] = array(
+    '#type' => 'hidden',
+    '#default_value' => $node->organization_nid,
+  );
+  
   $form['title'] = array(
     '#type' => 'textfield',
     '#title' => check_plain($type->title_label),
@@ -563,20 +568,26 @@
 function stormproject_update($node) {
   _stormproject_beforesave($node);
 
+  // this code needs to run whether or not revisions are being used
+  $s = "SELECT title FROM {node} WHERE type='stormorganization' AND nid=%d";
+  $r = db_query($s, $node->organization_nid);
+  $organization = db_fetch_object($r);
+  
+  // If the project has been moved to a different organization, all nodes that reference the project should be updated.
+  if ($node->organization_nid != $node->organization_nid_old) {
+    module_invoke_all('stormproject_change_hierarchy', $node->nid, $node->organization_nid, $organization->title);
+  }
+  
   // if this is a new node or we're adding a new revision,
   if ($node->revision) {
     stormproject_insert($node);
   }
   else {
-    $s = "SELECT title FROM {node} WHERE type='stormorganization' AND nid=%d";
-    $r = db_query($s, $node->organization_nid);
-    $organization = db_fetch_object($r);
-    
     $s = "SELECT title FROM {node} WHERE type='stormperson' AND nid=%d";
     $r = db_query($s, $node->manager_nid);
     $manager = db_fetch_object($r);
     
-  $assigned = node_load($node->assigned_nid);
+    $assigned = node_load($node->assigned_nid);
     
     db_query("UPDATE {stormproject} SET
       organization_nid=%d, organization_title='%s',
@@ -585,7 +596,8 @@
       manager_nid=%d, manager_title='%s', assigned_nid=%d, assigned_title='%s' WHERE vid = %d",
       $node->organization_nid, $organization->title, $node->projectcategory, $node->projectstatus, $node->projectpriority,
       $node->pricemode, $node->price, $node->currency, $node->datebegin, $node->dateend, $node->durationunit, $node->duration,
-      $node->manager_nid, $manager->title, $node->assigned_nid, $assigned->title, $node->vid);
+      $node->manager_nid, $manager->title, $node->assigned_nid, $assigned->title, $node->vid
+    );
     
     if ($node->title != $node->title_old) {
       module_invoke_all('stormproject_change', $node->nid, $node->title);
Index: stormtask/stormtask.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormtask/stormtask.module,v
retrieving revision 1.6.4.46
diff -u -r1.6.4.46 stormtask.module
--- stormtask/stormtask.module	25 Sep 2009 16:22:53 -0000	1.6.4.46
+++ stormtask/stormtask.module	8 Nov 2009 21:54:20 -0000
@@ -329,6 +329,11 @@
   db_query($s, $project_title, $project_nid, $project_title);
 }
 
+function stormtask_stormproject_change_hierarchy($project_nid, $organization_nid, $organization_title) {
+  $s = "UPDATE {stormtask} SET organization_nid=%d, organization_title='%s' WHERE project_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid);
+}
+
 function stormtask_form(&$node) {
   $breadcrumb = array();
   $breadcrumb[] = l(t('Storm'), 'storm');
@@ -402,7 +407,7 @@
     '#required' => true,
     '#attributes' => array('onchange' => "stormtask_organization_project_tasks(this, 'edit-project-nid', 'edit-parent-nid', true, '-')"),
   );
-
+  
   $s = "SELECT n.nid, n.title FROM {node} AS n INNER JOIN {stormproject} AS spr ON spr.vid=n.vid
   WHERE n.status=1 AND spr.organization_nid=%d AND n.type='stormproject' ORDER BY n.title";
   $s = stormproject_access_sql($s);
@@ -422,7 +427,12 @@
     '#required' => true,
     '#attributes' => array('onchange' => "stormtask_project_tasks(this, 'edit-parent-nid', true, '-')"),
   );
-
+  
+  $form['group1']['project_nid_old'] = array(
+    '#type' => 'hidden',
+    '#default_value' => $node->project_nid,
+  );
+  
   $tree = _stormtask_get_tree($node->project_nid);
   $parent_tasks = _stormtask_plain_tree($tree);
   $form['group1']['parent_nid'] = array(
@@ -607,6 +617,21 @@
 }
 
 function stormtask_update($node) {
+  $s = "SELECT n.title FROM {node} n INNER JOIN {stormorganization} o ON n.nid=o.nid
+        WHERE type='stormorganization' AND n.nid=%d";
+  $r = db_query($s, $node->organization_nid);
+  $o = db_fetch_object($r);
+  $node->organization_title = $o->title;
+  
+  $s = "SELECT n.title, p.organization_title FROM {node} n INNER JOIN {stormproject} p ON n.nid=p.nid
+        WHERE type='stormproject' AND n.nid=%d";
+  $r = db_query($s, $node->project_nid);
+  $p = db_fetch_object($r);
+  $node->project_title = $p->title;
+  
+  if ($node->project_nid != $node->project_nid_old) {
+    module_invoke_all('stormtask_change_hierarchy', $node->nid, $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title);
+  }  
   // if this is a new node or we're adding a new revision,
   if ($node->revision) {
     stormtask_insert($node);
Index: stormticket/stormticket.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormticket/stormticket.module,v
retrieving revision 1.5.4.32
diff -u -r1.5.4.32 stormticket.module
--- stormticket/stormticket.module	25 Sep 2009 16:24:03 -0000	1.5.4.32
+++ stormticket/stormticket.module	8 Nov 2009 21:54:16 -0000
@@ -240,6 +240,16 @@
   db_query($s, $task_title, $task_stepno, $task_nid, $task_title, $task_stepno);
 }
 
+function stormticket_stormproject_change_hierarchy($project_nid, $organization_nid, $organization_title) {
+  $s = "UPDATE {stormticket} SET organization_nid=%d, organization_title='%s' WHERE project_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid);
+}
+
+function stormticket_stormtask_change_hierarchy($task_nid, $organization_nid, $organization_title, $project_nid, $project_title) {
+  $s = "UPDATE {stormticket} SET organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s' WHERE task_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid, $project_title, $task_nid);
+}
+
 // INVOICE CREATE / EDIT FORM
 function stormticket_form(&$node) {
   $breadcrumb = array();
@@ -312,7 +322,7 @@
     '#required' => TRUE,
     '#attributes' => array('onchange' => "stormtask_organization_project_tasks(this, 'edit-project-nid', 'edit-parent-nid', true, '-')"),
   );
-
+  
   $s = "SELECT n.nid, n.title FROM {node} AS n INNER JOIN {stormproject} AS spr ON spr.vid=n.vid WHERE spr.organization_nid=%d AND n.status=1 AND n.type='stormproject' ORDER BY n.title";
   $s = stormproject_access_sql($s);
   $s = db_rewrite_sql($s);
@@ -339,7 +349,12 @@
     '#options' => array(0 => '-') + $tasks,
     '#process' => array('storm_dependent_select_process'),
   );
-
+  
+  $form['group1']['task_nid_old'] = array(
+    '#type' => 'hidden',
+    '#default_value' => $node->task_nid,
+  );
+  
   $form['group2'] = array(
     '#type' => 'markup',
     '#theme' => 'storm_form_group',
@@ -458,31 +473,43 @@
 // INSERT / UPDATE FUNCTIONS
 function stormticket_insert($node) {
   _stormticket_beforesave($node);
-
+  
   db_query("INSERT INTO {stormticket}
-            (vid, nid,
-            organization_nid, organization_title,
-            project_nid, project_title,
-            task_nid, task_title, task_stepno,
-            ticketcategory, ticketstatus, ticketpriority,
-            datebegin, dateend, durationunit, duration, pricemode, price, currency)
-           VALUES
-           (%d, %d,
-            %d, '%s',
-            %d, '%s',
-            %d, '%s', '%s',
-            '%s', '%s', '%s',
-            %d, %d, '%s', %f, '%s', %f, '%s')",
-          $node->vid, $node->nid,
-          $node->organization_nid, $node->organization_title,
-          $node->project_nid, $node->project_title,
-          $node->task_nid, $node->task_title, $node->task_stepno,
-          $node->ticketcategory, $node->ticketstatus, $node->ticketpriority,
-          $node->datebegin, $node->dateend, $node->durationunit, $node->duration,
-          $node->pricemode, $node->price, $node->currency);
+    (vid, nid, organization_nid, organization_title, project_nid, project_title,
+    task_nid, task_title, task_stepno, ticketcategory, ticketstatus, ticketpriority, 
+    datebegin, dateend, durationunit, duration, pricemode, price, currency)
+    VALUES
+    (%d, %d, %d, '%s', %d, '%s',
+    %d, '%s', '%s', '%s', '%s', '%s',
+    %d, %d, '%s', %f, '%s', %f, '%s')",
+    $node->vid, $node->nid, $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title,
+    $node->task_nid, $node->task_title, $node->task_stepno, $node->ticketcategory, $node->ticketstatus, $node->ticketpriority,
+    $node->datebegin, $node->dateend, $node->durationunit, $node->duration, $node->pricemode, $node->price, $node->currency
+  );
 }
 
 function stormticket_update($node) {
+  $s = "SELECT n.title FROM {node} n INNER JOIN {stormorganization} o ON n.nid=o.nid
+    WHERE type='stormorganization' AND n.nid=%d";
+  $r = db_query($s, $node->organization_nid);
+  $o = db_fetch_object($r);
+  $node->organization_title = $o->title;
+
+  $s = "SELECT n.title, p.organization_title FROM {node} n INNER JOIN {stormproject} p ON n.nid=p.nid
+    WHERE type='stormproject' AND n.nid=%d";
+  $r = db_query($s, $node->project_nid);
+  $p = db_fetch_object($r);
+  $node->project_title = $p->title;
+
+  $s = "SELECT n.title FROM {node} n INNER JOIN {stormtask} t ON n.nid=t.nid WHERE n.type='stormtask' AND n.nid=%d";
+  $r = db_query($s, $node->task_nid);
+  $ta = db_fetch_object($r);
+  $node->task_title = $ta->title;
+  
+  if ($node->task_nid != $node->task_nid_old) {
+    module_invoke_all('stormticket_change_hierarchy', $node->nid, $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title, $node->task_nid, $node->task_title);
+  }
+  
   // if this is a new node or we're adding a new revision,
   if ($node->revision) {
     stormticket_insert($node);
@@ -490,14 +517,15 @@
   else {
     _stormticket_beforesave($node);
     db_query("UPDATE {stormticket} SET
-              organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s',
-              task_nid=%d, task_title='%s', task_stepno='%s', ticketcategory='%s', ticketstatus='%s', 
-              ticketpriority='%s', datebegin=%d, dateend=%d, durationunit='%s', duration=%f, pricemode='%s', 
-              price=%f, currency='%s' WHERE vid = %d",
-              $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title,
-              $node->task_nid, $node->task_title, $node->task_stepno, $node->ticketcategory, $node->ticketstatus, 
-              $node->ticketpriority, $node->datebegin, $node->dateend, $node->durationunit, $node->duration, $node->pricemode, 
-              $node->price, $node->currency, $node->vid);
+      organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s',
+      task_nid=%d, task_title='%s', task_stepno='%s', ticketcategory='%s', ticketstatus='%s', 
+      ticketpriority='%s', datebegin=%d, dateend=%d, durationunit='%s', duration=%f, pricemode='%s', 
+      price=%f, currency='%s' WHERE vid = %d",
+      $node->organization_nid, $node->organization_title, $node->project_nid, $node->project_title,
+      $node->task_nid, $node->task_title, $node->task_stepno, $node->ticketcategory, $node->ticketstatus, 
+      $node->ticketpriority, $node->datebegin, $node->dateend, $node->durationunit, $node->duration, $node->pricemode, 
+      $node->price, $node->currency, $node->vid
+    );
     if ($node->title != $node->title_old) {
       module_invoke_all('stormticket_change', $node->nid, $node->title);
     }
Index: stormtimetracking/stormtimetracking.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/storm/stormtimetracking/stormtimetracking.module,v
retrieving revision 1.10.4.43
diff -u -r1.10.4.43 stormtimetracking.module
--- stormtimetracking/stormtimetracking.module	28 Oct 2009 22:16:14 -0000	1.10.4.43
+++ stormtimetracking/stormtimetracking.module	8 Nov 2009 21:58:35 -0000
@@ -247,6 +247,21 @@
   db_query($s, $ticket_title, $ticket_nid, $ticket_title);
 }
 
+function stormtimetracking_stormproject_change_hierarchy($project_nid, $organization_nid, $organization_title) {
+  $s = "UPDATE {stormtimetracking} SET organization_nid=%d, organization_title='%s' WHERE project_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid);
+}
+
+function stormtimetracking_stormtask_change_hierarchy($task_nid, $organization_nid, $organization_title, $project_nid, $project_title) {
+  $s = "UPDATE {stormtimetracking} SET organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s' WHERE task_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid, $project_title, $task_nid);
+}
+
+function stormtimetracking_stormticket_change_hierarchy($ticket_nid, $organization_nid, $organization_title, $project_nid, $project_title, $task_nid, $task_title) {
+  $s = "UPDATE {stormtimetracking} SET organization_nid=%d, organization_title='%s', project_nid=%d, project_title='%s', task_nid=%d, task_title='%s' WHERE ticket_nid=%d";
+  db_query($s, $organization_nid, $organization_title, $project_nid, $project_title, $task_nid, $task_title, $ticket_nid);
+}
+
 function stormtimetracking_form(&$node) {
   $breadcrumb = array();
   $breadcrumb[] = l(t('Storm'), 'storm');

