GhostManSec
Server: LiteSpeed
System: Linux premium117.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: eblama1 (1214)
PHP: 8.2.31
Disabled: NONE
Upload Files
File: /home/eblama1/sms.karnplayinland.com/modules/School_Setup/MarkingPeriods.php
<?php

require_once 'modules/School_Setup/includes/MarkingPeriods.fnc.php';

DrawHeader( ProgramTitle() );

// Default MP ID to Full Year.

if ( empty( $_REQUEST['marking_period_id'] ) )
{
	$_REQUEST['marking_period_id'] = GetFullYearMP() ? GetFullYearMP() : 'new';

	$_REQUEST['mp_term'] = 'FY';
}

if ( $_REQUEST['marking_period_id'] === 'new' )
{
	switch ( $_REQUEST['mp_term'] )
	{
		case 'FY':
			$title = _( 'New Year' );
			break;

		case 'SEM':
			$title = _( 'New Semester' );
			break;

		case 'QTR':
			$title = _( 'New Marking Period' );
			break;

		case 'PRO':
			$title = _( 'New Progress Period' );
			break;
	}
}
else
{
	$_REQUEST['marking_period_id'] = (string) (int) $_REQUEST['marking_period_id'];
}

// Add eventual Dates to $_REQUEST['tables'].
AddRequestedDates( 'tables', 'post' );

// UPDATING

if ( ! empty( $_POST['tables'] )
	&& AllowEdit() )
{
	foreach ( (array) $_REQUEST['tables'] as $id => $columns )
	{
		//FJ fix SQL bug invalid sort order

		if ( isset( $columns['SORT_ORDER'] )
			&& $columns['SORT_ORDER'] !== ''
			&& ! is_numeric( $columns['SORT_ORDER'] ) )
		{
			$error[] = _( 'Please enter a valid Sort Order.' );

			break 1;
		}

		// UPDATE

		if ( $id !== 'new' )
		{
			foreach ( (array) $columns as $column => $value )
			{
				if ( $column === 'START_DATE'
					|| $column === 'END_DATE'
					|| $column === 'POST_START_DATE'
					|| $column === 'POST_END_DATE' )
				{
					//FJ fix SQL bug START_DATE or END_DATE is null

					if (  ( ! VerifyDate( $value )
						&& $value !== '' )
						|| ( ( $column === 'START_DATE' || $column === 'END_DATE' )
							&& $value === '' ) )
					{
						$error[] = _( 'Not all of the dates were entered correctly.' );

						break 2;
					}

					//FJ verify END_DATE > START_DATE
					$mp_dates_RET = DBGet( "SELECT START_DATE, END_DATE, POST_START_DATE, POST_END_DATE
						FROM school_marking_periods
						WHERE MARKING_PERIOD_ID='" . (int) $id . "'" );

					$start_date = ! empty( $columns['START_DATE'] ) ?
						$columns['START_DATE'] :
						$mp_dates_RET[1]['START_DATE'];

					$end_date = ! empty( $columns['END_DATE'] ) ?
						$columns['END_DATE'] :
						$mp_dates_RET[1]['END_DATE'];

					$post_start_date = ! empty( $columns['POST_START_DATE'] ) ?
						$columns['POST_START_DATE'] :
						$mp_dates_RET[1]['POST_START_DATE'];

					$post_end_date = ! empty( $columns['POST_END_DATE'] ) ?
						$columns['POST_END_DATE'] :
						$mp_dates_RET[1]['POST_END_DATE'];

					if (  ( $column === 'END_DATE'
						&& date_create( $value ) <= date_create( $start_date ) )
						|| ( $column === 'START_DATE'
							&& date_create( $end_date ) <= date_create( $value ) )
						|| ( $column === 'POST_END_DATE'
							&& $value !== ''
							&& $post_start_date !== null
							&& date_create( $value ) <= date_create( $post_start_date ) )
						|| ( $column === 'POST_START_DATE'
							&& $value !== ''
							&& $post_end_date !== null
							&& date_create( $post_end_date ) <= date_create( $value ) ) )
					{
						$error[] = _( 'Start date must be anterior to end date.' );

						break 2;
					}
				}
			}

			$go = true;

			$sql = DBUpdateSQL(
				'school_marking_periods',
				$columns,
				[ 'MARKING_PERIOD_ID' => (int) $id ]
			);
		}

		// New: check for Title.
		elseif ( ! empty( $columns['TITLE'] ) )
		{
			$insert_columns = [
				'MP' => $_REQUEST['mp_term'],
				'SYEAR' => UserSyear(),
				'SCHOOL_ID' => UserSchool(),
			];

			switch ( $_REQUEST['mp_term'] )
			{
				case 'SEM':
					$insert_columns['PARENT_ID'] = (int) $_REQUEST['year_id'];
					break;

				case 'QTR':
					$insert_columns['PARENT_ID'] = (int) $_REQUEST['semester_id'];
					break;

				case 'PRO':
					$insert_columns['PARENT_ID'] = (int) $_REQUEST['quarter_id'];
					break;
			}

			foreach ( (array) $columns as $column => $value )
			{
				if ( $column === 'START_DATE'
					|| $column === 'END_DATE'
					|| $column === 'POST_START_DATE'
					|| $column === 'POST_END_DATE' )
				{
					//FJ fix SQL bug START_DATE or END_DATE is null

					if ( ! VerifyDate( $value )
						&& $value !== ''
						|| ( ( $column === 'START_DATE'
							|| $column === 'END_DATE' )
							&& $value === '' ) )
					{
						$error[] = _( 'Not all of the dates were entered correctly.' );

						break 2;
					}

					//FJ verify END_DATE > START_DATE

					if (  ( $column === 'END_DATE'
						&& date_create( $value ) <= date_create( $columns['START_DATE'] ) )
						|| ( $column === 'POST_START_DATE'
							&& $columns['POST_END_DATE'] !== ''
							&& date_create( $value ) > date_create( $columns['POST_END_DATE'] ) ) )
					{
						$error[] = _( 'Start date must be anterior to end date.' );

						break 2;
					}
				}
			}

			$go = true;

			$sql = DBInsertSQL(
				'school_marking_periods',
				$insert_columns + $columns
			);
		}

		// CHECK TO MAKE SURE ONLY ONE MP & ONE GRADING PERIOD IS OPEN AT ANY GIVEN TIME
		$dates_RET = DBGet( "SELECT MARKING_PERIOD_ID
			FROM school_marking_periods
			WHERE MP='" . $_REQUEST['mp_term'] . "'
			AND ( true=false" .
			( ! empty( $columns['START_DATE'] ) ? " OR '" . $columns['START_DATE'] .
				"' BETWEEN START_DATE AND END_DATE" : '' ) .
			( ! empty( $columns['END_DATE'] ) ? " OR '" . $columns['END_DATE'] .
				"' BETWEEN START_DATE AND END_DATE" : '' ) .
			( ! empty( $columns['START_DATE'] ) && ! empty( $columns['END_DATE'] ) ?
				" OR START_DATE BETWEEN '" . $columns['START_DATE'] . "' AND '" . $columns['END_DATE'] . "'" .
				" OR END_DATE BETWEEN '" . $columns['START_DATE'] . "' AND '" . $columns['END_DATE'] . "'" : '' ) . ")
			AND SCHOOL_ID='" . UserSchool() . "'
			AND SYEAR='" . UserSyear() . "'" .
			( $id !== 'new' ? " AND SCHOOL_ID='" . UserSchool() . "'
				AND SYEAR='" . UserSyear() . "'
				AND MARKING_PERIOD_ID!='" . (int) $id . "'" : '' ) );

		$posting_RET = DBGet( "SELECT MARKING_PERIOD_ID
			FROM school_marking_periods
			WHERE MP='" . $_REQUEST['mp_term'] . "'
			AND ( true=false" .
			( ! empty( $columns['POST_START_DATE'] ) ? " OR '" . $columns['POST_START_DATE'] .
				"' BETWEEN POST_START_DATE AND POST_END_DATE" : '' ) .
			( ! empty( $columns['POST_END_DATE'] ) ? " OR '" . $columns['POST_END_DATE'] .
				"' BETWEEN POST_START_DATE AND POST_END_DATE" : '' ) .
			( ! empty( $columns['POST_START_DATE'] ) && ! empty( $columns['POST_END_DATE'] ) ?
				" OR POST_START_DATE BETWEEN '" . $columns['POST_START_DATE'] . "' AND '" . $columns['POST_END_DATE'] . "'" .
				" OR POST_END_DATE BETWEEN '" . $columns['POST_START_DATE'] . "' AND '" . $columns['POST_END_DATE'] . "'" : '' ) . ")
			AND SCHOOL_ID='" . UserSchool() . "'
			AND SYEAR='" . UserSyear() . "'" .
			( $id !== 'new' ? " AND MARKING_PERIOD_ID!='" . (int) $id . "'" : '' ) );

		if ( ! empty( $dates_RET ) )
		{
			$error[] = sprintf(
				_( 'The beginning and end dates you specified for this marking period overlap with those of "%s".' ),
				GetMP( $dates_RET[1]['MARKING_PERIOD_ID'] )
			) . ' ' .
			_( 'Only one marking period can be open at any time.' );

			$go = false;
		}

		if ( ! empty( $posting_RET ) )
		{
			$error[] = sprintf(
				_( 'The grade posting dates you specified for this marking period overlap with those of "%s".' ),
				GetMP( $posting_RET[1]['MARKING_PERIOD_ID'] )
			) . ' ' .
			_( 'Only one grade posting period can be open at any time.' );

			$go = false;
		}

		if ( $go )
		{
			DBQuery( $sql );

			if ( $id === 'new' )
			{
				$_REQUEST['marking_period_id'] = DBLastInsertID();
			}
		}
	}

	// Unset tables & redirect URL.
	RedirectURL( [ 'tables' ] );
}

// DELETING

if ( $_REQUEST['modfunc'] === 'delete'
	&& AllowEdit() )
{
	switch ( $_REQUEST['mp_term'] )
	{
		case 'FY':
			$name = _( 'Year' );

			$parent_term = '';
			$parent_id = '';
			break;

		case 'SEM':
			$name = _( 'Semester' );

			$parent_term = 'FY';
			$parent_id = issetVal( $_REQUEST['year_id'] );
			break;

		case 'QTR':
			$name = _( 'Quarter' );

			$parent_term = 'SEM';
			$parent_id = issetVal( $_REQUEST['semester_id'] );
			break;

		case 'PRO':
			$name = _( 'Progress Period' );

			$parent_term = 'QTR';
			$parent_id = issetVal( $_REQUEST['quarter_id'] );
			break;
	}

	if ( DeletePrompt( $name ) )
	{
		DBQuery( MarkingPeriodDeleteSQL( $_REQUEST['marking_period_id'], $_REQUEST['mp_term'] ) );

		$_REQUEST['mp_term'] = $parent_term;

		$_REQUEST['marking_period_id'] = $parent_id;

		// Unset modfunc & redirect URL.
		RedirectURL( 'modfunc' );
	}
}

if ( ! $_REQUEST['modfunc'] )
{
	echo ErrorMessage( $error );

	if ( $_REQUEST['marking_period_id']
		&& $_REQUEST['marking_period_id'] !== 'new' )
	{
		// Check marking period ID is valid for current school & syear!
		$marking_period_RET = DBGet( "SELECT MARKING_PERIOD_ID
			FROM school_marking_periods
			WHERE SCHOOL_ID='" . UserSchool() . "'
			AND SYEAR='" . UserSyear() . "'
			AND MARKING_PERIOD_ID='" . (int) $_REQUEST['marking_period_id'] . "'" );

		if ( ! $marking_period_RET )
		{
			$_REQUEST['marking_period_id'] = GetFullYearMP() ? GetFullYearMP() : 'new';

			$_REQUEST['mp_term'] = 'FY';

			// Unset year & semester & quarter IDs & redirect URL.
			RedirectURL( [ 'year_id', 'semester_id', 'quarter_id' ] );
		}

		if ( AllowEdit()
			&& $_REQUEST['marking_period_id'] !== 'new'
			&& $_REQUEST['marking_period_id'] !== GetFullYearMP() )
		{
			// @since 6.6 Add warning when Marking Period dates are not within Parent MP dates range.
			$parent_mp_type = GetMP( $_REQUEST['marking_period_id'], 'MP' ) === 'SEM' ? 'FY' :
				( GetMP( $_REQUEST['marking_period_id'], 'MP' ) === 'QTR' ? 'SEM' : 'QTR' );

			$parent_mp_id = GetParentMP( $parent_mp_type, $_REQUEST['marking_period_id'] );

			$parent_mp_end_date = GetMP( $parent_mp_id, 'END_DATE' );

			$mp_end_date = GetMP( $_REQUEST['marking_period_id'], 'END_DATE' );

			$parent_mp_start_date = GetMP( $parent_mp_id, 'START_DATE' );

			$mp_start_date = GetMP( $_REQUEST['marking_period_id'], 'START_DATE' );

			if ( $mp_end_date > $parent_mp_end_date )
			{
				$warning[] = _( 'End date for current Marking Period is posterior to parent Marking Period\'s end date.' );
			}

			if ( $mp_start_date < $parent_mp_start_date )
			{
				$warning[] = _( 'Start date for current Marking Period is anterior to parent Marking Period\'s start date.' );
			}
		}
	}

	echo ErrorMessage( $warning, 'warning' );

	// ADDING & EDITING FORM.

	if ( $_REQUEST['marking_period_id'] !== 'new' )
	{
		$RET = DBGet( "SELECT TITLE,SHORT_NAME,SORT_ORDER,DOES_GRADES,DOES_COMMENTS,
				START_DATE,END_DATE,POST_START_DATE,POST_END_DATE
			FROM school_marking_periods
			WHERE MARKING_PERIOD_ID='" . (int) $_REQUEST['marking_period_id'] . "'" );

		$RET = $RET[1];

		$title = $RET['TITLE'];
	}

	$mp_href = 'Modules.php?modname=' . $_REQUEST['modname'] . '&mp_term=' . $_REQUEST['mp_term'] .
		'&year_id=' . issetVal( $_REQUEST['year_id'] ) .
		'&semester_id=' . issetVal( $_REQUEST['semester_id'] ) .
		'&quarter_id=' . issetVal( $_REQUEST['quarter_id'] ) .
		'&marking_period_id=' . $_REQUEST['marking_period_id'];

	$delete_button = '';

	if ( AllowEdit()
		&& $_REQUEST['marking_period_id'] !== 'new' )
	{
		// Is Single Marking Period? Do NOT delete.
		$not_single_mp = $_REQUEST['mp_term'] !== 'FY' || $_REQUEST['mp_term'] === 'PRO';

		if ( $_REQUEST['mp_term'] !== 'FY'
			&& $_REQUEST['mp_term'] !== 'PRO' )
		{
			$mp_count = DBGetOne( "SELECT COUNT(MARKING_PERIOD_ID)
				FROM school_marking_periods
				WHERE MP='" . $_REQUEST['mp_term'] . "'
				AND SYEAR='" . UserSyear() . "'
				AND SCHOOL_ID='" . UserSchool() . "'" );

			$not_single_mp = $mp_count > 1;
		}

		if ( $not_single_mp )
		{
			// @since 5.0 MP has Course Periods? Do NOT delete.
			$can_delete = DBTransDryRun(
				MarkingPeriodDeleteSQL( $_REQUEST['marking_period_id'], $_REQUEST['mp_term'] )
			);

			if ( $can_delete )
			{
				$delete_URL = URLEscape( $mp_href . "&modfunc=delete" );

				$delete_button = '<input type="button" value="' . AttrEscape( _( 'Delete' ) ) .
					'" onclick="' . AttrEscape( 'ajaxLink(' . json_encode( $delete_URL ) . ');' ) . '" />';
			}
		}
	}

	echo '<form action="' . URLEscape( $mp_href ) . '" method="POST">';

	DrawHeader( $title, $delete_button . SubmitButton() );

	$header = '<table class="width-100p valign-top fixed-col"><tr class="st">';

	$header .= '<td>' . TextInput(
		issetVal( $RET['TITLE'], '' ),
		'tables[' . $_REQUEST['marking_period_id'] . '][TITLE]',
		_( 'Title' ),
		'required maxlength="50"'
	) . '</td>';

	$header .= '<td>' . TextInput(
		issetVal( $RET['SHORT_NAME'], '' ),
		'tables[' . $_REQUEST['marking_period_id'] . '][SHORT_NAME]',
		_( 'Short Name' ),
		'required maxlength="10"' .
			( $_REQUEST['marking_period_id'] === 'new' ? ' size="3"' : '' )
	) . '</td>';

	if ( AllowEdit() )
	{
		// Hide Sort Order from non editing users.
		$header .= '<td>' . TextInput(
			issetVal( $RET['SORT_ORDER'], '' ),
			'tables[' . $_REQUEST['marking_period_id'] . '][SORT_ORDER]',
			_( 'Sort Order' ),
			' type="number" min="-9999" max="9999"'
		) . '</td></tr>';
	}

	// @since 4.1 Grade posting date inputs are required when "Graded" is checked.
	$header .= '<script>var mpGradedOnclickPostDatesRequired = function(el) {
		var dates = ["month", "day", "year"],
			dateStartInput,
			dateEndInput;

		for (var i=0,max=dates.length; i<max; i++) {
			dateStartInput = document.getElementsByName( dates[i] + "_tables[' . $_REQUEST['marking_period_id'] .
			'][POST_START_DATE]" )[0];
			dateEndInput = document.getElementsByName( dates[i] + "_tables[' . $_REQUEST['marking_period_id'] .
			'][POST_END_DATE]" )[0];

			dateStartInput.required = dateEndInput.required = el.checked;
		}

		// Add .legend-red CSS class to label if input is required/
		$(dateStartInput).parent().nextAll(".legend-gray").toggleClass("legend-red", el.checked);
		$(dateEndInput).parent().nextAll(".legend-gray").toggleClass("legend-red", el.checked);
	};</script>';

	$js_onclick_post_dates_required = 'onclick="mpGradedOnclickPostDatesRequired( this );"';

	$header .= '<tr class="st"><td>' . CheckboxInput(
		issetVal( $RET['DOES_GRADES'], '' ),
		'tables[' . $_REQUEST['marking_period_id'] . '][DOES_GRADES]',
		_( 'Graded' ),
		'',
		$_REQUEST['marking_period_id'] === 'new',
		button( 'check' ),
		button( 'x' ),
		true,
		$js_onclick_post_dates_required
	) . '</td>';

	if ( AllowEdit()
		|| ! empty( $RET['DOES_GRADES'] ) )
	{
		// Hide Comments from non editing users if MP not Graded.
		$header .= '<td>' . CheckboxInput(
			issetVal( $RET['DOES_COMMENTS'], '' ),
			'tables[' . $_REQUEST['marking_period_id'] . '][DOES_COMMENTS]',
			_( 'Comments' ),
			'',
			$_REQUEST['marking_period_id'] === 'new',
			button( 'check' ),
			button( 'x' )
		) . '</td>';
	}

	$header .= '</tr><tr><td colspan="3"><hr></td></tr>';

	$required = $allow_na = $div = true;

	$header .= '<tr class="st"><td>' . DateInput(
		issetVal( $RET['START_DATE'], '' ),
		'tables[' . $_REQUEST['marking_period_id'] . '][START_DATE]',
		_( 'Begins' ),
		$div,
		$allow_na,
		$required
	) . '</td>';

	$header .= '<td>' . DateInput(
		issetVal( $RET['END_DATE'], '' ),
		'tables[' . $_REQUEST['marking_period_id'] . '][END_DATE]',
		_( 'Ends' ),
		$div,
		$allow_na,
		$required
	) . '</td></tr>';

	$required = ! empty( $RET['DOES_GRADES'] );

	$red = ! empty( $RET['DOES_GRADES'] ) && empty( $RET['POST_END_DATE'] );

	if ( AllowEdit()
		|| ! empty( $RET['DOES_GRADES'] ) )
	{
		// Hide Grade Posting Dates from non editing users if MP not Graded.
		$header .= '<tr class="st"><td>' . DateInput(
			issetVal( $RET['POST_START_DATE'], '' ),
			'tables[' . $_REQUEST['marking_period_id'] . '][POST_START_DATE]',
			( $red ? '<span class="legend-red">' : '' ) . _( 'Grade Posting Begins' ) . ( $red ? '</span>' : '' ),
			$div,
			$allow_na,
			$required
		) . '</td>';

		$header .= '<td>' . DateInput(
			issetVal( $RET['POST_END_DATE'], '' ),
			'tables[' . $_REQUEST['marking_period_id'] . '][POST_END_DATE]',
			( $red ? '<span class="legend-red">' : '' ) . _( 'Grade Posting Ends' ) . ( $red ? '</span>' : '' ),
			$div,
			$allow_na,
			$required
		) . '</td></tr>';
	}

	$header .= '</table>';

	DrawHeader( $header );

	echo '</form>';

	// DISPLAY THE MENU
	$LO_options = [ 'save' => false, 'search' => false, 'responsive' => false ];

	// FY
	$fy_RET = DBGet( "SELECT MARKING_PERIOD_ID,TITLE
		FROM school_marking_periods
		WHERE MP='FY'
		AND SCHOOL_ID='" . UserSchool() . "'
		AND SYEAR='" . UserSyear() . "' ORDER BY SORT_ORDER IS NULL,SORT_ORDER" );

	if ( ! empty( $fy_RET ) )
	{
		if ( ! empty( $_REQUEST['mp_term'] ) )
		{
			if ( $_REQUEST['mp_term'] === 'FY' )
			{
				$_REQUEST['year_id'] = issetVal( $_REQUEST['marking_period_id'] );
			}

			foreach ( (array) $fy_RET as $key => $value )
			{
				if ( $value['MARKING_PERIOD_ID'] === $_REQUEST['year_id'] )
				{
					$fy_RET[$key]['row_color'] = Preferences( 'HIGHLIGHT' );
				}
			}
		}
	}

	echo '<div class="st">';

	$columns = [ 'TITLE' => _( 'Year' ) ];

	$link = [];

	$link['TITLE']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=' . $_REQUEST['modfunc'] . '&mp_term=FY';

	$link['TITLE']['variables'] = [ 'marking_period_id' => 'MARKING_PERIOD_ID' ];

	if ( empty( $fy_RET ) )
	{
		$link['add']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&mp_term=FY&marking_period_id=new';
	}

	ListOutput( $fy_RET, $columns, 'Year', 'Years', $link, [], $LO_options );

	echo '</div>';

	// SEMESTERS

	if (  ( $_REQUEST['mp_term'] === 'FY'
		&& $_REQUEST['marking_period_id'] !== 'new' )
		|| $_REQUEST['mp_term'] === 'SEM'
		|| $_REQUEST['mp_term'] === 'QTR'
		|| $_REQUEST['mp_term'] === 'PRO' )
	{
		$sem_RET = DBGet( "SELECT MARKING_PERIOD_ID,TITLE
			FROM school_marking_periods
			WHERE MP='SEM'
			AND SCHOOL_ID='" . UserSchool() . "'
			AND SYEAR='" . UserSyear() . "'
			AND PARENT_ID='" . (int) $_REQUEST['year_id'] . "'
			ORDER BY SORT_ORDER IS NULL,SORT_ORDER,START_DATE" );

		if ( ! empty( $sem_RET ) )
		{
			if ( ! empty( $_REQUEST['mp_term'] ) )
			{
				if ( $_REQUEST['mp_term'] === 'SEM' )
				{
					$_REQUEST['semester_id'] = issetVal( $_REQUEST['marking_period_id'] );
				}

				foreach ( (array) $sem_RET as $key => $value )
				{
					if ( ! empty( $_REQUEST['semester_id'] )
						&& $value['MARKING_PERIOD_ID'] === $_REQUEST['semester_id'] )
					{
						$sem_RET[$key]['row_color'] = Preferences( 'HIGHLIGHT' );
					}
				}
			}
		}

		echo '<div class="st">';

		$columns = [ 'TITLE' => _( 'Semester' ) ];

		$link = [];

		$link['TITLE']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=' . $_REQUEST['modfunc'] . '&mp_term=SEM&year_id=' . $_REQUEST['year_id'];

		$link['TITLE']['variables'] = [ 'marking_period_id' => 'MARKING_PERIOD_ID' ];

		$link['add']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&mp_term=SEM&marking_period_id=new&year_id=' . $_REQUEST['year_id'];

		ListOutput( $sem_RET, $columns, 'Semester', 'Semesters', $link, [], $LO_options );

		echo '</div>';

		// QUARTERS

		if ( ( $_REQUEST['mp_term'] === 'SEM'
				&& $_REQUEST['marking_period_id'] !== 'new' )
			|| $_REQUEST['mp_term'] === 'QTR'
			|| $_REQUEST['mp_term'] === 'PRO' )
		{
			$qtr_RET = DBGet( "SELECT MARKING_PERIOD_ID,TITLE
				FROM school_marking_periods
				WHERE MP='QTR'
				AND SCHOOL_ID='" . UserSchool() . "'
				AND SYEAR='" . UserSyear() . "'
				AND PARENT_ID='" . (int) $_REQUEST['semester_id'] . "'
				ORDER BY SORT_ORDER IS NULL,SORT_ORDER,START_DATE" );

			if ( ! empty( $qtr_RET ) )
			{
				if ( ( $_REQUEST['mp_term'] === 'QTR'
						&& $_REQUEST['marking_period_id'] !== 'new' )
					|| $_REQUEST['mp_term'] === 'PRO' )
				{
					if ( $_REQUEST['mp_term'] == 'QTR' )
					{
						$_REQUEST['quarter_id'] = issetVal( $_REQUEST['marking_period_id'] );
					}

					foreach ( (array) $qtr_RET as $key => $value )
					{
						if ( $value['MARKING_PERIOD_ID'] === $_REQUEST['quarter_id'] )
						{
							$qtr_RET[$key]['row_color'] = Preferences( 'HIGHLIGHT' );
						}
					}
				}
			}

			echo '<div class="st">';

			$columns = [ 'TITLE' => _( 'Quarter' ) ];

			$link = [];

			$link['TITLE']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=' . $_REQUEST['modfunc'] . '&mp_term=QTR&year_id=' . $_REQUEST['year_id'] . '&semester_id=' . $_REQUEST['semester_id'];

			$link['TITLE']['variables'] = [ 'marking_period_id' => 'MARKING_PERIOD_ID' ];

			$link['add']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&mp_term=QTR&marking_period_id=new&year_id=' . $_REQUEST['year_id'] . '&semester_id=' . $_REQUEST['semester_id'];

			ListOutput( $qtr_RET, $columns, 'Quarter', 'Quarters', $link, [], $LO_options );

			echo '</div>';

			// PROGRESS PERIODS

			if ( ( $_REQUEST['mp_term'] === 'QTR'
					&& $_REQUEST['marking_period_id'] !== 'new' )
				|| $_REQUEST['mp_term'] === 'PRO' )
			{
				$pro_RET = DBGet( "SELECT MARKING_PERIOD_ID,TITLE
					FROM school_marking_periods
					WHERE MP='PRO'
					AND SCHOOL_ID='" . UserSchool() . "'
					AND SYEAR='" . UserSyear() . "'
					AND PARENT_ID='" . (int) $_REQUEST['quarter_id'] . "'
					ORDER BY SORT_ORDER IS NULL,SORT_ORDER,START_DATE" );

				if ( ! empty( $pro_RET ) )
				{
					if ( $_REQUEST['mp_term'] === 'PRO'
						&& $_REQUEST['marking_period_id'] !== 'new' )
					{
						$_REQUEST['progress_period_id'] = issetVal( $_REQUEST['marking_period_id'] );

						foreach ( (array) $pro_RET as $key => $value )
						{
							if ( $value['MARKING_PERIOD_ID'] === $_REQUEST['marking_period_id'] )
							{
								$pro_RET[$key]['row_color'] = Preferences( 'HIGHLIGHT' );
							}
						}
					}
				}

				echo '<div class="st">';

				$columns = [ 'TITLE' => _( 'Progress Period' ) ];

				$link = [];

				$link['TITLE']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&modfunc=' . $_REQUEST['modfunc'] . '&mp_term=PRO&year_id=' . $_REQUEST['year_id'] . '&semester_id=' . $_REQUEST['semester_id'] . '&quarter_id=' . $_REQUEST['quarter_id'];

				$link['TITLE']['variables'] = [ 'marking_period_id' => 'MARKING_PERIOD_ID' ];

				$link['add']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&mp_term=PRO&marking_period_id=new&year_id=' . $_REQUEST['year_id'] . '&semester_id=' . $_REQUEST['semester_id'] . '&quarter_id=' . $_REQUEST['quarter_id'];

				ListOutput( $pro_RET, $columns, 'Progress Period', 'Progress Periods', $link, [], $LO_options );

				echo '</div>';
			}
		}
	}
}