--- support.module	2009-07-02 15:09:24.000000000 +0200
+++ supportNew.module	2009-07-02 15:18:23.000000000 +0200
@@ -145,6 +145,12 @@ function support_menu() {
     'access callback' => TRUE,
     'type' => MENU_CALLBACK,
   );
+  $items['support/%node/reassign/%/%'] = array(
+    'page callback' => 'support_reassign_ticket',
+    'page arguments' => array(1, 3, 4),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
   $items['support/all/unsubscribe/%user/%'] = array(
     'page callback' => 'support_unsubscribe_user',
     'page arguments' => array('all', 3, 4),
@@ -332,6 +338,39 @@ function support_active_clients() {
 }
 
 /**
+ * Reassign ticket
+ */
+function support_reassign_ticket($node,$new_assign,$key)
+	{
+	if ($new_assign == "takefromform")
+		$new_assign = $_REQUEST['new_assigned_user'];
+	if (is_object($node) && is_numeric($new_assign))
+		{
+		$lock = md5($node->nid . $node->assigned);
+		if ($lock == $key && array_key_exists($new_assign,_support_assigned($node->assigned,$node)))
+			{
+			#echo "cool";
+			$oldassigned = $node->assigned;
+			db_query('UPDATE {support_ticket} SET assigned = ' . $new_assign . ' WHERE nid = ' . $node->nid);
+			if (db_affected_rows())
+				{
+                drupal_set_message(t('Support ticket %ticket assigment changed from %oldassigned to %new_assign.',array('%ticket' => check_plain($node->title),'%oldassigned'=>$oldassigned,'%new_assign'=>$new_assign)));
+                }
+            else
+                {
+                drupal_set_message(t('Error while changing the assignment of support ticket %ticket from %oldassigned to %new_assign.',array('%ticket' => check_plain($node->title),'%oldassigned'=>$oldassigned,'%new_assign'=>$new_assign)),'error');
+                }
+			}
+		else
+			{
+			drupal_set_message(t('Error while changing the assignment of support ticket %ticket from %oldassigned to %new_assign (bad key lock or cannot assign to this user).',array('%ticket' => check_plain($node->title),'%oldassigned'=>$oldassigned,'%new_assign'=>$new_assign)),'error');
+			}
+		}
+    drupal_goto($_SERVER['HTTP_REFERER']);
+	}
+
+
+/**
  * Unsubscribe user from tickets.
  */
 function support_unsubscribe_user($node, $account, $key) {
@@ -534,6 +573,28 @@ function support_form(&$node) {
 
 }
 
+function support_reassign_form($form_state,$ticket)
+	{
+    $assignable = _support_assigned($ticket->assigned, $ticket);
+	foreach ($assignable as $ass_uid => $ass_name)
+		{
+		$options[$ass_uid] = $ass_name;
+		}
+	$form['#action'] = url('support/' . $ticket->nid . '/reassign/takefromform/' . md5($ticket->nid.$ticket->assigned));
+	$form['#attributes'] = array('class' => 'support-reassign-form');
+	$form['new_assigned_user'] = array(
+		'#type' => 'select',
+		'#options' => $options,
+		'#default_value' => $ticket->assigned,
+		);
+	$form['submit_assigned_user'] = array(
+		'#type' => 'submit',
+		'#value'=> t('OK')
+		);
+	return $form;
+	}
+
+
 /**
  * Implementation of hook_nodeapi().
  */
@@ -1914,11 +1975,16 @@ function support_page($client = NULL, $s
     array('data' => t('Ticket'), 'field' => 'n.title'),
     array('data' => t('Updated'), 'field' => 'last_updated', 'sort' => 'desc'),
     array('data' => t('Reported by'), 'field' => 'n.uid'),
-    array('data' => t('Assigned to'), 'field' => 't.assigned'),
-    array('data' => t('State'), 'field' => 't.state'),
-    array('data' => t('Priority'), 'field' => 't.priority'),
-    array('data' => t('Updates'), 'field' => 'l.comment_count'),
-  );
+    );
+  if (!user_access('can assign tickets to any user'))
+    $header[] = array('data' => t('Assigned to'), 'field' => 't.assigned');
+  $header[] = array('data' => t('State'), 'field' => 't.state');
+  $header[] = array('data' => t('Priority'), 'field' => 't.priority');
+  $header[] = array('data' => t('Updates'), 'field' => 'l.comment_count');
+  if (user_access('can assign tickets to any user'))
+  	$header[] = array('data' => t('Assign'));
+  elseif (user_access('can assign tickets to self'))
+  	$header[] = array('data' => t('Take'));
   if ($state == -2) {
     $my_open = " AND t.assigned = $user->uid";
   }
@@ -1959,15 +2025,30 @@ function support_page($client = NULL, $s
       $node = node_load($ticket->nid);
       $comments .= '&nbsp;('. l(format_plural($new, '1 new', '@count new'), "node/$ticket->nid", array('query' => comment_new_page_count($node->comment_count, $new, $node), 'fragment' => 'new')) .')';
     }
-    $rows[] = array('data' => array(
+    $thisrow = array('data' => array(
       array('data' => l($ticket->nid, "node/$ticket->nid"), 'class' => 'ticket-id'),
       array('data' => l(_support_truncate($ticket->title), "node/$ticket->nid"), 'class' => 'ticket-title'),
       array('data' => format_date($ticket->last_updated, 'small'), 'class' => 'ticket-updated'),
-      array('data' => l(_support_truncate($account->name, 24), "user/$account->uid"), 'class' => 'ticket-reported'),
-      array('data' => l(_support_truncate($assigned->name, 24), "user/$assigned->uid"), 'class' => 'ticket-assigned'),
-      array('data' => _support_state($ticket->state), 'class' => 'ticket-state'),
-      array('data' => _support_priorities($ticket->priority), 'class' => 'ticket-priority'),
-      array('data' => $comments)), 'class' => "state-$ticket->state priority-$ticket->priority");
+      array('data' => l(_support_truncate($account->name, 24), "user/$account->uid"), 'class' => 'ticket-reported')));
+      if (!user_access('can assign tickets to any user'))
+        $thisrow['data'][] = array('data' => l(_support_truncate($assigned->name, 24), "user/$assigned->uid"), 'class' => 'ticket-assigned');
+      $thisrow['data'][] = array('data' => _support_state($ticket->state), 'class' => 'ticket-state');
+      $thisrow['data'][] = array('data' => _support_priorities($ticket->priority), 'class' => 'ticket-priority');
+      $thisrow['data'][] = array('data' => $comments);
+      $thisrow['class']  = "state-$ticket->state priority-$ticket->priority";
+  $assignable = _support_assigned($ticket->assigned, $ticket);
+  if (user_access('can assign tickets to any user'))
+  	{
+  	$thisrow['data'][] = array('data' => drupal_get_form('support_reassign_form',$ticket));
+	}
+  elseif (user_access('can assign tickets to self'))
+  	{
+	if (array_key_exists($user->uid,$assignable))
+		{
+		$thisrow['data'][] = array('data' => l(t('Take'),"support/$ticket->nid/reassign/$user->uid/".md5($ticket->nid.$ticket->assigned)));
+		}
+	}
+  $rows[] = $thisrow;
   }
   return theme('table', $header, $rows, array('class' => 'support')) . theme('pager');
 }
