149 lines
4.5 KiB
JavaScript
149 lines
4.5 KiB
JavaScript
const DEFAULT_LANG = 'pt';
|
|
var data = {};
|
|
var prepared_data = {};
|
|
|
|
function escapeHtml(unsafe) {
|
|
return unsafe
|
|
.replace(/&/g, "&")
|
|
.replace(/</g, "<")
|
|
.replace(/>/g, ">")
|
|
.replace(/"/g, """)
|
|
.replace(/'/g, "'");
|
|
}
|
|
|
|
function prepare_convention_series(data){
|
|
prepared_data[data.statute.uuid]={'kind': 'statute', ...data.statute};
|
|
prepare_string(data.name);
|
|
for(var edition of data.editions) prepare_convention_edition(edition);
|
|
}
|
|
|
|
function prepare_string(data){
|
|
prepared_data[data.uuid]={'kind': 'string', ...data};
|
|
}
|
|
|
|
function prepare_convention_edition(data){
|
|
prepared_data[data.uuid]={'kind': 'convention_edition', ...data};
|
|
prepare_string(data.name);
|
|
prepare_string(data.theme);
|
|
for(var rt of data.registration_tiers) prepare_registration_tier(rt);
|
|
for(var tag of data.tags) prepare_tag(tag);
|
|
for(var place of data.places) prepare_place(place);
|
|
for(var event of data.events) prepare_event(event);
|
|
}
|
|
|
|
function prepare_registration_tier(data){
|
|
prepared_data[data.uuid]={'kind': 'registration_tier', ...data};
|
|
prepare_string(data.tier);
|
|
}
|
|
|
|
function prepare_event(data){
|
|
data = JSON.parse(JSON.stringify(data)) //deep copy, as we will change it
|
|
prepare_string(data.title);
|
|
if(data.subtitle.uuid) prepare_string(data.subtitle);
|
|
prepare_string(data.description);
|
|
if(data.picture.uuid) prepare_string(data.picture);
|
|
data.attendable_by = data.attendable_by.map(it => prepared_data[it]);
|
|
data.categories = data.categories.map(it => prepared_data[it]);
|
|
data.places = data.places.map(it => prepared_data[it]);
|
|
prepared_data[data.uuid]={'kind': 'event', ...data};
|
|
}
|
|
|
|
function prepare_place(data){
|
|
prepared_data[data.uuid]={'kind': 'place', ...data};
|
|
prepare_string(data.label);
|
|
prepare_color(data.color);
|
|
}
|
|
|
|
function prepare_tag(data){
|
|
prepared_data[data.uuid]={'kind': 'tag', ...data};
|
|
prepare_string(data.label);
|
|
prepare_color(data.color);
|
|
}
|
|
|
|
function prepare_color(data){
|
|
prepared_data[data.uuid]={'kind': 'color', ...data};
|
|
}
|
|
|
|
function re_render_everything(){
|
|
document.body.innerHTML = '';
|
|
document.title = data.name[get_language()];
|
|
document.body.innerHTML = ""+render_header()+render_page();
|
|
}
|
|
|
|
function render_header(){
|
|
var s = '';
|
|
s+='<nav class="langchgr">';
|
|
s+='<a class="btn blockybtn" href="'+generate_language_changer_link('pt')+'">PT</a>';
|
|
s+='<a class="btn blockybtn" href="'+generate_language_changer_link('en')+'">EN</a>';
|
|
s+='<a class="btn blockybtn" href="'+generate_language_changer_link('es')+'">ES</a>';
|
|
s+='</nav>';
|
|
return s;
|
|
}
|
|
|
|
function render_page_convention_eventrow(intent){
|
|
var s = '';
|
|
s+='<tr>';
|
|
s+='</tr>';
|
|
return s;
|
|
}
|
|
|
|
function render_page_convention(intent){
|
|
var s='';
|
|
document.title = intent.theme[get_language()]+' | '+intent.name[get_language()];
|
|
console.log(intent);
|
|
s+='<h1>'+intent.name[get_language()]+'</h1>';
|
|
s+='<h2>'+intent.theme[get_language()]+'</h2>';
|
|
s+='<table class="eventstable">';
|
|
for(var event of intent.events) s+=render_page_convention_eventrow(prepared_data[event.uuid]);
|
|
s+='</table>';
|
|
return s;
|
|
}
|
|
|
|
function render_page(){
|
|
var intent = prepared_data[get_pageuuid()];
|
|
var s='';
|
|
s+='<main>';
|
|
if(false){}
|
|
else if(intent.kind === 'convention_edition') s+=render_page_convention(intent);
|
|
else if(intent.kind === 'event') s+=render_page_convention(intent);
|
|
else s+='There is no view for this content.';
|
|
s+='</main>';
|
|
return s;
|
|
}
|
|
|
|
var get_language = () => document.location.hash.split('#')[1] || "";
|
|
var get_pageuuid = () => document.location.hash.split('#')[2] || "";
|
|
var generate_language_changer_link = lang => "#"+lang+"#"+get_pageuuid()
|
|
var generate_page_changer_link = page => "#"+get_language()+"#"+page
|
|
var change_page = page => window.history.replaceState({}, "", generate_page_changer_link(page));
|
|
var change_language = lang => window.history.replaceState({}, "", generate_language_changer_link(lang));
|
|
|
|
function init(){
|
|
prepare_convention_series(data);
|
|
change_page(data.featured || data.editions[0]);
|
|
re_render_everything();
|
|
}
|
|
|
|
window.onpopstate = (event) => {
|
|
re_render_everything();
|
|
}
|
|
|
|
(() => {
|
|
if(
|
|
((document.location.hash.split('#')[2] || "") === "")
|
|
||
|
|
((document.location.hash.split('#')[1] || "") === "")
|
|
){
|
|
change_language(DEFAULT_LANG);
|
|
}
|
|
})();
|
|
|
|
jQuery.getJSON(
|
|
'./data.json',
|
|
(resp) => {
|
|
document.body.innerHTML = '';
|
|
data = resp;
|
|
init();
|
|
}
|
|
);
|