/*
* 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(dnt){
_paq.push(['setDoNotTrack', dnt])
window.localStorage.setItem('dnt', dnt);
$('#disclaimerpopup').popup('close');
}
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'));
}
document.addEventListener('pause', function(){
track('event/pause');
});
document.addEventListener('resume', function(){
track('event/resume');
});
// Login-Popup beim Start
document.addEventListener('deviceready', function(){
_paq.push(['setCustomVariable', 1, 'Modell', device.model, 'visit']);
_paq.push(['setCustomVariable', 2, 'Version', device.version, 'visit']);
track('event/load');
var dnt = window.localStorage.getItem('dnt');
if(dnt == 'undefined' || dnt == null || dnt == ''){
setTimeout(function(){
$('#lnkdisclaimer').click();
}, 2000);
}else{
fillform();
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();
load();
trylogin();
});
/* füllt die Loginform mit gespeicherten Werten */
function fillform(){
var username = window.localStorage.getItem('username');
if(username !== 'undefined' && username != null && username != ''){
$('#username').val(username);
}
var password = window.localStorage.getItem('password');
if(password !== 'undefined' && password != null && password != ''){
$('#password').val(password);
}
}
/* benachrichtigt den Benutzer an vdate mit msg */
var notifications = 0;
function addNotification(vdate, msg){
vdate.subtract('days', 1); // Ein Tag vorher, 18 Uhr benachrichtigen
var secondsUntilDate = moment.diff(vdate, 'seconds');
if(secondsUntilDate > 0){
localNotification.add(++notifications, {
seconds: secondsUntilDate,
message: msg,
badge: 0});
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);
}
}
/* konvertiert die extrahierten Strings in ein lesbares Format und filtert nach relevanten Vertretungen */
function parseVertretungen(str, username){
var vertretungen_re = 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();
var subklassen = nutzerklasse.match(/(\d{1,2})([ABCD])/);
str.split('\n').forEach(function(vertretungsstr){
res = vertretungsstr.match(vertretungen_re)
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];
if(klasse.indexOf(nutzerklasse) == -1){
var wichtig = true;
for(j = 1; j < subklassen.length; j++){
if(klasse.indexOf(subklassen[j]) == -1){
wichtig = false;
}
}
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 page_text = "";
var last_block = null;
for(j = 0; j < textContent.length; j++){
var block = textContent[j];
if(last_block != null && last_block.str[last_block.str.length - 1] != ' '){
if(block.x < last_block.x){
page_text += '\n';
}else if(last_block.y != block.y && (last_block.str.match(/^(\s?[a-zA-Z])$|^(.+\s[a-zA-Z])$/) == null )){
page_text += '\n';
}
}
page_text += block.str;
last_block = block;
}
var username = getuserdata()[0];
var vertretungen = parseVertretungen(page_text, username);
if(vertretungen.length > 0){
var vdate = moment($div.data('date')).startOf('minute').set('hour', 18);
addNotification(vdate, vertretungen.join('\n'));
addSocialButton(vdate, vertretungen.join(', '), $div);
}
});
callback(pdf);
});
});
}
function render_pdf(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_noconn').show('fast');
console.log('Fehler: ' + text.toString() + ' / ' + text.code);
track('error/connectiondown');
}
/* 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'));
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 = fileEntry.name;
console.log('Dateiname: ' + name);
var fname_re = new RegExp('.*?(\\d{4}-\\d{2}-\\d{2})(.*?)\\.pdf');
var results = name.match(fname_re);
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('