<?php

/*
 *	Simulator record functions for sabreQMS module
 */


/*
 *	user_groups_display()
 *
 *	returns:  Displays table list of user groups
 *
 */

function user_groups_display() {
	
	if (user_access('view admin lists') == False) {
		return;
	}
	
	// Check permissions -- only allow editing capabilities if 'administer ' enabled
	$bAllowAdmin = user_access('administer sabreQMS');

	$table_header = array( 
		array( 'data' => 'User Group' ),
		array( 'data' => 'Users Assigned' ),
	);
	
	//if ( $bAllowAdmin == True ) {
	$table_header[] = array(
			'data' => 'Admin',
		);
	//}
	
	global $user;
	
	
	// Get list of user groups
	/*
	$query = db_select('qms_user_groups', 'g');	
	$query->fields('g', array('user_group_id', 'group_name'));
	$query->orderBy('group_name', 'ASC');
	$result = $query->execute();
  */		
	
	$sql = "SELECT g.user_group_id, g.group_name  
	        FROM   {qms_user_groups} g 
				  ORDER BY group_name ASC";
	$result = db_query($sql);					

	$i = 0;
	$table_rows = array();
	
	foreach ($result as $row) {
		
		$row_data = array(
			$row->group_name,
			$row->user_group_id,  // this is only a temp placeholder
			_st_generate_options('usergroup', $row->user_group_id),
		);
		
		//if ( $bAllowAdmin == True ) {
			//$row_data[] = _st_generate_options('simulator', $row->simulator_id);
		//}
		
		$table_rows[] = array('data' => $row_data);
		$i++;
	}
	
	if ( $i == 0 ) {
		$table_rows[] = array('None', '', '');
	}
	else {
		for ( $j = 0; $j < $i; $j++) {
			$user_group_id = $table_rows[$j]['data'][1];
			
			$sql = "SELECT group_concat(u.name separator ', ') AS `group_users` 
							FROM   {qms_user_groups_users} gu, {users} u 
							WHERE   gu.user_id = u.uid 
							AND   	gu.user_group_id = :ugid";

			$usernames = db_query($sql, array(':ugid' => $user_group_id))->fetchField();

			$table_rows[$j]['data'][1] = $usernames;
		
		}
		
	}

	//$content = '';

	//if ( $bAllowAdmin )
	//{
		$content = "<p>For simulator activity email notifications</p>";
		$content .= l( t('Add User Group'), 'usergroup/add', array('class' => 'user_group') );
	//}
	
	$content .= theme( 'table', array(
		'header' => $table_header,
		'rows' => $table_rows,
	));

	return $content;
}


/*
 *	user_group_form()
 *
 *  overloads:  hook_form()
 *
 *	Displays the form for adding/updating
 */

function user_group_form($form, $form_state, $user_group_id = 0) {

	if ( user_access('administer sabreQMS') == FALSE ) {
    return form_set_error( t('Unauthorized'), t('Administrator access required'));
  }

	$group_name = "";
	$group_user_list = array();
	$userlist = new UserList();
	
	// all page-specific javascript loaded in the after_build function
	$form['#after_build'][] = 'user_group_form_after_build';
	
	
	if ( $user_group_id > 0 ) {   // Edit existing record
		
		$group_name = _get_user_group($user_group_id);
		
		if ( $group_name == "" ) {
	    form_set_error( t('Oops!'), t('Something seems to have gone wrong.  User Group not found.'));
			drupal_goto('qmssettings/usergroups');
			return;
	  }
	
		$group_user_list = _get_user_group_users($user_group_id);
	}	
	
	
	$form['group_name'] = array(
		'#type' => 'textfield',
		'#title' => t('User Group Name'),
		'#maxlength' => 50,
		'#default_value' => (($user_group_id > 0) ? $group_name : ''),
	);	
	
	
	$form['user_group_id'] = array(
		'#type' => 'textfield',
		'#default_value' => (($user_group_id > 0) ? $user_group_id : 0),
		'#attributes' => array('id' => 'qms-user-group-id',
													 'class' => array('qms-hidden-field')),
	);	
	
	//----------- build the user list table for this user group -----------------
	
	$user_table = _format_user_group_users_table($group_user_list, (($user_group_id > 0) ? 'EDIT':'ADD'));
	
	// turn database results array into an assoc array by user_id
	// needs to be in the same format as the UserList
	$assigned_user_list = array();
	foreach($group_user_list as $u) {
			$assigned_user_list[$u->uid] = $u->name;
	}
	
	$form['fs_users'] = array(
		'#type' => 'fieldset',
		'#title' => 'Users Assigned to Group',
	);


	$form['fs_users']['users'] = array(
		'#markup' => $user_table,
	);


	$form['fs_users']['user_select'] = array(
		'#type' => 'select',
		'#title' => t('Add User'),
		'#options' => $userlist->get($assigned_user_list),
		'#default_value' => 0,
		'#attributes' => array('id' => 'qms-user-select',			
													 'class' => array('qms-select')),  // this is necessary for CKEditor functions
		// putting this in a 1x1 table for consistency
		'#prefix' => '<table class="qms-plain-table"><tr style="vertical-align:bottom;"><td style="width:35%">',
		'#suffix' => '</td>',
	);
	
	$form['fs_users']['add_user'] = array(
		'#type' => 'button',
		'#value' => t('Add'),
		'#attributes' => array('id' => 'qms-btn-add-user',
													 'qms-url' => (( $user_group_id > 0 ) ? 
																url('usergroup/user/add') : 
																url('usergroup/user/refresh')) ),
		'#prefix' => '<td><div class="qms-actions">',
		'#suffix' => '&nbsp;&nbsp;<a id="qms-btn-clear-selection" href="">Clear</a></div></td></tr></table>',
	);
	
	if ( $user_group_id == 0 ) {  // storage field for new user group, adding users
		// need to wrap this in a hidden div since the textarea seems to want to display the grabber bar
		$form['fs_users']['users_to_add'] = array(
			'#type' => 'textarea',
			'#default_value' => '',
			'#prefix' => '<div id="qms-users-hidden" class="qms-hidden-field">',
			'#attributes' => array('id' => 'qms-users-to-add'),
		);
	}
	
	// storage area for dynamic dialog elements
	$form['popup_dialog'] = array(
		'#type' => 'markup',
		'#markup' => '<div id="qms-message-box"></div>',
	);
	
	global $base_url;
  $form['actions'] = array('#type' => 'actions');
  $form['actions']['submit'] = array(
		'#type' => 'submit',
		'#value' => t('Submit'),
    '#attributes' => array('class' => array('qms-btn-submit')),
	);
  $form['actions']['done'] = array(
		'#type' => 'button',
		'#value' => t('Done'),
		'#attributes' => array('class' => array('qms-btn-done', 'qms-btn-extra'),
                           'onclick' => 'window.location="' . 
                                url('qmssettings/usergroups') . '"; return false;'),
    '#suffix' => '<span class="qms-waiting"><img class="qms-waiting-img" src="' . 
                  $base_url . QMS_IMAGES_DIR . 'waiting.gif" /></span>',
	);
	
	
		
	// storage area for dynamic dialog element
	$form['popup_dialog'] = array(
		'#markup' => '<div id="qms-message-box"></div>',
	);
	

	return $form;
}

/*------ AFTER BUILD FUNCTION --------
*	 functions called, as it implies, after the form is built
*  this is necessary when custom javascript and/or css files are added as needed
*  at the page level for forms that go through validation with hook_form_validate()
*  Otherwise, if a form fails validation, the page/form is reloaded for the user to correct
*  but the accompanying javascript & css is not reloaded with it. 
*  when $form['#after_build][] is used, the external scripts will be reloaded properly.
*/

/* 
 * user_group_form_after_build()
 *
 */
function user_group_form_after_build($form, &$form_state)
{
	drupal_add_library('system','ui.dialog');
	drupal_add_js(drupal_get_path('module', 'sabreTools') . '/js/sabreTools.lib.js');
	
	if ( (int)$form['user_group_id']['#default_value'] == 0) {
		drupal_add_js(drupal_get_path('module', 'sabreQMS') . '/js/sabreQMS.usergroupadd.js');
	}
	else {
		drupal_add_js(drupal_get_path('module', 'sabreQMS') . '/js/sabreQMS.usergroupedit.js');
	}

	
	return $form;
}



/*
 *	user_group_form_validate()  
 *
 *  overloads:  hook_form_validate()
 *
 *	Validates form after it is submitted
 */

function user_group_form_validate($form, $form_state) {
	if ( trim($form_state['values']['group_name']) == '' ) {
		form_set_error('group_name', t('User Group Name is a required field'));
	}
}

/*
 *	simulator_form_submit()  
 *
 *  overloads:  hook_form_submit()
 *
 *	Saves form data upon successful submit
 */

function user_group_form_submit($form, $form_state) {
	
	$user_group = (object) NULL;
	$user_group->user_group_id = (int) $form_state['values']['user_group_id'];
	$user_group->group_name = Trim($form_state['values']['group_name']);
	
	

	if  ( $user_group->user_group_id == 0 )  {  
		// new record
		
		$users_to_add = Trim($form_state['values']['users_to_add']);
		$userlist = explode('|', $users_to_add);
		
		
		// Table:  {qms_user_groups}
		if ( False == drupal_write_record('qms_user_groups', $user_group)) {
			$msg = "Oops!  Something went wrong saving the new user group record to the database.";
			drupal_set_message(t($msg));
		}
		
		// add the group's users
		$user_group_user = (object) Null;
		$user_group_user->user_group_id = $user_group->user_group_id;
		$user_group_user->user_id = 0;
		
		foreach( $userlist as $u ) {
			$user_rec = explode('=', $u);
			$user_group_user->user_id = $user_rec[1];

			drupal_write_record('qms_user_groups_users', $user_group_user);

			$user_group_user->user_groups_users_id = 0;
		}
		
	}
	else {
		// update existing
		// Table:  {qms_user_groups}
		if ( False == drupal_write_record('qms_user_groups', $user_group, 'user_group_id')) {
			$msg = "Oops!  Something went wrong updating the user group record.";
			drupal_set_message(t($msg));
		}
		
		// assigned users are handled in separate ajax callbacks for editing user groups
	}
	
	
	drupal_goto('qmssettings/usergroups');
}

/*
 *	user_group_delete_confirm()  
 *
 *	Validate and Ask for confirmation before deleting record
 */

function user_group_delete_confirm($form, $form_state, $user_group_id) {
	
	if ( user_access('administer sabreQMS') == FALSE ) {
    form_set_error( t('Unauthorized Access'), t('Administrator access required.'));
		drupal_goto('qmssettings/usergroups');
		return;	
  }
	
	$group_name = _get_user_group($user_group_id);
	
	if ( $group_name == "" ) {
    form_set_error( t('Oops!'), t('Something seems to have gone wrong.  User Group not found.'));
		drupal_goto('qmssettings/usergroups');
		return;
  }
	
	$form['user_group_id'] = array(
		'#type' => 'value',
		'#value' => $user_group_id,
	);
	
	$form['group_name'] = array(
		'#type' => 'value',
		'#value' => $group_name,
	);
  
  $title = t('Delete User Group') . '?';
  $question = t('Are you sure you want to delete?') . 
              '<h2>' . $group_name . '</h2><br />' . 
              t('This action cannot be undone.');
  $goto_if_canceled = 'qmssettings/usergroups';
  $yes_btn = 	t('Delete');
  $no_btn = t('Cancel');
	
  // force this here to avoid a problem with routing if cancelled
  //$_GET['destination'] = $goto_if_canceled;
  
  return confirm_form($form, $title,	$goto_if_canceled, $question, 
                      $yes_btn, $no_btn);
}

/*
 *	user_group_delete_confirm_submit()  
 *
 *	Submit after confirmation, delete the specified record
 */

function user_group_delete_confirm_submit($form, $form_state) {
	
	if ( $form_state['values']['confirm']) {
		$user_group_id = $form_state['values']['user_group_id'];
		$group_name = $form_state['values']['group_name'];
			
	
		// delete from database
		$num_rows = db_delete('qms_user_groups')
								->condition('user_group_id', $user_group_id, '=')
								->execute();
    
    
		$msg = '';					
		if ( $num_rows != 1 ) {
			$msg = 'Oops!  Unable to delete record for ' . $group_name . '.';
			drupal_set_message(t($msg));
			drupal_goto('qmssettings/usergroups');
			return;
		}
		
		// delete group's user links
		db_delete('qms_user_groups_users')
							->condition('user_group_id', $user_group_id, '=')
							->execute();
			
		// delete group from notifications	
		db_delete('qms_notifications')
							->condition('user_group_id', $user_group_id, '=')
							->execute();
	
		$msg = 'User Group record, ' . $group_name . ' has been deleted.';

		drupal_set_message(t($msg));
	}
	
	drupal_goto('qmssettings/usergroups');
}


/*
 *  user_group_add_user_callback()
 *
 *	AJAX Callback Function
 *
 */
function user_group_add_user_callback() {
		
	$content = "";
	$group_user_list = array();
	$user_group_id = ( isset($_POST['user_group_id'])  ? (int)$_POST['user_group_id'] : 0 );
	$user_id = ( isset($_POST['user_id'])  ? (int)$_POST['user_id'] : 0 );

	if ( ($user_group_id > 0) && ($user_id > 0) ) {
		$query = db_insert('qms_user_groups_users')
						 	->fields(array('user_group_id', 'user_id'))
	  					->values(array(
												'user_group_id' => $user_group_id,
												'user_id' => $user_id,
											))
							->execute();
						
		$group_user_list = _get_user_group_users($user_group_id);					
	}
	$content = _format_user_group_users_table($group_user_list, "EDIT"); 	
	die($content);
}

/*
 *  user_group_remove_user_callback()
 *
 *	AJAX Callback Function
 *
 */
function user_group_remove_user_callback($user_id) {
	
	$content = "";
	$group_user_list = array();
	
	$user_group_id = ( isset($_POST['user_group_id'])  ? (int)$_POST['user_group_id'] : 0 );
	
	if ( ($user_group_id > 0) && ($user_id > 0) ) {
		// delete group's user links
		db_delete('qms_user_groups_users')
							->condition('user_group_id', $user_group_id, '=')
							->condition('user_id', $user_id, '=')
							->execute();

		$group_user_list = _get_user_group_users($user_group_id);	
		$content = _format_user_group_users_table($group_user_list, "EDIT"); 			
	}
	
	die($content);
}


/*
 *  user_group_remove_user_callback()
 *
 *	AJAX Callback Function
 *  Reformats and redisplays user table without links to the user group which has not been added yet
 *
 */
function user_group_user_table_refresh_callback() {
	
	// break user id list into individual records
	$ul = trim($_POST['user_list']);
	$group_user_list = array();
	$user_row_data = array();

	
	if ( strlen($ul) > 0 ) {
		$group_user_list = explode('|', $ul);
		//asort($group_user_list);
	}
	else {  // only one in the list
		$group_user_list = $ul;
	}
	
	
	$content = _format_user_group_users_table($group_user_list, 'ADD'); 					
	
	die($content);
}

/*
 *  _format_user_group_users_table()
 *
 *	accepts the  user group list and formats it/themes it into a table
 *
 */

function _format_user_group_users_table($group_user_list, $mode = 'EDIT') {
	
	$content = "";
	$user_row_data = array();
	
	$i = 0;
	foreach($group_user_list as $u) {
		
		if ( $mode == 'ADD') {
			$user_info = explode('=', $u);
			$link_options = l( t('Remove'), "",  array('attributes' => array('class' => 'qms-user-remove', 'row' => $i) ) );
			$user_row_data[$i] = array('data' => array( $user_info[0], $link_options));
		}
		else {  // EDIT
			$row = array(
				$u->name,
				l( t('Remove'), "usergroup/user/remove/" . $u->uid, 
								array('attributes' => array('class' => 'qms-user-remove', 'row' => $i, 'username' => $u->name) ) ),
			);
			$user_row_data[] = array( 'data' => $row );	
		}
		$i++;
	}
	if ( $i == 0 ) {
			$user_row_data = array('data' => array('None', ''));
	}							
	

	// rebuild table
	$content = '<div id="qms-users-div">';
	
	$content .= theme( 'table', array(
		'header' => array(array('data' => 'Users', 'class' => 'qms-user-group-tbl-col1'), 
											array('data' => 'Admin')),
		'rows' => $user_row_data,
	));
	
	$content .= '</div>';
	
	return $content;
}


/*
 *  _get_user_group($user_group_id = 0)
 *
 *	Returns the User Group info
 *
 */

function _get_user_group($user_group_id = 0) {

	if ( $user_group_id == 0 ) return "";
	
	// get the record
	$sql = "SELECT group_name FROM {qms_user_groups} g WHERE user_group_id = :ugid";
	$result = db_query($sql, array(':ugid' => $user_group_id));
	
	if ( $result->rowCount() == 0 ) {
		return "";
	}
	
	return $result->fetchField();
}
	
	
/*
 *  _get_user_group_users($user_group_id = 0)
 *
 *	Returns the User Group users list
 *
 */

function _get_user_group_users($user_group_id = 0) {
	
	if ( $user_group_id == 0 ) return array();
	
	$sql = "SELECT u.name, u.uid 
					FROM   {users} u, {qms_user_groups_users} gu
					WHERE  gu.user_group_id = :ugid 
					AND    gu.user_id = u.uid 
					ORDER BY u.name ASC";
	$result = db_query($sql, array(':ugid' => $user_group_id));

	if ( $result->rowCount() == 0 ) {
		return array();
	}
	
	return db_query($sql, array(':ugid' => $user_group_id))->fetchAll();
}




