conventionschedule-android/webapp/main.js
2018-10-15 22:26:30 -03:00

149 lines
4.5 KiB
JavaScript

const DEFAULT_LANG = 'pt';
var data = {};
var prepared_data = {};
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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();
}
);