...
 
Commits (2)
......@@ -74,6 +74,22 @@ fn fill_user_data(session: &SessionUser, data: &mut json_val::Map<String, serde_
data.insert("parent".to_string(), to_json(&"base"));
}
fn fill_oauth_data((self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>),
data: &mut json_val::Map<String, serde_json::Value>)
{
let mut oauth_links: Vec<(String, String, String)> = Vec::new();
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
}
fn grade_to_string(grade: i32) -> String {
match grade {
0 => "Noch kein Schüler".to_string(),
......@@ -90,7 +106,7 @@ fn grade_to_string(grade: i32) -> String {
}
pub fn index<T: MedalConnection>(conn: &T, session_token: Option<String>,
(self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>))
oauth_infos: (Option<String>, Option<Vec<OauthProvider>>))
-> (String, json_val::Map<String, json_val::Value>)
{
let mut data = json_val::Map::new();
......@@ -103,23 +119,13 @@ pub fn index<T: MedalConnection>(conn: &T, session_token: Option<String>,
}
}
let mut oauth_links: Vec<(String, String, String)> = Vec::new();
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
fill_oauth_data(oauth_infos, &mut data);
data.insert("parent".to_string(), to_json(&"base"));
("index".to_owned(), data)
}
pub fn status<T: MedalConnection>(conn: &T) -> String { conn.get_debug_information() }
pub fn status<T: MedalConnection>(conn: &T, _: ()) -> String { conn.get_debug_information() }
pub fn debug<T: MedalConnection>(conn: &T, session_token: Option<String>)
-> (String, json_val::Map<String, json_val::Value>) {
......@@ -172,7 +178,7 @@ pub enum ContestVisibility {
}
pub fn show_contests<T: MedalConnection>(conn: &T, session_token: &str,
(self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>),
oauth_infos: (Option<String>, Option<Vec<OauthProvider>>),
visibility: ContestVisibility)
-> MedalValue
{
......@@ -185,17 +191,7 @@ pub fn show_contests<T: MedalConnection>(conn: &T, session_token: &str,
data.insert("can_start".to_string(), to_json(&true));
}
let mut oauth_links: Vec<(String, String, String)> = Vec::new();
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
fill_oauth_data(oauth_infos, &mut data);
let now = time::get_time();
let v: Vec<ContestInfo> =
......@@ -280,8 +276,11 @@ fn check_contest_constraints(session: &SessionUser, contest: &Contest) -> Contes
grade_matching }
}
pub fn show_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_token: &str, query_string: Option<String>)
-> MedalValueResult {
pub fn show_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_token: &str,
query_string: Option<String>,
oauth_infos: (Option<String>, Option<Vec<OauthProvider>>))
-> MedalValueResult
{
let session = conn.get_session_or_new(&session_token);
let contest = conn.get_contest_by_id_complete(contest_id);
......@@ -295,7 +294,10 @@ pub fn show_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_token
public: contest.public };
let mut data = json_val::Map::new();
data.insert("parent".to_string(), to_json(&"base"));
data.insert("empty".to_string(), to_json(&"empty"));
data.insert("contest".to_string(), to_json(&ci));
fill_oauth_data(oauth_infos, &mut data);
let constraints = check_contest_constraints(&session, &contest);
......@@ -484,7 +486,7 @@ pub fn start_contest<T: MedalConnection>(conn: &T, contest_id: i32, session_toke
}
pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String),
(self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>))
oauth_infos: (Option<String>, Option<Vec<OauthProvider>>))
-> Result<String, MedalValue>
{
let (username, password) = login_data;
......@@ -497,17 +499,7 @@ pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String),
data.insert("username".to_string(), to_json(&username));
data.insert("parent".to_string(), to_json(&"base"));
let mut oauth_links: Vec<(String, String, String)> = Vec::new();
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
fill_oauth_data(oauth_infos, &mut data);
Err(("login".to_owned(), data))
}
......@@ -515,7 +507,7 @@ pub fn login<T: MedalConnection>(conn: &T, login_data: (String, String),
}
pub fn login_with_code<T: MedalConnection>(
conn: &T, code: &str, (self_url, oauth_providers): (Option<String>, Option<Vec<OauthProvider>>))
conn: &T, code: &str, oauth_infos: (Option<String>, Option<Vec<OauthProvider>>))
-> Result<Result<String, String>, (String, json_val::Map<String, json_val::Value>)> {
match conn.login_with_code(None, &code) {
Ok(session_token) => Ok(Ok(session_token)),
......@@ -527,17 +519,7 @@ pub fn login_with_code<T: MedalConnection>(
data.insert("code".to_string(), to_json(&code));
data.insert("parent".to_string(), to_json(&"base"));
let mut oauth_links: Vec<(String, String, String)> = Vec::new();
if let Some(oauth_providers) = oauth_providers {
for oauth_provider in oauth_providers {
oauth_links.push((oauth_provider.provider_id.to_owned(),
oauth_provider.login_link_text.to_owned(),
oauth_provider.url.to_owned()));
}
}
data.insert("self_url".to_string(), to_json(&self_url));
data.insert("oauth_links".to_string(), to_json(&oauth_links));
fill_oauth_data(oauth_infos, &mut data);
Err(("login".to_owned(), data))
}
......
......@@ -297,16 +297,9 @@ fn greet_personal<C>(req: &mut Request) -> IronResult<Response>
// hier ggf. Daten aus dem Request holen
let config = req.get::<Read<SharedConfiguration>>().unwrap();
let (self_url, oauth_providers) = (config.self_url.clone(), config.oauth_providers.clone());
let (template, mut data) = {
// hier ggf. Daten aus dem Request holen
let mutex = req.get::<Write<SharedDatabaseConnection<C>>>().unwrap();
let conn = mutex.lock().unwrap_or_else(|e| e.into_inner());
let oauth_infos = (config.self_url.clone(), config.oauth_providers.clone());
// Antwort erstellen und zurücksenden
core::index(&*conn, session_token, (self_url, oauth_providers))
};
let (template, mut data) = with_conn![core::index, C, req, session_token, oauth_infos];
/*if let Some(server_message) = &config.server_message {
data.insert("server_message".to_string(), to_json(&server_message));
......@@ -321,12 +314,7 @@ fn greet_personal<C>(req: &mut Request) -> IronResult<Response>
fn dbstatus<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static {
let status = {
let mutex = req.get::<Write<SharedDatabaseConnection<C>>>().unwrap();
let conn = mutex.lock().unwrap_or_else(|e| e.into_inner());
core::status(&*conn)
};
let status = with_conn![core::status, C, req, ()];
let mut resp = Response::new();
resp.set_mut(status).set_mut(status::Ok);
......@@ -337,12 +325,7 @@ fn debug<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static {
let session_token = req.get_session_token();
let (template, data) = {
let mutex = req.get::<Write<SharedDatabaseConnection<C>>>().unwrap();
let conn = mutex.lock().unwrap_or_else(|e| e.into_inner());
core::debug(&*conn, session_token)
};
let (template, data) = with_conn![core::debug, C, req, session_token];
let mut resp = Response::new();
resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
......@@ -415,55 +398,17 @@ fn contests<C>(req: &mut Request) -> IronResult<Response>
Ok(resp)
}
fn opencontests<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static {
let session_token = req.require_session_token()?;
let config = req.get::<Read<SharedConfiguration>>().unwrap();
let (self_url, oauth_providers) = (config.self_url.clone(), config.oauth_providers.clone());
let (template, mut data) = with_conn![core::show_contests,
C,
req,
&session_token,
(self_url, oauth_providers),
core::ContestVisibility::Open];
config.server_message.as_ref().map(|sm| data.insert("server_message".to_string(), to_json(&sm)));
let mut resp = Response::new();
resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
Ok(resp)
}
fn currentcontests<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static {
let session_token = req.require_session_token()?;
let config = req.get::<Read<SharedConfiguration>>().unwrap();
let (self_url, oauth_providers) = (config.self_url.clone(), config.oauth_providers.clone());
let (template, mut data) = with_conn![core::show_contests,
C,
req,
&session_token,
(self_url, oauth_providers),
core::ContestVisibility::Current];
config.server_message.as_ref().map(|sm| data.insert("server_message".to_string(), to_json(&sm)));
let mut resp = Response::new();
resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
Ok(resp)
}
fn contest<C>(req: &mut Request) -> IronResult<Response>
where C: MedalConnection + std::marker::Send + 'static {
let contest_id = req.expect_int::<i32>("contestid")?;
let session_token = req.require_session_token()?;
let query_string = req.url.query().map(|s| s.to_string());
let (template, data) = with_conn![core::show_contest, C, req, contest_id, &session_token, query_string].aug(req)?;
let config = req.get::<Read<SharedConfiguration>>().unwrap();
let oauth_infos = (config.self_url.clone(), config.oauth_providers.clone());
let (template, data) =
with_conn![core::show_contest, C, req, contest_id, &session_token, query_string, oauth_infos].aug(req)?;
let mut resp = Response::new();
resp.set_mut(Template::new(&template, data)).set_mut(status::Ok);
......@@ -1236,8 +1181,6 @@ pub fn start_server<C>(conn: C, config: Config) -> iron::error::HttpResult<iron:
let router = router!(
greet: get "/" => greet_personal::<C>,
contests: get "/contest/" => contests::<C>,
contestsopen: get "/contest/open/" => opencontests::<C>,
contestscurrent: get "/contest/current/" => currentcontests::<C>,
contest: get "/contest/:contestid" => contest::<C>,
contestresults: get "/contest/:contestid/result/" => contestresults::<C>,
contestresults_download: get "/contest/:contestid/result/download" => contestresults_download::<C>,
......
{{#if not_bare}}
<!DOCTYPE html>
<html lang="en" style="background-color: #fafafa;">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=450">
<title>Jugendwettbewerb Informatik: Programmieren – leichter, als du denkst!</title>
<link rel="stylesheet" href="/static/lib/bulma/medal-bulma-0.7.5.css">
<link rel="icon" href="/static/images/favicon.png" type="image/png">
<style>
ul {
list-style-type: none;
font-size:x-large;
margin-left:20px;
}
</style>
</head>
<body style="background-color: white;">
<div class="container" style="padding: 1.5rem;">
<div class="columns">
<div class="column is-7">
<a href="/">
<img style="float:left; margin-right: 10px;" src="/static/images/klein.png">
</a>
<h1 class="title">Jugendwettbewerb Informatik</h1>
<h2 class="subtitle">Programmieren – leichter, als du denkst!</h2>
</div>
<div class="column is-one-third">
&nbsp;
{{#if logged_in}}
<div class="columns">
<div class="column is-8">
Eingeloggt als <em>{{ username }}</em>
{{#if firstname}}{{#if lastname}}
({{firstname}} {{lastname}})
{{/if}}{{/if}}
{{#if teacher}}
[Lehrer]
{{/if}}
<br>
<a href="/profile" class="button is-info is-small">👤 &nbsp; Profil</a>
{{#if teacher}}
<a href="/group/" class="button is-warning is-small">&nbsp; Gruppenverwaltung</a>
{{/if}}
</div>
<div class="column"><a href="/logout" class="button is-small is-danger" type="submit">&nbsp; Logout</a></div>
</div>
<div class="columns">
<div class="column"></div>
</div>
{{/if}}
</div>
</div>
{{#*inline "page"}}
{{#if teacher}}
<!-- <div class="columns alogin">
<div class="column is-8 is-offset-2">
<a href="/group/">
<div class="notification is-warning">
<h3 class="title is-5">Gruppenverwaltung</h3>
<p>Gruppen für die Wettbewerbsteilnahme anlegen und verwalten</p>
</div>
</a>
</div>
</div> -->
<!-- <div class="columns alogin">
<div class="column is-8 is-offset-2">
<a href="/contest/{{ contest.id }}/result/">
<div class="notification is-info">
<h3 class="title is-5">Gruppenergebnisse</h3>
<p>Ergebnisse meiner Gruppen für diesen Wettbewerb einsehen</p>
</div>
</a>
{{#if not_bare}}
<div class="columns">
<div class="column is-8 is-offset-2">
<h3 class="title is-4">{{#if has_duration}}Wettbewerb:{{else}}Trainingsaufgaben:{{/if}} {{ contest.name }}</h3>
{{#if contest.duration}}<h4 class="subtitle is-5">Dauer: {{contest.duration}} Minuten</h4>{{/if}}
</div>
</div>
{{#if teacher}}
<div class="columns">
<div class="column is-6 is-offset-3">
<a href="/contest/{{ contest.id }}/result/">
<div class="notification is-info">
<h3 class="title is-5">Gruppenergebnisse</h3>
<p>Ergebnisse meiner Gruppen für diesen Wettbewerb einsehen</p>
</div>
</div> -->
{{/if}}
<div class="columns">
<div class="column is-8 is-offset-2">
<h3 class="title is-4">{{#if has_duration}}Wettbewerb:{{else}}Trainingsaufgaben:{{/if}} {{ contest.name }}</h3>
{{#if contest.duration}}<h4 class="subtitle is-5">Dauer: {{contest.duration}} Minuten</h4>{{/if}}
</div>
</div>
{{#if teacher}}
<div class="columns">
<div class="column is-6 is-offset-3">
<a href="/contest/{{ contest.id }}/result/">
<div class="notification is-info">
<h3 class="title is-5">Gruppenergebnisse</h3>
<p>Ergebnisse meiner Gruppen für diesen Wettbewerb einsehen</p>
</a>
</div>
</a>
</div>
</div>
</div>
{{/if}}
<div class="columns" id="bare_content">
{{/if}}
<div class="columns" id="bare_content">
{{/if}}
<div class="column is-6 is-offset-3">
<div style="min-height: 400px; margin-bottom:100px;" class="content">
<!-- <h3 class="title is-4">{{#if has_duration}}Wettbewerb:{{else}}Trainingsaufgaben:{{/if}} {{ contest.name }}</h3>
{{#if contest.duration}}<h4 class="subtitle is-5">Dauer: {{contest.duration}} Minuten</h4>{{/if}} -->
{{#if is_started}}
<p>
{{#if has_duration}}
{{#if is_time_left}}
Verbleibenden Zeit: <span id="timetime">{{time_left}}</span>
<script>
var seconds_left_at_start = {{seconds_left}};
var timerStart = Date.now();
function lz(a) {
var b = a.toString();
if (b.length < 2) {
return "0" + b;
}
return b;
}
function updateTimer() {
var seconds_passed = (Date.now() - timerStart) / 1000;
var seconds_left = seconds_left_at_start - seconds_passed;
var hour = seconds_left / 3600 | 0;
var min = (seconds_left / 60 | 0) % 60 | 0;
var sec = seconds_left % 60 | 0;
text = hour.toString() + ":" + lz(min) + "<span id=\"ttsec\">:" + lz(sec) + "</span>";
document.getElementById("timetime").innerHTML = text;
}
setInterval(updateTimer, 300);
</script>
{{else}}
Die Zeit ist abgelaufen. Du kannst nun die Aufgaben nicht mehr öffnen.
{{/if}}
{{/if}}
</p>
{{#each tasks}}
<div>
{{name}}
<ul style="list-style-type: none;margin: 5px 30px 15px;padding: 0;">
{{#each subtasks}}
<li>
{{#if ../../is_time_up}}
<button class="button is-link is-outlined" disabled>{{linktext}}</button>
{{else}}
<a href="/task/{{id}}" class="button is-link is-outlined">{{linktext}}</a>
{{/if}}
</li>
{{/each}}
</ul>
</div>
{{/each}}
<hr>
<div class="column is-6 is-offset-3">
<div style="min-height: 400px; margin-bottom:100px;" class="content">
{{#if is_started}}
<p>
{{#if has_duration}}
{{#if is_time_left}}
Verbleibenden Zeit: <span id="timetime">{{time_left}}</span>
<script>
var seconds_left_at_start = {{seconds_left}};
var timerStart = Date.now();
function lz(a) {
var b = a.toString();
if (b.length < 2) {
return "0" + b;
}
return b;
}
function updateTimer() {
var seconds_passed = (Date.now() - timerStart) / 1000;
var seconds_left = seconds_left_at_start - seconds_passed;
var hour = seconds_left / 3600 | 0;
var min = (seconds_left / 60 | 0) % 60 | 0;
var sec = seconds_left % 60 | 0;
text = hour.toString() + ":" + lz(min) + "<span id=\"ttsec\">:" + lz(sec) + "</span>";
document.getElementById("timetime").innerHTML = text;
}
setInterval(updateTimer, 300);
</script>
{{else}}
Die Zeit ist abgelaufen. Du kannst nun die Aufgaben nicht mehr öffnen.
{{/if}}
{{/if}}
</p>
{{#each tasks}}
<div>
{{name}}
<ul style="list-style-type: none;margin: 5px 30px 15px;padding: 0;">
{{#each subtasks}}
<li>
{{#if ../../is_time_up}}
<button class="button is-link is-outlined" disabled>{{linktext}}</button>
{{else}}
<a href="/task/{{id}}" class="button is-link is-outlined">{{linktext}}</a>
{{/if}}
</li>
{{/each}}
</ul>
</div>
{{/each}}
<hr>
<p>
Punktestand: {{ total_points }} ★ / {{ max_total_points }}&nbsp; ({{ relative_points }} %)
</p>
{{else}}
{{#if can_start}}
<p>
<form action="" method="post">
<input type="hidden" name="csrf_token" value="{{csrf_token}}">
<input class="button is-warning is-medium" type="submit" value="{{#if contest.duration}}⏱ &nbsp; {{/if}}Jetzt starten! {{#if contest.duration}}({{contest.duration}} min){{/if}}" style="font-weight:bold;">
</form>
</p>
{{#if contest.duration}}
<p>
Punktestand: {{ total_points }} ★ / {{ max_total_points }}&nbsp; ({{ relative_points }} %)
Der Wettbewerb läuft nach dem Starten für {{contest.duration}} Minuten.
Der Wettbewerb kann nach dem Starten nicht mehr pausiert werden!
</p>
{{/if}}
{{#if time_until_end}}
<p>Der Wettbewerb kann noch gestartet werden: {{ time_until_end.0 }} Tage, {{ time_until_end.1 }} Stunden, {{ time_until_end.2 }} Minuten.</p>
{{/if}}
{{else}}
<p>Du kannst diesen Wettbewerb nicht starten.</p>
{{#if constraints.contest_over}}
<p>Der Wettbewerb ist bereits beendet.</p>
{{else}}
{{#if can_start}}
<p>
<form action="" method="post">
<input type="hidden" name="csrf_token" value="{{csrf_token}}">
<input class="button is-warning is-medium" type="submit" value="{{#if contest.duration}}⏱ &nbsp; {{/if}}Jetzt starten! {{#if contest.duration}}({{contest.duration}} min){{/if}}" style="font-weight:bold;">
</form>
</p>
{{#if contest.duration}}
<p>
Der Wettbewerb läuft nach dem Starten für {{contest.duration}} Minuten.
Der Wettbewerb kann nach dem Starten nicht mehr pausiert werden!
</p>
{{/if}}
{{#if time_until_end}}
<p>Der Wettbewerb kann noch gestartet werden: {{ time_until_end.0 }} Tage, {{ time_until_end.1 }} Stunden, {{ time_until_end.2 }} Minuten.</p>
{{#if constraints.contest_not_begun}}
<p>Der Wettbewerb hat noch nicht begonnen.</p>
{{#if time_until_start}}
<p>Der Wettbewerb wird geöffnet in: {{ time_until_start.0 }} Tagen, {{ time_until_start.1 }} Stunden, {{ time_until_start.2 }} Minuten.</p>
{{/if}}
{{else}}
<p>Du kannst diesen Wettbewerb nicht starten.</p>
{{#if constraints.contest_over}}
<p>Der Wettbewerb ist bereits beendet.</p>
{{#if logged_in}}
{{#if constraints.grade_too_low}}
<p>Deine angegebene Jahrgangsstufe entspricht nicht den für diesen Wettbewerb vorgesehenen Altersgruppen.</p>
{{/if}}
{{#if constraints.grade_too_high}}
<p>Deine angegebene Jahrgangsstufe entspricht nicht den für diesen Wettbewerb vorgesehenen Altersgruppen.</p>
{{/if}}
{{else}}
{{#if constraints.contest_not_begun}}
<p>Der Wettbewerb hat noch nicht begonnen.</p>
{{#if time_until_start}}
<p>Der Wettbewerb wird geöffnet in: {{ time_until_start.0 }} Tagen, {{ time_until_start.1 }} Stunden, {{ time_until_start.2 }} Minuten.</p>
{{/if}}
{{else}}
{{#if logged_in}}
{{#if constraints.grade_too_low}}
<p>Deine angegebene Jahrgangsstufe entspricht nicht den für diesen Wettbewerb vorgesehenen Altersgruppen.</p>
{{/if}}
{{#if constraints.grade_too_high}}
<p>Deine angegebene Jahrgangsstufe entspricht nicht den für diesen Wettbewerb vorgesehenen Altersgruppen.</p>
{{/if}}
{{else}}
<p>Möglicherweise musst du dich zunächst <a href="/login">einloggen</a>.</p>
{{/if}}
{{/if}}
<p>Möglicherweise musst du dich zunächst <a href="/login">einloggen</a>.</p>
{{/if}}
{{/if}}
{{/if}}
</div>
</div>
{{#if not_bare}}
{{/if}}
{{/if}}
</div>
</div>
<footer class="footer">
<div class="content has-text-centered">
<p>
</p>
</div>
</footer>
<script>
// Reload page content as soon as you come back from another task via the back button in order to show the newly achieved stars
function reload_content(event) {
var request = new XMLHttpRequest();
request.open("GET","?bare&r=" + Math.random().toString(36).substr(2));
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.addEventListener('load', function(event) {
if (request.status >= 200 && request.status < 300) {
document.getElementById("bare_content").innerHTML = request.responseText;
} else {
console.warn(request.statusText, request.responseText);
}
});
request.send();
}
window.onpageshow = reload_content;
</script>
</body>
</html>
{{#if not_bare}}
</div>
<script>
// Reload page content as soon as you come back from another task via the back button in order to show the newly achieved stars
function reload_content(event) {
var request = new XMLHttpRequest();
request.open("GET","?bare&r=" + Math.random().toString(36).substr(2));
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
request.addEventListener('load', function(event) {
if (request.status >= 200 && request.status < 300) {
document.getElementById("bare_content").innerHTML = request.responseText;
} else {
console.warn(request.statusText, request.responseText);
}
});
request.send();
}
window.onpageshow = reload_content;
</script>
{{/if}}
{{/inline}}
{{#if not_bare}}
{{~> (parent)~}}
{{else}}
{{~> (empty)~}}
{{/if}}