<?php
// $Id$

/**
 *		@file
 *		sabreQMS Module for plugin to Drupal 7 Framework
 *
 *		Engineering Search List functions
 *    
*/

//require_once('sabreQMS.utils.inc');

/*
 * _get_engineering_results_table_header()
 * generates the headers for the search results table so it only gets called once
 *
 */

function _get_engineering_results_table_header($admin) {
	$table_header = array( 
		'eng_no' => array( 'data' => 'Eng. No.', 'field' => 'eng_no', 'sort' => 'desc', 'class' => array('qms-eng-results-engno')  ),
		'dr_no' => array( 'data' => 'DR No.', 'field' => 'dr_no', 'sort' => 'desc', 'class' => array('qms-eng-results-drno')  ),
		'datetime' => array( 'data' => 'Date', 'field' => 'datetime', 'sort' => 'desc', 'class' => array('qms-eng-results-datetime')  ),
		'full_name' => array( 'data' => 'Technician', 'field' => 'full_name', 'sort' => 'asc', 'class' => array('qms-eng-results-tech')  ),
		'sim_name' => array( 'data' => 'Simulator', 'field' => 'sim_name', 'sort' => 'asc', 'class' => array('qms-eng-results-simulator')  ),
		//'admin' => array( 'data' => 'Options'),
	);
	if ( $admin ) {
		$table_header['admin'] = array( 'data' => 'Admin', 'class' => array('qms-results-admin') );
	}
	
	
	return $table_header;
}


/*
 * _get_engineering_search_list()
 * display the search results
 * This function gets called by engineering_search_form_callback() and engineering_pager_callback()
 * also gets called after a delete submit to refresh the cache ($bRefresh = True), but does not return anything
 *
 */

function _get_engineering_search_list($search, $eng_search_results = Null) {
	
	if ( user_access('search view reports') == FALSE ) {
		drupal_set_message(t('Unauthorized:  User authentication required'));
    return;
  }

	$bAdmin = user_access('administer sabreQMS');	
	global $user;
	$user_is_customer_id = _user_is_customer($user->uid);
	
	$num_per_page =  QMS_RECORDS_PER_PAGE;  
	$table_header = array();
	
	if ( $eng_search_results == Null ) {
		$eng_search_results = new SearchResultsTable('ENG');
	}
	if ( !$eng_search_results->hasHeader() ) {
		$table_header = _get_engineering_results_table_header($bAdmin);
		$eng_search_results->setHeader($table_header);
	}
	else {
		$table_header = $eng_search_results->getHeader();
	}
	
	// get the selected cache, if anything has been stored
	$saved_selected_text = '';
	$selected_cache_name = _get_qms_cache_name(QMS_ENGINEERING_SELECTED);

	$selected_cache = cache_get($selected_cache_name);
	if ( isset($selected_cache->data) && ($selected_cache->data <> '') ) {
		$saved_selected_text = $selected_cache->data;
	}
	
	
	$search_init = array(
		'table_name' => 'qms_engineering',
		'table_alias' => 'g',
		'table_header' => $table_header,
		'pager_path' => 'search/engineering/pager',
		'order' => QMS_ENGINEERING_DEFAULT_SORT_COLUMN,
		'order_default' => 'Eng. No.',
		'sort' => QMS_ENGINEERING_DEFAULT_SORT,
		'sort_default' => 'desc',
		'variable' => True,
	);
	
	$query = _st_setup_paged_search($search_init);
		
	
	//----------------------- discrepancy linked search parms --------------------------------
	// dr_no
	if ( ($search->dr_no <> '') && ( $search->dr_no <> 'DR') ) {  // if only DR prefix, don't bother
		$search->dr_no .= '%';  // append wildcard for fuzzy match
		$query->innerJoin('qms_discrepancy_log', 'd', 'd.discrepancy_id = g.discrepancy_id AND d.dr_no LIKE :drno',
											array(':drno' => $search->dr_no) );	
	}
	else {
		$query->innerJoin('qms_discrepancy_log', 'd', 'd.discrepancy_id = g.discrepancy_id');	
	}
		
	
  
  // simulators  
  $query->innerJoin('qms_simulators', 's', 's.simulator_id = d.simulator_id');
	if ( $search->simulator_id ) {
		$query->condition('d.simulator_id', $search->simulator_id);
	}
  else {
    // ALL SIMS SEARCH - ignore the sims that have been turned off for ALL searches
    $query->condition('s.include_all_searches', 1);
  }
	
	// customer
	if ( $user_is_customer_id ) {
		// add filter to limit results to those related to this customer
		// linked thru the simulator record
		$query->condition('s.customer_id', $user_is_customer_id);
	}
	
	
	//-------------------------- end DR linked search parms ----------------------------------
	
	//--------- Date filtering -----------
	
	//  Date opened
	if (strlen($search->from_date) > 0) {
		$search->from_date .= " 00:00:00";	 // append time segment in UTC format
		$query->condition('datetime', _st_format_timestamp($search->from_date), '>=');
	}
	if (strlen($search->to_date) > 0) {
		$search->to_date .= " 23:59:59";		// append time segment in UTC format
		$query->condition('datetime', _st_format_timestamp($search->to_date), '<=');
	}
	
	// eng_no
	if ( ($search->eng_no <> '') && ( $search->eng_no <> 'ENG') ) {  // if only ENG prefix, don't bother
		$search->eng_no .= '%';  // append wildcard for fuzzy match
		$query->condition('eng_no', $search->eng_no, 'LIKE');
	}
	
	// tech		
	if ( $search->tech_id > 0 ) {
		//$query->innerJoin('qms_employees', 'e', 'e.user_id = g.tech_user_id AND e.user_id = :uid',
		//									array(':uid' => $search->tech_id) );	
		$query->condition('g.tech_user_id', $search->tech_id);
	}
	$query->leftJoin('qms_employees', 'e', 'e.user_id = g.tech_user_id');
	$query->leftJoin('users', 'u', 'u.uid = g.tech_user_id');
	
	
	// load_updated		
	if ( $search->load_updated_id > 0 ) {
		$query->innerJoin('qms_eng_load_updated', 'p', 'p.eng_load_updated_id = g.load_updated_id AND p.eng_load_updated_id = :luid',
											array(':luid' => $search->load_updated_id) );	
	}
	else {
		$query->innerJoin('qms_eng_load_updated', 'p', 'p.eng_load_updated_id = g.load_updated_id');
	}
	
	// module text		
	if ( $search->module_text <> '' ) {
		//---------------------- Keyword Seaching --------------
		// Combo Keyword and Exact Phrase Matching ( ex:  keyword "exact phrase" )
		_st_add_keyword_search_condition($query, 'module_updated', $search->module_text);		
	}	

	
	$query->fields('g', array('engineering_id', 'eng_no', 'datetime', 'discrepancy_id', 'tech_user_id') )
							->fields('s', array('sim_name', 'active', 'device_id_internal'))
							->fields('e', array('full_name'))
							->fields('u', array('name'))
							->fields('d', array('dr_no', 'tech_user_id'));
							
	// determine if items were selected or not		
	if ( strlen($saved_selected_text) ) {
		$list = explode(",", $saved_selected_text);
		$query->addExpression("IF( g.engineering_id IN(:sel_list), :y, :n )", "selected", 
																array(':sel_list' => $list, ':y' => 1, ':n' => 0));	
	}
	$max_count = 0;
	$results = _st_execute_paged_search($query, $max_count);
		
		
	$i = 0;
	$table_rows = array();
	$selected_list = array();
	
	foreach ($results as $row) {		
		
		// set the id into the array index which is linked to the tableselect's checkbox
		$table_rows[$row->engineering_id] = array(
			'eng_no' => array(
				'data' => array(
					'#type' => 'link',
					'#title' => check_plain($row->eng_no),
					'#href' => 'engineering/view/' . $row->engineering_id,
					'#options' => array('query' => array('destination' => 'search/engineering')),
				),
			),
			'dr_no' => array(
				'data' => array(
					'#type' => 'link',
					'#title' => check_plain($row->dr_no),
					'#href' => 'discrepancy/view/' . $row->discrepancy_id,
					'#options' => array('query' => array('destination' => 'search/engineering')),
				),
			),
			'datetime' => _st_format_date($row->datetime, 'short'),
			'full_name' => ( (strlen($row->full_name) > 0) ? check_plain($row->full_name) : check_plain($row->name) . "*" ),
			'sim_name' => _st_format_sim_name($row->sim_name, $row->device_id_internal, $row->active),
			//'admin' => _get_results_table_options('engineering', $row->engineering_id, $bAdmin),
		);
		
		if ( $bAdmin ) {
			// don't allow for the column to exist if user is not an admin, otherwise we get an empty column
			$table_rows[$row->engineering_id]['admin'] = array(
				'data' => _get_results_table_options('engineering', $row->engineering_id, 
																							$bAdmin, 'search/engineering'), 
				'class' => array('qms-results-admin'),
			);
			
		}
		
		if ( strlen($saved_selected_text) ) { $selected_list[$row->engineering_id] = $row->selected; 	}
		
		$i++;
	}
	
	$pager = theme('pager', array('tags' => array(), 'quantity' => $num_per_page));
	$eng_search_results->setPager($pager);
	$eng_search_results->setResults($table_rows);
	$eng_search_results->setSelected($selected_list);
	
	// Save to cache
	// cache the $eng_search_results object
	// cache the nested table array structure without rendering
	// rendering has to be done each time the results are displayed or the checkbox selections won't work
	$results_cache_name = _get_qms_cache_name(QMS_ENGINEERING_SEARCH_RESULTS);
	cache_set($results_cache_name, $eng_search_results, 'cache', time() + QMS_CACHE_TIMEOUT);
	
	return $table_rows;

}





