/*
* Copyright (C) 2014
* This file is part of WvS VPlan.
*
* WvS VPlan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
function setDNT(dntrack){
dntrack = dntrack.toString();
_paq.push(['setDoNotTrack', dntrack]);
localStorage.setItem('dntrack', dntrack);
$('#disclaimerpopup').popup('close');
$('#dntflip').val(dntrack);
}
function track(what){
_paq.push(['setCustomUrl', what]);
_paq.push(['trackPageView', what]);
}
function trackPlan(vdate){
track('ui/tab/plan');
track('plan/' + vdate.format('YYYY/MM/DD'));
}
$('#settingspanel').on('panelclose', function(){
localStorage.setItem('dntrack', $('#dntflip').val());
localStorage.setItem('classes', $('#addclass').val().toUpperCase());
localStorage.setItem('notifyday', $('#notifydayflip').val());
localStorage.setItem('notifydate', $('#notifydate').val());
});
document.addEventListener('pause', function(){
track('event/pause');
});
document.addEventListener('resume', function(){
track('event/resume');
});
document.addEventListener('offline', function offline(){
$('#loginsubmit').prop('disabled', true);
$('#error_noconn').show('fast');
}, false);
document.addEventListener('online', function online(){
$('#loginsubmit').prop('disabled', false);
$('#error_noconn').hide('fast');
}, false);
var _paq = _paq || [];
$('#mainpage').on('pagebeforeshow', function(){
/* Sprache setzen */
moment.lang('de');
/* Nutzungsstatistiken */
_paq.push(['setTrackerUrl', 'http://klimaag.***REMOVED***/piwik/piwik.php']); // TODO Https wäre schön.
_paq.push(['setSiteId', 5]);
console.log('Piwik initialisiert');
/* gespeicherte Daten laden */
var dntrack = localStorage.getItem('dntrack');
var additionalClasses = localStorage.getItem('classes');
var notifyDay = localStorage.getItem('notifyday');
var notifyDate = localStorage.getItem('notifydate');
if(dntrack === null || dntrack.length === 0){
dntrack = 'false';
}
$('#dntflip').val(dntrack).slider('refresh');
if(additionalClasses === null || additionalClasses.length === 0){
additionalClasses = '';
}
$('#addclass').val(additionalClasses).textinput('refresh');
if(notifyDay === null || notifyDay.length === 0){
notifyDay = 0;
}
$('#notifydayflip').val(notifyDay).slider('refresh');
if(notifyDate === null || notifyDate.length === 0){
notifyDate = '18:00';
}
$('#notifydate').val(notifyDate).textinput('refresh');
/* Piwik initialisieren */
_paq.push(['setDoNotTrack', dntrack]);
});
// Login-Popup beim Start
document.addEventListener('deviceready', function(){
/* los geht's */
_paq.push(['setCustomVariable', 1, 'Modell', device.model, 'visit']);
_paq.push(['setCustomVariable', 2, 'Version', device.version, 'visit']);
track('event/load');
var dntrack = localStorage.getItem('dntrack');
if(dntrack === null || dntrack.length === 0){
setTimeout(function(){
$('#lnkdisclaimer').click();
}, 2000);
}else{
fillForm();
window.plugin.notification.local.cancelAll(); // alle Benachrichtigungen canceln, werden während des Renderings neu gesetzt
load();
tryLogin();
}
}, false);
/* der Loader wird nur angezeigt, wenn das Popup zu ist */
$('#loginpopup').on('popupafteropen', function(){
$.mobile.loading('hide');
});
$('#disclaimerpopup').on('popupafterclose', function(){
fillForm();
window.plugin.notification.local.cancelAll();
load();
tryLogin();
});
/* füllt die Loginform mit gespeicherten Werten */
function fillForm(){
var username = localStorage.getItem('username');
if(username !== null && username.length !== 0){
$('#username').val(username);
}
var password = localStorage.getItem('password');
if(password !== null && password.length !== 0){
$('#password').val(password);
}
}
/* benachrichtigt den Benutzer an vdate mit msg */
function addNotification(vdate, msg, $div){
var title = 'Vertretung für ' + vdate.format('dddd');
vdate = vdate.subtract('days', 1).add('days', $('#notifydayflip').val()); // Bei Bedarf einen Tag vorher
if(moment().isBefore(vdate)){
window.plugin.notification.local.add({
date: vdate.toDate(),
message: msg,
title: title,
autoCancel: true,
json: JSON.stringify({id: $div.attr('id')}),
//badge: 0 //TODO
});
window.plugin.notification.local.onclick = function(id, state, json){
var div = JSON.parse(json).id;
location.href = '#' + div; // TODO hoffentlich funktioniert das auch immer...
};
console.log('Benachrichtigung hinzugefügt: ' + vdate.format('DD.MM. HH:mm') + '; ' + msg);
}
}
/* zeigt einen Button an, mit dem die Vertretung geteilt werden kann */
function addSocialButton(vdate, msg, $div){
if(moment().isBefore(vdate)){
var datestr = vdate.format('dddd');
var btn = $('')
.text('Teile die Vertretungen')
.click(function(){
window.plugins.socialsharing.share('Hey Leute! Laut der WvS-VPlan-App gibt es folgende Vertretungen am ' + datestr + ': ' + msg);
console.log('Vertretungsplan geteilt: ' + datestr);
track('event/share');
})
.addClass('ui-btn ui-corner-all ui-btn-inline');
$div.prepend(btn);
console.log('Teilen-Button hinzugefügt: ' + datestr + msg);
}
}
function checkeKlasse(nutzerklasse, klasse){
var subklassen = nutzerklasse.match(/(\d{1,2})([ABCD])/);
var wichtig = true;
if(nutzerklasse.length === 0){
wichtig = false;
}
if(klasse.indexOf(nutzerklasse) == -1){
if(subklassen !== null){
for(j = 1; j < subklassen.length; j++){ // Wenn alle Buchstaben der Klasse in der Vertretung vorkommen
if(klasse.indexOf(subklassen[j]) == -1){
wichtig = false;
}
}
}else{
wichtig = false;
}
}
return wichtig;
}
/* konvertiert die extrahierten Strings in ein lesbares Format und filtert nach relevanten Vertretungen */
function parseVertretungen(str, username){
var vertretungenRe = new RegExp('(\\w+)\\s+(\\d(?:\\s+-\\s+\\d)?)\\s+((?:x\\s+)?)(\\+|\\w+|---)\\s+(\\w+|---)\\s+(\\w+|---)\\s+(.*?)\\s+(\\w+)(?:\\s+)?(.*?)');
var res;
var vertretungen = [];
var nutzerklasse = username.match(/(\w+)_.*/)[1].toUpperCase();
str.split('\n').forEach(function(vertretungsstr){
res = vertretungsstr.match(vertretungenRe);
if(res !== null){
var klasse = res[1];
var stunde = res[2].replace(/ /g, '');
var entfall = res[3].indexOf('x') > -1;
var vertreter = res[4];
var fach = res[5];
var raum = res[6];
var art = res[7];
var lehrer = res[8];
var info = res[9];
var wichtig = false;
if(checkeKlasse(nutzerklasse, klasse) === true){
wichtig = true;
}else{
var additionalClasses = $('#addclass').val().split('\n'); // alle benutzerdefinierten Klassen durchgehen
additionalClasses.forEach(function(addCls){
if(checkeKlasse(addCls, klasse) === true){
wichtig = true;
}
});
}
if(wichtig === false){
return;
}
if(entfall === true){
if(art.length <= 1){
art = "";
}else{
art = " " + art;
}
if(info.length <= 1){
info = "";
}else{
info = " Info:" + info;
}
vertretungen.push(klasse + " " + stunde + ". Stunde Entfall statt " + lehrer + art + info);
}else{
if(art.length <= 1){
art = "";
}else{
art = art + " in ";
}
if(info.length <= 1){
info = "";
}else{
info = " Info:" + info;
}
var nlehrer;
if(lehrer !== vertreter){
nlehrer = " bei " + vertreter + " (statt " + lehrer + ")";
}
vertretungen.push(klasse + " " + stunde + ". Stunde " + art + fach + nlehrer + " in Raum " + raum + info);
}
}else{
if(vertretungsstr.indexOf('Unterrichtsschluss') > -1){
vertretungen.push(vertretungsstr);
}
}
});
vertretungen = vertretungen.filter(function(elem, pos){ // doppelte Einträge filtern
return vertretungen.indexOf(elem) == pos;
});
console.log(JSON.stringify(vertretungen));
return vertretungen;
}
/* PDF Rendering */
function renderPage($div, pdf, pageNumber, callback){
pdf.getPage(pageNumber).then(function(page){
var scale = 1;
var viewport = page.getViewport(scale);
var pageDisplayWidth = viewport.width;
var pageDisplayHeight = viewport.height;
var $pageDivHolder = $('
');
$pageDivHolder.addClass('pdfpage');
$pageDivHolder.width($(window).width()); // TODO Rotation change
$pageDivHolder.height($(window).height());
var $canvas = $('');
var canvas = $canvas.get(0);
canvas.className = 'pdfcanvas';
var context = canvas.getContext('2d');
canvas.width = pageDisplayWidth;
canvas.height = pageDisplayHeight;
$pageDivHolder.append(canvas);
$div.append($pageDivHolder);
var renderContext = {
canvasContext: context,
viewport: viewport
};
page.render(renderContext).promise.then(function(pdf){
page.getTextContent().then(function(textContent){ // Text extrahieren
var pageText = "";
var lastBlock = null;
for(j = 0; j < textContent.length; j++){
var block = textContent[j];
if(lastBlock !== null && lastBlock.str[lastBlock.str.length - 1] !== ' '){
if(block.x < lastBlock.x){
pageText += '\n';
}else if(lastBlock.y !== block.y && (lastBlock.str.match(/^(\s?[a-zA-Z])$|^(.+\s[a-zA-Z])$/) === null )){
pageText += '\n';
}
}
pageText += block.str;
lastBlock = block;
}
var username = getUserData();
if(username === null){
return;
}else{
username = username[0];
}
var vertretungen = parseVertretungen(pageText, username);
if(vertretungen.length > 0){
var vdate = moment($div.data('date'), 'YYYY-MM-DD').startOf('second');
var time = $('#notifydate').val().split(':');
vdate.set('hour', time[0]);
vdate.set('minute', time[1]);
addSocialButton(vdate, vertretungen.join(', '), $div);
addNotification(vdate, vertretungen.join('\n'), $div); //FIXME addNotification ändert vdate
}
});
callback(pdf);
});
});
}
function renderPdf(url, divstr){
console.log('Rendere PDF: ' + url + ' (' + divstr + ')');
PDFJS.getDocument(url).then(function(pdf){
var $viewer = $('#' + divstr);
var pageNumber = 1;
renderPage($viewer, pdf, pageNumber++, function pageRenderingComplete(){
if(pageNumber > pdf.numPages){
$.mobile.loading('hide'); // nach dem Rendern des ersten PDFs Loader verstecken
return;
}
renderPage($viewer, pdf, pageNumber++, pageRenderingComplete);
});
});
}
/* wird bei Verbindungsfehlern oder anderen Fehlern aufgerufen */
function fail(text){
$('#lnklogin').click();
$('#error_general').show('fast');
console.log('Fehler: ' + text.toString() + ' / ' + text.code);
track('error/general_' + text.toString() + '_' + text.code);
}
/* entfernt das Logintab */
function removeLoginTab(){
$('#vplannavbar').find('*').andSelf().each(function(){
$(this).removeClass(function(i, cn){
var matches = cn.match(/ui-[\w\-]+/g) || [];
return (matches.join(' '));
});
if($(this).attr('class') === ''){
$(this).removeAttr('class');
}
});
$('#vplannavbar').navbar('destroy');
$('#vplannavbar ul li:first').remove();
$('#vplannavbar').navbar();
$('#login').remove();
$('#vplantabs').tabs('refresh');
var vdate = moment($('#vplantabs ul li:first').data('date'), 'YYYY-MM-DD');
trackPlan(vdate);
}
function replaceUmlauts(umlautstr){
tr = {'ä': 'ae', 'ü': 'ue', 'ö': 'oe', 'ß': 'ss'};
return umlautstr.replace(/[äöüß]/g, function($0) { return tr[$0]; });
}
/* fügt die lokale URL des Plans ein und ruft die Seite zum Rendering auf */
function addPlanAttr(fileEntry, wasdownloaded){
var sPath = fileEntry.toURL();
var name = decodeURIComponent(fileEntry.name);
console.log('Dateiname: ' + name);
var fnameRe = new RegExp('.*?(\\d{4}-\\d{2}-\\d{2})(.*?)\\.pdf');
var results = name.match(fnameRe);
var vdate = moment(results[1], 'YYYY-MM-DD').startOf('day');
if(results[2] !== null){
results[2] = results[2].replace(/[ ,]/g, '-').replace(/-{2}/g, '-');
}
name = vdate.format('DD_MM_YYYY') + replaceUmlauts(results[2]);
if(!$(name).length){
$('#vplannavbar').find('*').andSelf().each(function(){
$(this).removeClass(function(i, cn){
var matches = cn.match(/ui-[\w\-]+/g) || [];
return (matches.join(' '));
});
if($(this).attr('class') === ''){
$(this).removeAttr('class');
}
});
$('#vplannavbar').navbar('destroy');
$('#vplannavbar ul').append('