<%pre>

#include <livefeatures.h>
#include <setup.h>
#include <tools.h>
#include <epg_events.h>

using namespace std;
using namespace vdrlive;

</%pre>
<%args>
	int channel = -1;
</%args>
<%session scope="global">
bool logged_in(false);
</%session>
<%request scope="page">
	cChannel* Channel;
</%request>
<%include>page_init.eh</%include>
<%cpp>
if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html");
</%cpp>
<%cpp>
	pageTitle = trVDR("Schedule");

#if VDRVERSNUM < 20301
	cSchedulesLock schedulesLock;
	cSchedules const* schedules = cSchedules::Schedules( schedulesLock );

	ReadLock channelsLock( Channels );
	if ( !channelsLock )
		throw HtmlError( tr("Couldn't aquire access to channels, please try again later.") );
#endif

	// cChannel* Channel; (see %request above)
	if ( channel > 0 ) {
#if VDRVERSNUM >= 20301
		LOCK_CHANNELS_READ;
		Channel = (cChannel *)Channels->GetByNumber( channel );
#else
		Channel = Channels.GetByNumber( channel );
#endif
	}
	else {
#if VDRVERSNUM >= 20301
		LOCK_CHANNELS_READ;
#endif
		if (cDevice::CurrentChannel()) {
#if VDRVERSNUM >= 20301
			Channel = (cChannel *)Channels->GetByNumber(cDevice::CurrentChannel());
#else
			Channel = Channels.GetByNumber(cDevice::CurrentChannel());
#endif
		}
		else {
#if VDRVERSNUM >= 20301
			Channel = (cChannel *)Channels->Get( Channels->GetNextNormal( -1 ) );
#else
			Channel = Channels.Get( Channels.GetNextNormal( -1 ) );
#endif
		}
	}
	if ( Channel == 0 )
		throw HtmlError( tr("Couldn't find channel or no channels available. Maybe you mistyped your request?") );

	cSchedule const* Schedule;
#if VDRVERSNUM >= 20301
	{
		LOCK_SCHEDULES_READ;
		Schedule = Schedules->GetSchedule( (const cChannel *)Channel );
	}
#else
	Schedule = schedules->GetSchedule( Channel );
#endif
</%cpp>
<& pageelems.doc_type &>
<html>
	<head>
		<title>VDR Live - <$ pageTitle $></title>
		<& pageelems.stylesheets &>
		<& pageelems.ajax_js &>
	</head>
	<body>
		<& pageelems.logo &>
		<& menu active=("schedule") component=("schedule.channel_selection") &>
		<div class="inhalt">
<%cpp>
	if ( Schedule == 0 ) {
</%cpp>
			<$ tr("No schedules available for this channel") $>.
<%cpp>
	}
	else {
</%cpp>
		<table class="listing" cellspacing="0" cellpadding="0">
<%cpp>
		string current_day = "";
		const cEvent* PresentEvent = Schedule->GetPresentEvent();
		time_t now = time(NULL) - ::Setup.EPGLinger * 60;
#if VDRVERSNUM >= 20301
		for (const cEvent *Event = (cEvent *)Schedule->Events()->First(); Event; Event = (cEvent *)Schedule->Events()->Next(Event)) {
#else
		for (const cEvent *Event = Schedule->Events()->First(); Event; Event = Schedule->Events()->Next(Event)) {
#endif
			if (Event->EndTime() <= now && Event != PresentEvent)
				continue;

			EpgInfoPtr epgEvent = EpgEvents::CreateEpgInfo(Channel, Event);

			string title(epgEvent->Title());
			string short_description(epgEvent->ShortDescr());
			string description(epgEvent->LongDescr());
			string start(epgEvent->StartTime(tr("%I:%M %p")));
			string end(epgEvent->EndTime(tr("%I:%M %p")));
			string day(epgEvent->StartTime(tr("%A, %b %d %Y")));
			string epgid = EpgEvents::EncodeDomId(Channel->GetChannelID(), Event->EventID());

			bool truncated = false;
			bool lastEventCurrentDay = false;
			{
#if VDRVERSNUM >= 20301
				cEvent* NextEvent = (cEvent *)Schedule->Events()->Next(Event);
#else
				cEvent* NextEvent = Schedule->Events()->Next(Event);
#endif
				if (!NextEvent) {
					lastEventCurrentDay = true;
				}
				else {
					string nday(NextEvent->StartTime() ? FormatDateTime(tr("%A, %b %d %Y"), NextEvent->StartTime()) : "");
					lastEventCurrentDay = (day != nday);
				}
			}

			if (current_day != day) {
				if (current_day != "") {
</%cpp>
				<tr class="spacer">
					<td colspan="5"/>
				</tr>
<%cpp>
				}
</%cpp>
				<tr class="head">
					<td colspan="5"><div class="boxheader"><div><div><$ day $></div></div></div></td>
				</tr>
<%cpp>
				current_day = day;
			}
</%cpp>
				<tr>
					<td class="action leftcol <? lastEventCurrentDay ? "bottomrow" ?>"><& pageelems.event_timer epgid=(epgid) &></td>
					<td class="action <? lastEventCurrentDay ? "bottomrow" ?>"><%cpp>if (LiveFeatures<features::epgsearch>().Recent() ) { </%cpp><a href="searchresults.html?searchplain=<$ StringUrlEncode(title) $>"><img src="<$ LiveSetup().GetThemedLink("img", "search.png") $>" alt="" <& tooltip.hint text=(tr("Search for repeats.")) &>></img></a><%cpp> } else { </%cpp><img src="img/transparent.png" width="16" height="16"><%cpp> } </%cpp></td>
					<td class="action <? lastEventCurrentDay ? "bottomrow" ?>"><& pageelems.imdb_info_href title=(title) &></td>
					<td class="topaligned <? lastEventCurrentDay ? "bottomrow" ?>"><div class="withmargin nowrap"><$ start $> - <$ end $></div></td>
					<td class="<? (Event == PresentEvent) ? "current" ?> topaligned rightcol <? lastEventCurrentDay ? "bottomrow" ?>"><div class="more withmargin"><a <& tooltip.hint text=(StringEscapeAndBreak(StringWordTruncate(description, 300, truncated)) + "<br />" + tr("Click to view details.")) &><& tooltip.display domId=(epgEvent->Id()) &>><span class="title"><$ title $></span><br /><span class="short"><%cpp>if (short_description.empty()) { </%cpp>&nbsp;<%cpp> } </%cpp><$ short_description $></span></a></div></td>
				</tr>
<%cpp>
		}
</%cpp>
			</table>
<%cpp>
	}
</%cpp>
		</div>
	</body>
</html>
<%include>page_exit.eh</%include>

<%def channel_selection>
<form action="schedule.html" method="get" id="channels">
   <span>
     <label for="channel"><$ tr("Channel") $>:&nbsp;<span class="bold"><$ Channel->Number() $></span></label>
     <& channels_widget name=("channel") selected=(Channel ? *Channel->GetChannelID().ToString() : "") onchange=("document.forms.channels.submit()") &>
     <& pageelems.ajax_action_href action="switch_channel" tip=(tr("Switch to this channel.")) param=(Channel->GetChannelID()) image="zap.png" alt="" &>
     <& pageelems.vlc_stream_channel channelId=(Channel->GetChannelID()) &>
   </span>
</form>
</%def>