<?php
/**
 *		
 *		sabreScheduler Module for plugin to Drupal 7 Framework
 *
 *		Session Patterns (default sessions during schedule creation) function handling
 *    
*/

require_once('sabreScheduler.sessions.inc');


/*
 *	session_patterns_display()
 *
 *	displays a list of session patterns the scheduling manager can choose from when creating a new schedule
 */
function session_patterns_display() {
	
	if (user_access('view manage menu') == False) {
		drupal_goto('');
		return '';
	}	
	
	return _get_session_patterns_table();
}

/*
 *		_get_session_patterns_table()
 *	
 *		returns all pattern sessions in a formatted table ('table' or 'tableselect') based on the $display_type
 */
function _get_session_patterns_table($display_type = 'table')  {
  
  $bEdit = user_access('edit settings');
	
	
	// ------------------- GET PATTERN SESSIONS ---------------------
	$query = db_select('sch_pattern_sessions', 'ps');
	$query->innerJoin('sch_schedule_patterns', 'sp', 'ps.schedule_pattern_id = sp.schedule_pattern_id');
	$query->innerJoin('sch_session_names', 'sn', 'ps.session_name_id = sn.session_name_id');
	$query->fields('sp', array('schedule_pattern_id', 'pattern_name'))
				->fields('ps', array('pattern_session_id', 'session_name_id', 'begin_time', 'end_time'))
				->fields('sn', array('session_name'));
	$query->orderBy('ps.schedule_pattern_id', 'ASC')->orderBy('ps.begin_time', 'ASC');

	$results = $query->execute();
	
	$table_header = array(
		'pattern_name' => array('data' => t('Schedule Pattern'), 'field' => 'pattern_name', 'sort' => 'asc'),
		'sessions' => array('data' => t('Sessions'), 'field' => 'sessions', 'sort' => 'asc'),
	);
	if ( ($display_type == 'table') && $bEdit ) {
		$table_header['admin']['data'] = t('Admin');
	}
	
	$table_rows = array();
	$p_table = '';
	$last_pattern_id = 0;
	$pattern_name = '';
	$sessions = '';
	$times = '';
	$i = 0;
	
	foreach ($results as $row) {
		if ( $i && ($last_pattern_id <> $row->schedule_pattern_id) ) {
			
			// beginning a new pattern;  output the previous pattern, start the new one
			
			if ( $display_type == 'table') {
        $row_data = array(
          $pattern_name,
					'<div class="sch-pattern-session-list">' . $sessions . '</div>' .
					'<div class="sch-pattern-times-list">' . $times . '</div>',
        );
        if ( $bEdit ) {
          $row_data[] = _st_generate_options('pattern', $last_pattern_id);
        }
				$table_rows[] = array( 'data' => $row_data);		
			}
			else {  // tableselect 

				// set the id into the array index which is linked to the tableselect's checkbox
				$table_rows[$last_pattern_id] = array(
					'pattern_name' => $pattern_name,
					'sessions' => '<div class="sch-pattern-session-list">' . $sessions . '</div>' .
												'<div class="sch-pattern-times-list">' . $times . '</div>',
				);
			}

			$sessions = '';	
			$times = '';
		}

		$sessions .= $row->session_name . ': <br />';
		$times .= $row->begin_time . ' - ' . $row->end_time . '<br />';

		$last_pattern_id = $row->schedule_pattern_id;
		$pattern_name = $row->pattern_name;
		
		$i++;
	}
	
	if ($i) {
		// add the last stray pattern row
		if ( $display_type == 'table') {
      $row_data = array(
        $pattern_name,
        '<div class="sch-pattern-session-list">' . $sessions . '</div>' .
        '<div class="sch-pattern-times-list">' . $times . '</div>',
      );
      if ( $bEdit ) {
        $row_data[] = _st_generate_options('pattern', $last_pattern_id);
      }
      $table_rows[] = array( 'data' => $row_data);		
		}
		else {  // tableselect 

			// set the id into the array index which is linked to the tableselect's checkbox
			$table_rows[$last_pattern_id] = array(
				'pattern_name' => $pattern_name,
				'sessions' => '<div class="sch-pattern-session-list">' . $sessions . '</div>' .
											'<div class="sch-pattern-times-list">' . $times . '</div>',
			);
		}
	}
	
	$content = '';
	
	// don't add this for tableselects, just for tables 
	if ( $display_type == 'table') {
		$content = '<div class="sch-help-div">' . 
										t('The schedule session patterns defined here will appear as options when creating a new schedule. ' . 
										'The new schedule will inherit session time settings from the specified schedule pattern.') . 
									 '</div><br />';
		
    if ( $bEdit ) {
      $content .= l( t('Add Schedule Pattern'), 'pattern/add', 
                      array('class' => array('sch-pattern-add')) );
    }
	}

	
	if ( $display_type == 'table') {
		$content .= '<div id="sch-pattern-tbl-div">';
		$content .= theme( 'table', 
		array(
			'header' => $table_header,
			'rows' => $table_rows,
			'empty' => t('None'),
		));		
		$content .= '</div>';
	}
	else {  // tableselect
		// we cannot render the tableselect here, has to be handled through a form element
		// pass the header and options arrays to the calling function
		
		$content = array(
			'#header' => $table_header,
			'#options' => $table_rows,
		);
	}
	
	return $content;
}

/*
 *	schedule_pattern_form()
 *
 *	Add or Edit a schedule pattern and its sessions
 *  overloads hook_form()
 */

function schedule_pattern_form($form, $form_state, $schedule_pattern_id = 0) {
	
	if ( user_access('view manage menu') == FALSE ) {
    drupal_set_message( t('Unauthorized.  Permission is required.'));
		drupal_goto('');
		return $form;	
  }

	drupal_add_js('(function($) {
										Drupal.behaviors.schSchedulePattern = {
											attach: function(context, settings) {
												$("edit-pattern-name", context).focus();
											}
										}
									}(jQuery));', 'inline');
		
	$form['help'] = array(							
	 	'#markup' => '<div class="sch-help-div">' . 
									t('Set time settings for each session. <br />To omit a Session from the pattern, ' .
									'set both the Session\'s Begin Time and End Time equal to "0000"') . 
								 '</div><br />',
	);
	


	$schedule_pattern = (object) Null;
	$sessions = array();
	

	if ( $schedule_pattern_id ) {   // Get the existing record
		
		$schedule_pattern = _get_schedule_pattern($schedule_pattern_id);
		if ( $schedule_pattern == (object) Null ) {
			drupal_set_message( t('Oops!  Something seems to have gone wrong.  Schedule Pattern not found.'));
			drupal_goto('patterns');
			return $form;	
		}
		
		$form['timestamp'] = array(
			'#markup' => _st_format_record_timestamp_table($schedule_pattern),
		);
	}
  	
	$form['pattern_name'] = array(
		'#type' => 'textfield',
		'#title' => t('Pattern Name'),
		'#maxlength' => 100,
		'#required' => True,
		'#default_value' => ($schedule_pattern_id ? $schedule_pattern->pattern_name : ''),
	);	
				
	$form['schedule_pattern_id'] = array(
		'#type' => 'textfield',
		'#default_value' => $schedule_pattern_id,
		'#attributes' => array('class' => array('qms-hidden')),
	);	
	
			
	if ( $schedule_pattern_id ) {  
		// ------------------- GET SESSIONS LINKED TO THIS PATTERN ---------------------
		$sessions = _get_schedule_pattern_sessions($schedule_pattern_id, True);
	}
		
	$sn_list = _get_session_list();
	
	$table_header = array(
		array('data' => t('Session'), 'class' => array('sch-pattern-session-tbl-session')),
		array('data' => t('Begin Time'), 'class' => array('sch-pattern-session-tbl-begin-time')),
		array('data' => t('End Time'), 'class' => array('sch-pattern-session-tbl-end-time')),
	);
	$table_rows = array();
	$s_table = '';
	$i = 0;
	foreach ($sn_list as $id => $session_name) {
		$row_data = array(
			/*
			theme('select', array('element' => array(
				'#name' => 'session_name_' . $i,
				'#type' => 'select',
				'#options' => $sn_list,
				//'#default_value' => 0,
				'#attributes' => array('class' => array('qms-select'),
															 'id' => 'sch-session_name-select'),
			))), */
			$session_name . ' ' . 
				theme('textfield', array('element' => array(
					'#name' => 'session_name_id_' . $i,
					'#type' => 'textfield',
					'#autocomplete_path' => '',
					'#value' => $id,
					'#attributes' => array('class' => array('qms-hidden')),
				))) . ' ' . 
				theme('textfield', array('element' => array(
					'#name' => 'pattern_session_id_' . $i,
					'#type' => 'textfield',
					'#autocomplete_path' => '',
					'#value' => ( $schedule_pattern_id ? $sessions[$id]->pattern_session_id : 0),  //$sessions[$id]['pattern_session_id']
					'#attributes' => array('class' => array('qms-hidden')),
				))), 	
			theme('textfield', array('element' => array(
				'#name' => 'begin_time_' . $i,
				'#type' => 'textfield',
				'#maxlength' => 4,
				'#size' => 5,
				'#autocomplete_path' => '',
				'#value' => ( $schedule_pattern_id ? $sessions[$id]->begin_time : '0000'),  //$sessions[$id]->begin_time
				'#attributes' => array('id' => 'sch-begin-time-' . $i),
			))) . '<span> hhmm</span>',
			theme('textfield', array('element' => array(
				'#name' => 'end_time_' . $i,
				'#type' => 'textfield',
				'#maxlength' => 4,
				'#size' => 5,
				'#autocomplete_path' => '',
				'#value' => ( $schedule_pattern_id ? $sessions[$id]->end_time : '0000'),  //$sessions[$id]->end_time
				'#attributes' => array('id' => 'sch-end-time-' . $i),
			))). '<span> hhmm</span>',
		);
		
		$table_rows[] = array( 'data' => $row_data );	
		$i++;
	}
	
	$s_table .= '<div id="sch-pattern-sessions-div">';
	$s_table .= theme( 'table', array(
		'header' => $table_header,
		'rows' => $table_rows,
		'attributes' => array('id' => 'sch-pattern-sessions-tbl'),
	));
			
	$s_table .= '</div>';
	
	$form['pattern_sessions_tbl'] = array(
		'#markup' => $s_table,
	);
	
	$form['session_count'] = array(
		'#type' => 'textfield',
		'#default_value' => count($sn_list),
		'#attributes' => array('class' => array('qms-hidden')),
	);	
	
	
	
	$form['actions'] = array('#type' => 'actions');
	$form['actions']['submit'] = array(
		'#type' => 'submit',
		'#value' => 'Submit',
	);
  $form['actions']['done'] = array(
		'#type' => 'button',
		'#value' => t('Done'),
		'#attributes' => array('class' => array('qms-btn-done', 'qms-btn-extra'),
                           'onclick' => 'window.location="' . 
                                url('patterns') . '"; return false;'),
	);
	

	return $form;
	
}

/*
 *	schedule_pattern_form_validate()
 *
 */
function schedule_pattern_form_validate($form, $form_state) {
	if ( trim($form_state['values']['pattern_name']) == '' ) {
		form_set_error('pattern_name', t('Pattern Name is a required field'));
	}
	$sess_count = (int)$form_state['values']['session_count'];
  
	// no begin or end times should be empty
	for ($i=0; $i<$sess_count; $i++) {
		// need to get these from post due to how the controls are rendered in the table at form build
		$begin_time = trim($_POST['begin_time_' . $i]);
		$end_time = trim($_POST['end_time_' . $i]);
		// improperly formatted time
		if ( (strlen($begin_time) < 4) || ($begin_time < 0) ) {
			form_set_error('begin_time_' . $i, t('Begin Time is not valid and may not be formatted correctly.'));
		} else if ($begin_time >= 2400) {
      form_set_error('begin_time_' . $i, t('Valid time values are [ 0000-2359 ]'));
    } else if ($begin_time >= 2400) {
      form_set_error('end_time_' . $i, t('Valid time values are [ 0000-2359 ]'));
    } else if ( (strlen($end_time) < 4) || ($end_time < 0) ) {
			form_set_error('end_time_' . $i, t('End Time is not valid and may not be formatted correctly.'));
		}
	}
	
}

/*
 *	schedule_pattern_form_submit()
 *
 */
function schedule_pattern_form_submit($form, $form_state) {

	global $user;
	$sn_list = _get_session_list();
	
	$schedule_pattern_id = (int)$form_state['values']['schedule_pattern_id'];
	$session_count = (int)$form_state['values']['session_count'];
	
	$schedule_pattern = new stdClass();
	$schedule_pattern->pattern_name = $form_state['values']['pattern_name'];
	
	if ( $schedule_pattern_id ) {
		$schedule_pattern->schedule_pattern_id = $schedule_pattern_id;
		$schedule_pattern->updated_date = REQUEST_TIME;
		$schedule_pattern->updated_by_user = $user->uid;
		
		// update record
		if ( False == drupal_write_record('sch_schedule_patterns', $schedule_pattern, 'schedule_pattern_id')) {
			$msg = "Oops!  Something went wrong saving the schedule pattern record.";
			drupal_set_message(t($msg));
			drupal_goto('patterns');
			return False;
		}
	}
	else {
		$schedule_pattern->created_date = REQUEST_TIME;
		$schedule_pattern->created_by_user = $user->uid;
		
		// new record
		if ( False == drupal_write_record('sch_schedule_patterns', $schedule_pattern)) {
			$msg = "Oops!  Something went wrong saving the schedule pattern record.";
			drupal_set_message(t($msg));
			drupal_goto('patterns');
			return False;
		}
	}
	

	$sess_pat = new stdClass();
	$sess_pat->schedule_pattern_id = $schedule_pattern->schedule_pattern_id;
	
	
	for ($i=0; $i < $session_count; $i++) {
		// we need to get these values from $_POST due to how the controls are rendered at form build
		$pattern_session_id = (int)$_POST['pattern_session_id_' . $i];
		if ( $pattern_session_id ) {
			$sess_pat->pattern_session_id = $pattern_session_id;
		}
		$sess_pat->session_name_id = (int)$_POST['session_name_id_' . $i];
		$sess_pat->begin_time = trim($_POST['begin_time_' . $i]);
		$sess_pat->end_time = trim($_POST['end_time_' . $i]);

		if ( $pattern_session_id ) { // update
			if ( False == drupal_write_record('sch_pattern_sessions', $sess_pat, 'pattern_session_id')) {
				$msg = "Oops!  Something went wrong saving the schedule pattern session record.";
				drupal_set_message(t($msg));
				drupal_goto('patterns');
				return False;
			}
		}
		else {  // new
			if ( False == drupal_write_record('sch_pattern_sessions', $sess_pat)) {
				$msg = "Oops!  Something went wrong saving the schedule pattern session record.";
				drupal_set_message(t($msg));
				drupal_goto('patterns');
				return False;
			}
		}
		unset($sess_pat->pattern_session_id);  //unset for the next session
	}
	
	drupal_set_message(t('Schedule Pattern successfully saved.'));
	drupal_goto('patterns');
}



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

function schedule_pattern_delete_confirm($form, $form_state, $schedule_pattern_id = 0) {
	
	try {
		
		if ( user_access('view manage menu') == FALSE ) {
	    drupal_set_message( t('Unauthorized Access.  Permission is required.'));
			drupal_goto('');
			return;	
	  }

		$schedule_pattern = _get_schedule_pattern($schedule_pattern_id);
		if ( $schedule_pattern == (object)Null ) {
			drupal_set_message( t('Oops!  Something seems to have gone wrong.  Schedule Pattern not found.'));
			drupal_goto('patterns');
			return;
		}		
	
		$form['schedule_pattern_id'] = array(
			'#type' => 'value',
			'#value' => $schedule_pattern_id,
		);
	
		$form['pattern_name'] = array(
			'#type' => 'value',
			'#value' => $schedule_pattern->pattern_name,
		);
    
    $title = t('Delete Schedule Pattern') . '?';
    $question = t('Are you sure you want to delete?') . 
                '<h2>' . $schedule_pattern->pattern_name . '</h2><br />' . 
                t('This action cannot be undone.');
    $goto_if_canceled = 'patterns';
    $yes_btn = 	t('Delete');
    $no_btn = t('Cancel');

    return confirm_form($form, $title,	$goto_if_canceled, $question, $yes_btn, $no_btn);	
	}
	catch (Exception $e) {
		watchdog(SCH_SCHEDULER, 'pattern_delete_confirm() ' . $e->getMessage(), array(), WATCHDOG_ERROR);
	} 
}

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

function schedule_pattern_delete_confirm_submit($form, $form_state) {
	
	if ( $form_state['values']['confirm']) {
		$schedule_pattern_id = $form_state['values']['schedule_pattern_id'];
		$pattern_name = $form_state['values']['pattern_name'];
		
		// delete from database
		$num_rows = db_delete('sch_pattern_sessions')
								->condition('schedule_pattern_id', $schedule_pattern_id, '=')
								->execute();

		$num_rows = db_delete('sch_schedule_patterns')
								->condition('schedule_pattern_id', $schedule_pattern_id, '=')
								->execute();
	
		$msg = '';					
		if ( $num_rows == 1 ) {
			// success
			
			$msg = t('Schedule Pattern record, ') . '<b>' . $pattern_name . '</b>' . t(' has been deleted.');
		}
		else {
			$msg = t('Oops!  Unable to delete Schedule Pattern, ') . '<b>' . $pattern_name . '</b>.';
		}
		drupal_set_message(t($msg));	
	}
	
	drupal_goto('patterns');
}




/*
 *	_get_schedule_pattern()
 *
 *	retrieves the pattern record
 */

function _get_schedule_pattern($schedule_pattern_id = 0) {
	try {
		
		$schedule_pattern = (object) Null;
		
		if ( $schedule_pattern_id ) { 
			$query = db_select('sch_schedule_patterns', 'sp');
			$query->condition('schedule_pattern_id', $schedule_pattern_id);
			$query->fields('sp', array('schedule_pattern_id', 'pattern_name', 
																'created_date', 'created_by_user',
																'updated_date', 'updated_by_user'
																));
			$result = $query->execute();
			if ( $result->rowCount() ) {
				$schedule_pattern = $result->fetchObject();
			}
		}												
		return $schedule_pattern;
	}
	catch (Exception $e) {
		watchdog(SCH_SCHEDULER, '_get_schedule_pattern() ' . $e->getMessage(), array(), WATCHDOG_ERROR);
	} 
}

/*
 *	_get_schedule_pattern_sessions()
 *
 *	retrieves the session settings for a specific pattern
 */

function _get_schedule_pattern_sessions($schedule_pattern_id = 0, $key_by_session_name_id = False) {
	try {
		
		$sessions = array();
		
		// ------------------- GET PATTERN SESSIONS ---------------------
		
		if ( $schedule_pattern_id ) { 
			$query = db_select('sch_pattern_sessions', 'ps');
			$query->innerJoin('sch_session_names', 'sn', 'ps.session_name_id = sn.session_name_id');
			$query->condition('ps.schedule_pattern_id', $schedule_pattern_id);
			$query->fields('ps', array('pattern_session_id', 'session_name_id', 
																'begin_time', 'end_time'))
						->fields('sn', array('session_name'));
			$query->orderBy('begin_time', 'ASC');
			$results = $query->execute();
			
			if ( $results->rowCount() ) {
				if ( $key_by_session_name_id ) {
					foreach($results as $row) {
						$sessions[$row->session_name_id] = $row;
					}
				}
				else {
					$sessions = $results->fetchAll();
				}
			}
		}												
		return $sessions;
	}
	catch (Exception $e) {
		watchdog(SCH_SCHEDULER, '_get_schedule_pattern_sessions() ' . $e->getMessage(), array(), WATCHDOG_ERROR);
	} 
}

	
